三次握手流程
先来一张TCP建立连接流程图:(图片来自于网络)
上图中的部分符号解释:
SYN:TCP首部中6个标志bit中的1个,表示同步包
ACK:TCP首部中6个标志bit中的1个,表示确认包
seq:同步序号
ack:确认序号
第一次握手:客户发送SYN包到服务器,这个包中包括了:
- 目的端口号;
- seq = client ISN(客户初始序号,即上图中的x);
- 客户的窗口大小;
- 可接收的最大报文段长度(MSS);
发送后,客户进入SYN_SENT状态,等待服务器确认。
第二次握手:服务器回复SYN-ACK包,这个包中包括了:
- seq = server ISN(服务器初始序号,即上图中的y),“你的请求我已接受,我这方的数据流序号从y开始”;
- ack = client ISN + 1(即x+1);
- 服务器的窗口大小;
- 可接收的最大报文段长度(MSS);
发送后,服务器进入SYN_RECV状态。
第三次握手:客户发送ACK包到服务器,这个包包括了:
- seq = client ISN + 1(即x+1),“我这方的数据流序号从x+1开始,我们可以互相传输数据了”;
- ack = server ISN + 1(即y+1);
发送后,客户和服务器均进入ESTABLISHED。
一些重要概念
半连接队列
在三次握手协议中,服务器维护一个半连接队列,该队列为每个客户的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN 包,并向客户回复了确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于SYN_RECV状态,当服务器收到客户的确认包时,该条目所标识的连接进入ESTABLISHED状态,同时从半连接队列删除该条目。
SYN-ACK重传次数
服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。(注意,每次重传等待的时间不一定相同。)
半连接存活时间
半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。