将多个写入打包到单个 TCP 数据包中

问题描述 投票:0回答:1
我有一系列

send()

 调用来将字节写入 TCP 套接字。是否可以强制套接字仅在 TCP 数据包已满(超过 MTU)或我明确指示我已完成顺序调用时发送 TCP 数据包?
具体来说,我有一些代码,例如:

send()

我想以某种方式最小化发送的底层数据包的数量。
这可以通过创建一个中间缓冲区来完成,然后在所有发送调用之后,我可以手动发送该缓冲区,但我想避免创建中间缓冲区,因为某些数据可能非常大,并且需要额外的该数据的副本。换句话说,我希望以零复制方式发送数据。这可能吗?

注意:我知道 TCP 不是基于数据包的协议。我搜索了一下,有很多答案给出了迂腐的回答,即数据包并不真正存在,虽然它在语义上可能是正确的,但它并不是特别有用,因为下面仍然有 IP 数据包。

您可以通过
c linux sockets tcp
1个回答
0
投票
一次性写下所有内容。 但无论如何,您无法控制套接字接口如何或何时打包数据并发送。 这取决于网络拥塞、内部缓冲区大小、MTU 和其他几个原因。

TCP 使用的 MTU 通常会根据连接端之间路径中所有接口的 MTU 在连接生命周期内进行调整。  这是根据收到的 ICMP 分段所需数据包动态计算的。  因此,允许用户干扰微调算法是一种危险的行为。  恕我直言,套接字越早准备好发送数据,接收方就越早收到数据。

© www.soinside.com 2019 - 2024. All rights reserved.