IPv4 头部结构
IPv4 头格式
Version(版本号):IP 协议版本号。目前只有两个版本:IPv4 和 IPv6
Header Length(IP 协议头部长度):IP 协议头部的长度,单位字节(32 bit)需要这个值是因为任选字段的长度是可变的, 这个字段占4bit(最多能表示15个32bit的的字,即4*15=60个字节的首部长度),因此IP 头部最多有60字节长度。正常的长度是20字节; 如果有额外的 IP 的 options 选项,还得加上 option 的长度。
Type of Service (服务类型):标示包传输优先级。总共8位,是由3个优先权位(不再使用),4个 TOS 位,1个固定的0组成。 4个 TOS 位:最新延迟、最大吞吐量、最高可靠性、最小成本,只能4选一。
Total Length(包长度):整个IP包的长度,16位,最大可以标示 65536个字节,Total Length - Header Length = 数据长度。通过 Header Length 和 Total Length 就可以知道数据的起始位置和结束位置。
Identifier(标识符):网络中转发的IP报文的长度可以不同,但如果报文长度超过了数据链路所支持的最大长度,则报文就需要分割成若干个小的片段才能在链路上传输。比如以太网帧中数据最大长度(MTU)为 1500字节,大于 MTU 的都会被分割,被分割的每个包都有相同的一个值,表示这是同一个 ip 包。
Flag(标志位): 标志字段在IP报头中占3位。
Fragmented Offset(偏移量): 当某个 IP 大包分成多片时,各个分片是不按顺序达到目的地的,IP 包根据分片的偏移量进行重组包。(跟TCP 原理一样)
(Time to Live)生存时间:表示数据包经过的路由器个数。如果网络上有些路由器的路由表配置不合理,路由寻址可能会导致死循环,数据包会一直循环传输。 IP 包发送的时候可以设置一个 TTL 值,比如 TTL=64,没经过一个路由器 TTL 减1,减到0 还没到到目的地,路由器会抛弃这个IP包,并使用一个ICMP消息通知发送方。
Protocal(协议): 协议类型 1:ICMP, 2:IGMP, 6:TCP, 17:UDP。
Header CheckSum(首部校验和):校验 IP 协议头,判断IP协议头是否正确传输。
Source Address(源IP): 请求方 IP
Distination Address(目的IP): 响应方 IP
Options(可选字段): IP支持很多可选选项。