请教一个 tcp 超过 mss 分包的问题

2023-08-11 17:27:02 +08:00
 yujianwjj

假设一个 tcp 报文的大小是 1600 ,然后 mss 是 1440 ,那么协议栈会分包,分成 0-1440 ,1440-1600 两个包发出。

现在遇到一个问题是,有的机器上是先发出 0-1440 的包再发送 1440-1600 的包,有的机器是先发出 1440-1600 的包再发送 0-1440 的包。

这个是可以配置的吗?怎么设置?

2320 次点击
所在节点    Linux
27 条回复
hankai17
2023-08-11 17:31:19 +08:00
粘包警察在此
ovtfkw
2023-08-11 17:33:38 +08:00
粘包了吧
ysc3839
2023-08-11 17:41:13 +08:00
TCP 之上传输的是数据流,你说的“报文的大小是 1600”应该是指“一次性发送了 1600 字节”,因为 MSS 是 1440 ,所以不能只用一个 TCP 包发完。那按理来说 TCP 会先发前面的数据,再发后面的数据,因为接收端收到后要保持顺序,先收到后面的还得等前面的,没有好处。
cheng6563
2023-08-11 17:42:27 +08:00
等你网络差点就会发现数据可能是 0-200 一个包过来的了
yujianwjj
2023-08-11 17:46:39 +08:00
补充一下:我是在发送端用 tcpdump 抓包查看的。
coderxy
2023-08-11 17:53:48 +08:00
楼上都是些啥,开口闭口粘包的。 这就是一个基本的 TCP 分段问题, 分段之后接收方系统内核会帮你处理好顺序然后再写到你的进程的接收缓冲区。 至于能不能改变发送顺序,可能会比较麻烦,你可以尝试使用 tc 随机丢包去模拟 0-1440 的报文丢弃了后,1440-1600 先到,0-1440 通过重发后到的情况,对于接收方来说,效果是一样的。
hankai17
2023-08-11 17:59:05 +08:00
没看过相关源码
怀疑是网卡多队列 包被拆分后 送到不同队列对应不同的发送线程 造成发包乱序?
coderxy
2023-08-11 18:02:13 +08:00
@coderxy 补充一下,没看清楼主的问题,你这个顺序每台机器每次都固定吗? 系统相同吗? 确实没遇到过。
iOCZ
2023-08-11 18:03:50 +08:00
发送顺序并不重要,每个包会有一个序号吧,收到的时候放入缓冲区就有序了。
Exxfire
2023-08-11 18:06:35 +08:00
从后往前发是一种不好的操作。所以怀疑:
1. 是不是底层用了什么并行的方式发送数据,导致大 buf 处理更慢;
2. 是不是抓了大包的重传包;
3. 我更喜欢 wireshark 。
yujianwjj
2023-08-11 18:10:59 +08:00
补充:不同机器的硬件是不同,每台机器都是固定的顺序,操作系统都是 linux ,但是内核版本不一致
kkkbbb
2023-08-11 18:17:36 +08:00
你是单纯的想让发的顺序一致,还是因为这个导致了什么问题?即便发的顺序不一致,tcp 接收端也会顺序重组数据啊,接收端没啥问题吧
inhzus
2023-08-11 18:38:33 +08:00
tcpdump 看到的顺序和 receiver 观测到的顺序不一定一致啊...
leonshaw
2023-08-11 18:44:29 +08:00
不正常,乱序很容易触发快速重传
julyclyde
2023-08-11 18:55:16 +08:00
首先,不能用报文这个词
只能说“在 TCP 流上发送了一个 1600 长度的消息”

你说的“先发出 1440-1600”这个无所谓,反正对方收到的是保证顺序的
neroxps
2023-08-11 19:41:09 +08:00
两边抓包对比下,发包方没收到重传要求就不需要管他。
julyclyde
2023-08-11 19:43:35 +08:00
@neroxps 即使收到重传请求也不用管啊
hasdream
2023-08-11 19:47:21 +08:00
每次握手就获取目前能使用的 MTU 大小, 一般这个大小是减去 以太网头 16byte
每次发送的数据 = MTU - IP header size - tcp header size
内核数据接收 会根据包的 seq 等计算等计算包的位置 保障在用户端不会乱序
neroxps
2023-08-11 19:47:32 +08:00
@julyclyde 大量重传请求是需要排查的
yolee599
2023-08-11 21:20:32 +08:00
你是在发送端抓包的还是在接收端抓包的,一般发送端是按顺序发送的,但接收端不一定是按顺序收到的,因为两个包走了不一样的网络路径

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/964529

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX