引言
Internet协议即IP协议。所有的TCP, UDP, ICMP, IGMP数据都通过IP数据报传输。IP提供了一种尽力而为,无连接的数据包交付服务。
“尽力而为”: 不保证IP数据报成功到达目的地,任何可靠性需要上层提供。
“无连接“: IP不维护网络单元中数据报相关的任何连接状态信息,每个数据报独立于其它数据报来处理。两个连续的数据报可能乱序到达目的地。
IP数据报格式
长度信息:一个常规的IPv4头部大小为20字节,除非存在选项字段(很少见)。IPv6头部长度是它的两倍,但是没有任何选项。
网络字节序: 与计算机术语:大端对齐同一个意思。低位存在低地址,高位存在高地址。如数字 0xff10, 计算机的CPU存储为小端对其,即: 10 ff H. 而将其通过网络传输时,必须转换为 ff 10 H(网络字节序)才能传输,即高位字节优先。
字段解释:
- 版本: ipv4 为4, ipv6为6
- IHL(Internet 头部长度): 有多少个32bits. 正常情况是5, 即前面谈过的20字节。IPv6没有这个字段,其长度固定为40字节。
- ToS(服务类型字段):被分为DS(区分服务字段)和ECN(显示拥塞通知字段)。
- 总长度:是整个IP数据报的总长度,通过这个字段和IHL字段,我们知道数据部分从哪里开始。该字段长度为16bits,所以IP报文最大可为65535字节。但是链路层协议往往不能携带这么大的数据,所以要对其进行分片。
- 标识字段: 为了避免不同数据报分片之间的混淆,主机维护计数器,将值赋予该字段。该字段对分片的实现非常重要。
- TTL(生存周期):数据报可以经过的路由器的总数量。通常为64,也有128,255等。当这个字段达到0,该数据报被丢弃,并产生一个ICMP消息通知发送者.
- 协议字段: 表示数据报有效载荷部分的数据类型。UDP(17),TCP(6)。
- 头部校验和: 只计算IPv4头部的校验和,不保证有效载荷的正确性。
DS字段和ECN
- DS字段的数字被称为DSCP(区分服务代码点),用于支持IP协议上不同类型的服务:即不只是尽力而为的服务。
- 2位的ECN是数据报的拥塞标识符,一个具有ECN感知能力的路由器在持续拥塞的状态下会设置这两位,TCP协议会发现这种情况并且将其通知发送方,发送方随后会降低发送速度。
IP选项
IP支持一些可供选择的选项,其中大部分是不再实用或可取,在IPv6中,大部分选项被删除或者改变,而且不再是IPv6头部的一部分。这些选项有:列表结尾,没有操作,源路由,安全和处理标签,记录路由,时间戳,流ID,EIP,跟踪,路由器警告,快速启动。
IPv6扩展头部
IPv6头部固定为40字节,IPv6通过扩展头部来实现IPv4选项的部分功能。扩展头部和更高层的协议(TCP/IP)与IPv6头部构成一个级联头部,它们之间通过下一个头部字段连接起来。
各个选项的详细说明这里不细说,请查阅相关资料。
IP转发
当主机收到一个数据报时,首先检查目的地址:
- 如果是自己(自己某一个接口所配置的IP地址或IP广播或者组播地址),则交给协议字段或者IPv6头部的下一个头部字段指定的协议模块处理。
- 如果不是:
- 如果IP层被配置为路由器,则转发该数据报。
- 否则默默丢弃,必要时生成ICMP报文给发送者。
转发不会改变数据报的IP地址,只是通过设置链路层地址来完成交付的过程:
- 发送者定义好源IP和目的IP,如果目的IP不在本地,则将链路层的目的MAC地址设置为路由器,由路由器代为转发。
- 每一跳路由器在转发时,都会将源MAC地址设置为自己,目的MAC地址设置为下一跳路由器。
转发表
当需要转发一个数据报时,必须与转发表匹配,从而知道下一跳和输出端口。转发表的组成如下:
- 目的地址: 用于与一个掩码操作的结果向匹配。如果该字段为全0,表示默认路由。
- 掩码:将报文先进行掩码,再与目的地址比较。
- 下一跳:下一个IP实体(路由器或者主机)的IP地址。数据报将被转发到该地址。
- 接口:从哪一个网络接口发出去。
可以看到,路由器不包含到任何目的地的完整转发路径。IP转发只提供数据报文发送的下一跳的地址。它有以下假设:
- 假设下一跳更接近目的地
- 假设下一跳路由器与自己直接连接
- 假设实体之间没有环路
完成这些假设需要路由协议,多种路由协议能够做好这项工作:RIP,OSPF,BGP,IS-IS。
IP 分片和重组
链路层对可传输的每一个帧的大小有着限制,比如以太网限制为1500字节。而一个IP数据报的大小可能又65535字节。要保持IP数据报抽象与链路层细节的一致和分离,IP引入了分片和重组。
在网络层发送数据报时,会检测所发送接口的MTU(最大传输),如果超出则进行分片。分片既可以在端上进行,也可以在路径上的任意一点进行。
分片
将一个IP数据报,分割成多个满足MTU限制的IP子数据报。每个数据报都有完整的:ETH + IP + 网络层负载的结构,只不过原来大数据报的负载被均分在分片的负载当中。
虽然每一个IP分片也都有IP头部,但是每个头部都是有标识的,例如将某一个数据报分为下面3个部分:
分片1 : ETH + IP + 负-------------载
分片2 : ETH + IP + 负-------------载
分片3 : ETH + IP + 负----载
IPv4头部的标识,分片偏移,更多分片(MF) 标识着不同的分片,也为重组作基础。
各个字段的作用如下:
- 标识:同一数据报的所有分片均相同,用于区分不同数据报的分片,由发送方设置。
- 分片偏移:用于重组时回复顺序。
- MF:有后续分片标识为1,没有后续分片标识为0。
IPv4中的总长度要修正为分片的总长度。
重组
重组依据标识,分片偏移,MF来重组数据报即可,但是也要注意下面两个事情:
- 任何一个分片的丢失,都将导致整个数据报重发。所以TCP尽量不让IP分片发生。
- 重组超时: 任何数据报的任何一个分片首先到达目的地,IP层就启动一个计时器。超时一般是30秒后或者60秒。如果重组超时,目标机器回复一个ICMP消息告诉发送方重组超时,请求重发。