IPv4 Header结构

IPv4 Header结构

P 提供最简单的服务:实现从源到目的的数据转发。不会在传输数据前先与接收方建立连接,也不保证传输的可靠性,它只提供尽力而为的服务。

IP 通信时传输的是 IP 报文, IP 报文由 IP 头部和数据两部分组成。IP 头部包含控制报文转发的必要信息。通过 IP 头部的结构,可以对 IP 的功能有一个详细的了解。

2015-04-14-3.jpg

微信截图_20210330111145.png

版本( Version )

字段长度为 4 比特,表示 IP 的版本号。IPv4 的版本号是 4 ,所以这个字段的值也是 4 。常见的版本号有 IPv4 和 IPv6 。

头部长度( IHL:Internet Header Length )

字段长度为 4 比特,表示 IP 头部大小,单位是 4 字节( 32 比特)。没有可选项的 IP 包,头部长度为 5 ,即 20 字节( 4 × 5 = 20 )。

区分服务( TOS:Type Of Service )

字段长度为 8 比特,用来说明数据是要加速传输还是精确传输,以及数据在传输过程中是否遇到了拥塞。

总长度( Total Length )

字段长度为 16 比特,表示 IP 头部和数据加起来的总字节数。IP 包的最大长度为 65535 字节。

标识( ID:Identification )

字段长度为 16 比特,用于分片重组。同一个分片的标识值相同,不同分片的标识值不同。通常,每发送一个 IP 包,它的值也逐渐递增。另外,即使 ID 相同,如果目标地址、源地址或协议不同的话,也会被认为是不同的分片。

标志( Flags )

字段长度为 3 比特,表示分片信息。每比特的具体含义如下表。

微信截图_20210330111238.png

分片偏移( FO:Fragment Offset )

字段长度为 13 比特,表示分片在整个数据包中的位置。作用是告诉重组分片的设备,应该按照什么样的顺序重组数据包。

生存时间( TTL:Time To Live )

字段长度为 8 比特,表示数据包可以经过的中转路由器数量。每经过一个路由器, TTL 会减少 1 ,直到变成 0 则丢弃改包,避免数据包在网络中无限传递。

注意:TTL与DNS TTL有区别。二者都是生存时间,前者指ICMP包的转发次数(跳数),后者指域名解析信息在DNS中的存在时间。

协议( Protocol )

字段长度为 8 比特,表示 IP 上一层所使用的协议。常见的 IP 上层协议有 TCP 和 UDP 。

微信截图_20210330111316.png

头部校验和( Header Checksum )

字段长度为 16 比特,用来校验数据包的头部是否被破坏。设备会丢弃校验失败的数据包。IPv6 以取消头部校验和字段,通过上层的 TCP 或 UDP 校验协议是否正确。

源地址( Source Address )

字段长度为 32 比特( 4 字节),表示发送端 IP 地址。

目的地址( Destination Address )

字段长度为 32 比特( 4 字节),表示接收端 IP 地址。

可选项( Options )

这个字段很少使用,在 IPv6 协议中已经取消。

填充( Padding )

在有可选项的情况下, 头部长度不是 32 比特的整数倍时,通过向字段填充 0 ,调整为 32 比特的整数倍。

数据( Data )

IP 数据字段,用于存放数据。把 IP 上一层协议的头部也作为数据进行处理。

参考:

https://abcdxyzk.github.io/blog/2015/04/14/kernel-net-sock-raw/