TCP send断开的一些测试

测试结论:

服务端循环接收,客户端每隔1s发送,使用默认缓冲区大小,短暂断开服务端网线后再接上(3s左右),现象是客户端继续发送无异常,服务端接收阻塞10s左右后,会一次性收到多条之前客户端缓存区的数据。

服务端循环接收,客户端每隔1s发送,不启用keepalive,短暂断开客户端网线后再接上(3s左右),现象是客户端send直接返回-1,服务端阻塞等待数据,会一直等待下去。

将客户端发送缓冲设置为0,其它同测试1,短暂断开服务端网线后再接上(3s左右),现象是客户端发送在服务端断开后会阻塞,过12s左右后继续正常发送。

其它同测试一,网线断开后不再接上,现象是在服务端网线断开后,客户端发送持续成功,直到过了20s左右,客户端发送才返回了-1。(测试过修改发送缓冲大小和增加发送超时,都无效,还是20s)

同测试2,服务端增加keepalive设置,设置为10s无法送开始发探测包,1s一个最多发3个,现象是客户端send直接返回-1,服务端接收过13s返回了-1。

测试4的msdn解释:If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has been placed in nonblocking mode.即只要协议栈缓冲区窗口没满,send就会成功,但是增大缓冲区,测试还是20s返回-1,这里没找到能增大这个超时时间的办法,缩短确实可以,测试3缓冲区发满后,发送就会阻塞。

以下是《effective TCP/IP programming》的说明。

1.测试条件:

服务端程序跑在树莓派上,连接后循环recv,如果有数据,打印数据,如果数据长度<=0,则打印长度。

客户端程序跑在windows下,每隔1s发送一次”hello world”。

服务端程序:

客户端程序:

操作:在9s时,断开服务端网线,等待3s后,将网线接回。

服务端结果:

客户端结果:

2.测试条件

其它同测试1,但是不断开服务端网线,断开客户端网线。

服务端结果:

客户端结果:

3.测试条件

将客户端发送缓冲设置为0,其它同测试1。

客户端代码:

客户端结果:

服务端结果:

4.测试条件

其它同测试1,但是服务端断开后不再接上网线。

客户端结果:

服务端结果:

5.测试条件

同测试2,服务端增加keepalive设置

客户端结果:

服务端结果:

第四条已经找到了原因

抓包发现,默认情况下,windows下的重发包是0.6s,1.2s,2.4s,4.8s, 9.6s,总计差不多就是20s。

这是客户端设置了0.5s没收到数据发送keepalive的抓包情况,每隔1s,共发10次,可以看到,可以在10s左右就可以检测到错误。

抱着这个问题,首先回顾了《TCP/IP详解卷1》,在178页 18.3连接建立的超时中看到,第一次重传时间是6秒,第二次是24秒,这显然和我实际看到的不一样。

另外在书中第21章《TCP的超时与重传》中可以看到关于RTO和RTT的概念。

RTT = Round Trip Time

指连接的往返时间,由三部分组成:链路的传播时间、末端系统的处理时间、路由器缓存中的排队和处理时间,反应了网络当前的状况。

RTO = Retransmission TimeOut

指连接的超时重传时间,根据RTT不断的进行调整,防止重传时间太短导致发出太多包,防止重传时间太长使得应用层反应缓慢。

稍微看了下感觉其中的计算可能过时了(后来发现确实是如此)。

去RFC查了下,重传超时相关最新的是RFC6298,他更新了RFC1122并且废弃了RFC2988。

文中提到,对于同一个包的多次重传,必须使用Karn算法,也就是刚才看到的双倍增长。

不同系统下这个时间次数都不相同,windows下

与抓包结果相符。

原文出处:https://www.cnblogs.com/gezi/p/12218174.html

