TCP/IP协议栈--IP首部选项字段的分析

本文深入解析IP选项处理机制,涵盖选项格式、ip_dooptions函数、记录路由选项、源站和记录路由选项以及时间戳选项等内容。介绍了不同选项的功能及处理流程。

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

IP输入函数(ipintr)将在验证分组格式(检验和,长度等)之后。确定分组是否到达目的地之前,对选项进行处理。

这表明分组所

遇到的每一个路由器以及终于的目的主机都对要分组的选项进行处理。

IP分组内能够包括某些在分组被转发或被接收之前处理的可选字段。IP实现能够用随意顺序处理选项。标准IP首部之后最多可跟

40字节的选项。


1.选项格式

IP选项字段可能包括0个或多个单独选项。选项有两种类型,单字节和多字节。如图所看到的:

全部选项都以1字节类型type字段開始。

在多字节选项中,类型字段后面紧接着一个长度len字段,其它字段时数据data。很多选项

数据字段的第一个字节时1字节的位域offset字段,指向数据字段内的某个字节。长度字节的计算覆盖了类型、长度和数据字段。

类型

被继续分成三个子字段:1bit备份copied标志,2bit类class字段和5bit数字number字段。

下图列出了眼下定义的IP选项。

前两个选项

时单字节选项;其它的是多字节选项。


第1列显示了Net/3的选项常量,第2列和第3列是该类型的十进制和二进制值。第4列是选项的长度。

Net/3列显示的是在Net3中

由ip_dooptions实现的选项。IP必须自己主动忽略全部它不识别的选项。当中安全和流ID没有在Net/3中实现,流ID选项时过时的。
安全选项主要时美国军方使用。
当Net/3对一个有选项的分组进行分片时。它将检查copied标志位。该标志位之处是否把全部选项都备份到每一个分片的IP首部。
class字段把相关的选项按下图进行分组,除时戳选项具有class为2外,全部选项都是class为0.

2.ip_dooptions函数

ipintr在检測分组的目的地址之前调用ip_dooptions.该函数处理分组中它所直到的全部选项。
ip_dooptions顺序读取每一个选项并进行处理:假设遇到EOL选项则终止该循环,假设遇到NOP选项。则忽略它,假设须要未知
选项则忽略。

分组选项被处理后,假设分组须要被转发。分组被传给ip_forward。
假设处理选项时出现了错误,函数就会进入错误处理。发出适当的ICMP错误报文。
以下几节会详细说明选项的处理。

3.记录路由选项

记录路由选项使得分组在穿过互联网时所经过的路由被记录在分组内部,项的大小是源主机在构造时确定的,必须足够保存
全部预期的地址。我们记得在IP分组的首部,选项最多仅仅能有40个字节。

记录路由选项能够有3个字节的开销。

后面紧跟地址的

列表(每一个地址4个字节)。假设该选项是唯一选项,则最多能够有9个(3+4*9=39)地址出现。一旦分配给该选项的空间被填满,
就按通常的情况对分组进行转发,中间的系统就不再记录地址。
下图说明了一个记录路由选项的格式。


假设IP目的地址时某个系统地址(分组已到达目的地),则把接收接口的地址记录在选项中。否则把ip_rtaddr函数提供的外出
接口的地址记录下来。假设ip_rtaddr无法找到目的地路由,则发送一个ICMP主机不可达差错报文。

ip_rtaddr函数
该函数查询路由缓存,必要时查询完整的路由表,来找到到给定IP地址的路由。

函数返回一个指向in_ifaddr结构的指针。该指针

与该路由的外出接口有关。该函数中。rtalloc函数搜索路由表。寻找到目的地的路由。

4.源站和记录路由选项

通常在中间路由器所选择的路径上转发分组。源站和记录路由选项同意源站明白制定一条到目的地的路由,覆盖掉中间路由器
的路由选择决定。并且在分组到达目的地的过程中,把该路由记录下来。
严格路由包括了源站和目的站之间的每一个中间路由器的地址。

