0%

IP协议报文

网络模型

网络模型常见的有7,4,5层模型。

IP协议位于四层模型中的网络层。

IP报文

版本:IP协议的版本,占4bit,目前的IP协议版本号为4,下一代IP协议版本号为6。注意这里讨论的是IPv4的报文,IPv6的报文已经不长这个样了。

首部长度:IP报头的长度。固定部分的长度(20字节)和可变部分的长度之和。共占4位。最大为1111,即10进制的15,以32bits4字节为单位,代表IP报头的最大长度可以为15个32bits(4字节),也就是最长可为15*4=60字节,除去固定部分的长度20字节,可变部分的长度最大为40字节。

服务类型:Type Of Service。

总长度:IP报文的总长度。报头的长度和数据部分的长度之和。用16位二进制数表示,单位为8bits1字节,因此,IP报文的最大长度为65535字节。但由于MTU的限制,超过的话需要分片传输。所以就必须要有分片相关信息的字段,后面三个就是分片相关的字段。

标识:唯一的标识主机发送的每一份数据报。通常每发送一个报文,它的值加一。当IP报文长度超过传输网络的MTU(最大传输单元)时必须分片,这个标识字段的值被复制到所有数据分片的标识字段中,使得这些分片在达到最终目的地时可以依照标识字段的内容重新组成原先的数据。

标志:共3位。R、DF、MF三位。目前只有后两位有效,DF位:为1表示不分片,为0表示分片。MF:为1表示“更多的片”,为0表示这是最后一片。

片偏移:本分片在原先数据报文中相对首位的偏移量,字段长度为13位,以8bit1字节为单位,主要作用是为了使分片数据的接收者能够按照正确的顺序重组报文。如果没有这个片偏移值那么接收方收到分片后就不知道把这个分片的数据拼接在哪个位置了。

生存时间:IP报文所允许通过的路由器的最大数量。每经过一个路由器,TTL(Time To Live)减1,当为0时,路由器将该数据报丢弃。TTL 字段是由发送端初始设置一个 8 bit字段.推荐的初始值由分配数字 RFC 指定,当前值为 64。发送 ICMP 回显应答时经常把 TTL 设为最大值 255。

协议:指出IP报文携带的数据使用的是那种协议,以便目的主机的IP层能知道要将数据报上交到哪个进程(不同的协议有专门不同的进程处理)。和端口号类似,此处采用协议号,TCP的协议号为6,UDP的协议号为17。ICMP的协议号为1,IGMP的协议号为2.

首部校验和:计算IP头部的校验和,检查IP报头的完整性。

源IP地址:标识IP数据报的源端设备。32位,最大可以标识 2^32(约等于43亿)个设备。43亿看起来很多,但现在已经所剩无几,所以才出了IPv6,把IP地址直接干到128位,最大可以标识 2^128 (43亿 43亿 43亿 * 43亿)个设备,应该是用不完的。

目的IP地址:标识IP数据报的目的地址。

有兴趣的可以研究下IP分片与分片重组。

参考

IP报文格式详解

IP报文格式

问答

1. IP报文中的TTL设置的规则是什么,最大值255会不会不够?

现行的 IP 网络看似非常庞大,但得益于骨干网络优化,任意两点的最短路径并不长。所以就目前阶段来说TTL一般设置为64或128足以。

参考:

TTL,IP包存活时间 系列文章,作者写的还不错。

2. IP报文怎么计算数据部分长度

IP报文中有两个字段首部长度、总长度,因此IP报文的数据部分长度就等于总长度-首部长度。

3.IP报文为什么需要总长度字段

网上博客的解释:
因为一些数据链路(以太网)有MTU最大传输单元限制,小于最小MTU需要填充一些数据以达到最小长度,大于最大MTU需要对数据报进行分片处理,所以需要总长度来确定 IP 数据部分的内容。

主要原因还是因为以太帧可能会进行填充。

网络层之IP协议

4.为什么以太网MTU通常被设置为1500?

RFC标准定义以太网的默认MTU值为1500。那么这1500的取值是怎么来的呢?

早期的以太网使用共享链路的工作方式,为了保证CSMA/CD(载波多路复用/冲突检测)机制,所以规定了以太帧长度最小为64字节,最大为1518字节。最小64字节是为了保证最极端的冲突能被检测到,64字节是能被检测到的最小值;最大不超过1518字节是为了防止过长的帧传输时间过长而占用共享链路太长时间导致其他业务阻塞。所以规定以太网帧大小为64~1518字节,虽然技术不断发展,但协议一直没有更改。

以太网最大的数据帧是1518字节,这样刨去帧头14字节和帧尾CRC校验部分4字节,那么剩下承载上层IP报文的地方最大就只有1500字节,这个值就是以太网的默认MTU值。这个MTU就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片,如果单个IP报文长度大于MTU,则会在发送出接口前被分片,被切割为小于或等于MTU长度的IP包。

5.超过MTU的报文如何进行分片?

以太网缺省MTU=1500字节,这是以太网接口对IP层的约束,如果IP层有<=1500字节需要发送,只需要一个IP包就可以完成发送任务;如果IP层有>1500字节数据需要发送,需要分片才能完成发送。

以主机发送一个数据载荷长度为2000字节的报文为例说明其分片的过程(假设出接口的MTU值为1500)。在网络层会对报文进行封装,其结构组成:IP头部20字节+数据载荷长度2000字节,报文封装后,整个报文长度为2020字节。在出接口进行转发的时候,发现IP报文的长度超过了MTU的值1500,因此要进行分片处理,详情见下图。

第一片报文,IP报文头固定20字节,数据载荷可以封装1480字节(MTU值1500字节-IP报文头20字节,数据载荷长度须是8的倍数);

第二片报文,复制第一片的IP头,IP报文头固定20字节,数据载荷为剩余的520字节(总数据载荷长度2000字节减去第一片中已封装的1480字节)。如果最后一片报文的长度不足46字节(MTU最小值为46字节),会自动填充至46字节。(可以看到这里会自动填充到46字节,假如整个IP包只有30字节,如果不知道IP包的总长度那么就无法得知IP包的界限。由于分片和填充的原因,所以IP包里面需要有一个总长度的字段。)

所有分片报文在发送至目的主机后,在目的主机进行分片重组,恢复为原报文。在进行重组时,通过IP标志位中的MF用来分辨这是不是最后一个分片,片偏移用来分辨这个分片相对原数据报的位置。通过这几个字段,可以准确的完成数据报的重组操作。

觉得文章有帮助可以打赏一下哦!