TCP 中的数据包大小、窗口大小和套接字缓冲区

Vij*_*ogi 5 sockets tcp

在研究了“窗口大小”概念之后,我了解到它在通过线路发送之前保留数据包,直到收到最早的数据包的确认为止。一旦填满,后续数据包将被丢弃。我还在某处读到TCP是一种流协议,而数据包是与网络层的IP协议相关的。

直到我假设我已经声明了一个缓冲区(内部代码),我填充了一些数据并使用套接字发送该缓冲区。我声明了一个 10000 字节的缓冲区,并使用套接字通过 10 Gbps 链路重复发送它。

我有以下假设和问题。请核实并帮忙

  1. 如果我想发送 64,256,512 等字节的数据包,请在那么多空间的代码内声明缓冲区并通过套接字发送。每次执行 send() 命令都会发送一个同样大小的数据包。

  2. 那么,如果我想研究数据包大小变化对吞吐量的影响,我该怎么办?我需要改变代码中的缓冲区大小吗?

  3. 我们使用 SO_SNDBUF 和 SO_RECVBUF 设置的套接字缓冲区是什么?谷歌说这是套接字的缓冲区空间。它与 TCP 窗口大小相同还是不同?哪个参数更适合改变或增加吞吐量?

套接字缓冲区中还有三个参数:Min、Default 和 Max。我应该根据我的实验改变哪一项以获得更多相关性?

usr*_*usr 3

TCP 不直接公开控制数据包发送方式的方法,因为它是流协议。但是您可以通过禁用 Nagle 算法来使 TCP 堆栈发送数据包。这样,您的所有数据都send将立即发送出去,而不是被缓冲。数据将被分割成 MTU 大小的数据包,约为 1400 字节。取决于链接。

回答 (2):禁用 nagling 并使用 < 1400 字节的缓冲区调用发送。使用 Wireshark 确保您得到您想要的。

缓冲区设置与此无关。我不知道有什么正当理由去触碰它们。

一般来说,这个问题可能没有实际意义,因为您似乎想要发送大量数据。只需启用 Nagling 和send大缓冲区(例如 64KB)即可。