小编jla*_*aye的帖子

澄清 Linux TCP 窗口大小和延迟

通过我无法理解的 TCP 通道发送数据时出现延迟。该链路为 1Gb 链路,端到端延迟约为 40 毫秒。在我当前的设置中,延迟(一条消息从发送者用户空间到接收者用户空间的时间)可以达到 100 毫秒。

发送方套接字配置了 TCP_NODELAY 选项。发送缓冲区 (SO_SNDBUF) 配置为 8MB。接收缓冲区 (SO_RCVBUF) 也配置为 8MB。Tcp 窗口缩放被激活。

update-1:我使用 zeromq 3.1.1 中间件来承载数据。套接字配置,包括 TCP_NODELAY 标志由中间件执行。一些选项是可以访问的,比如 rx 和 tx 发出缓冲区大小,但不是 TCP_NODELAY。据我了解,TCP_NODELAY 被激活以确保数据尽可能发送。同时,实际的套接字发送和发送消息的决定在两个单独的线程中执行。如果在要发送批处理中的第一条消息时有几条消息可用,则完成正确的批处理。

我使用 tcpdump 进行了捕获,从中提取了以下帧。在初始 TCP 握手之后,发送方 (172.17.152.124) 开始发送数据。接收方的初始窗口大小为 5840 字节,发送方为 5792 字节。

我的问题是发送方发送了两个帧(#6 和 #7)然后停止,等待接收方返回 ack。就我所见,未达到接收器的窗口大小,传输不应停止(384 字节未完成,初始接收窗口大小为 5840 字节)。我开始认为我没有正确理解 TCP 是什么。有人可以帮忙澄清一下吗?

update-2:我的数据负载由一个幻数和一个时间戳组成。我通过将有效负载的时间戳与 tcpdump 放置的时间戳进行比较来隔离延迟的数据包。帧#9 的有效载荷 ts 非常接近帧#6 和#7 中的一个,并且明显小于帧#8 中接收到的ack 的时间戳。

update-1:帧#9 没有立即发送的事实可以用 TCP 通道的慢启动来解释。事实上,一旦连接运行了几分钟,问题也会出现,所以慢启动似乎不是一般的解释。

  1. 20:53:26.017415 IP 172.17.60.9.39943 > 172.17.152.124.56001:标志 [S],seq 2473022771,win 5840,选项 [mss 142219,e,800,142200,800,800,800 确认长度

  2. 20:53:26.017423 …

linux tcp tcpdump tcp-slow-start

7
推荐指数
1
解决办法
2万
查看次数

标签 统计

linux ×1

tcp ×1

tcp-slow-start ×1

tcpdump ×1