ip首部可选字段_10、网络层IP报文首部结构分析

本文详细介绍了IP报文的结构,包括首部的固定部分和可变部分,强调了版本、首部长度、区分服务、总长度等关键字段。同时,讲解了数据分片的原因、过程以及标识、标志、片偏移字段的作用。通过实例分析,帮助读者理解IP数据报分片的实际应用。
摘要由CSDN通过智能技术生成

前面说过,网络层的作用就是互联网络,实现各个子网之间的通信,经过前面两篇的铺垫以及数据链路层的学习,我们自然而然地就会问一个问题:网络层中的数据报文是啥样子的?跟以太网协议中的帧结构一样吗?话不多说,开干IP报文,前方高能,非战斗人员快速撤退。

61ac252eccbd68b758d888f548ff2b4b.png

做人要开心~学习也要开心~

一、IP报文

我们之前说过,数据链路层最重要的协议是以太网协议,那么网络层也有一个最重要的协议,那就是伟大的IP协议(IP是Internet Protocol,网际互连协议的缩写,是TCP/IP体系中的网络层协议)。

一句话就是:OSI 第 3 层(网络层)的最主要协议就是 IP 协议。

我们之前学习了以太网协议,涉及以太网帧的结构定义,之前说过,以太网帧除了要发送的消息和CRC校验外,还有三个重要信息:目的MAC地址、源MAC地址、IP协议版本。

同样地,对于 OSI 第 3 层,我们也得确定传输的消息单元中需要包含哪些信息,以及这些信息排列的顺序。

在一头扎进IP报文前,有必要理下完整数据报文的结构,防止混乱:

6671471d759bb9713bc9f53d5bb95920.png

这里就是OSI的封装的概念,一条数据从上到下经过OSI模型传递的时候,会在实际的数据上不停地添加HTTP头、TCP/UDP头、IP头以及以太网的头。我们现在已经学习到IP这一层,下面所谓的数据其实包含了HTTP头、TCP/UDP头、以及实际的数据。

这是为了方便学习,并且我们的网络层其实不关心里面的TCP头是啥,因此等学习到传输层的时候我们再慢慢分解出来。就好像我们学习以太网协议的时候,只关心了以太网的头,具体里面的数据一带而过。那么现在来到了网络层,我们就需要把以太网协议中的数据再做一次细化,着重把我们网络层感兴趣的IP头拿出来分析。

好了,下面的文章实际上关心的就是上图说的IP头部分里面有啥。

1.1 小试牛刀

那么我们的网络层除了上层的数据外,还有啥呢?我们来实际抓个包看看,我找了一个HTTP的网站,用 wireshark 抓了一个包,我点开了一个HTTP协议的报文,如图所示:

bd8166b825aa8564f782f867354df97b.png

我们在下面可以看到各层的信息,比如第一层物理层:

  1. Frame 2004,表示帧的编号是2004

  2. 该帧的大小为464字节,即3704个bits

第二层的数据链路层中包含:

  1. 目标MAC地址

  2. 源MAC地址

  3. IP协议

可以看到第三层包含的内容比以第二层多多了,OSI第二层消息单元被称为以太网帧或者简称帧,有固定的格式;我们的第三层也是如此,也有固定的格式,不过消息单元被称为数据报(datagram)/数据包(packet)。

我们先挑个简单的来看看,最后两个是源IP和目的地IP。这个跟以太网的MAC地址有点像,很好理解。

思考一个小问题:为了向一台机器发送消息,是否需要知道它的子网掩码?

答案是不需要的,因为我们获取到了对方的IP之后,就很容易地知道它跟我们这台机器在不在同一个网络中,在的话直接用第2层协议来通信,不在则需要借助第3层来通信。

第二个小问题:源IP在前面,目的IP在后面,这顺序跟第二层相反,有搞错吗?换句话说,这里需不需要将目的IP放在前面?

不需要,因为当我们数据传送到对方网络后,OSI第二层就可以根据MAC地址判断谁是接收方电脑了,所以第2层将目的MAC放在前面。那么既然已经确定了谁是接收者,那么IP就不是首要确定的信息了,所以OSI第3层考虑把其他更重要的信息放在了前面,而把IP的信息放在了末尾。