宽松路由仅仅指定某些中间路由器地址,在宽松路由中。路由器能够

自由选择两个系统之间的不论什么路径;而在严格路由中,则不同意路由器这么做。
例如以下图,A,B和C是路由器。而HS和HD是源和目的主机。由于每一个接口都有自己的IP地址,所以我们看到路由器A有三个地址:
A1。A2。A3。

相同。B和C也有多个地址。


IP首部的源和目的地址以及在选项中列出的位移和地址表。指定了路由以及分组眼下在该路由中所处的位置。

下图显示了当

分组依照这个宽松路由从HS经过A,B,C到HD,信息时怎样改变的。每行代表当分组被第1列显示的系统发送时的状态,最后
一行显示分组被HD接收。
每一个系统都把接口的地址放到选项去。

通过这样的方法, 分组所採用的路由都被记录在选项中。被记录的路由将被目的系统倒

转过来放到应答分组上,让他们沿着原始的路由的逆方向发送。
除了UDP,Net/3在应答时总是把收到的源路由逆转过来。

选项处理主要包括下面几个部分:
1.源路由的结束
假设IP首部的目的地址是某个本地地址。而且offset所指向的超过了源路由的末尾。源路由中没有地址了,则分组已经到达
了目的地。调用save_rte将源路由保存在例如以下图所看到的的ip_srcrt结构中,由于在终于目的地。运输协议必须可以使用分组中
被记录下来的路由,运输协议必须把该路由倒过来并附在全部应答的分组上。

2.为下一跳更新分组
假设IP首部目的地址是一个本地地址,而且offset指向选项内的一个地址,则该系统是源路由中指定的一个中间系统,分组
还没有到达目的地。在严格路由中,下一个系统必须位于某个直接相连的网络上。而在宽松路由中。假设没有找到下一个系统
的接口或路由。则发送一个ICMP源路由失败差错报文。

假设找到一个接口或一条路由,则更新IP目的地址设置为offset指向的IP地址。

在源路由选项内。用外出接口的地址取代中间

系统的地址,把offset添加。指向路由的下一个地址。
3.多播目的地
假设新的目的地址不是多播地址,在处理全然部选项后,应该把分组转发不是返回给ipintr。
源路由中的多播地址同意两个多播路由器通过不支持多播的中间路由器进行通信。


5.时间戳选项

当分组穿过一个互联网时,时间戳选项使各个系统把它当前的时间表示记录在分组的选项内。时间是以从UTC的午夜開始计算
的毫秒计,被记录在一个32bit的字段里。
假设系统没有准确的UTC或没有每秒更新至少15次,就不把它作为标准时间,非标准时间必须把时间戳字段的高位置位。
有三种时间戳选项,Net/3通过下图所看到的的ip_timestamp结构訪问。


ip_flg指定的三种时间戳选项例如以下:

初始主机必须构造一个具有足够大的数据区存放可能的时间戳和地址的地址的时间戳选项,对于ipt_flg为3的时间戳选项,
初始主机在构造该选项时,填写要记录时间戳的系统的地址。

下图显示了三种时间戳选项的结构。


由于IP选项仅仅有40个字节。所以时间戳选项限制仅仅能有9个时戳,或4个地址和时间时戳对。


