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发现机制替代,并且采用了扩展头部的概念来支持各种可选项。

相关推荐
^Lim4 分钟前
esp32 JTAG 串口 bootload升级
java·linux·网络
小林熬夜学编程28 分钟前
【Linux系统编程】第五十弹---构建高效单例模式线程池、详解线程安全与可重入性、解析死锁与避免策略,以及STL与智能指针的线程安全性探究
linux·运维·服务器·c语言·c++·安全·单例模式
LuckyTHP30 分钟前
CentOS 9 无法启动急救方法
linux·运维·centos
vvw&32 分钟前
如何在 Ubuntu 22.04 上安装带有 Nginx 的 ELK Stack
linux·运维·nginx·ubuntu·elk·elasticsearch·开源项目
Linux运维老纪34 分钟前
交换机配置从IP(Switch Configuration from IP)
linux·服务器·网络·安全·运维开发·ip
加载中loading...38 分钟前
C/C++实现tcp客户端和服务端的实现(从零开始写自己的高性能服务器)
linux·运维·服务器·c语言·网络
大筒木老辈子40 分钟前
Linux笔记---进程:初识进程
linux·服务器·笔记
木木em哈哈1 小时前
archlinux安装waydroid
linux·运维·服务器
苹果醋31 小时前
vue3 在哪些方便做了性能提升?
java·运维·spring boot·mysql·nginx
程序猿阿伟1 小时前
《进程隔离机制:C++多进程编程安全的坚固堡垒》
服务器·c++·安全