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{}和pub{}建立 。这时假如有错误发生,会通过标志位来拆除相应
的socket 和释放内存,TCP 连接失败 。假如缓存队列处于填满状态,TCP 认为有错误发生,
所有的后续连接请求会被拒绝 。这里可以看出SYN Flood 攻击是如何起作用的 。
丢弃:假如该分段中的标志为RST 或ACK,或者没有SYN 标志,则该分段丢弃 。
并释放相应的内存 。
发送序列变量
SND.UNA : 发送未确认
SND.NXT : 发送下一个
SND.WND : 发送窗口
SND.UP : 发送优先指针
SND.WL1 : 用于最后窗口更新的段序列号
SND.WL2 : 用于最后窗口更新的段确认号
ISS : 初始发送序列号
接收序列号
RCV.NXT : 接收下一个
RCV.WND : 接收下一个
RCV.UP : 接收优先指针
IRS : 初始接收序列号
当前段变量
SEG.SEQ : 段序列号
SEG.ACK : 段确认标记
SEG.LEN : 段长
SEG.WND : 段窗口
SEG.UP : 段紧急指针
SEG.PRC : 段优先级
CLOSED 表示没有连接,各个状态的意义如下:
LISTEN : 监听来自远方TCP 端口的连接请求 。
SYN-SENT : 在发送连接请求后等待匹配的连接请求 。
SYN-RECEIVED : 在收到和发送一个连接请求后等待对连接请求的确认 。
ESTABLISHED : 代表一个打开的连接,数据可以传送给用户 。
FIN-WAIT-1 : 等待远程TCP 的连接中断请求,或先前的连接中断请求的确认 。
FIN-WAIT-2 : 从远程TCP 等待连接中断请求 。
CLOSE-WAIT : 等待从本地用户发来的连接中断请求 。
CLOSING : 等待远程TCP 对连接中断的确认 。
LAST-ACK : 等待原来发向远程TCP 的连接中断请求的确认 。
TIME-WAIT : 等待足够的时间以确保远程TCP 接收到连接中断请求的确认 。
CLOSED : 没有任何连接状态 。
TCP 连接过程是状态的转换,促使发生状态转换的是用户调用:OPEN,SEND,
RECEIVE,CLOSE,ABORT 和STATUS 。传送过来的数据段,非凡那些包括以下标记的数
据段SYN,ACK,RST 和FIN 。还有超时,上面所说的都会时TCP 状态发生变化 。
序列号
请注重,我们在TCP 连接中发送的字节都有一个序列号 。因为编了号,所以可以
确认它们的收到 。对序列号的确认是累积性的 。TCP 必须进行的序列号比较操作种类包括
以下几种:
①决定一些发送了的但未确认的序列号 。
②决定所有的序列号都已经收到了 。
③决定下一个段中应该包括的序列号 。
对于发送的数据TCP 要接收确认,确认时必须进行的:
SND.UNA = 最老的确认了的序列号 。
SND.NXT = 下一个要发送的序列号 。
SEG.ACK = 接收TCP 的确认,接收TCP 期待的下一个序列号 。

推荐阅读