好了,简单的搞定了,意味着热身运动结束了,下面就开始看看报文其他元素的含义吧。终究还是要面对疾风的。

1.2 报文结构

跟以太网有18个字节的帧头一样,IP报文也有它自己的头,称为首部,以及数据部分:

f4c2001b5bace6294852bed9b393d5e6.png

一个IP数据报由首部和数据两个部分组成。

其中首部的前一个部分是固定部分,长度固定共20字节,这是所有IP数据报必须具有的。后一部分是可变部分,其长度是可变的,不是必须的。

所以IP的报文格式是这样:

b3d71fe8ab0029ef73b60ddcc8e17306.png

1.3 首部的固定部分

那么下面重点当然就落在了首部的格式上了,并且重点是固定部分:

a7f0a74655aad5cc879fd214f1ebaf20.png

(1) 版本:占4位,指IP协议的版本。目前广泛使用的IP协议版本有两种IPv4和IPv6。

(2) 首部长度:占4位,其单位是4B。所以首部长度必须是4B的整数倍。如首部长度字段的4个二进制位分别是1111(对应十进制是15),则IP协议首部的长度是15 × 4B = 60B(字节)。由于IP数据报首部的固定部分长度固定是20,所以首部字段最小从0101(5*4B)开始。

(3) 区分服务:占8位,一般情况下不使用该字段。只有使用区分服务时,这个字段才起作用,如要求当前的数据报设置高优先级优先发送。

(4) 总长度:占16位,表示首部和数据部分长度之和,单位是字节。

(5) 标识、标志、片偏移是关于IP数据报分片的,下面详细说下。

(6) 生存时间:占8位,表示数据报在网络中的寿命。由发送数据报的源点设置这个字段,其目的是为了防止那些无法交付的数据报无限制的在互联网中兜圈子(例如从路由器R1转发到R2,再转发到R3,然后又转发到R1),因而白白浪费网络资源。数据报每经过一个路由器,这个值就会减1,当减至0时,就丢弃该数据报。window系统默认为128。发送 ICMP 回显应答时经常把 TTL 设为最大值 255。

(7) 协议:占8位,协议字段是指出次数据报所携带的数据是使用的协议。这里记两个协议字段的值:6表示TCP协议,17表示UDP协议。

(8) 首部校验和:占16位,只校验数据报的首部,不检验数据部分。数据报每经过一个路由器都要重新计算一下首部校验和(一些字段,如生存时间、标志、片偏移可能发生了变化)。

(9) 源地址和目的地址:各占32位。这个上面已解释。

1.4 首部的可变部分

(1) 可选字段:长度可变,从1字节~40字节。可变部分是为了增加IP数据报的功能,如用来支持排错、测量以及安全等措施。

(2) 填充:IP数据报的首部长度必须是4B的整数倍,所以如果首部长度不满足4B整数倍时,就使用填充字段将首部填充到4B的整数倍。

1.5 数据分片

上面1.3中第5个说到,标识、标志、片偏移是关于IP数据报分片的。那为什么会出现分片呢?

什么叫分片?

将报文分割成多个片段的过程叫做分片。

为什么要分片?

我们知道,数据链路层中最大的帧长为1518,IP报文1500byte +帧头18byte = 1518byte

那么也就是说,一帧的数据部分最大是1500字节,这个其实就是以太网协议中规定的最大传输单元MTU

以太网规定其最大传送单元MTU的值是1500字节,如果从网络层传输下来的数据报长度超过MTU值,就必须把过长的数据报进行分片处理。

很容易可以想到,分完片后接收方肯定要重组,那么我们的分片就得有依据,否则报文重组就头大了。IP报文中用标识、标志、片偏移来用于数据报文分片。

(1) 标识:占16位,所有分片的数据报的标识必须要和原数据报的标识相同。假如一个数据报的标识是12345,这个数据报过大,分片后将它分为3个小的数据报,这3个较小的数据报的标识也必须是12345,可以理解这3个数据报是一个家族的。相同的标识字段的值可以使分片后的各个数据报最后能正确的重装成原来的数据报。

(2) 标志:占3位,目前只有两位有意义。

1) 最低位即第3位记为MF(More Fragment),意思是是否还有更多分片。当值为1时,表示该分片不是最后一片,后面还有分片,当值为0时,表示这是原数据报分片后的最后一片数据报,后面已经没有更多的分片了。