<think>好的,我现在需要帮助用户了解如何构造TCP/IP协议栈指纹数据包。用户提到了方法和工具,所以我得先回顾相关知识,特别是引用内容中的相关信息。 首先,根据引用[2],协议栈指纹识别分为主动和被动两种。主动方式需要发送特定构造的数据包,而被动则是分析接收到的包。用户的问题是关于构造数据包,所以应该集中在主动方法上。 接下来,引用[2]提到主动协议栈指纹识别利用不同OS在TCP/IP实现上的差异。例如,FIN探测、ISN采样、DF位设置、窗口大小等。构造指纹数据包时,需要针对这些不同的字段进行设置,以触发目标系统的特定响应。 然后,引用[3]提到IP协议中的TTL、分片等字段可能被用于攻击,但这里用户的需求是构造指纹,所以这些字段的调整可能用于探测而非攻击。比如,设置不同的TTL值或分片标志,观察目标系统的处理方式。 关于工具部分,引用[1]提到Wireshark、Tcpdump等用于分析,而构造数据包可能需要其他工具。常见的如Scapy(Python库)、Nmap的NSE脚本,或者Hping3。这些工具允许用户自定义数据包的各个字段,如TCP选项、标志位、窗口大小等。 还需要考虑如何组合不同的探测技术。例如,发送个带有FIN标志但无ACK的包,或者设置异常的TCP窗口大小,观察目标是否响应或如何响应。此外,不同的OS对ICMP错误消息的处理可能不同,这也可以作为探测的部分。 用户可能需要具体的步骤,比如使用Scapy构造特定数据包,设置不同的TCP选项,发送并捕获响应。同时,工具的使用示例会帮助用户理解实际操作过程。 最后,确保回答结构清晰,分步骤说明方法和工具,并提供相关问题,如用户可能想了解如何分析响应数据或优化指纹探测。</think>### 构造TCP/IP协议栈指纹数据包的方法与工具 #### **方法原理** TCP/IP协议栈指纹识别基于不同操作系统对RFC协议实现的差异性[^2]。构造指纹数据包的核心是通过**主动发送特殊构造的TCP/IP报文**,触发目标系统返回差异化的响应,从而推断其操作系统类型。以下是关键构造方法: 1. **TCP首部字段操控** - **FIN探测**:发送仅包含FIN标志位的TCP包(无SYN/ACK),观察是否返回RST包[^2]。 - **ISN序列号采样**:分析目标系统生成的初始序列号(ISN)的随机性规律。 - **窗口大小设置**:发送异常TCP窗口大小(如0或极大值),记录目标返回的窗口值。 - **ACK值探测**:发送错误的ACK序号,观察是否触发特定响应。 2. **IP层特性操控** - **DF位(Don't Fragment)**:设置或清除DF标志,测试目标系统分片策略[^2][^3]。 - **TTL值差异**:通过初始TTL值(如64、128、255)判断操作系统类型[^2]。 - **分片处理**:发送异常分片包(如重叠分片),观察重组逻辑。 3. **协议交互行为测试** - **ICMP响应抑制**:发送非常规ICMP请求(如错误报文),检查是否被过滤或修改[^2]。 - **TCP选项顺序**:构造包含多个TCP选项(如MSS、窗口缩放、时间戳)的包,记录目标支持的选项及顺序。 --- #### **常用工具** 1. **Scapy(Python库)** - **功能**:灵活构造自定义数据包,支持逐层定义以太网帧、IP/TCP首部字段- **示例代码**: ```python from scapy.all import * # 构造FIN探测包 ip = IP(dst="目标IP") tcp = TCP(dport=80, flags="F") send(ip/tcp) ``` 2. **Nmap(NSE脚本)** - **功能**:通过`-O`参数启用OS检测,内置多种指纹探测脚本(如`osscan`)。 - **命令**: ```bash nmap -O --osscan-guess 目标IP ``` 3. **Hping3** - **功能**:手动构造TCP/UDP/ICMP包,测试特定标志位组合的响应。 - **示例**: ```bash hping3 -S -F -p 80 目标IP # 发送SYN+FIN组合包 ``` 4. **Xprobe2** - **特点**:概率式OS指纹识别工具,通过多维度协议交互生成指纹特征库。 --- #### **技术实现步骤** 1. **数据包构造**:选择目标字段(如TCP窗口大小、IP DF位)并设置非常规值。 2. **批量发送**:通过工具向目标发送多种探测包。 3. **响应分析**:捕获目标返回的报文,记录以下特征: - TCP窗口大小、ISN增长模式 - ICMP错误消息内容及抑制行为 - 分片重组策略和DF位处理逻辑 4. **指纹匹配**:将特征与已知指纹库(如Nmap-os-db)比对,确定操作系统类型[^2][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值