sendto需要很多时间

时间:2019-05-27 02:43:49

标签: c sockets raw-sockets

我正在尝试在没有TCP负载的情况下与客户端-服务器通信。我只是将tcp的标头用作有效负载字段,默认情况下为20字节。我刚刚意识到,对于传输大文件,cpu的使用率非常高,我尝试在代码的每个部分都放置一些计时器。 (我用rdtsc来做。)结果是我在1000到勾之间建立了数据包的所有内容(由于内核会自动计算它,所以我不触摸ipv4校验和)。然后我查看了sendto时间,它花费了100000〜滴答(比构建数据包多100倍)。有没有没有sendto的发送原始tcp数据包的更快方法,还是有一种使sendto更快的方法?

我这样测量发送时间:

timefirst = rdtsc()
sendto()
timesecond = rdtsc()
print timesecond - timefirst

我用以下方法创建发送套接字:

int mysocket = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
int one = 1;
const int *val = &one;
setsockopt(mysocket, IPPROTO_IP, IP_HDRINCL, val, sizeof(one));

注意:我仅在我这边(发送程序和内核)谈论数据包的时间。它与通过电线,isp和路由器的速度无关。

2 个答案:

答案 0 :(得分:0)

您是否遇到过Nagle的算法:https://en.wikipedia.org/wiki/Nagle%27s_algorithm

如果是这样,您可以尝试设置TCP_NODELAY的套接字选项,该选项可能会解决发送数据的速度比您预期的慢。

答案 1 :(得分:0)

好吧,要将IP数据包发送到另一个地方,需要路由它并获取目标目的地的MAC地址,这可能涉及(并非总是)ARP往返来获取路由器/目的地的MAC地址。主机组成以太网头。

您尚未包括延迟量(您做得很好,但是您未指定滴答声的持续时间),也未包括电线中看到的电线流量输出,以便能够确定这些时间...如何确定目标地址,是否还有DNS查找以获取IP地址?这应该意味着(第一次)进行另一次网络往返,以获取目标主机的IP地址。

在另一架飞机上,您实际上在测量什么? sendto(2)执行所需的时间?数据包在电线上可见所需的时间?到达目的地需要多少时间?如果是,源计算机和目标计算机是否同步?在这种情况下如何同步?

您为什么不按How to create a Minimal, Complete, and Verifiable example页显示的那样实际显示代码?