[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]某客户端传文件导致连接中断的分析过程

上一篇:[备忘]关于MTU,MSS
下一篇:[备忘]postgresql将逗号分隔的字符串,转成多行

添加日期:2022/4/18 2:04:17 快速返回   返回列表 阅读655次
现象:
某客户端不停的断开,重连,如此反复。
重启路由器,无效。

分析:
日志看不出啥来,只知道连接close。
开wireshark抓包,发现是发文件时,有丢包,重传5次后,客户端主动关闭连接。

看了备份目录,发现有些文件可以传上去,大概几百字节。
传不上去的文件,都大于1KB。
查看TCP包,发现len>1460,是1489字节。
发现1460字节的包,交互都没问题。

尝试修改程序,将每次write的字节数控制在1000字节,
发现可以正常上传。
看来是TCP包>1460被丢弃了。

可是系统不是应该自动拆包吗?
查看另外一家,len都8000字节了,啥事没有。
所以,怀疑这家网卡或路由器有问题。

网卡没看出什么特别配置来。
到路由器抓包,发现>1460的tcp包,被进行了ip分包。
ip分包,说明数据长度>设备的MTU了。
该路由器界面还挺复杂,找到对应外网接口,查看MTU,竟然是1492.
正常应该是1500才对。
改成1500,问题解决。

走了弯路,应该第一时间查看MTU设置。
只是因为路由器界面复杂,随便点了几下,没仔细看。

怎么理解才对?
TCP握手时MSS=1460,
路由器按1460拆包,加上TCP和IP的20+20的头=1500
但是出口MTU是1492,所以ip层进行了拆包。
ip层和tcp层是两层,各管各的,互不相干。
ip层没有重传机制,丢了就丢了。
丢一个,TCP层就要重传,效率降低。
比如拆了100个包,那么100个都收到,才算一个TCP包,
TCP才会回复ACK。

那这里才拆两个包?怎么这么爱丢呢?几次重传都没有响应呢?
还是因为接收端没处理到ip拆包?






 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved