TCP协议的通讯方式( 二 )


一般情况下,该缓存队列的容量很小 。原因很简单,在正常的情况下TCP可以很好的处理连接请求 。假如当缓存队列填满的时候新的客户端连接请求被丢弃,客户端只需要简单的重新发送连接请求,服务端有时间清空缓存队列以相应新的连接请求 。
在现实环境中,不同操作系统支持TCP缓冲队列有所不同 。在BSD结构的系统中,如下所示:
OS Backlog BLGrace Notes
SunOS 4.x.x 5 8
IRIX 5.2 5 8
Linux 1.2.x 10 10 Linux does not have this grace margin

FreeBSD 2.1.032
FreeBSD 2.1.5128
Win NTs 3.5.1 6 6 NT does not appear to have this margin
Win NTw 4.0 6 6 NT has a pathetic backlog
五、TCP进站(Inbound)处理过程
为了更好的讲述TCP SYN Flood的攻击过程,我们先来介绍一下正常情况下,TCP进站处理的过程 。
服务端处于监听状态,客户端用于建立连接请求的数据包(IP packet)按照TCP/IP协议堆栈组合成为TCP处理的分段(segment) 。
分析报头信息: TCP层接收到相应的TCP和IP报头,将这些信息存储到内存中 。
检查TCP校验和(checksum):标准的校验和位于分段之中(Figure-2) 。假如检验失败,不返回确认,该分段丢弃,并等待客户端进行重传 。
查找协议控制块(PCB{}):TCP查找与该连接相关联的协议控制块 。假如没有找到,TCP将该分段丢弃并返回RST 。(这就是TCP处理没有端口监听情况下的机制) 假如该协议控制块存在,但状态为关闭,服务端不调用connect()或listen() 。该分段丢弃,但不返回RST 。客户端会尝试重新建立连接请求 。
建立新的socket:当处于监听状态的socket收到该分段时,会建立一个子socket,同时还有socket{},tcpcb{}和pcb{}建立 。这时假如有错误发生,会通过标志位来拆除相应的socket和释放内存,TCP连接失败 。假如缓存队列处于填满状态,TCP认为有错误发生,所有的后续连接请求会被拒绝 。这里可以看出SYN Flood攻击是如何起作用的 。
丢弃:假如该分段中的标志为RST或ACK,或者没有SYN标志,则该分段丢弃 。并释放相应的内存 。


推荐阅读