ip包头解析

IPv4包头的详细结构如下:

IPv4包头格式固定部分

•版本(Version):

4比特,表示IP协议版本号,目前最常见的为0100,代表IPv4。

•首部长度(Header Length, IHL):

4比特,单位是4字节,它表示IP头部的总长度,最小值为5(即5x4=20字节),最大值为15(即15x4=60字节)。不含任何可选项时,通常为5。

核心字段

•服务类型(Type of Service, TOS) 或 优先级与QoS:

8比特,定义了数据包的服务质量要求,如延迟、吞吐量等。

•总长度(Total Length):

16比特,指出整个IP数据报(包括IP头部和载荷)的总字节数。

包括:

  1. IP头部:固定部分通常为20字节(如果没有任何可选项),加上可能存在的可变长度的可选字段。

  2. 上层协议数据单元(Payload):即IP数据报所承载的实际有效载荷,它可以是TCP、UDP或其他网络层以上协议的数据(应用层、传输层、网络层)。

•标识符(Identification):

16比特,如果IP数据报由于超过了路径上的最大传输单元(MTU)而必须在通过网络传输时被分成多个较小的数据报片,那么这些数据报片都会携带相同的标识符值,以便接收端主机能够根据该值正确地识别和重组属于同一个原始数据报的所有分片。

•标志(Flags):

3位bit:

•第一位:保留未用(Reserved),通常设置为0。

•第二位:DF(Don't Fragment,不分片标志)。如果该位置1,则表示路由器在转发数据报时不得对其进行分片,否则应当丢弃该数据报并发送一个"分片需要但 DF 设置" ICMP 错误消息给源主机。

•第三位:MF(More Fragments,更多分片标志)。当MF=1时,表明当前数据报是一个较大原始数据报的一部分,并且还有更多的分片紧随其后;而MF=0则表示这是最后一个分片。

通过这些标志位,接收方可以根据标志字段的信息以及片偏移(Fragment Offset)字段来正确地重组来自同一原始IP数据报的所有分片。

•片偏移(Fragment Offset):

13比特,指出该数据报片在原始数据报中的相对位置。

例如,如果一个IP数据报被分为两个分片,第一个分片包含原始数据报的前1000字节,第二个分片包含剩余部分,则第一个分片的片偏移字段通常设置为0,而第二个分片的片偏移字段则会反映出它所携带数据与原始数据报起始点之间的距离(以8字节为单位)。

寻址字段

•生存时间(Time to Live, TTL):

8比特,表示数据报可以经过的最大路由器跳数,每经过一个路由器就减1,当TTL变为0时,路由器丢弃该数据包。

•协议(Protocol):

8比特,指示上层所使用的协议,例如TCP、UDP等。

•首部校验和(Header Checksum):

16比特,用来校验IP头部的完整性。

首部校验和的计算方法是对IP头部的所有16位字进行二进制反码求和,并对结果取反得到最终的校验和值。

当数据包在网络中传输时,每经过一个路由器节点,都会重新计算这个校验和以验证头部是否在传递过程中发生变化。

如果接收端计算出的校验和与接收到的数据包中的校验和不匹配,则说明IP头部可能发生了错误,此时该数据包通常会被丢弃,但IP协议本身不会尝试重传,而是依赖于上层协议(如TCP)来发现数据丢失并进行重传处理。

需要注意的是,IP首部校验和并不包括数据部分(有效载荷),只针对IP头部进行校验。而在IPv6协议中,已经取消了首部校验和字段,转而依靠更低层的链路层(如以太网帧校验序列FCS)和上层协议(如TCP、UDP)的校验机制来保证数据完整性。

源地址和目的地址

•源IP地址(Source IP Address):

32比特,发出数据报的设备的IP地址。

•目的IP地址(Destination IP Address):

32比特,接收数据报的目标设备的IP地址。

可选项(Options):

这部分是可变长的,包含了一系列可选字段,主要用于实验或特殊功能。由于可选项的存在,导致IP头部长度不固定。但实际应用中,大部分IP数据报都不包含可选项,所以常见的IP头部长度为20字节。

数据/填充(Data/Padding):

紧跟在IP头部之后的是上层协议的数据载荷以及可能存在的填充位,用于保证IP头部后面紧跟着的是4字节对齐的数据边界。

特别说明:

IPv6的包头结构有所不同,其头部更为简洁,而且去除了碎片处理机制,由路径MTU发现机制替代,并且采用了扩展头部的概念来支持各种可选项。

相关推荐
Aspiresky21 小时前
浅析Linux进程信号处理机制:基本原理及应用
linux·运维·信号处理
全栈工程师修炼指南1 天前
告别手动构建!Jenkins 与 Gitlab 完美协作,根据参数自动化触发CI/CD流水线实践
运维·ci/cd·自动化·gitlab·jenkins
ajassi20001 天前
linux C 语言开发 (八) 进程基础
linux·运维·服务器
yzx9910131 天前
接口协议全解析:从HTTP到gRPC,如何选择适合你的通信方案?
网络·人工智能·网络协议·flask·pygame
matlab的学徒1 天前
Web与Nginx网站服务(改)
linux·运维·前端·nginx·tomcat
程思扬1 天前
利用JSONCrack与cpolar提升数据可视化及跨团队协作效率
网络·人工智能·经验分享·docker·信息可视化·容器·架构
Insist7531 天前
prometheus安装部署与alertmanager邮箱告警
linux·运维·grafana·prometheus
xqlily1 天前
Linux操作系统之Ubuntu
linux·运维·ubuntu
init_23611 天前
isis dis选举
网络
倔强的石头1061 天前
【Linux指南】Makefile入门:从概念到基础语法
linux·运维·服务器