请教一个 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 的包。

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

2348 次点击
所在节点    Linux
27 条回复
r6cb
2023-08-11 23:34:28 +08:00
或许可以给第一个包的 URG 置 1 ,能让它不排队
zhs227
2023-08-11 23:39:52 +08:00
tcp 分段以后头部是有标记是否第 1 片和是否最后一片的。这是基本操作
zhs227
2023-08-11 23:45:59 +08:00
看错了,tcp 是没有分片标记的,ip 层才有。上一楼回答有误。
ZRS
2023-08-12 02:41:25 +08:00
伪需求,如果你需要任意控制发送量和顺序,请用 UDP 。但接收方也是不保序的
BingoXuan
2023-08-12 12:55:17 +08:00
发送永远都是按顺序的,就是 0:1440,1440:1600 这样。如果接收端 0:1440 没收到,而收到了 1440:1600 ,会发送快速重传,让发送端重新发送 0:1440 。

tcp 发送是滑动窗口内的数据以不超过 mss 进行顺序发送,等到对方 ack 后调整滑动窗口或者进行重传
jackniu
2023-08-12 17:34:24 +08:00
@hankai17 每次软中断都是独立的线程在处理,不存在多队列拿错的情况,因为一个软中断和一个硬中断是一一对应的
neoblackcap
2023-08-13 00:38:06 +08:00
自己在写协议栈或者网卡驱动么?应用层开发者不应该关心这个 TCP 层的实现细节。因为从接收端会重排,tcp socket 读出来的东西必然是有序的。
然后如果是想稳定复现这个两个 IP 包的先后顺序大概是很难,因为你必须控制传输链路中的全部网络设备,否则都没法实现稳定丢包。
如果要尝试复现,可以在网络链路中的一台网络设备进行设置,通过类似 eBPF 或者防火墙技术,对包进行过滤

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

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

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

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

© 2021 V2EX