TCP/IP 分段与重组

TCP/IP 分段与重组 
作者: yunongweb 2005-05-19 10:10 分类:默认分类 标签:


描述stream4的工作过程及原理,流程等

stream4可以检测的何种入侵及攻击(看其规则)
stream4及其相关插件共同工作可以检测哪些种类的攻击,构成一个列表
stream4的规则有哪些???察看snort.conf文件

根据规则添加或修改相关的stream4的检测规则
并且可以检测出额外类型的攻击(添加新状态,构成新规则)

IP碎片:

在ip包头中,identification 16位的标志符  代表一个分组
      offset:偏移量  代表一个分片在一个分组中的位置
当一个路由器分割一个IP分组时,16位的标志符是必须复制的段,它能够唯一地标志一个IP分组,使目的主机能够判断每个碎片所属的IP分组,而且每个碎片中都偏移值,用来标记素片在IP分组中的位置

IP碎片通常会按照顺序到达目的地,最后的碎片的MF位为0(表示这是最后一个碎片)

碎片重叠问题 
  
    目前,主要有两种技术用于逃避检测设备的监视。第一种就是使用尽可能小的碎片,例如:每个碎片只有8个字节(碎片最小8个字节),而每个碎片中都没有足够的信息,从而逃过检测。
  
    另外一种方式就是碎片重叠。在IP分组中有一个13位的域(fragment offset),标识每个碎片在原始IP分组中的偏移。构造错误的碎片偏移值,可能造成碎片的重叠


tcp流重组:

重组TCP数据流需要进行序列号跟踪,但是如果在传输过程中丢失了很多报文,就可能使入侵检测系统无法进行序列号跟踪。如果没有恢复机制,就可能使入侵检测系统不能同步监视TCP连接。

最主要的问题是入侵检测系统必须知道被监视系统宣布的窗口大小。TCP包头的窗口域标识TCP连接接收方能够接收的数据数量,能够防止发送方向自己的缓冲区发送太多数据。如果收到的数据数量超过窗口的大小,这些数据就会被丢弃。而且,入侵检测系统对窗口的反应比受监视系统的反应要慢些。如果在两者不一致的期间有报文到达就会造成问题。 
  
    另外,攻击者发送一些序列号相同而负载不同的报文也会对入侵检测系统的TCP流重组造成问题,这些序列号相同的报文包头的各个域完全相同(除了校验和域)。很显然,接收方只会处理所有序列号相同的报文中的一个,其它的都会被丢弃。

数据重叠 
  
    和IP碎片一样,TCP报文段也可能非顺序到达,也存在重叠数据覆盖问题。而且,究竟是新到数据覆盖先到数据也由接收方操作系统决定


与包过滤防火墙不同的是,状态检测防火墙是基于会话信息做出决策的,而不是包的信息;

状态检测防火墙验证进来的数据包时,判断当前数据包是否符合先前允许的会话,并在状态表中保存这些信息。状态检测防火墙还能阻止基于异常TCP的网络层的攻击行为。网络设备,比如路由器,会将数据包分解成更小的数据帧,因此,状态检测设备,通常需要进行IP数据帧的重组,按其原来顺序组装成完整的数据包。

分段

对于不同的网络,其中传送的包大小可能不一样,因此把大包分小的功能是必须的。数据报也可以被标记为“不可分段”,如果一个数据报被如何标记了,那么在任何情况下都不准对它进行分段。如果不分段到不了目的地,那就把包在半路抛弃了。在本地网内进行的重新分段和重组对IP模块是不可见的,这种方法也可以使用。

本地网分段和重组把重组的各段加上标记,接收方使用这些标记使不同的段区别开来。段偏移量域告诉接收方应该把这一段放在什么地方,多段标记指示最后一个段,利用不同的域完全可以重组一个数据报。标记域是用于唯一标记数据报的,它是最初的发送方设置,而且要保证数据报在网络传输的全过程中它中唯一的。最初的发送方把多段标记设置为零,段偏移量设置为零。

我们假设IP模块把一个大数据报分为两个小的,IP模块首先取得数据报头,再分隔数据为两份,将数据报头加在两份数据上。分隔数据时以8个字节为单位,第二段不一定是8个字节,但第一个必须是。我们把第一段中的8位字节数称为段块数(NFB)。新生成的第一个数据报内是生成的第一段数据,设置多段标记为1;新生成的第二个数据报内是生成的第二段数据,多段标记等于原来数据报内的值,段偏移量等于原数据报中的值加上NFB。上述过程可以从2扩展至N的情况。

