美文网首页
tcp连接的断开

tcp连接的断开

作者: 杨剑锋 | 来源:发表于2020-11-09 16:36 被阅读0次

TCP的断开就是经过四次挥手:


image.png

这是正常的情况,客户端主动tcp连接断开的过程。客户端先是发送一个FIN为一的报文,然后进入FIN_WAIT_1的状态。
服务器收到FIN报文后,发送一个ACK报文,然后进入CLOSED_WAIT状态。
客户端收到服务器的ACK报文进入FIN_WAIT_2状态。
等到服务器觉得他数据处理好了,可以关闭的时候,会发送一个FIN报文,然后进入LAST_ACK。等待最后一个应答。
让客户端收到服务器FIN报文,就进入TIME_WAIT状态了,随后发送最后一个ACK报文,然后close。
客户端再等待2msl后也自己主动关闭。而只有主动关闭的情况下,才会有TIME_WAIT。

那么为什么四次挥手需要四次呢?
三次握手其实就是在第二次把ACK和SYN两个报文合并成一个发,但是断开的过程可能还有一方需要处理下数据,需要延长点时间,等处理好再发FIN,所以就比三次握手多了一次。

这里还有一个问题,为什么需要TIME_WAIT,然后到close需要2msl的时间呢?

先说下什么是MSL,也就是报文的最长生存时间,超过这个时间的报文就要被丢弃掉。tcp是基于ip的,ip上有个生存时间TTL,是ip报文可以经过的最大路由数量,每经过一个路由就减1,减到0,ip报文就丢弃掉,然后通过ICMP通知源主机,我们的ping也算是经过这个。当然msl和ttl还是有区别的,msl是时间,ttl是路由数量,msl也是大于等于ttl的。在linux中,2msl默认是60秒。

前文也说了,只有主动发起断开连接的进程才会有time wait状态。time wait+2msl有两个原因:
1.防止旧连接的数据包


image.png

像这个seq 301的包,如果因为网络的原因被延迟了,而没有time wait或者很短,那么连接断开后,又建立新的连接,这个时候这个包到了,可能就导致数据紊乱了。而2msl可以保证两个方向的包在断开前丢弃掉。

2.保证正确的断开连接
2msl的时间也是保证第四个报文的ack可以被被动关闭方接收到。


image.png

如图,假设time wait比较短或者没有,当最后的ack报文丢失的时候。客户端已经close了,而服务器一直处于last ack的状态。这样连接就不能正常断开了。而如果有time wait +2msl这个情况就可以避免。假设服务器没有收到最后一个ack报文,服务器会重发FIN等待客户端的ack。
这样就可以保证不会出现一端断开,另外一端没有断开的情况了。

有时候我们在服务器上会看到很多time wait。time wait一般就是服务器主动发起的断开请求才会产生的状态。所以time wait过多,第一个是系统资源会大量消耗,还有是端口如果占的太多,会导致没办法创建新连接。这个时候可以把linux的net.ipv4.tcp_tw_reuse开启,置为1,可以复用time wait超过1秒的连接。

这边再说说tcp的保活机制。也就是怎么长期维持客户端和服务端的连接。
在一个时间段内,如果没有连接等相关活动,tcp的保活机制会定期发探测报文,如果连续几个探测报文就没有回应,就将错误信息报告给系统,系统通知上层应用。

在 Linux 内核可以有对应的参数可以设置保活时间、保活探测的次数、保活探测的时间间隔,以下都为
默认值:
tcp_keepalive_time=7200:表示保活时间是 7200 秒(2⼩时),也就 2 小时内如果没有任何连接
相关的活动,则会启动保活机制
tcp_keepalive_intvl=75:表示每次检测间隔 75 秒;
tcp_keepalive_probes=9:表示检测 9 次无响应,认为对⽅方是不不可达的,从⽽而中断本次的连接。
也就是说在 Linux 系统中,最少需要经过 2 小时 11 分 15 秒才可以发现一个「死亡」连接。
当然这个时间也可以自己配置。

相关文章

  • TCP10问

    1.TCP建立连接时需要几次握手, 断开连接需要几次握手? TCP建立连接需要三次握手, 断开连接要四次握手。现有...

  • HTTP 学习碎片

    持久连接 只要任意一端没有明确提出断开连接,那么保持TCP连接状态。这样做减少了TCP连接的重复建立和断开所造成的...

  • TCP状态装换图知识详解(图)

    TCP状态装换图 [TOC] 状态图 状态解释 tcp连接的建立3次握手 tcp断开连接4次挥手 TCP正常连接建...

  • TCP 的三次握手和四次挥手,了解泛洪攻击么

    引言 TCP 建立连接与断开连接的过程 TCP 泛洪攻击(TCP 建立连接过程中的攻击手段)与防护 TCP 建立连...

  • tcp连接的断开

    TCP的断开就是经过四次挥手: 这是正常的情况,客户端主动tcp连接断开的过程。客户端先是发送一个FIN为一的报文...

  • Linux下tcp连接断开后,端口释放问题

    Linux系统下,TCP/IP连接断开 如果客户端先断开连接,server端再断开,那么server端占用的端口号...

  • TCP-连接、断开和滑动窗口简介

    转载:TCP-连接、断开和滑动窗口简介 1.TCP概述TCP(Transmission Control Proto...

  • 12·iOS 面试题·TCP 为什么要三次握手,四次挥手?

    前言 TCP 属于传输层协议,是面向有连接,可靠的流协议。面对有连接这个特性,TCP 就有建立连接和断开连接的过程...

  • TCP通信的整个过程

    不断是长连接,断开再连是短连接 tcp长连接和短连接 TCP在真正的读写操作之前,server与client之间必...

  • TCP连接的理解

    TCP(Transmission Control Protocol,缩写:TCP)连接时会进行三次握手,断开时会有...

网友评论

      本文标题:tcp连接的断开

      本文链接:https://www.haomeiwen.com/subject/asdtbktx.html