在不同的TCP段中发送数据,不会被TCP栈合并
Send data in separate TCP segments without being merged by the TCP stack
Linux (Kernel 3.0.0.12;我想通过(POSIX) send-call发送一些tcp数据包。
使用Wireshark,我可以看到数据包不是在单独的tcp帧中发送的,而是两个或多个数据包一起发送的。
有没有办法告诉系统在自己的tcp数据包中从一个send()
缓冲区发送数据?程序流不应该在send-call处阻塞。
您的TCP堆栈正在实现Nagle算法,试图通过缓冲数据来提高效率。这是一种常见的优化,其目的是摊销40+字节(TCP + IP)报头的成本。堆栈不是发送多个小数据包,而是缓冲数据并将它们组合成一个更大的数据包,从而减少了报头开销。
TCP栈不是无限缓冲的。只要连接上有一些未确认的已发送数据,发送方就会继续缓冲。下一个包在:
- 一个完整的数据包值可以发送或
- 所有先前发送的数据被接收方确认
您通常可以通过设置TCP_NODELAY
套接字选项来禁用此功能。
setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int));
如果您希望每个数据包单独发送,请考虑使用UDP。但是,您必须实现自己的错误检测和重传丢失的数据包等…
您可以关闭Nagle,但最好停止与TCP堆栈的战斗。最好在你的协议中添加某种形式的帧,这样你就不需要担心你的传输单元是否被聚合和/或分割了。
在发送者中,这通常意味着使用终止字符或给出长度。
在接收端,它意味着知道如何读到一些终止字符,和/或知道如何使用接收到的传输单元的一部分,或从多个传输单元组装一个完整的消息。
我喜欢用buffsock来做这个,尽管它是Python的一项技术。但是你可能想要c++类似的东西:http://stromberg.dnsalias.org/strombrg/bufsock.html
"packet"。
不,这就是拥有一个"网络堆栈"的全部意义——你的以太网帧可以独立于更高级别的TCP/IP堆栈进行传输和路由。你绝对不想插手这件事!
- 使用C++程序合并排序没有得到正确的输出
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 用于合并排序的合并函数
- 在声明中合并两个常量"std::set"(不是在运行时)
- 如何将一个数组值合并为一个整数c++
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 将向量的 N 段合并到位C++
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- 在C++中合并两个库
- 以迭代方式合并标准::unordered_map
- 通过TCP的PvP通信问题
- 无法合并生成操作.. 先决条件不同
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- 合并排序不排序自创建数组类 c++
- 合并文本文件不同行中的重复项
- 找不到标识符合并
- 在不同的TCP段中发送数据,不会被TCP栈合并