IP数据报
IP是TCP/IP协议族中最核心的协议,全部的TCP、UDP、ICMP、IGMP数据都以IP数据报的格式传输。IP仅提供尽力而为的传输服务。假设发生某种错误。IP会丢失该数据。然后发送ICMP消息给信源端。另外。IP数据报能够不按发送顺序接受。
IP数据报的格式例如以下:
前20字节和紧接其后的选项部分是IP数据报的首部,前20个字节是固定的,选项可有可无。首部的每一行是一个32位字的单位,最高位在左边,为0bit。最低位在右边。为31bit。
4字节的32bit值依照下面次序传输:首先0-7bit,其次8-15比特,然后16-23bit,最后是24-31bit,这样的传输次序称为big endian字节序(我们在C语言写位操作的算法时经常使用到该词)。TCP/IP首部中的全部二进制整数在网络中传输时都要求以这样的次序,因此它又称作网络字节序。其它形式存储的二进制数据。如little endian格式,则必须在数据传输之前把首部转化成网络字节序。
首部长度是指首部占32bit字的数目,由于4位的最大值为15,因此首部最长为60字节,也即是说选项部分的最大值为40字节。不够4的倍数。要用0填充。使数据部分的起始地址为4的倍数。
总长度指整个IP数据报的长度,包括首部和数据部分,16bit,最长可达65535字节。
虽然理论上能够传送一个长达65535的IP数据报。但实际上还要考虑网络的最大承载能力等因素,标准的TCP/IP分组大小为576字节。减去IP首部的20个字节。TCP首部的20个字节,路由协议头的24个字节,为512字节,因此主机接受的数据报的数据部分一般不超过512个字节。
(PS:这点看的也不是太懂,网上非常多人也有此疑问。谢希仁的计算机网络中写的一次IP数据报最少576字节,尼玛这里翻译的是不超过576字节。先往后看吧。说不定看到后面就豁然开朗了)。
这两天差点儿相同算是搞明确了,非常多基于UDP协议的应用之所以要求UDP的数据部分不超过512个字节(576-20-20)。主要是考虑整个传输路径上的效率,由于链路层为X2.5的网络的MTU为576个字节,这基本也是各种链路层网络的最小MTU。大于这个值就不会产生分片。之所以建议不超过这个值应该是考虑到网络承载能力和传输效率、每台主机的接受能力等非常多因素的权衡。当然书上也说,576仅仅是建议值。实际上大于它也是能够的,仅仅是这样在遇到X2.5网络时可能产生分片。临时是这么理解的,不知道看到后面会不会有新的收获。
第十一章中又有说:如今很多但不是全部的广域网都能够处理大于512字节的分组。
3个标志位主要用来标识分片的IP数据报,片位移为分片的数据报的首个字节偏离整个原始数据报的位置。
IP路由选择
主机通过路由器和目的主机连接。
主机通过IP数据报连接目的主机时,依照例如以下步骤搜索(同一网络中的搜索要经过ARP协议将目的主机的IP地址解析为MAC地址):
- 搜索路由表,优先搜索匹配主机。假设能找到和IP地址全然一致的目标主机,则将该包发向目标主机
- 搜索路由表,假设匹配主机失败。则匹配同子网的路由器,这须要子网掩码的协助。
假设找到路由器。则将该包发向路由器。
- 搜索路由表,假设匹配同子网路由器失败,则匹配同网号路由器,假设找到路由器,则将该包发向路由器。
- 搜索路由表,假设以上都失败了,就搜索默认路由,假设默认路由存在,则发包
- 假设都失败了,就丢掉这个包。