IPv4 Header结构
P 提供最简单的服务:实现从源到目的的数据转发。不会在传输数据前先与接收方建立连接,也不保证传输的可靠性,它只提供尽力而为的服务。
IP 通信时传输的是 IP 报文, IP 报文由 IP 头部和数据两部分组成。IP 头部包含控制报文转发的必要信息。通过 IP 头部的结构,可以对 IP 的功能有一个详细的了解。
版本( 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 比特,表示分片信息。每比特的具体含义如下表。
分片偏移( FO:Fragment Offset )
字段长度为 13 比特,表示分片在整个数据包中的位置。作用是告诉重组分片的设备,应该按照什么样的顺序重组数据包。
生存时间( TTL:Time To Live )
字段长度为 8 比特,表示数据包可以经过的中转路由器数量。每经过一个路由器, TTL 会减少 1 ,直到变成 0 则丢弃改包,避免数据包在网络中无限传递。
注意:TTL与DNS TTL有区别。二者都是生存时间,前者指ICMP包的转发次数(跳数),后者指域名解析信息在DNS中的存在时间。
协议( Protocol )
字段长度为 8 比特,表示 IP 上一层所使用的协议。常见的 IP 上层协议有 TCP 和 UDP 。
头部校验和( 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/