前面说过,网络层的作用就是互连网络,实现各个子网之间的互联,经过前面几篇的铺垫以及数据链路层的学习,我们自然而然地就会问一个问题:网络层中的数据报文是啥样子的?跟以太网协议中的帧结构一样吗?
学习了网络层中的报文结构,我们再去学习报文是如何进行路由的,才是正确的学习方向。
注意,本篇文章还涉及到IP数据分片的说明,这个实际上是考研或网络工程师认证考试的一个必会知识点,这里我将其补充进行详细说明。
前方高能!!!持续干货!!!
一、IP协议概述
我们之前说过,数据链路层最重要的协议是以太网协议,那么网络层也有一个最重要的协议,那就是伟大的IP协议(IP是Internet Protocol
(网际互连协议)的缩写,是TCP/IP体系中的网络层协议)。
一句话就是:OSI 第 3 层(网络层)的最主要协议就是 IP 协议。
我们之前学习了以太网协议,涉及以太网帧的结构定义,之前说过,以太网帧除了要发送的消息和CRC校验外,还有三个重要信息:目的MAC地址、源MAC地址、IP协议版本。
同样地,对于 OSI 第 3 层,我们也得确定传输的消息单元中需要包含哪些信息,以及这些信息排列的顺序。
在一头扎进IP报文前,有必要理下完整数据报文的结构,防止混乱:
这里就是OSI的封装的概念,一条数据从上到下经过OSI模型传递的时候,会在实际的数据上不停地添加HTTP头、TCP/UDP头、IP头以及以太网的头。我们现在已经学习到IP这一层,下面所谓的数据其实包含了HTTP头、TCP/UDP头、以及实际的数据。
这是为了方便学习,并且我们的网络层其实不关心里面的TCP头是啥,因此等学习到传输层的时候我们再慢慢分解出来。就好像我们学习以太网协议的时候,只关心了以太网的头,具体数据一带而过。那么现在来到了网络层,我们就需要把以太网协议中的数据再做一次细化,着重把我们网络层感兴趣的IP头拿出来分析。
好了,下面的文章实际上关心的就是上图说的IP头部分里面有啥。
二、小试牛刀
那么我们的网络层除了上层的数据外,还有啥呢?我们来实际抓个包看看,我找了一个HTTP的网站,用 wireshark 抓了一个包,我点开了一个HTTP协议的报文,wireshark是常用的抓包软件,后续将单独开辟一篇来介绍如何使用,抓包结果如图所示:
我们在下面可以看到各层的信息,比如第一层物理层:
-
Frame 2004
,表示帧的编号是2004 -
该帧的大小为464字节,即3704个bits
第二层的数据链路层中包含:
-
目标MAC地址
-
源MAC地址
-
IP协议
可以看到第三层包含的内容比以第二层多多了,OSI第二层消息单元被称为以太网帧或者简称帧,有固定的格式;我们的第三层也是如此,也有固定的格式,不过消息单元被称为数据报(datagram
)/数据包(packet
)。
我们先挑个简单的来看看,最后两个是源IP和目的地IP。这个跟以太网的MAC地址有点像,很好理解。
思考一个小问题:为了向一台机器发送消息,是否需要知道它的子网掩码?
答案是不需要的,因为我们获取到了对方的IP之后,结合我们自己的子网掩码就很容易地知道它跟我们这台机器在不在同一个网络中,在的话直接用第2层协议来通信,不在则需要借助第3层来通信。
第二个小问题:源IP在前面,目的IP在后面,这顺序跟第二层相反,有搞错吗?换句话说,这里需不需要将目的IP放在前面?
不需要,因为当我们数据传送到对方网络后,OSI第二层就可以根据MAC地址判断谁是接收方电脑了,所以第2层将目的MAC放在前面。那么既然已经确定了谁是接收者,那么IP就不是首要确定的信息了,所以OSI第3层考虑把其他更重要的信息放在了前面,而把IP的信息放在了末尾。
好了,简单的搞定了,意味着热身运动结束了,下面就开始看看报文其他元素的含义吧。终究还是要面对疾风的。
三、IP数据报首部结构整体说明
跟以太网有18个字节的帧头一样,IP报文也有它自己的头,称为首部,以及数据部分:
一个IP数据报由首部和数据两个部分组成。
其中首部的前一个部分是固定部分,长度固定共20字节,这是所有IP数据报必须具有的。
后一部分是可变部分,其长度是可变的,不是必须的,最小是0字节,最大是40字节。
所以IP的报文格式是这样:
四、IP数据报首部固定部分
那么下面重点当然就落在了首部的格式上了,并且重点是固定部分:
(1) 版本:占4位,指IP协议的版本。目前广泛使用的IP协议版本有两种IPv4和IPv6。
(2) 首部长度:占4位,该字段的取值以4字节为单位。所以首部长度必须是4B的整数倍。如首部长度字段的4个二进制位分别是1111(对应十进制是15),则IP协议首部的长度是15 × 4B = 60B(字节),表示IP数据报首部包含20字节的固定部分和最大40字节可变部分。由于IP数据报首部的固定部分长度固定是20,所以首部字段最小从0101开始。
(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位。这个上面已解释。
五、IP数据报首部可变部分
(1) 可选字段:长度可变,从1字节~40字节。可变部分是为了增加IP数据报的功能,如用来支持排错、测量以及安全等措施。
(2) 填充:IP数据报的首部长度必须是4B的整数倍,所以如果首部长度不满足4B整数倍时,就使用填充字段将首部填充到4B的整数倍。
六、数据分片原理说明
上面1.3中第5个说到,标识、标志、片偏移是关于IP数据报分片的。那为什么会出现分片呢?
什么叫分片?
将报文分割成多个片段的过程叫做分片。
为什么要分片?
我们知道,数据链路层中最大的帧长为1518,IP报文1500byte
+帧头18byte
= 1518byte
那么也就是说,一帧的数据部分最大是1500字节,这个其实就是以太网协议中规定的最大传输单元MTU
。
以太网规定其最大传送单元MTU
的值是1500
字节,如果从网络层传输下来的数据报长度超过MUT
值,就必须把过长的数据报进行分片处理。
很容易可以想到,分完片后接收方肯定要重组,那么我们的分片就得有依据,否则报文重组就头大了。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的整数倍。
七、分片例子理解
假设一个数据报的总长度是3820个字节,其数据部分为3800字节长(首部仅仅使用固定部分),需要分片为长度不超过1420字节的数据报片。
因固定首部长度为20字节,因此每个数据报片的长度不超过1400字节。于是分为3个报片,其数据部分的长度分别为1400、1400、1000字节。原始数据报首部被复制为各个数据报的首部,但是必须修改有关字段。
对于原始数据报、数据报片1、2、3的首部部分信息如下图,(原始数据报的标识取12345)
八、分片实际抓包举例
以下三张图,就是一个大报文被分片成了三份传输的抓包报文:
我们来简单分析,我们可以看到在数据链路层传递的帧的大小分别为:838字节、838字节、332字节。
首先我们可以看到,标识字段即Identification
都是一样的,表示这3个数据报是一个家子的,到时候接收端接收的时候就还把这一家子的人整合起来即可。
并且标志中的DF和MF字段我在图中做了解释,比较简单。
最重要的是偏移量,我们看下第一个报文,总长度为838字节,去除以太网的帧头18个字节,实际上以太网上传输的数据长度为820字节,这个与抓包里面的Total Length
长度是吻合的。
那么由于IP报文的首部固定部分有20字节长度,那么无可变部分,那么实际数据长度就是800字节。结合片偏移的单位是8B,那么显然第二个分片的片偏移应该是800/8=100。(只是wireshark
抓包后又乘上了8来表示实际的偏移字节),所以第二个显示800,第三个显示1600。可见wireshark
的贴心。
你也许会问,为啥不采用MTU为1400字节来分片呢?
实际上,当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同)通过这段水管最大水量就是由中间最细的水管决定。
对于网络层的上层协议而言,它们对水管粗细不在意,它们认为这是网络层的事情。网络层IP协议会检查每个从上层协议下来的数据包大小,并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是降低了传输性能,本来可以一次搞定的事情,分多次搞定,所以在网络层更高一层(即传输层)的实现中往往会对此加以注意。有些高层因为某些原因就会要求不能分层,因此会在IP数据包包头加上一个DF标签。这样当这个数据包在一大段网络里传输的时候,如果遇到MTU小于IP数据包的情况,转发设备就会根据要求丢弃这个数据包。然后返回一个错误信息给发送者。
后续学习TCP的时候我们还将接触到MSS的概念,到时候我们回过头来结合MTU进行对比。
分析了这种分片的报文,那么不分片的报文就更简单了,不再赘述了。下面进入本篇文章的总结阶段。
九、总结
注意区分几个字段的单位:
-
首部长度:单位是4B,表示数据报的首部的长度。
-
总长度:单位是B,标识整个数据报的长度。
-
片偏移量:单位是8B,表示某一分片相对于用户数据字段的起点。
本篇文章重点学习了IP的报文首部各个字段的位置和含义,关键知识点总结如下:
-
IP数据包由首部+数据组成,其中首部分为固定的20字节+可选部分(长度可变且非必须,最小为0字节,最大为40字节)
-
首部包含佷多字段,比以太网层的帧结构复杂多了
-
版本:IP协议版本,IPV4/IPV6
-
首部长度:数据报首部长度,单位是4B
-
区分服务:一般情况下不用
-
总长度:数据报总长度,即首部+数据部分
-
标识:分片的标识要和原数据的标识一致
-
标志:MF(是否还有分片,1表示还有分片,0表示已经是最后一个分片)、DF(能否分片,0表示允许分片,1表示不允许分片)
-
片偏移:分片相对于用户数据字段的起点,单位是8字节
-
生存时间TTL:数据报寿命,每经过一个路由器生存时间减一
-
协议:数据部分使用的协议类型,6标识TCP,17标识UDP
-
首部校验和:只校验数据报首部
-
源地址和目的地址
-
wireshark
很人性化,很有必要学习下哦
好了,至此,,我们现在知道了 IP 数据报的头部各个元素的含义及其位置。我们之前提到过,一个网络到另一个网络,中间要穿过佷多不同的网络,那么就可能存在多条路径,这就是路由,并且涉及OSI第三层最重要的硬件:路由器,这就是我们下面要学习的重点,本文完。
原文始发于微信公众号(幕后哈土奇):二十一、网络层篇-一文详尽IP数据报首部结构
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/114011.html