我的C程序中有两个send()s,看着wireshark,我意识到它们是作为一条TCP / IP消息发出的。我假设这是某种TCP / IP优化,确定它们足够小,可以一起发送。但是,我正在从头开始重建一个旧程序,我正在基于它的TCP / IP流量构建我的工具:MTU限制,内部协议设计等。所以如果旧工具发出两个单独的消息,我需要发出两条不同的消息。
所以有人知道它在后台具体做了什么(除了简单的优化),如果有一个标志或需要启用/禁用的东西,那么我得到1比1的C send()s和TCP / IP传输?现在我所能做的就是让它们分开就是在每次send()之后放一个sleep(1)。
感谢。
答案 0 :(得分:7)
您可以在TCP_NODELAY
中设置setsockopt
以禁用Nagle算法,以防止您的操作系统组合小数据包。但是,对于您来说,了解TCP是一种面向流的协议以及个人"数据包"不打算有意义地分开。沿途的路由器可以自由组合或拆分TCP数据包(虽然这是不常见的,因为需要额外的处理),并且接收操作系统不一定每个recv()
读取一个发送的数据包。如果要在TCP中描述信息包,则需要使用标头结构来报告以下字节中有多少属于该数据包。