Performance TCP客户端在继续发送之前等待ack

Performance TCP客户端在继续发送之前等待ack,performance,networking,tcp,low-latency,Performance,Networking,Tcp,Low Latency,我试图理解为什么tcp客户端停止发送数据和 等待服务器响应。我已经读过,并且在两个端点上都将initcwnd设置为400。我还设置了 net.ipv4.tcp\u窗口\u缩放为1。两个套接字都使用TCP_NODELAY选项打开,以禁用Nagle算法。 端点之间的RTT延迟约为35毫秒 从下面的tcpdump跟踪中可以清楚地看到,at14:02:46.310155客户端发送其最后一个数据包,然后等待来自服务器的确认,该确认在大约31毫秒后到达。一旦它到达,它将继续发送数据 14:02:46.268

我试图理解为什么tcp客户端停止发送数据和 等待服务器响应。我已经读过,并且在两个端点上都将initcwnd设置为400。我还设置了
net.ipv4.tcp\u窗口\u缩放为1。两个套接字都使用TCP_NODELAY选项打开,以禁用Nagle算法。
端点之间的RTT延迟约为35毫秒

从下面的tcpdump跟踪中可以清楚地看到,at
14:02:46.310155
客户端发送其最后一个数据包,然后等待来自服务器的确认,该确认在大约31毫秒后到达。一旦它到达,它将继续发送数据

