关于网络通信程序中的组包问题

elated 2011-11-13 09:57:54
在网络通信库中,用TCP协议传输,为了提高效率,希望把小的数据组成较大的包一起发送出去,但是有时候小块的数据到达了,而很长时间后面没有数据。如果设置一个定时器等待超时,那么超时时间设定为多少合适呢?是每一个连接一个定时器,还是多个连接共用一个定时器?
...全文
189 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
恨天低 2011-11-19
  • 打赏
  • 举报
回复
其实,这些都没必要自己去处理吧?直接发出去吧,我觉得底层已经对这些进行优化了的。
qq120848369 2011-11-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 elated 的回复:]

不知一般的网络通信库是怎么处理这个问题的,比如ACE,ASIO
[/Quote]

web服务器在response的时候使用cork。
elated 2011-11-19
  • 打赏
  • 举报
回复
不知一般的网络通信库是怎么处理这个问题的,比如ACE,ASIO
cocoabird 2011-11-14
  • 打赏
  • 举报
回复
一般是直接发出去
elated 2011-11-14
  • 打赏
  • 举报
回复
怎么突然间感觉没必要这么做呢,直接发出去和自己管理超时,哪个好呢?
giant1st 2011-11-13
  • 打赏
  • 举报
回复
TCP_NODELAY和TCP_CORK基本上控制了包的“Nagle化”,Nagle
化在这里的含义是采用Nagle算法把较小的包组装为更大的帧。
John Nagle是Nagle算法的发明人,后者就是用他的名字来命名
的,他在1984年首次用这种方法来尝试解决福特汽车公司的网络
拥塞问题(欲了解详情请参看IETF RFC 896)。

更多请参考: http://blog.csdn.net/netpet/article/details/2836436
qq120848369 2011-11-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 elated 的回复:]

引用 1 楼 qq120848369 的回复:
这个不用你操心,你就小包发出去就行了,TCP自己做了延迟发送,默认200MS的等待时间。

或者你自己做好相关状态记录,使用如下选项主动控制:


C/C++ code
TCP_CORK
设置此项将不发送部份帧。所有排队的部份帧只在此项清除后, 才能发送。在调用 sendfile(2) 前准备数据报头或对网络吞吐量进行优化有用处。 ……
[/Quote]

Negle只有在未响应ACK<=1的情况下才会继续送出数据,原理就是如果ACK回来的慢说明网络状况差,那么就不应该继续发送。 现在Negle算法和延迟发送机制结合在一起,意思就是尽量避免小数据的发送,所以默认200MS的延迟,期待用户在200MS内连续送出若干个小片段,那么TCP会帮助你合并成一个大包送出去。

既然你发送的间隔那么长,可以选择利用CORK,不过我看你的需求挺麻烦的,我是没办法满足你了。
elated 2011-11-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qq120848369 的回复:]
这个不用你操心,你就小包发出去就行了,TCP自己做了延迟发送,默认200MS的等待时间。

或者你自己做好相关状态记录,使用如下选项主动控制:


C/C++ code
TCP_CORK
设置此项将不发送部份帧。所有排队的部份帧只在此项清除后, 才能发送。在调用 sendfile(2) 前准备数据报头或对网络吞吐量进行优化有用处。 此选项不能与 TCP_N……
[/Quote]
Nagle算法?为什么我看好多资料都建议关闭这个选项?却不明白为什么
qq120848369 2011-11-13
  • 打赏
  • 举报
回复
这个不用你操心,你就小包发出去就行了,TCP自己做了延迟发送,默认200MS的等待时间。

或者你自己做好相关状态记录,使用如下选项主动控制:

TCP_CORK
设置此项将不发送部份帧。所有排队的部份帧只在此项清除后, 才能发送。在调用 sendfile(2) 前准备数据报头或对网络吞吐量进行优化有用处。 此选项不能与 TCP_NODELAY 联用.


对于一个SOCKET,发送任何数据前先CORK,等你认为足够多的时候清除CORK,数据将一次性送出。

65,192

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