tcp协议是web开发最重要而又最基础的知识,那么tcp的三次握手和四次挥手理解了吗,接下来一起深入学习理解一下。

TCP连接和断开整体图

image-20210712093707571

TCP的三次握手

  1. 请求端(通常称为客户)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号(ISN,在这个例子中为1415531521)。这个SYN段为报文段1。

  2. 服务器发回包含服务器的初始序号的SYN报文段(报文段2作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。

  3. 客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文段3)。这三个报文段完成连接的建立。这个过程也称为三次握手( three-way handshake)。

问题一:第二次、第三次握手失败会怎么样?

如果握手失败服务端会等待客户端重新连接,这时候服务端处于半关闭状态。如果出现大量的半关闭连接,会耗尽服务器的连接资源数,导致请求无法进来。也就是所谓的DDOS攻击。

TCP的四次挥手

image-20210712094403688

整体流程如下:

  1. 客户端发起断开,向服务器发送FIN
  2. 当服务器收到这个FIN,它返回客户端ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
  3. 同时TCP服务器还向应用程序(即丢弃服务器)传送一个文件结束符。接着这个服务器程序就关闭它的连接,导致它的TCP端发送一个FIN,
  4. 客户必须返回一个ACK确认,并将确认序号设置为收到序号加1。

问题二:为什么需要四次挥手,两次挥手为什么不行?

建立一个连接需要三次握手,而终止一个连接要经过4次握手。这由TCP的半关闭(halfclose)造成的。既然一个TCP连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接。当一端收到一个FIN,它必须通知应用层另一端已经终止了那个方向的数据传送。
收到一个FIN只意味着在这一方向上没有数据流动。一个TCP连接在收到一个FIN后仍能发送数据。因此需要两个方向都收到FIN。