IP首部格式[转载]

本文详细解析了IPv4数据包的首部格式及各字段含义,包括版本、首部长度、服务类型等,并介绍了如何通过这些字段来理解IP数据包在网络中的传输方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCP 传输首部是 IP首部,所以把IP首部格式 拿过来研究下,看IP首部解码过程;
 
来源:51CTO博客,地址: http://lihuan.blog.51cto.com/4391550/799911 
 
原文如下:
 

 IP包首部格式

IPv4首部一般是20字节长。在以太网帧中,IPv4包首部紧跟着以太网帧首部,同时以太网帧首部中的协议类型值设置为080016。 IPv4提供不同,大部分是很少用的选项,使得IPv4包首部最长可扩展到60字节(总是4个字节4个字节的扩展)

0

4

8

12

16

19

24

31

版本

首部长度

服务类型

长度

认证

标志

段偏移量

TTL

协议

校验和

源IP地址

目的IP地址

选项 ...

IP包头字段说明

版本:4位,指定IP协议的版本号。

包 头长度(IHL):4位,IP协议包头的长度,指明IPv4协议包头长度的字节数包含多少个32位。由于IPv4的包头可能包含可变数量的可选项,所以这 个字段可以用来确定IPv4数据报中数据部分的偏移位置。IPv4包头的最小长度是20个字节,因此IHL这个字段的最小值用十进制表示就是5 (5x4 = 20字节)。就是说,它表示的是包头的总字节数是4字节的倍数。

服务类型:定义IP协议包的处理方法,它包含如下子字段

过程字段:3位,设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制)

延迟字段:1位,取值:0(正常)、1(期特低的延迟)

流量字段:1位,取值:0(正常)、1(期特高的流量)

可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)

成本字段:1位,取值:0(正常)、1(期特最小成本)

未使用:1位

长度:IP包的总长

认证:

标志:是一个3位的控制字段,包含:

保留位:1位

不分段位:1位,取值:0(允许数据报分段)、1(数据报不能分段)

更多段位:1位,取值:0(数据包后面没有包,该包为最后的包)、1(数据包后面有更多的包)


段偏移量:当数据分组时,它和更多段位(MF, More fragments)进行连接,帮助目的主机将分段的包组合。

TTL:表示数据包在网络上生存多久,每通过一个路由器该值减一,为0时将被路由器丢弃。

协议:8位,这个字段定义了IP数据报的数据部分使用的协议类型。常用的协议及其十进制数值包括ICMP(1)、TCP(6)、UDP(17)。

校验和:16位,是IPv4数据报包头的校验和。

源地址(Source Address,SA)

发送IP数据包的IP地址,占32位。

目的地址(Destination Address)

接收IP数据包的IP地址,也占32位。

选项(Options)+填充(Padding)

这两个选项较少使用,只有某些特殊的封包需要特定的控制才会利用到。共32位。这些选项通常包括:

? 安全和处理限制:用于军事领域

? 记录路径:让每个路由器都记下它的IP地址

? 时间戳:让每个路由器都记下它的IP地址和时间

? 宽松的源站选路:为数据报指定一系列必须经过的IP地址

? 严格的源站选路:与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址。

以上这些选项很少被使用,而且并非所有的主机和路由器都支持这些选项。选项字段一直都是以32位作为界限,在必要的时候插入值为0的填充字节。这样就保证IP首部始终是32位的整数倍(这是首部长度字段所要求的)。

从以上IP包头格式可以看出,IP协议包头大小也有两种:当没有“选项”这个字段时,为160位,20个字节;当有“选项”字段时为192位,24个字节。它与TCP协议包头大小是一样的。

### 计算机网络 IP 首部格式解释 IP 数据报的首部对于确保数据在网络中的正确传输至关重要。IPv4 的首部固定部分有 20 字节,可选字段使得整个首部最大可达 60 字节[^2]。 #### 版本 (Version) 占 4 位,指明 IP 协议版本号。当前广泛使用的 IPv4 使用数值 `4` 表示。 #### 头长度 (IHL, Internet Header Length) 同样占用 4 位,表示头部所含 32 比特字的数量。由于最小头部长为 20 字节(即五个 32-bit),因此该字段至少应设为 `5`。当存在选项时,此值会相应增加。 #### 差分服务字段 (DS Field, Differentiated Services Field) 原称为 TOS(Type of Service),现在扩展成 DS 字段用于 QoS 控制,共占据 8 位。 #### 总长度 (Total Length) 这是一个 16 位字段,它定义了整个 IP 数据包的总长度,单位是字节。这不仅涵盖了头部也包含了负载的数据量。考虑到以太网 MTU 是 1500 字节,这意味着单个未分片的 IP 数据报的最大大小被限定在这个范围内[^1]。 #### 标识符 (Identification) 由发送方分配的一个 16 位数,在重组来自分片的原始数据报过程中起作用。 #### 标志 (Flags) 三个标志位用来控制和识别分片情况: - **保留位**:始终置零。 - **DF(Don't Fragment)** :如果设置则不允许对该数据报进行分片处理。 - **MF(More Fragments)** :指示后面还有更多片段;最后一个片段不设置此标记。 #### 分片偏移 (Fragment Offset) 这个 13 位域指出相对于原始数据报第一个字节的位置来定位各分片位置的信息。 #### 生存时间 (TTL, Time to Live) 每经过一个路由器就减一,直到达到零为止就会丢弃数据包并返回 ICMP 报文给源地址。这样可以防止数据包无限循环于互联网之中。 #### 协议 (Protocol) 指定上层协议类型以便接收端知道如何解析后续载荷内容。例如 TCP 对应的是 `6`, UDP 则对应 `17`. #### 首部校验和 (Header Checksum) 为了保证 IP 首部本身的完整性而计算得出的一个 16 位检验码。注意这里只针对 IP 首部做 CRC 校验,并不对有效负荷负责。 #### 源地址与目的地址 (Source Address and Destination Address) 各自占有四个八位组的空间分别记录下发出请求以及预期回应的目标机器各自的逻辑地址信息。 ```c struct ip { u_int8_t ip_vhl; /* version << 4 | header length >> 2 */ u_int8_t ip_tos; /* type of service */ u_int16_t ip_len; /* total length */ u_int16_t ip_id; /* identification */ u_int16_t ip_off; /* fragment offset field */ #define IP_RF 0x8000 /* reserved fragment flag */ #define IP_DF 0x4000 /* dont fragment flag */ #define IP_MF 0x2000 /* more fragments flag */ #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ u_int8_t ip_ttl; /* time to live */ u_int8_t ip_p; /* protocol */ u_int16_t ip_sum; /* checksum */ struct in_addr ip_src,ip_dst; /* source and dest address */ }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值