跳到主要内容

TCP连接

三次握手​

TCP的三次握手是为了建立可靠的连接而设计的。在建立连接之前,双方需要经过三次握手来确认连接的可行性

三次握手的过程如下:

  • 第一次握手: 客户端向服务端发送SYN标识的数据包,表示要建立连接
  • 第二次握手: 服务端收到客户端SYN数据包之后,通过ACK确认标识来进行回复确认,发送SYN和ACK标识数据给客户端,表示服务端同意建立连接
  • 第三次握手: 客户端受到服务端的数据包之后,会发送一个ACK标识给服务器,表示已经收到服务器标识序号了,服务端收到报文后没问题之后,同意建立连接

第三次握手为什么要发送ACK标识给服务器?

  • 为了证明客户端发送数据正常
  • 表示已经收到服务器标识序号了

补充:

SYN(Synchronize)标志是用来同步序号的。它表示发送方希望建立连接,或者表示已经收到了对方的序号 ACK(Acknowledgment)标志是用来确认序号的。它表示已经收到了对方的序号,或者表示已经处理完了对方的数据。

四次挥手​

四次挥手的过程如下:

  • 第一次挥手:客户端发送一个带有 FIN 标志的数据包给服务器,表示客户端希望断开连接。
  • 第二次挥手: 服务器收到客户端的数据包后,会发送一个带有 ACK 标志的数据包给客户端。表示服务器已经收到了客户端的请求,并且准备好断开连接。
    • 此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。
  • 第三次挥手:服务器传输完数据之后,服务器发送一个带有 FIN 标志的数据包给客户端,表示服务器希望断开连接。
  • 第四次挥手: 客户端收到服务器的数据包后,会发送一个带有 ACK 标志的数据包给服务器。表示客户端已经收到了服务器的请求,并且准备好断开连接。

补充:

1、FIN(Finish)标志是用来结束连接的。它表示希望断开连接 2、四次握手就是中间多了一层:等待服务器传输数据, 传输完成之后再一次响应回复相关数据的过程

为什么建立连接是三次握手,而断开连接是四次挥手​

简单来说:(因为二次挥手的时候当服务端收到客户端FIN报文时,需要先向客户端发送ACK码进行回复确认,但是此时的服务端并不会关闭socket【Socket是基于TCP】的连接),而是处于等待关闭的状态,因为服务端还有数据没有发送完毕,当服务端发送数据完毕之后,再向客户端发送FIN报文

建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。 而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

  • 答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。