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