gpt4 book ai didi

c - TCP 网络吞吐量测量

转载 作者:可可西里 更新时间:2023-11-01 02:45:33 25 4
gpt4 key购买 nike

作为练习的一部分,我正在编写一个小程序来测试网络吞吐量,并且需要将发送和接收缓冲区增加到 256 KB(以尝试提高 TCP 性能)。我使用 setsockopt() 和 SO_SNDBUF/SO_RCVBUF 选项执行此操作,并且还增加了“net.core.rmem_max”和“net.core.wmem_max”值。

getsockopt() 确认缓冲区大小的增加(256KB 值的两倍)所以我知道这很好。但是,当我将 256KB 的数据从一台主机发送到另一台主机时,接收方总是在多次读取中接收它,每次读取的大小各不相同(形式介于 20 到 40 次读取之间,接收字节数从 1448 到 18824 不等)直到它接收到所有数据.在这一点上,我主要对这些问题很困惑,

  1. 随着缓冲区大小的增加,它不应该在一次读取中接收它吗?
  2. 另外,为什么每次读取的字节数差异如此之大(它们不应该更恒定还是更不恒定)?
  3. 有什么方法可以确保在一次读取中接收到 256KB?

下面是显示读取部分的接收方代码片段,

  while(1) {
memset(&client_addr, 0, sizeof(client_addr));
if ((connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) <= 0) {
perror("accept()");
exit(EXIT_FAILURE);
}

while ((n = recv(connfd, &buff[0], BUFF_SIZE, 0/*MSG_WAITALL*/)) > 0) {
totalBytes += n;
++pktCount;
printf("Received(%d): %d bytes\n", pktCount, n);
}

if (n == 0) {
printf("Connection closed (Total: %lu bytes received)\n", totalBytes);
}

close(connfd);
connfd = -1;
totalBytes = 0;
pktCount = 0;
}

任何帮助都会很棒。

TIA

最佳答案

With the increased buffer size shouldn't it receive it in one read?

没有。 TCP/IP 是一种流式传输协议(protocol),将数据分段成较小的数据包。缓冲区大小主要影响底层网络层实现可以使用多少内存(Linux 通常将您设置的内存加倍),但不能保证接收方将以与发送方发送它的大小完全相同的 block 接收数据(在总之,当您调用 send()/write() 时,实际上并不意味着数据包已发送。此外,由于 MTU,您很可能还是将数据包拆分了。

Also why do the amount of bytes in each read differ so much (shouldnt they be more of less constant)?

您可能想调试为什么会发生这种情况。有数百个因素——正在使用的 NIC、它的设置、它的驱动程序、TCP/IP、TCP、以太网网络层设置、发送方和接收方之间的东西(即交换机)等。但是,嘿,更多的数据进来,而你的操作系统并且应用程序正在处理前一个 block 。鉴于将数据从 NIC 传递到用户空间应用程序的成本相对非常高,因此缓冲数据并以不同大小获取数据也就不足为奇了。

Is there some way to ensure the 256KB is received in one read?

可能有。可以使用阻塞式 read() 并要求操作系统仅在接收到至少 256KB 或发生错误时才唤醒进程。

关于c - TCP 网络吞吐量测量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13543565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com