第18章TCP连接的建立和终止

连接的建立

三次握手

连接的终止

四次挥手

最大报文长度MSS Max Segment Size

为了避免IP分片的发生,所以在三次握手阶段会协商最大报文长度。

TCP的半关闭与半打开

TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力,这就是所谓的半关闭。当主动关闭端发送了FIN后,还能继续接收来自被动关闭方的数据。

如果一方已经关闭或异常终止连接而另一方却还不知道,我们将这样的TCP连接称为半打开的。(半打开连接的常见原因是某一端主机因为突然掉电而不是正常的结束应用程序后再关机)。

TCP的状态

连接的建立:SYN_RECV SYN_SEND ESTABLISHED

连接的断开:FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT CLOSING CLOSE_WAIT LAST_ACK

2MSL: 2*Max Segment Lifetime

复位报文段

不存在的端口的连接请求,当连接请求到达时,目的端口没有进程正在监听。(对于这种情况,TCP会发送RST报文,UDP产生ICMP端口不可达信息)

终止一个连接:

  • 有序释放:按照正常的四次挥手发送FIN的方式断开连接
  • 异常终止:直接发送一个RST报文,无论是否代传输的数据是否传输完毕,RST的接收方会区分另一端执行的是有序释放还是异常终止 。
  • 服务器的TCP已经重新启动,它将丢失复位前连接的所有信息,因此它不知道数据报文段中提到连接,TCP处理的原则仅仅是发送一个RST回复报文。即:当TCP发现收到的数据和连接对应不上的时候,仅仅是直接返回RST。

TCP的连接请求队列与积压backlog

当服务器很繁忙的时候,TCP对于大量到来的连接请求采用以下规则:

  • 服务器端有一个固定长度的连接队列,该队列中的连接已经被接受(三次握手已经完成),但还没有被应用层所接受,TCP接受一个连接是将其放进队列,应用层接受一个连接是将其移除队列
  • 应用层需要指定该队列的最大长度,这个值成为积压值backlog,积压值说明的是TCP监听端口已经被TCP接受而等待应用层接受的最大连接数,和系统所允许的最大连接数、服务器所能并发处理的客户数并不是一回事
  • 当一个连接请求的SYN到达时,TCP使用一个算法来判断是否接受该连接(是否完成三次握手),如果不接受,TCP模块不会理会SYN,什么都不发(不发RST,想想为什么?)。
  • 应用层知道连接的时候,TCP已经完成三次握手建立了TCP连接,因此在服务器应用层进程还不知道这个连接的时候,客户端可能已经在开始发送数据了,这个时候数据是被TCP模块暂时存放在内核缓冲区。
原文地址:https://www.cnblogs.com/Spground/p/9567873.html