14:02:46.268179 IP client > server: Flags [S], seq 2645621234, win 28400, options [mss 1420,sackOK,TS val 6178563 ecr 0,nop,wscale 9], length 0 14:02:46.305282 IP server > client: Flags [S.], seq 339254367, ack 2645621235, win 28160, options [mss 1420,sackOK,TS val 4865788 ecr 6178563,nop,wscale 9], length 0 14:02:46.305343 IP client > server: Flags [.], ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 0 14:02:46.305592 IP client > server: Flags [P.], seq 1:44, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 43 14:02:46.305954 IP client > server: Flags [.], seq 44:1452, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 1408 14:02:46.306023 IP client > server: Flags [.], seq 1452:2860, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 1408 14:02:46.306258 IP client > server: Flags [.], seq 2860:4268, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 1408 14:02:46.306445 IP client > server: Flags [.], seq 4268:5676, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 1408 14:02:46.306586 IP client > server: Flags [.], seq 5676:7084, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 1408 14:02:46.306914 IP client > server: Flags [.], seq 7084:8492, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 1408 14:02:46.307082 IP client > server: Flags [.], seq 8492:9900, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 1408 14:02:46.307251 IP client > server: Flags [.], seq 9900:11308, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 1408 14:02:46.307411 IP client > server: Flags [.], seq 11308:12716, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 1408 14:02:46.307620 IP client > server: Flags [.], seq 12716:14124, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 1408 14:02:46.307760 IP client > server: Flags [.], seq 14124:15532, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 1408 14:02:46.307931 IP client > server: Flags [.], seq 15532:16940, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 1408 14:02:46.308059 IP client > server: Flags [.], seq 16940:18348, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 1408 14:02:46.308216 IP client > server: Flags [.], seq 18348:19756, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 1408 14:02:46.308373 IP client > server: Flags [.], seq 19756:21164, ack 1, win 56, options [nop,nop,TS val 6178573 ecr 4865788], length 1408 14:02:46.309622 IP client > server: Flags [.], seq 21164:22572, ack 1, win 56, options [nop,nop,TS val 6178574 ecr 4865788], length 1408 14:02:46.309852 IP client > server: Flags [.], seq 22572:23980, ack 1, win 56, options [nop,nop,TS val 6178574 ecr 4865788], length 1408 14:02:46.310023 IP client > server: Flags [.], seq 23980:25388, ack 1, win 56, options [nop,nop,TS val 6178574 ecr 4865788], length 1408 14:02:46.310155 IP client > server: Flags [.], seq 25388:26796, ack 1, win 56, options [nop,nop,TS val 6178574 ecr 4865788], length 1408 14:02:46.341579 IP server > client: Flags [.], ack 44, win 55, options [nop,nop,TS val 4865797 ecr 6178573], length 0 14:02:46.341612 IP client > server: Flags [.], seq 26796:28204, ack 1, win 56, options [nop,nop,TS val 6178582 ecr 4865797], length 1408 14:02:46.268179 IP客户端>服务器:标志,序号2645621234,win 28400,选项[mss 1420,sackOK,TS val 6178563 ecr 0,nop,wscale 9],长度0 14:02:46.305282 IP服务器>客户端:标志[S],序号339254367,确认2645621235,赢28160,选项[mss 1420,萨克克,TS val 4865788 ecr 6178563,nop,wscale 9],长度0 14:02:46.305343 IP客户端>服务器:标志[.],确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度0 14:02:46.305592 IP客户端>服务器:标志[P],序号1:44,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度43 14:02:46.305954 IP客户端>服务器:标志[.],序号44:1452,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度1408 14:02:46.306023 IP客户端>服务器:标志[.],序号1452:2860,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度1408 14:02:46.306258 IP客户端>服务器:标志[.],序号2860:4268,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度1408 14:02:46.306445 IP客户端>服务器:标志[.],序号4268:5676,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度1408 14:02:46.306586 IP客户端>服务器:标志[.],序号5676:7084,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度1408 14:02:46.306914 IP客户端>服务器:标志[.],序号7084:8492,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度1408 14:02:46.307082 IP客户端>服务器:标志[.],序列8492:9900,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度1408 14:02:46.307251 IP客户端>服务器:标志[.],序号9900:11308,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度1408 14:02:46.307411 IP客户端>服务器:标志[.],序号11308:12716,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度1408 14:02:46.307620 IP客户端>服务器:标志[.],序列12716:14124,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度1408 14:02:46.307760 IP客户端>服务器:标志[.],序列14124:15532,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度1408 14:02:46.307931 IP客户端>服务器:标志[.],序号15532:16940,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度1408 14:02:46.308059 IP客户端>服务器:标志[.],序号16940:18348,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度1408 14:02:46.308216 IP客户端>服务器:标志[.],序列18348:19756,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度1408 14:02:46.308373 IP客户端>服务器:标志[.],序号19756:21164,确认1,赢56,选项[nop,nop,TS val 6178573 ecr 4865788],长度1408 14:02:46.309622 IP客户端>服务器:标志[.],序列21164:22572,确认1,赢56,选项[nop,nop,TS val 6178574 ecr 4865788],长度1408 14:02:46.309852 IP客户端>服务器:标志[.],序号22572:23980,确认1,赢56,选项[nop,nop,TS val 6178574 ecr 4865788],长度1408 14:02:46.310023 IP客户端>服务器:标志[.],序号23980:25388,确认1,赢56,选项[nop,nop,TS val 6178574 ecr 4865788],长度1408 14:02:46.310155 IP客户端>服务器:标志[.],序列25388:26796,确认1,赢56,选项[nop,nop,TS val 6178574 ecr 4865788],长度1408 14:02:46.341579 IP服务器>客户端:标志[.],确认44,赢55,选项[nop,nop,TS val 4865797 ecr 6178573],长度0 14:02:46.341612 IP客户端>服务器:标志[.],序列26796:28204,确认1,赢56,选项[nop,nop,TS val 6178582 ecr 4865797],长度1408
这种行为有两个主要原因:

  • 。在连接刚刚建立或检测到拥塞后发生
  • 。发送比MSS短的TCP段时发生

  • 在您的场景中,客户端发送20个TCP段并等待确认。收到一个(第一段)后,它会发送更多(您的跟踪仅显示一个段)。

    从tcp通信转储中,我看到以下内容:

    -我们无法保证Nagle已关闭,但由于客户端正在发送完整的MSS消息,因此这似乎不是问题

    -连接正在使用窗口缩放:您可以在SYN和SYN+ACK消息的选项中看到wscale为9


    然而,我看到就在传递28160字节(服务器发布的窗口)之前,客户机停止并等待服务器确认。这可能是因为它没有考虑窗口比例,或者initcwnd是20(您说您将其设置为400),或者应用程序发送了26796个字节,然后发送其余的字节。

    在三向握手中,为接收方协商了2^9的窗口比例,接收方播发了55=55*2^9=28160字节的窗口

    然后,发送方发送一个43字节的数据包,紧接着是19字节和1408字节,总共26795字节

    显然,默认的初始拥塞窗口已经被修改,否则在没有收到ACK的情况下,20个数据包就不会被发送

    然而,26795字节几乎填满了接收器的窗口;没有足够的空间发送另一个完整的MTU

    当来自接收器的ACK最终到达确认接收43字节数据包并公布55个窗口时,我们知道来自初始数据包的43字节已被消耗,并且我们现在计算出有足够的空间发送一个以上1408字节的数据包(28160-26795+43=1408)

    所以问题是,你的接收者没有为窗口做广告