TCP/IP协议的三次握手及实现原理( 三 )


建立新的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期待的下一个序列号 。
SEG.SEQ = 一个数据段的第一个序列号 。
SEG.LEN = 数据段中包括的字节数 。
SEG.SEQ SEG.LEN-1 = 数据段的最后一个序列号 。
假如一个数据段的序列号小于等于确认号的值,那么整个数据段就被确认了 。而在接收数据时下面的比较操作是必须的:
RCV.NXT = 期待的序列号和接收窗口的最低沿 。
RCV.NXT RCV.WND:1 = 最后一个序列号和接收窗口的最高沿 。
SEG.SEQ = 接收到的第一个序列号 。
SEG.SEQ SEG.LEN:1 = 接收到的最后一个序列号.

推荐阅读