IPV4报头及IP分片

IP协议是无连接,不可靠,无状态的。
无连接就是指通讯时不能长久的维持对方信息,保持连接。
不可靠就是不能保证数据准确的发送给接受方,可能会丢失,变错,截断等。
无状态就是指发送的数据可能是乱序的重复的。

至于为什么IP协议的特性是这样的。为什么TCP协议又是有连接的,可靠的,无状态的。
那就得从控制协议的报头段来分析原因了。
不同的协议,不同的报头,因此表现出来的特性也是区别很大的。

IPv4的报头示意图是这样的。
  IPV4报头及IP分片_第1张图片
4位版本号:IP协议的版本,ipv4就值为4

4位头部长度:指这个报头一共有多少个字节,其中1个数表示4字节
4位能表示到15,因此报头最多4*15=60个字节

8位服务类型
其中3位表示优先权字段,现在已经忽略。
  然后4位为TOS字段,这四位互斥,只能一位取1,分别表示最小延迟,最大吞吐量,最高可靠性和最小消费。
然后还有1位保留,必须为0;

16位总长度:指整个ip数据报即报头+数据的大小。
其中一个数表示一个字节。由于ip所在网络层 的 下一层链路层封装为帧,而帧的最大传输单元(MTU)的上限为1500个字节(这里都用以太网的帧举例)。
IPV4报头及IP分片_第2张图片
IPV4报头及IP分片_第3张图片
因此这个2^16个字节的长度就远远超过了它下层的限制,所以ip数据报如果超过1500个字节,会被分片传输。
这就会有一个问题,如果ip数据报的大小为1501,那么就会被分为2片。一个片的数据为1500字节,另一片的数据为1字节,后者显然很不划算

16位标识:标识了每个发送的数据报,初值是随机的,之后每发一个数据报值+1。

3位标识字段
第一位保留
第二位表示是否禁止下层链路层把ip封装成帧的时候使用分片机制,如果这个设置了,那么ip数据报就不会分片,如果ip数据报超过1500字节(以太网是1500,其他的不一定),那么这个ip数据报就被丢弃,返回差错报文。
第三位表示 此ip数据报是否有 更多的数据报分片。
Ip分片什么意思呢?就是比如我们原本打算发的数据报为4000个字节,由于mtu的1500字节的限制,会被分割,如图所示。

IPV4报头及IP分片_第4张图片
因此我们要把这个数据报拆分为3个数据报才能正常发送。
前两个数据报①② 的标识字段的第三位都是1,表示后面还有分片,最后一个数据报③是0,表示是分片的尾巴。因此这位标识字段和前面的16位标识共同作用下,就可以把 被分片成很多ip数据报们 还原成原始的很大的(超过1500字节)的ip数据报

13位片偏移表示的是这个数据报相对于分片前的数据报的偏移位置。这个由于是13位,为啥不是16?因为有3位被标识字段占了。因此表示的是实际偏移的1/8,也就是说这个偏移乘以8 (即2^3,占得那3位) 才是真正的偏移,拿上图的距离。
第一个数据报①就是分片前数据报的初始位置,因此没有偏移是0
第二个数据报②是分片前的第1440个字节的位置,但这个值要除以8,因此为180。
第三个数据报③是分片前 第2880个字节的位置,因此偏移为360。

因此ip数据报的数据部分(不算报头那60个字节)的大小应该是8的倍数,否则到时候会无法整除的,1440就是180的8倍,如果报头没有选项部分,即40个字节,则数据部分的大小不能取1460个字节,应该取1456个字节。


8位生存时间:就是路由器的跳数,能转几次路由器,这样主要是为了防止ip数据报一直无限在路由器间循环跳转,影响整个网络环境。
一般设为64,经过一次路由器就减一,直到为0,这个ip数据报就被路由器处决了。

8位协议表示的是上层使用什么协议。TCP 为6,UDP为17 ,ICMP为1

16位校验和,接受ip数据报的端检测这个ip数据报的头部是否损坏。

32位源端ip地址和32位目的端ip地址 意思显而易见,不解释!

最后为40个字节的选项


因此我们可以大概了解IP协议的特性了。
IP协议不可靠,即不保证数据正确的传输。其主要原因还是没有检测数据是否损坏的步骤,16位校验和也仅仅检查的是ip数据报的报头是否损坏。
无状态是由于数据报式的服务并没有控制接受顺序的步骤, 16位标识只是为了ip分片相关的。
无状态虽然让数据可能乱序重复,但换来的却是高效和简洁,没有那么多的控制选项,传送速率来说也是相对较快。

你可能感兴趣的:(linux)