背景:前些天团队在进行终端设备和服务器端长连接业务的测试时,发现了这么一个情况:在拔掉设备端的网线后,再插上网线,有时可以继续正常的进行长接连请求,而且用的还是拔掉网线之前的那个长连接。但是有时却不能继续正常的长连接请求,需要重新建立一个新的长连接。让我尤感诧异的是第一种网线断开再插上后长连接可以恢复的情况,彻底颠覆了我一直抱有的一个所谓的“物理连接”的观念。究竟怎么回事,我们来探个究竟。


首先说说我自己发明的“物理连接”这个名词,不管怎么说我都是一个网络编程的"老手"。经常会给新人和其他有问题咨询我的同事灌输一个观念,只要网线拔掉了,说明物理连接都断了,更别提逻辑上的TCP长连接,再插上网线也只能再建立一个新的连接来继续进行请求。我做个简单的比喻:我理解的TCP长连接好比以前我们用的有线电话,甲和乙通话的过程中,倘若其中一人的电话线被拔掉了,连接就彻底断了。即使再插上电话线也不可能自动恢复通话,我们不得不重新拨通。

发现了插上网线后连接还会恢复的情况,我起初以为是简单的TCP套接字复用的情况,但是发现设备端并未编写自动重连的逻辑,这就太让我好奇和疑虑了。于是我找了一个同事配合我进行了多次测试,发现了拔掉网线后针对此TCP长连接可能会出现的 两种情况。

首先做下铺垫,做过网络编程的朋友应该都知道这么一个情况

当客户端与服务器建立起正常的TCP连接后,如果客户主机网线断开、电源掉电、或系统崩溃,服务器进程将永远不会知道(通过我们常用的select,epoll监测不到断开或错误事件),如果不主动处理或重启系统的话对于服务端来说会一直维持着这个连接,任凭服务端进程如何望穿秋水,也永远再等不到客户端的任何回应。这种情况就是半开连接,浪费了服务器端可用的文件描述符。

说明网线断开对端是不能做任何感知的,除非我们配置操作系统的SO_KEEPALIVE选项,或者进行应用层心跳检测。请参考文章《网络编程释疑之:TCP半开连接的处理》。

  1. 如果网线断开的时间短暂,在SO_KEEPALIVE设定的探测时间间隔内,并且两端在此期间没有任何针对此长连接的网络操作。当连上网线后此TCP连接可以自动恢复,继续进行正常的网络操作。

  2. 如果网线断开的时间很长,超出了SO_KEEPALIVE设定的探测时间间隔,或者两端期间在此有了任何针对此长连接的网络操作。当连上网线时就会出现ETIMEDOUT或者ECONNRESET的错误。你必须重新建立一个新的长连接进行网络操作。

这件事后,我再也不敢随便发明名词了,呜呜......

发现一篇好文:《tcp连接断连问题剖析》

网络编程释疑之:TCP连接拔掉网线后会发生什么相关推荐

  1. TCP协议:拔掉网线后, 原本的 TCP 连接还存在吗?

    问题描述 今天,聊一个有趣的问题:拔掉网线几秒,再插回去,原本的 TCP 连接还存在吗? 可能有人会说,网线都被拔掉了,那说明物理层被断开了,那在上层的运输层理应也会断开,所以原本的 TCP 连接就不 ...

  2. 拔掉网线后, 原本的 TCP 连接还存在吗?

    大家好,我是小林. 今天,聊一个有趣的问题:拔掉网线几秒,再插回去,原本的 TCP 连接还存在吗? 可能有的同学会说,网线都被拔掉了,那说明物理层被断开了,那在上层的传输层理应也会断开,所以原本的 T ...

  3. 原本的 TCP 连接,被拔掉网线后还存在吗?

    网线都被拔掉了,那说明物理层被断开了,那在上层的传输层理应也会断开,所以原本的 TCP 连接就不会存在的了.就好像, 我们拨打有线电话的时候,如果某一方的电话线被拔了,那么本次通话就彻底断了. 真的是 ...

  4. 客户端拔掉网线后,会直接影响 TCP 连接状态吗?

    大家好,我是小林. 今天,聊一个有趣的问题:拔掉网线几秒,再插回去,原本的 TCP 连接还存在吗? 可能有的同学会说,网线都被拔掉了,那说明物理层被断开了,那在上层的传输层理应也会断开,所以原本的 T ...

  5. java网络编程,通过TCP,Socket实现多对一的局域网聊天室

    java网络编程,通过TCP,Socket实现多对一的局域网聊天室 可以实现多个客户端连接服务器,服务器接收到信息就会把信息广播到所有的客户端 这是服务器端的代码 View Code import j ...

  6. Linux网络编程---详解TCP

    Linux网络编程---详解TCP的三次握手和四次挥手_shanghx_123的博客-CSDN博客_tcp的协议数据单元被称为 TCP协议详解(TCP报文.三次握手.四次挥手.TIME_WAIT状态. ...

  7. TCP/IP网络编程之基于TCP的服务端/客户端(二)

    回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...

  8. 用java网络编程中的TCP方式上传文本文件及出现的小问题

    自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...

  9. TCP/IP网络编程之基于TCP的服务端/客户端(一)

    TCP/IP网络编程之基于TCP的服务端/客户端(一) 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于 ...

最新文章

  1. 服务应该去版本化,不管是微服务还是SOA
  2. 【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )
  3. 小程序----面试题总结
  4. eclipse xml文件中按没有提示
  5. 一文带你认识keepalived,再带你通关LVS+Keepalived!
  6. LaTeX TikZ绘图——组合数学中棋盘多项式的画法
  7. SSM框架入门学习记录
  8. HDU 2154 跳舞毯
  9. httpd的一些知识点
  10. java 判断类型_Java中类型判断的几种方式
  11. 12月 Web 服务器调查:nginx 增长最快,微软市场份额最高
  12. 《Android音视频开发》— Android 书籍
  13. 列举对比【智能建站 自主建站 DIY建站 傻瓜式建站 响应式建站系统哪个好?】
  14. mac 电脑 java wifi密码尝试器
  15. Python的异步编程介绍(MD)
  16. 搜索的实例——水管工游戏
  17. 重生之我是赏金猎人(九)-从本无法触发的xss到梦幻联动挖掘多个致命接口下的XSS触发点
  18. 配置samba服务器全过程
  19. 基于树莓派4b(raspberry pi 4b)内核编译流程,交叉编译环境搭建,loadable kernel module (LKM)编译方法
  20. hiho #1474 拆字游戏(dfs,记录状态)

热门文章

  1. 订单操作-分页查询所有订单
  2. redis(12)--事件,客户端,服务器
  3. 如何使 React 中的 useEffect、useLayoutEffect 只调用一次
  4. 基于 DataLakeAnalytics 做跨地域的数据分析 1
  5. 大量执行OSS PutObject时卡住的问题排查
  6. 第16章 C预处理器和C库 16.3 在#define中使用参数
  7. Solr学习笔记——查询
  8. 阿里云免费申请免费SSL证书
  9. Fragment结合nineold包实现滑动tab页
  10. HDU - 2296 Ring(AC自动机+dp)