java tcp 断开检测_TCP连接网线断开时的情况测试相关推荐

  1. java tcp 获取状态_TCP连接状态

    服务端,端口的状态变化 先在本机(IP地址为:192.168.1.10)配置FTP服务,然后在其它计算机(IP地址为:192.168.1.1)访问FTP服务,从TCPView看看端口的状态变化. 下面 ...

  2. 主动断开socket链接_TCP连接与断开详解(socket通信)

    http://blog.csdn.net/Ctrl_qun/article/details/52518479 一.TCP数据报结构以及三次握手 TCP(Transmission Control Pro ...

  3. java tcp端口复用_tcp端口复用

    Java TCP/IP协议的Socket如何设置端口复用? 情境如下: 1). 使用new Socket(ServerAddress, ServerPort, ClientAddr你的其中一端的连接没 ...

  4. python socket 主动断开_python之使用ctrl+c断开多线程(TcpSocketServer连接)出现端口占用的情况...

    1.使用setDaemon(True)代替join() [全部替换]---不然子线程 2.在主线程 try: while True: time.sleep(1) except KeyboardInte ...

  5. C#实现TCP客户端,可检测断线并自动重连保持连接,对于网线断开或拔掉的情况也可检测到

    使用C#实现的TCP客户端,可检测断线(包括网线断开或拔掉),支持断线重连.客户端内部有循环缓冲区异步接收数据,对客户端的读操作会立即返回,根据方法返回值来判断读取数据的字节数. ps:通讯接口ICo ...

  6. TCP协议的长连接和短连接详解

    一.前言 TCP在真正开始进行数据传输之前,Server 和 Client 之间必须建立一个连接.当数据传输完成后,双方不再需要这个连接时,就可以释放这个连接. TCP连接的建立是通过三次握手,而连接 ...

  7. java如何处理tcp异常断开_(转)TCP连接异常断开检测

    TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...

  8. mysql的tcp链接过程_tcp建立连接和断开连接过程

    在之前对TCP协议的介绍中,说到了其中它的一个特点是面向连接.今天就来介绍一下它的连接和断开过程. 面向连接指的是采用TCP协议通讯,在数据传输之前必须先建立连接,通讯完成之后,必须关闭连接. 建立连 ...

  9. tcp 服务端如何判断客户端断开连接

    最近在做一个服务器端程序,C/S结构.功能方面比较简单就是client端与server端建立连接,然后发送消息给server.我在server端会使用专门的线程处理一条socket连接.这就涉及到一个 ...

最新文章

  1. 二分查找(递归与非递归)
  2. 老男孩教育参观云计算公司
  3. 第三次学JAVA再学不好就吃翔(part29)--代码块
  4. html双翼布局,第19题 CSS如何实现双飞翼布局?
  5. .NET 6 Preview 6 Released
  6. “嘲羊群众”词条视频惹怒粉丝 百度知道向张艺兴道歉...
  7. 【报告分享】2021年95后医美人群洞察报告:颜值经济,95后“美力”来袭.pdf(附下载链接)...
  8. wss3.0 对文档库的一些操作
  9. Ogre 3d 工具集
  10. 说说VNode节点(Vue.js实现) 1
  11. 使用PowerDesigner
  12. linux内核奇遇记之md源代码解读之七阵列同步一
  13. FME将ArcGIS符号化转为CAD填充
  14. houdini大神自诉:为什么我要放弃maya I
  15. STM32个人笔记-电源管理
  16. 美国无人机技术及相关项目
  17. oracle数据库连接非常慢,sqlplus很快,用客户端就很慢,十几秒才好
  18. Bootstrap布局自动拉伸改变大小
  19. 过上等生活,享下等情欲
  20. 蘑菇丁自动填写日报---Python语言实现

热门文章

  1. 计算机组装走线,DIY电脑装机教程 走背线方法图文教程
  2. 130 个相见恨晚的神器网站
  3. Mysql搜寻姓_mysql – 用于搜索名称和姓氏的最有效的sql架构
  4. 读透《华为数字化转型之道-方法篇》 by 傅一平
  5. Chrome浏览器无法安装
  6. Cisco实物图片库
  7. NSGAII快速非支配遗传算法二代学习笔记1
  8. 工作经历最详细的模板
  9. 月亮,还是馅饼(1)
  10. 鼎捷 易飞 ERP 9.0.12.0 下载 算号 注册