TCP
三次握手
- 第一次握手: 建立连接时,客户端发送
syn
包到服务器,并进入syn_sent
状态,等待服务器确认。syn: 同步序列编号(Synchronize Sequence Numbers)
- 第二次握手:服务器收到
syn
包并确认客户的的SYN, 同时发送一个自己的SYN包,即SYN+ACK
包,服务器进入syn_recv
状态 - 第三次握手:客户端收到服务器的
SYN+ACK
包,向服务器发送确认包ACK(ack=k+1)
握手过程中传输的包中不包含数据,三次握手后,才会正式传输数据
总结:
client 发送 syn 包,进入 SYN_SENT -->
server 收到 client的 syn 包,确认后发送 SYN+ACK 包,进入 syn_recv -->
client 收到 server 的 SYN+ACK 包,发送 ACK 包。
连接建立
四次挥手
- 客户端进程发出 连接释放报文,并且停止发送数据,客户端进入
FIN-WAIT-1
(终止等待1)状态
TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
- 服务器收到 连接释放报文,并发出确认报文,服务端进入了
CLOSE-WAIT
(关闭等待)状态 - 客户端收到服务器的确认请求后, 客户端就进入
FIN-WAIT-2(终止等待2)
状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最 后的数据) - 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,服务器就进入了
LAST-ACK(最后确认)
状态 - 客户端收到服务器的连接释放报文后,必须发出确认,此时 客户端就进入了
TIME-WAIT(时间等待)
状态, 注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后或客户端撤销相应的TCB
后,才进入CLOSED
状态。 - 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
总结:
client 发出 连接释放报文,进入 FIN-WAIT-1 -->
server 收到 client的连接释放报文,发出 确认报文,进入 CLOSE-WAIT -->
client 收到 server的确认报文,进入 FIN-WAIT-2 -->
server 发送 连接释放报文(数据发送完毕后会发送),进入 LAST-ACK -->
client 收到 server的 连接释放报文,发出 确认报文,进入 TIME-WAIT -->
server 收到 client的 确认报文,进入 CLOSED。此次 TCP连接结束。