第一次
第一次握手:建立连接时,
客户端发送
syn包(syn=j)到
服务器,并进入
SYN_SENT状态,等待服务器确认;SYN:同步序列编号(
Synchronize Sequence Numbers)。
第二次
未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于 Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。
Backlog参数:表示未连接队列的最大容纳数目。SYN-ACK重传次数服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。
半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务器从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。
面向连接的TCP三次握手是Syn Flood存在的基础。
TCP协议头最少20个字节,包括以下的区域(由于翻译不尽相同,文章中给出相应的英文单词):
TCP
序列号(序列码,Sequence Number):32位的
序列号由接收端计算机使用,重新分段的
报文成最初形式。当SYN出现,序列码实际上是初始序列码(
ISN),而第一个数
据
字节
是ISN+1。这个
序列号
(序列码)是可以补偿传输中的 不一致。
TCP应答号(Acknowledgment Number):32位的序列号由接收端计算机使用,重组分段的报文成最初形式。如果设置了ACK控制位,这个值表示一个准备接收的包的序列码。
数据偏移量(HLEN):4位包括TCP头大小,指示何处数据开始。
保留(Reserved):6位值域,这些位必须是0。为了将来定义新的用途所保留。
窗口(Window):16位,用来表示想收到的每个TCP数据段的大小。
校验位(Checksum):16位TCP头。源机器基于数据内容计算一个数值,收信息机要与源机器数值结果完全一样,从而证明数据的有效性。
选项(Option):长度不定,但长度必须以字节。如果没有选项就表示这个一字节的域等于0。