目录
1.TCP状态转换图
2.三次握手过程
Client Server
Send SYN(seq==j) ----------> Receive SYN(seq==j)
Receive SYN(seq==k,ACK==j+1) <---------- Send SYN(seq==k,ACK==j+1)
Send ACK(ACK==k+1) ----------> Receive ACK(ACK==k+1)
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),待发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
其中,这三次握手的过程中,包含了下面的这些概念:
1).未连接队列
在TCP建立连接的过程中,服务器会维护一个未连接队列。该队列会为每一个客户端的SYN包(syn==j)开辟一个条目,表示服务器已经收到SYN包,并向客户端发出了确认,正在等待客户端的确认包。这些条目所代表的连接在服务器中处于SYN_RECV状态,当服务器收到客户端ACK时,这些条目被删除,服务器进入ESTABLISHED状态。
2).Backlog参数
这个参数用来表示未连接队列的最大容纳数目。SYN+ACK重传次数。服务器发送完SYN+ACK后,如果没有收到客户端的ACK,服务器进行首次重传。如果等待一段时间后,任然没有收到客户端ACK, 则进行第二次重传。以此类推,如果重传次数超过了系统规定的最大重传次数,系统会将该连接信息从半连接队列中删除。另外,每次重传等待时间不一定相同。
3).半连接存活时间
表示半连接队列的条目存活的最长时间,也即服务器从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。也称之为Timeout时间、SYN_RECV存活时间。