UDP和TCP带宽竞争处理问题


两台PC,都跑fedora10。
服务器端一个进程,启用3个线程,一个收UDP(只收,大量数据),两个收发TCP(少量控制命令)。
客户端一个进程,启用3个线程,一个UDP线程发数据(只发,大量数据),两个TCP线程收发(收命令并对应服务端命令作出反馈等)。

带宽有限,当客户端往上发的UDP数据把带宽占满时,发现服务器无法通过TCP链路往下发送数据,调用send返回OK但客户端一直收不到。如果带宽比较宽裕,则不存在这样的问题。此时当服务器把tcp链路关闭时,客户端会一瞬间收到所有累计的tcp数据,然后关闭连接。

两边tcp socket都设置了nodelay。

麻烦各位大侠指点一下,怎么避免或者处理这种TCP完全发不动的情况。

我现在让UDP发20K就停30ms,貌似没啥影响。

8 个解决方案

#1


能否把tcp的缓冲区减小?

#2


限制udp流量。这个跟网络上面的p2p传输很像。很多公司都想禁止p2p传输都禁止不了的。最好能在自己的源头上面控制最好。
其实你说的那种情况就是丢包。

#3


在同一台机器上是不是可以考虑以带外数据传送控制消息

#4


用iptable限制一下服务器端udp对应的那个端口的流量试试。

这种带宽都被占完了那还有什么办法呢。

#5


疑问是为什么服务器一旦主动close fd,客户端马上就全部收到命令了。而且命令也就二三十字节,怎么会一直发不下去。重传几次也够了吧。

#6


也许正是因为数据量小,所以TCP没有实际进行数据的传输,Nagle算法,先攒攒再说.. 本意是提高网络的利用率
lz打开TCP_NODELAY选项试试看
TCP_NODELAY
   Specifies whether TCP should follow the Nagle algorithm for deciding when to send data. By default, TCP will follow the Nagle algorithm. To disable this behavior, applications can enable TCP_NODELAY to force TCP to always send data immediately. For example, TCP_NODELAY should be used when there is an application using TCP
   for a request/response.

#7


我设置了nodelay的,应该不是nodelay的问题,即使被delay了也不可能被永远delay,现在现象是客户端就一直收不到,知道服务器端close fd,一瞬间客户端全部收到

#8


那试着减小TCP的缓冲区看看呢,将缓冲区大小设置为0
SO_SNDBUF    Sets send buffer size.
SO_RCVBUF    Sets receive buffer size.

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



关于对udp的可靠连接处理问题? UDP+线程池处理问题! 窗口处理问题 大日志处理问题 乱码处理问题 链表的处理问题 线程处理问题 大数处理问题 处理问题感悟 文件处理问题
 
粤ICP备14056181号  © 2014-2021 ITdaan.com