4个实验,彻底搞懂TCP连接的断开

      最后更新:2021-12-22 17:15:16 手机定位技术交流文章

      前言

      你能想到,当你看到这个标题时, TCP 连接被创建和断裂了, 我很清楚这一点, 不仅仅是三次握手和四次挥手? 等等,你可能会尝试在你的脑海中先回答这些问题:

      • 谁给四指的礼礼?
      • 您是否认为, 如果电力没有关机, 中断连接是可行的?
      • 无论哪种情况,四个挥手的连接都会被打破吗?

      这不是一个采访,这是一个真正的问题, 我会在回答之前先把它卖掉, 将会有一个关于事情的特别故事, 所以,让我们在谈论真正的问题之前先讲理论吧。

      正常断开

      从在典型环境下如何切断TCP连接开始, 我们向浅处和深处前进。 下面的图表描述了标准的 TCP 握手三次, 4次波( 来自 TCP/IP 详细卷1) 。

      例如,在我们的机器上, 您可以使用 Python 的简单HTTPServer 来轻松建立 http 服务( http 还基于 TCP 协议), 例如 :

      python -m SimpleHTTPServer 20880
      

      使用 Nc 或 Tonnet 等两个命令中的任何一个命令来建立 TCP 连接。 对于此测试, 我使用 nc 来创建连接 。

      nc -v ip port
      

      关于 ip 端口 [tcp/*] 的咨询已被取代! 无法关闭临时文件夹:%s 。

      我们如何看待这种关系?这种联系可能与网络或Issof有关,我更喜欢这样。

      lsof -i:20880
      

      港口将由客户或服务公司占用,但服务港口是固定的,客户港口是随机的。

      如果我们每次连接和分离、握手和挥手时都想查看 TCP TCP 的 TCP 报告呢? tcpdump 命令可以使用 。

      三次握手

      tcpdump -A -vv -i any -S host 10.179.245.95
      

      除了上面提到的杰作之外

      参数是——S,如果你不观察到第三次握手=1, 这和书中的想法不一样, 但它只是一个简化的tcpdum, 它必须附在实际值上--S。

      国旗[S]/[S]/[..]/[..]/[..]/[..][原件:英

      • [S] SYN(代表)
      • [.]代表ACK,[S.SYN+ACK。

      四次挥手

      序列相当于三次握手。我们有以下波数据。

      • [法] 财务处代表

      这张图有点奇怪,四波降为三波。这是《TCP协议》的实际执行。如果在第二和第三波之间没有提供数据,被动断开器然后可将第二个ACK和第三个FIN组合成一个波。

      当然,我抓到了四个正常的挥手, 比如这个。

      异常断开

      上面有太多的东西 我们终于能说到重点了

      是谁造成断开连接的?

      考虑以下问题:谁触发了TCP连接的断裂?是应用程序还是操作系统?

      让我们来看看一个非常基本的 TCP连接 建造和断开代码。

      tcpAddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:20880")
      conn, err := net.DialTCP("tcp", nil, tcpAddr)
      if err != nil {
       fmt.Println("Client connect error ! " + err.Error())
       return
      }
      
      defer func() {
       err := conn.Close()
       fmt.Println("Client connect closed !")
       if err != nil {
        fmt.Println(err)
       }
      }()
      
      fmt.Println(conn.LocalAddr().String() + " : Client connected!")
      time.Sleep(10 * time.Second)
      

      运行后,结果如下和预期结果:打印时,您可以看到连接。当断开链接时,您可以看到连接

      如果我们在连接失效前用杀9怎么办?

      关闭没有做它,但它发生了四次!

      对数据的研究得出以下结论:

      a.b 两个对等对等程序。如果进程b不叫近,则发送FIN软件包是内核操作系统。

      当你没有电或电网时 你怎么切断电源呢?

      根据前一次试验的结果,我们发现,即使过程意外终止,操作系统也将有助于四次发动波浪。

      但是,如果出现断电或网络中断,操作系统将无法接管。为了简化测试,将两个个人电脑连接到服务器上,然后切断服务器的网络以模拟停电。

      已知的情况是,当电网缩小时,链接不会立即下降。

      断网时有数据传输

      如果当网络关闭时数据被传输,由于无法进入ACK,所以会重试,然而,这种情况不能无限期地继续下去。在多次重复之后,如果对查询的答案仍未确认,则没有答案。如果你想参与其中,你将被视为网络或终端主机异常。强制关闭连接。目前,关闭是直接关闭。他们不会挥手(数据甚至没有发出)。还挥啥手),将 Linux 配置为

      最低的再传送时间为200毫秒,最高再传送时间为120毫秒,再传送次数为15毫秒。

      断网时没有数据传输

      如果网络关闭时没有数据传输,可检查TCP所附的活性键是否打开。 TCP的主要活性特征如下:

      • TCP 保持生命状态是一种在不干扰数据流内容的情况下相互探测的方法。 当定时器投入使用时, 现场信息会在一端发送, 当收到电文时, 则会在另一端发送 ACK 响应 。
      • 虽然它不是TCP标准,但大多数成就包括这一技术。
      • 该方法有争议性,其部分内容应列入申请书。

      启用“ 保持生命 ” 。

      由许多操作系统参数控制 :

      • 保存时间: 在不提供数据的情况下维持连接的时间长度 。
      • Kepalive_intvl: 发送间隔的时间, 即上面设置的函数 。
      • Kepalive_ probs:能够提供的最大测试包数量

      读取 Linux 上的以下文件 :

      cat /proc/sys/net/ipv4/tcp_keepalive_time
      cat /proc/sys/net/ipv4/tcp_keepalive_intvl
      cat /proc/sys/net/ipv4/tcp_keepalive_probes
      

      如果需要两个小时时间而不按默认方式传输数据,则维持生命开始运作!

      只有两个参数可以设定在 Go 中 :

      conn.SetKeepAlive(true)
      conn.SetKeepAlivePeriod(5 * time.Second)
      

      其中第二个是SetPlaveAlivePeridod, 其源代码如下:

      func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
       // The kernel expects seconds so round to next highest second.
       secs := int(roundDurationUp(d, time.Second))
       if err := fd.pfd.SetsockoptInt(syscall.IPPROTO_TCP, sysTCP_KEEPINTVL, secs); err != nil {
        return wrapSyscallError("setsockopt", err)
       }
       err := fd.pfd.SetsockoptInt(syscall.IPPROTO_TCP, syscall.TCP_KEEPALIVE, secs)
       runtime.KeepAlive(fd)
       return wrapSyscallError("setsockopt", err)
      }
      

      SetkeepalivePeriod 参数设置为 tcp_keepalive_intvl 和 tcp_keepalive_time, 以及 tcp_keepalive_ probes 。

      简单的测试 : 一旦 Cliet 打开了关键连接连接服务器, 没有传输数据, 服务器的网络被打破, 关键的生命心跳软件包是可见的, 连接被设置在 CLLOSED 上一段时间 。

      保持生命应该关闭。

      如果CasepeAlive在没有数据传输的情况下被关闭, 连接将永远不会被切断 。

      退出网格后,重新启动

      考虑另一种情况,即在与服务器和服务器终端网络运行中断后没有数据传输;如果重新启动服务器软件并恢复网络,连接工作是否会进行?

      如果服务器重新启动,我不确定 阴蒂 或者我不传输数据连接似乎正在运行中 。因为他们不知道对方的立场然而,如果客户 向服务器发送少量的数据 在这个时刻,你会看到服务器会给客户发RST然后,突然间, 连接被切断。

      总结

      除正常情况外,本条将试验与TCP联系分离的一些结果结合起来:

      • 当程序失败时,TCP连接断开的波浪将被操作系统取代。
      • 在TCP连接建立后,如果电力或网络断电,如果数据刚刚发送,如果TCP数据包没有达到上限,将再次尝试。
      • 当TCP连接建立时,如果电力或网络失效,而且没有这方面的数据流,
        • 如果启用 KeepArive, 连接将在指定的心跳测试后终止, 测试需要两个小时左右 。
        • 如果按键未打开, 连接将永远存在 。
      • 如果一方将RST包寄给另一方,另一方也不得不断开。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/15183.html

          热门文章

          文章分类