计算机网络—TCP三次握手、四次挥手

文章目录

  • 三次握手
    • 为什么要三次握手
    • 为什么不是两次握手
  • 四次挥手
    • 为什么客户端最后还要等待2MSL
    • 为啥要四次挥手

————————————————————————————————

三次握手

计算机网络—TCP三次握手、四次挥手_第1张图片

(1)客户端请求建立连接,并且向服务端发送同步序列号SYN。

(2)服务端收到请求后,发送 SYN (这里的 SYN 表示服务端的同步序列号) 和 ACK(ACK 表示对前面收到请求的一个确认,表示告诉客户端,我收到了你的请求)

(3)客户端收到服务端的请求后,再次发送 ACK,这个 ACK 是针对服务端连接的一个确认,表示告诉服务端,我收到了你的请求。

为什么要三次握手

三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
Client :客户端(发送方);Server :服务器端(接收方)

第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常

【接收方确认了—自己能收+发送方能发】

第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常

【发送方确认了—自己和对方能发能收】

【接收方和刚才一样,只能确认自己能收+发送方能发】

第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常

【发送方确认了—自己和对方能发能收】

【接收方确认了—自己和对方能发能收】

所以三次握手就能确认双发收发功能都正常,缺一不可。

为什么不是两次握手

(1)主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费

(2)三次握手是建立可靠的通信信道的最小值,也就是双方确认自己与对方的发送与接收是正常的。

​ 当然还可以四次、五次,只是没必要浪费这个资源

四次挥手

计算机网络—TCP三次握手、四次挥手_第2张图片
第一次挥手: 客户端向服务端发送连接释放报文(FIN=1,ACK=1),主动关闭连接,同时等待服务端的确认。

  • 序列号 seq= u,即客户端上次发送的报文的最后一个字节的序号+1。
  • 确认号 ack = k,即服务端上次发送的报文的最后一个字节的序号+1

第二次挥手: 服务端收到连接释放报文后,立即发出 确认报文 (ACK=1),序列号 seq=k,确认号ack = u+1。

  • 这时TCP连接处于半关闭状态,即客户端到服务端的连接已经释放了,但是服务端到客户端的连接还未释放。这表示客户端已经没有数据发送了,但是服务端可能还要给客户端发送数据。

第三次挥手: 服务端向客户端发送连接释放报文(FIN=1,ACK=1),主动关闭连接,同时等待A的确认。

  • 序列号 seq = w,即服务端上次发送的报文的最后一个字节的序号+1。
  • 确认号 ack = u+1,与第二次挥手相同,因为这段时间客户端没有发送数据

第四次挥手: 客户端收到服务端的连接释放报文后,立即发出确认报文(ACK=1),序列号seq=u+1,确认号为ack = w+1。

  • 此时,客户端就进入了【TIME-WAIT】状态。注意此时客户端到TCP连接还没有释放,必须经过2*MSL(最长报文段寿命)的时间后,才进入CLOSED 状态。而服务端只要收到客户端发出的确认,就立即进入CLOSED状态。可以看到,服务端结束TCP连接的时间要比客户端早一些。

为什么客户端最后还要等待2MSL

第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器

第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

为啥要四次挥手

任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。

举个例子:A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”,B回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话,于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,A 回答“知道了”,这样通话才算结束。

你可能感兴趣的:(计算机网络,tcp/ip,服务器)