对段的重组要求以下四个域有相同的值:标记,源地址,目标地址和协议。将不同的数据报根据自己带的偏移量重新组合为新段,第一个段的偏移量为0,最后一个段的多段标记为0。


分段和重组

Internet标记域(ID)和源地址,目的地址和协议域一起用于确认数据报分段和重组。如果数据报不是最后一段,则设置多段标记位(MF)。段偏移域标记段位置,它是相对于未分段时的数据报而言的。段以8个字节为单位,这样的分段策略使未分段的数据报有全零的分段信息(MF = 0,段偏移= 0)。如果进行分段,边界必须是8个字节的倍数。这种格式允许2的13次方(8192)个8字节段,一个数据报的最大长度刚好和长度域标明的数据64K一致。在分段时,有些选项被复制,有些则不。

每个IP模块必须能够不分段地传送68字节的数据报。这因为IP包头会达到60字节,而最小数据段长为8,68=60+8;而它也必须能够接收576字节的数据,不论这数据是未分段的还是分段的。

会被分段影响的域包括:

(1) 选项域

(2) 多段标记

(3) 段偏移

(4) Internet包头长度域

(5) 总长度域

(6) 包头校验码

如果设置了不分段标记(DF),则不可进行分段,即使数据报会因此而被抛弃。如果接收主机不能进行重组时则需要设置此位。我们在进行无盘引导时,则需要设置这一位。下面通过例子说明这一过程。其中#代表不等于,X到Y指的是包括X,而不包括Y的所有数据。

能够在下一个网络传送的最大数据报称为最大传输单元(MTU)。如果数据报的长度小于等于MTU,进行下一步;否则分为两段,第一段的大小等于MTU,第二段就是剩余的长度,将第一段传送,如果第二段仍然大于MTU,则重复分段过程,直到可以发送为止。下面我们给出一个定义:

FO - 段偏移

IHL - Internet包头长度

DF - 不分段标记

MF - 多段标记

TL - 总长度

OFO - 原段偏移

OIHL - 原Internet包头长度

OMF - 原多段标记

OTL - 原总长度

NFB - 段数

MTU - 最大传输单元

过程:

IF TL <= MTU THEN 将此数据报提交给下一处理阶段

ELSE IF DF = 1 THEN 抛弃数据报

ELSE 产生第一段:

(1) 复制源internet包头;

(2) OIHL <- IHL;OTL <- TL;OFO <- FO;OMF <- MF;

(3) NFB <- (MTU-IHL*4)/8;

(4) 附加第一个NFB*8个数据字节;

(5) 校正包头:MF <- 1;TL <- (IHL*4)+(NFB*8);重新计算校验码;

(6) 提交数据段到下一个数据报处理阶段;

如果要产生第二个段:

(7) 有选择地复制internet头;

(8) 附加剩余数据;

(9) 校正包头:IHL <- (((OIHL*4)-(未复制的选项长度))+3)/4;

TL <- OTL - NFB*8 - (OIHL-IHL)*4);

FO <- OFO + NFB;MF <- OMF;重新计算校验码;

(10) 将此段提交分段检测;结束。

上例中除了最后一段外,其它段都达到了MTU的大小,各种实现不同,只要能够得到的段小于等于MTU就可以了。

重组过程例子

对于每个数据报,缓冲区标记是由源地址,目的地址,协议和标记域一起确认的。如果数据报未分段,那就不需要进行重组,处理进行下一阶段。重组需要的数据结构有:数据缓冲区,包头缓冲区,段块位表,数据长度域和计数器。段中的数据根据段偏移和长度放在相应位置,段块标准表中的相应位根据接收的段块被设置。

如果是第一段(段偏移为0),将包头放于包头缓冲区;如果是最后一段(多段标记为0),计算数据总长度。如果接收完了整个数据报,进行下一处理阶段;如果没有接收完,设置计数器值为当前计数器和此段中保存的生存时间之间比较在的一个,重组函数放弃控制权。如果超时释放所有缓冲区。计数器的初值是重组等待时间的下限。因为如果到达段中的生存时间大于计数器当前值等待时间增加,如果小于则不会减少。计数器的最大时间可以达到最大生存时间(大约为4.25分)。如果设置为15秒可能比较好,当然随着实践,这个值可能会有更改。这个值的选择和缓冲区的大小和传输媒介有关,传输速度乘于计数器值等于缓冲区大小。

