持续创作,加快成长!这是我参加「日新计划 10 月更文应战」的第5天,点击查看活动概况

TCP 三次握手

所谓三次握手(Three-Way Handshake)即建立TCP衔接,就是指建立一个TCP衔接时,需求客户端和服务端一共发送3个包以承认衔接的建立。在socket编程中,这一进程由客户端执行connect来触发,整个流程如下图所示:

TCP 三次握手和四次挥手

第一次握手: 建立衔接时,客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状况,等候服务器承认;
第2次握手: 服务器收到syn包,必须承认客户的syn(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此刻服务器进入SYN_RECV状况;
第三次握手: 客户端收到服务器的SYN+ACK包,向服务器发送承认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状况,完成三次握手。

TCP 四次挥手进程

四次挥手(Four-Way Wavehand)即终止TCP衔接,是指断开一个TCP衔接时,需求客户端和服务端一共发送4个包以承认衔接的断开。在socket编程中,这一进程由客户端或服务端任一方执行close来触发,三次握手和四次挥手完好流程如下图:

TCP 三次握手和四次挥手

第一次挥手: Client发送一个FIN,用来封闭Client到Server的数据传送,Client进入FIN_WAIT_1状况。
第2次挥手: Server收到FIN后,发送一个ACK给Client,承认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状况。
第三次挥手: Server发送一个FIN,用来封闭Server到Client的数据传送,Server进入LAST_ACK状况。
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状况,接着发送一个ACK给Server,承认序号为收到序号+1,Server进入CLOSED状况,完成四次挥手。

为什么建立衔接协议是三次握手,而封闭衔接却是四次握手呢?

这是由于服务端的LISTEN状况下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答效果,而SYN起同步效果)放在一个报文里来发送。

但封闭衔接时,当收到对方的FIN报文告诉时,它只是表示对方没有数据发送给你了,但是还能接收数据;但未必己方所有的数据都全部发送给对方了,所以你可能未必会马上会封闭SOCKET,也即你可能还需求发送一些数据给对方之后,再发送FIN报文给对方来表示同意现在封闭衔接,所以它这儿的ACK报文和FIN报文多数情况下都是分开发送的。