一组图带你读懂TCP连接的终止
|
于TCP的半关闭 ( half-close)造成的。 因为一个TCP连接时全双工(即数据在两个方向上能同时传递),因此每个方面必须单独地进行关闭。 需要注意的是,收到一个FIN 只意味着在这一方向上没有数据流动,但一个TCP连接在收到一个FIN之后仍能发送数据。 TCP 连接终止过程,如图1所示 :
最大报文段长度(MSS)表示TCP 传往另一端的最大块数据块的长度。当建立一个TCP连接时,每一方都有用于通告它期望接收的MSS选项 ( MSS选项只能出现在SYN报文段中) 。 如果一方没有接收到来自另一方的MSS值,则 MSS就定为默认值536字节(这个默认值允许20 字节的IP 首部和20字节的TCP首部以适合576 字节的IP数据报)。 MSS让主机限制另一端发送数据报的长度,加上主机也能控制它发送数据报的长度,这将使以较小MTU接收到一个网络上的主机避免分段。状态变迁图(如图所示): ESTABLISHED状态是连接双方能够进行双向数据传送的状态。 当 SYN_RCVD(图中SYN 收到)状态是从LISTEN状态(正常情况)进入,而不是从SYN_SENT状态(同时打开)进入时,从SYN_RCVD回到 LISTEN状态变迁才是有效的。 这意味着如果执行被动打开(进入LISTEN),收到一个SYN,发送一个带ACK的 SYN(进入SYN_RCVD),然后收到一个RST,而不是一个ACK,便又回到LISTEN状态并等待另一个连接请求的到来。 TIME_WAIT状态也成为2MSL等待状态。 当 TCP 执行一个主动关闭,并发回最后一个ACK ,该连接必须在TIME_WAIT状态停留 的时间为2倍的MSL 。 这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发组后的FIN )。 一个 socket对(即包含本地IP 地址、本地端口、远端IP 地址和远端端口的4 元组)在TCP连接处于2 MSL 等待期间,将不能再次被使用。 尽管许多具体的实现中允许一个进程重新使用仍处于2 MSL 等待的端口(通常是设置选项SO_REUSEADDR),但TCP 不能允许一个新的连接建立在相同的插口上。 无论何时一个报文段发往基准的连接(即,由目的IP地址和目的端口号以及源IP地址和源端口号指明的连接)出现错误,TCP都会发回一个复位报文段。 异常终止(发送一个复位(RST )报文段而不是FIN 来中途释放一个连接)一个连接对应用程序来说有两点好处:
Socket API通过“ linger to close选项”(SO_LINGER)提供这种异常关闭的能 (编辑:桂林站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


