1. 三次握手

    TCP在传输数据之前,首先要建立好TCP连接,后续所有数据都基于这个已经建立的连接来传输,而建立TCP连接的过程通常被描述为三次握手(如下图)

总结描述TCP三次握手四次挥手_三次握手

    首先服务端的服务进程已经监听在某个端口上,监听之后就可以一直等待客户端请求建立TCP连接。

    第一次握手:当客户端想要和服务端建立TCP连接时,首先会发送一个连接请求报文给服务端。在这份报文里,SYN=1,ACK=0(ACK表示占用一个比特位的ACK设置位),seq=x(序号不一定是1),这个包被称为SYN包,客户端发送完SYN包后将进入SYN_SENT状态。

    第二次握手:服务端收到报文后,凭借SYN=1和ACK=0知道这是建立TCP连接的请求包,如果确认与客户端建立TCP连接,则需做出回复。回复时,SYN=1,ACK=1,seq=y,ack=x+1(ack表示确认号),这个包被称为ACK包,服务端发送完ACK包后将进入SYN_RECV状态。

    第三次握手:客户端收到服务端的回复报文后,凭借SYN=1,ACK=1知道同意建立连接,仍需向服务端回复一个ACK包,回复时,SYN=0,ACK=1,seq=x+1,ack=y+1(SYN=0、ACK=1表示这不是请求建立连接的包,只是回复包)。客户端在发送完回复包后将进入ESTABLISHED状态,表示TCP连接在客户端这边已经建立好。服务端在收到客户端的回复包后也将进入ESTABLISHED状态。到此,TCP连接就建立完成。

    注意事项:服务端在回复客户端的时候,也发送了以一个SYN=1的包,相当于也是在请求客户端去建立TCP连接,所以客户端最后回复了一个ACK包。

    同时客户端回复的ACK包也避免了无效连接再次重生的问题。比如客户端发送SYN包后,某些原因导致服务端过很长时间也没收到,客户端就重新再发了一个SYN包,此时网络上就有了两个SYN包,而服务端如果与其中一个SYN包建立好连接,后面再收到一个又建立一次连接,就不是想要的结果了,客户端通过ACK包来回复确认,从而避免了这个问题。


  1. 四次挥手

    在TCP连接断开(或释放)的时候,需要四次挥手的过程(如下图)

总结描述TCP三次握手四次挥手_服务端_02

    首先客户端和服务端在释放TCP连接前都已处于ESTABLISHED状态,假设客户端开始请求释放连接(也可以是服务端发出请求)

    第一次挥手:客户端发送一个FIN包给服务端,FIN包中,FIN=1(表示这是一个请求关闭TCP连接的数据包),seq=u(假设此时序号是u),发送完后,客户端将从ESTABLISHED状态转变为FIN-WAIT-1状态。

    第二次挥手:服务端收到FIN包后,凭借FIN=1知道客户端请求关闭,于是发一个回复包给客户端,设置ACK=1,ack=u+1,seq=v(假设服务端发送的数据序号是v),发送完这个回复包后,服务端进入CLOSE-WAIT状态。

    到此阶段,客户端到服务端方向的连接就已经释放了,并不能传输数据给服务端。而服务端到客户端方向的连接还没关闭,服务端可以继续发送数据给客户端,客户端也能收到。因为此阶段只有一个方向的连接被释放,所以CLOSE-WAIT状态也被称为半关闭(HALF-CLOSE)状态。客户端在收到服务端的ACK包后,将进入FIN-WAIT-2状态,等到服务端发起到客户端这边的连接关闭请求。

    第三次挥手:当服务端确认没有数据发送给客户端后,开始主动关闭从服务端到客户端方向的TCP连接,此时会发送一个FIN包,设置FIN=1,ACK=1,ack=u+1,seq=w(重新设置一个值)。服务端发送完这个FIN+ACK包后进入LAST-ACK(最后确认)状态。

    第四次挥手:客户端收到服务端的FIN+ACK包后,需对服务端发送的关闭请求做出回复。回复时,ACK=1,seq=u+1,ack=w+1。客户端发送完这个ACK包后不会立即关闭,而是进入到TIME-WAIT阶段等待一段时间(2倍的MSL时长)。服务端在收到客户端回复的ACK包后,意味着服务端到客户端的连接关闭已经确认了,于是服务端开始关闭连接。客户端在等待了2MSL的时长后,将真正关闭连接。

    注意事项:客户端在回复ACK之后不立即关闭而是等待2MSL后才关闭,是为了保证发送的最后一个ACK包能被服务端收到。如果不等待2MSL时长直接关闭,服务端可能在超时时间内无法收到回复包,于是重传FIN+ACK包给客户端,此时客户端已关闭无法接收重传的包,最终导致服务端按照非正常状态退出连接。


  1. 拟人化展现TCP三次握手和四次挥手

3.1 三次握手

    男女建立恋爱关系

[第一次握手]男:愿意做我女朋友吗?

[第二次握手]女:我愿意!你愿做我男朋友吗?

[第三次握手]男:我愿意!

双方达成统一意见,建立恋爱关系。


3.2 四次挥手

    在已经建立了恋爱关系的前提下,解除恋爱关系(两人通过手机短信分手)

【第一次挥手】男:感情淡了,散了吧,互删手机号并清记录那种,我先删清为敬。

【第二次挥手】女:得等到我把你养的小王八寄给你再删,免得看了倒胃口!

【第三次挥手】女:小王八你收到了吧?收到了我就删号清记录了。

【第四次挥手】男:小王八收到了。

确认男方的小王八已经收到,女方删除男方手机号清记录;男方看女方没有再回复,确认对方收到了回复也开始清记录,恋爱关系彻底结束。