IP协议(一)——IP数据报格式及其含义,IP数据报的切分

Posted 努力学习的少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IP协议(一)——IP数据报格式及其含义,IP数据报的切分相关的知识,希望对你有一定的参考价值。

  • 💂 个人主页:努力学习的少年
  • 🤟 版权: 本文由【努力学习的少年】原创、在CSDN首发、需要转载请联系博主
  • 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦

🚀 IP数据报格式

  • 版本:占4位,指ip协议的版本
  • 首部长度:表示IP数据报中报头的长度,可表示的最大的十进制位是15。首部长度表示的基本单位是4个字节,因此首部长度的最小值是5,也就是报头最小长度是20个字节。当首部长度是1111时,表示的是报头最大是60个字节。
  • 区分服务:占8位,用来获得更好的服务,但实际上一直没被用过。
  • 总长度:指的是一个IP数据报总的长度,也就是报头+数据。
  • 标识:占16位,在IP软件在存储器中维持着一个计数器,每产生一个数据报,计数器就+1,并将此值赋值给标识字段。当IP数据报长度超过MTU而必须进行分片,这个标识字段的值就被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各个数据报片最后的能正确地重装成为原来的数据。
  • 标志:占3位,但目前只有两位有意义
  1. 标志字段中的最低位为MF。MF=1即表示后面“还有分片”的数据报。MF=0表示的是这个数据报的最后一个。
  2. 标志字段中的中间一位记为DF,当DF记为1时,表示的是“不能分片”。
  • 片偏移: 占13位。片偏移指出,较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对于用户数据字段的起点,相对于用户的数据字段,该片从何开始。片偏移以8字节为单位。这就是说,每个分片长度一定是8字节的整数倍。 
  • 生存时间 :占8位,生存时间字段常用英文缩写是TTL(Time to Live),表明的是数据报在网络中的寿命。由发出数据报圆点设置这个字段,目的是防止无法交付的数据报无限制地在因特网中兜圈子,占用网络资源。TTL以跳数作为基本单位,路由器在转发数据报中,TTL值就会-1,当TTL为0时,该数据报就会被丢弃。显然数据报能在因特网中经过的路由器的最大数值是255。若把TTL的初始值设置为1,就表示该数据报只能在本局域网中传送。
  • 协议:占8位,协议字段指出此数据携带的数据是使用何种协议,以便让使目的的IP层知道将数据部分上交到哪个处理过程。如TCP,UDP等等
  • 首部检验和: 占16位,这个字段只检验数据报的首部,不包括数据部分。
  • 源IP地址:占32位。
  • 目的IP地址:占32位。

🚀 IP数据报分片问题

在了解IP数据报分片之前,我们先思考一下IP数据报为什么要进行分片?

  • 在数据链路层当中MAC层规定了MAC帧中最多能携带数据是MTU个字节(默认的MTU值是1500个字节),那么MAC中能携带最大能携带1500个字节。如果IP层向下传递一个超过1500个字节IP数据报给mac帧,则MAC帧是不会将数据报发送出去的,所以如果在IP层中是不能将一个大小是超过MTU的IP数据报传递到MAC层,如果检测到一个IP数据报的大小是超过MTU,则IP层会将IP数据报中的数据部分进行切片。

IP层是如何将IP数据报进行分片呢?

  • 假设一个数据报的总长度为3820,其数据部分是3800,如果MTU是1420个字节,为了能让我们的MAC层能将IP报发出去,所以分片后的IP数据报不能超过1420个字节,因为IP报头是固定的20个字节,所以分片后的IP报中数据部分不能超过1400个字节,于是如下分成3片,其数据部分1400,1400,1000个字节。

 接受方主机是如何判断收到的IP报中的数据被分片过呢?

  • 如果收到一个IP数据报中的MF标志位是1,则说明该IP数据报中的数据部分被分片过,需要对数据部分进行组装。或者收到一个IP数据报中的MF标志位是0,且偏移量不是0的IP数据报,也说明该IP数据报中的数据部分也被分片过。

接收方主机是如何判断IP数据报中数据部分组装完成或者IP数据报中的数据不需要进行组装了呢?

  • 如果接收方的IP层收到一个IP数据报中的MF标志位是0,且偏移量是0,说明该IP中的数据部分不需要进行组装,如果收到是一个IP数据报中的MF标志位是0,且偏移量不是0,那么就会检测组装数据部分中是否存在缺失的情况(根据偏移量进行检测),如果组装的数据部分是连续的,那么就说明被切片的数据字段已经组装完成。

如果IP数据报中的数据部分被切片后,其中某些分片缺失后会怎么样?

  • 如果某些分片在网络中丢失后,那么接收方中的数据部分组装后是不完整的,所以代表被切分的IP数据报丢失了,所以其它的相同标识分片的数据报是会被丢弃掉,因此发送过来的数据字段就丢失了,如果上层是TCP协议,则会进行超时重传一个IP报,当然效率是会减低很多的。因此,如果将一个IP报中的数据字段被切分多个分片,是会增加该IP报丢失几率的(IP协议是没有可靠协议的),只要其中一个切片丢了,则被切分的IP报就丢了,因此是不建议将IP报进行切分。

TCP协议为了减少IP报被切分的概率,双方主机在握手阶段会交换自己的MSS,那么MSS是什么呢?

  • MSS是TCP层交互给IP层最大分段大小,不包含TCP报头,只包含数据。由于在MAC层中规定了一个最大传输单元MTU,所有的MAC帧的数据部分不能超过该MTU,因此就要求IP层不能传输超过MTU字节的IP报,但IP报中报IP报头和IP数据部分,IP数据部分是由TCP层面决定的因此,所以TCP为了减少被切分的概率,就确定一个MSS限制每一次交互给IP层的数据大小。MSS数据大小去掉IP报头和TCP报头,IP报头和TCP报头都是20个字节(不考虑扩展项)。因此:MSS数据大小=MTU-20-20.(MTU默认值是1500个字节,也可以是其它值)。

 

  • 所以双方主机在建立连接的时候会交换自己的MSS大小值,最终大小取决于双方主机的较小值,如果一台主机的MSS是1200个字节,另一台主机的MSS是1300个字节,所以双方主机MSS都取1200个字节,那么双方通信的时候TCP层面发送的数据都是1200个字节。

Ip层是如何将 IP数据报中的报头和数据部分分开的?

  • Ip层收到一个数据报,会先读取前20个字节,因为前20个字节是固定的,然后再找到首部长度判断报头中是否存在选项,如果首部长度是0101,则说明报头为20个字节,所以刚刚读取的20个字节就是报头,然后再找到总长度,数据大小=总长度-首部长度,所以接下来再读取数据大小个字节就是该数据报的数据部分。

以上是关于IP协议(一)——IP数据报格式及其含义,IP数据报的切分的主要内容,如果未能解决你的问题,请参考以下文章

IP数据报首部格式

IP数据报首部格式

以太网帧TCP与UDP段以及IP数据报格式总结

计算机网络 王道考研2021 第四章:网络层 -- 网络层功能概述IP数据报格式(TCP/IP协议栈)IP数据报分片(MTU)

15.IP数据报格式详解

IP数据包的格式