TCP 三次握手及原理
2007
10
该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用
处理。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。
RST:复位标志
复位标志有效。用于复位相应的 TCP 连接。
SYN:同步标志
同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立
TCP 连接时有效。它提示 TCP 连接的服务端检查序列编号,该序列编号为 TCP 连接初始端
(一般是客户端)的初始序列编号。在这里,可以把 TCP 序列编号看作是一个范围从 0 到 4,
294,967,295 的 32 位计数器。通过 TCP 连接交换的数据中每一个字节都经过序列编号。
在 TCP 报头中的序列编号栏包括了 TCP 分段中第一个字节的序列编号。
FIN:结束标志
带有该标志置位的数据包用来结束一个 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 : 段确认标记