三次握手
在客户端和服务器之间建立正常的TCP网络连接时,客户端首先会发出一个 SYN 消息,服务器使用 SYN+ACK 应答表示已经接收到这个消息,最后客户端再以 ACK 消息响应。这样在客户端和服务器之间才能建立起可靠的 TCP 连接,数据才可以在客户端和服务器之间传递
第一次握手(SYN=1, seq=x):
客户端发送一个 TCP的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口(请求同步),并选择序号 seq=x,表明传送数据时的第一个数据字节的序号是 x。(seq是个随机值)
发送完毕后,客户端进入 SYN_SEND 状态。
第二次握手(SYN=1, ACK=1, seq=y, ack=x+1):
服务器的TCP收到连接请求报文段后,如同意,则发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号(随机值y),放到seq 域里,同时将确认序号ack设置为客户的 ISN 加1,即 x+1(即回复对方确认收到了序列号为x开始的包,且希望下次的数据从x+1的位置开始)。
发送完毕后,服务器端进入 SYN_RCVD 状态。
第三次握手(ACK=1,ack=y+1,seq=x+1)
客户端收到此报文段后再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段ack中发送给对方,并且告诉服务器自己的seq=x+1
发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP握手结束。
四次挥手
- 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态。
- 第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态。
- 第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态。
-
第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1, 服务端进入CLOSED状态,完成四次挥手。