2) 中间位即第2位记为DF(Don't Fragment),意思是原数据报能否分片。当值为1时,表示该数据报不允许分片,当值为0时,表示该数据报允许分片。

(3) 片偏移:占13位,以8B为单位。其表示较长分组分片后,某一片在原分组中的相对位置,也就是说相对于用户数据字段的起点,该片从何处开始。这也就是说,除了最后一个分片,每个分片的长度一定是8B的整数倍。

1.6 分片例子理解

假设一个数据报的总长度是3820个字节,其数据部分为3800字节长(首部仅仅使用固定部分),需要分片为长度不超过1420字节的数据报片。

因固定首部长度为20字节,因此每个数据报片的长度不超过1400字节。于是分为3个报片,其数据部分的长度分别为1400、1400、1000字节。原始数据报首部被复制为各个数据报的首部,但是必须修改有关字段。

0297ed09bb751b7e550caf28cb0d530e.png

对于原始数据报、数据报片1、2、3的首部部分信息如下图,(原始数据报的标识取12345)

d89250fee39df2d965079b5c8512c59b.png

1.7 分片例子实际报文

以下三张图,就是一个大报文被分片成了三份传输的抓包报文:

bfdef1f9717cca4cd9e68ef11a806379.png

a3cd4b312e73b5285a8b0fd8148d7bd3.png

15e289412cda35d6b092e17e31b65883.png

我们来简单分析,我们可以看到在数据链路层传递的帧的大小分别为:838字节、838字节、332字节。

首先我们可以看到,标识字段即Identification都是一样的,表示这3个数据报是一个家子的,到时候接收端接收的时候就还把这一家子的人整合起来即可。

并且标志中的DF和MF字段我在图中做了解释,比较简单。

最重要的是偏移量,我们看下第一个报文,总长度为838字节,去除以太网的帧头18个字节,实际上以太网上传输的数据长度为820字节,这个与抓包里面的Total Length长度是吻合的。

那么由于IP报文的首部固定部分有20字节长度,这里显然不需要用到可变部分,那么实际数据长度就是800字节。结合片偏移的单位是8B,那么显然第二个分片的片偏移应该是800/8=100。(只是wireshark抓包后又乘上了8来表示实际的偏移字节),所以第二个显示800,第三个显示1600。可见wireshark的贴心。

分析了这种分片的报文,那么不分片的报文就更简单了,不再赘述了。

二、总结

注意区分几个字段的单位:

  1. 首部长度:单位是4B,表示数据报的首部的长度。

  2. 总长度:单位是B,标识整个数据报的长度。

  3. 片偏移量:单位是8B,表示某一分片相对于用户数据字段的起点。

本篇文章重点学习了IP的报文首部各个字段的位置和含义,关键知识点总结如下:

  1. IP数据包由首部+数据组成,其中首部分为固定的20字节+可选部分(长度可变且非必须)

  2. 首部包含佷多字段,比以太网层的帧结构复杂多了

    1. 版本:IP协议版本,IPV4/IPV6

    2. 首部长度:数据报首部长度,单位是4B

    3. 区分服务:一般情况下不用

    4. 总长度:数据报总长度,即首部+数据部分

    5. 标识:分片的标识要和原数据的标识一致

    6. 标志:MF(是否还有分片,1表示还有分片,0表示已经是最后一个分片)、DF(能否分片,0表示允许分片,1表示不允许分片)

    7. 片偏移:分片相对于用户数据字段的起点,单位是8B

    8. 生存时间TTL:数据报寿命,每经过一个路由器生存时间减一

    9. 协议:数据部分使用的协议类型,6标识TCP,17标识UDP

    10. 首部校验和:只校验数据报首部

    11. 源地址和目的地址

  3. wireshark很强大也很人性化,很有必要学习和实际用下哦~

好了,至此,,我们现在知道了 IP 数据报的头部各个元素的含义及其位置。我们之前提到过,一个网络到另一个网络,中间要穿过佷多不同的网络,那么就可能存在多条路径,这就是路由,并且涉及OSI第三层最重要的硬件:路由器,这就是我们下面要学习的重点。本文先完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值