定义:

FO - 段偏移

IHL - Internet包头长度

MF - 多段标记

TTL - 生存时间

NFB - 段块数

TL - 总长度

TDL - 总数据长度

BUFID - 缓冲区标记

RCVBT - 段接收位表

TLB - 计数器下限

过程:

如果到达的数据段中的数据有部分或全部相同,上面的过程会使用数据的最新版本。

标记

标记是为了对特定数据报的段提供唯一的标记。如果数据报拥有相同的源地址,目的地址,协议和标记,IP模块会把他们认定是同一数据报。选择的任何由发送方担任。发送协议模块需要保持一个标记表,每个目的地址保持一个表项。然而,因此标记域允许65536个不同的值,有些主机能够不考虑目的地仍然可以达到标记唯一的目的。高层协议也可以使用标记。


服务类型

服务类型(TOS)是网络服务质量的选择。服务类型是由抽象参数确定的优先级,时延,吞吐量和可靠性的结合物。这些参数和一些实际对应的网络服务对应。对于什么是时延,什么是吞吐量之类的定义这里就不多说了。

生存时间

生存时间由发送者设置,是数据报在网络中最长的生存时间,如果超时会抛弃数据报。网络中每个结点都会处理存在于包头中的生存时间。此域的最少减少量为1,单位是秒。因此,最长的生存时间为255秒。每个处理模块必须对TTL减1,即使所使用的时间少于一秒也是如此。高层可靠连接协议是基于原重复数据报将不会在特定时间后到达,TTL是为了满足这样假设而存在。

选项

选项中数据报中是可选的,但在实现中必须有的。有没有选项是发送者说了算,每个IP模块必须能够分析每个选项,每个选项域有多个选项。选项可能没有达到32位的边界,不足的以零填充以达到32位的倍数。

校验码

如果包头发生改变必须重新计算包头校验码,校验码可以在一定程度上杜绝传输错误。有些应用程序允许数据报中的数据出错,如果IP强调数据正确性,类似的应用程序也就用不成了。

错误

IP协议错误可由ICMP协议报告。

3.3. 接口

接口的描述是功能性的,这个描述的具体实现机制会因为操作系统的不同而不同。不同的IP实现会有不同的用户接口。但是起码的子集是所有实现必须支持的。本节将描述这个基本子集。IP协议有上下有两个接口,一个是面向本地网络的,另一个是面向高层协议或应用程序的,我们称后一个接口为用户。虽然IP协议是数据报协议,所以用于保存状态的资源(内存)很少。

下面是一个高层接口范例:

SEND (src, dst, prot, TOS, TTL, BufPTR, len, Id, DF, opt => result)

上式中:

src = 源地址

dst = 目的地址

prot = 协议

TOS = 服务类型

TTL = 生存时间

BufPTR = 缓冲区指针

len = 缓冲区长度

Id = 标记

DF = 不分段

opt = 选项数据

result = 响应,响应分为OK和Error两种;

OK = 发送成功

Error = 参数错误或本地网络错误

优先级和安全性参数在选项中传送。

RECV (BufPTR, prot, => result, src, dst, TOS, len, opt)

上式中:

BufPTR = 缓冲区指针

prot = 协议

result = 响应,响应分为OK和Error两种;

OK = 发送成功

Error = 参数错误

len = 缓冲区长度

src = 源地址

dst = 目标地址

TOS = 服务类型

opt = 选项数据

当用户发送数据报时,他执行SEND命令。IP模块在收到调用时,检查传送来的参数并准备发送数据。如果参数合法而且本地网络正常接收数据,返回成功。如果参数不合法,或本地网络未接收数据,返回不成功。在未成功时会返回报告,报告内容会因实现不同而不同。

当数据报到达IP模块时,要么有一个RECV调用要么没有。如果有这个调用会传送信息给用户;如果没有,通知用户信息到达。如果没有找到应该通知的用户,返回ICMP错误,抛弃数据。通知用户可以通过假中断或类似的机制,这视操作系统不同而不同。源地址包括在发送调用中,IP模块可以检查源地址是否是一个合法地址。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值