[备忘]某客户端传文件导致连接中断的分析过程 |
上一篇:[备忘]关于MTU,MSS 下一篇:[备忘]postgresql将逗号分隔的字符串,转成多行 |
添加日期:2022/4/18 2:04:17 |
快速返回 返回列表 |
阅读654次 |
现象: 某客户端不停的断开,重连,如此反复。 重启路由器,无效。
分析: 日志看不出啥来,只知道连接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. |
|