【问题标题】:TCP Packet sizeTCP 数据包大小
【发布时间】:2016-03-19 21:16:46
【问题描述】:

我正在尝试从客户端向服务器发送 TCP 数据包,我希望能够选择数据包的大小。我面临的问题是,如果我不设置 Sleep(45)(毫秒),则数据包大小不正确。我使用 Wireshark 查看数据包的大小。

为了确保你们和我在一起,我会尽可能清楚地解释。

我尝试过这样做..

首先,我选择要发送的数据量。例如说 1Mb 或“1000000ish”字节。我分配了一个空间很大的数组。

为了能够发送特定大小的数据包,我分配了一个发送缓冲区,其中包含我想要的数据包大小(我的情况是 64、512、1024 和 1514 字节)。我用字母填充发送缓冲区。假设我想以 64 作为数据包大小发送。

for (int i = 0; i < packetSize; i++){ 
            sendbuf[i] = 'a';
        }

要知道我必须发送多少次数据包才能达到 1Mb,我做了这个数学运算。
nrOfTimes = (dataSize / packetSize)。

然后循环发送。

for (int i = 0; i < nrOfTimes; i++) {
            rc = send(sConnect, sendbuf, packetSize, 0); //rc and sConnect contains information where to send the data, if you wonder

            Sleep(45); // If i dont use this the packet size gets 1514. 
        }

如果我使用 sleep(45) 它可以工作,但需要数年才能完成,我应该测量时间,所以这样做是不正确的。如果我低于 Sleep(45) 那么我的网卡会忽略数据包大小并将其设置为 1514 大小。

有没有人有明确的想法该怎么做?我只能假设它可能与网卡缓冲区有关。

【问题讨论】:

  • TCP 为您提供字节流,而不是数据包,因此您不能轻易地使 1 个 send() 调用导致 1 个 recv() 调用。接收方是否从您的几个 send() 调用中接收到一堆数据真的很重要吗?
  • TCP 是一个流。因此,您无法发送特定尺寸。您只需继续发送数据,直到数据全部到位。
  • @nos 没错,我的错。我的任务是能够选择数据包的大小。但我不知道是谁做的......
  • 如果要发送数据包,则需要面向数据包的协议,而不是 TCP。
  • @PetrusLindblom 那么你被赋予了一项不可能完成的任务。您需要与任务提供者交谈,看看是否有误会。

标签: c++ sockets networking tcp packet


【解决方案1】:

TCP 是一种字节流协议,因此将传输视为离散的字节数据包是不正确的。您很可能通过注入 45 毫秒延迟与 Nagle algorithm 进行交互。

【讨论】:

  • 在wireshark中长度实际上是106,所以我的64+头。但根据我在大学的讲师的说法,它的正确长度。
猜你喜欢
  • 2011-04-18
  • 2020-05-25
  • 2010-09-28
  • 1970-01-01
  • 2010-12-23
  • 2021-03-10
  • 2011-08-13
  • 2013-01-09
相关资源
最近更新 更多