udp接收緩衝設置多大

先說一下保護消息邊界,就是指傳輸協議把數據當作一條獨立的消息在網上傳輸,接收端只能接收獨立的消息。這個機制決定了udp的特性:
1. udp可以多線程對同一個fd進行發包操作,如果是tcp多線程發送,會讓流亂序,接收端完全無法解析出來
2. udp接收端每次只能拿到一個包,tcp需要藉助自定義包頭來拆分出一個一個的包

假如現在發送端發送了長度爲100,200,300的3個包,接收端需要調用3次recvfrom才能取完,並且不能保證先後順序。一般情況下,爲了保證recvfrom成功,我們要保證接收緩衝大於報文的大小,也就是緩衝設置比最大的300要大。但是還是會丟包,常見情況有:
1. 發送端抖動突然請求量很大,而接收端不能在短時間內處理這些請求,造成緩衝區不夠用
2. 接收端需要訪問磁盤等IO操作,磁盤也會抖動,導致接收端處理能力下降,造成緩衝區不夠用
很明顯解決方案是加大緩衝區,那麼是不是越大越好?
成熟的系統邏輯一般都會有處理超時機制,假設超時時間是1s,前端頁面發送請求會帶上時間戳,並且自己也開始計時,如果1s內還沒有收到回覆就彈請求超時頁面,後臺收到請求查看時間戳超過1s也不會處理直接丟掉。
假如現在接收緩衝設置爲可以存放100個請求的大小,後臺處理能力是10個/s,1s之後處理了10個請求,接收緩衝中後面90個請求的前端頁面已經彈了請求超時了,另外新的10個請求進來了接收緩衝,後臺接着處理結果後面連續90個都是超時,終於才輪到新的10個請求可以處理了,這是不科學的,所以接收緩衝的大小最優的是設置爲超時時間*後臺處理能力,也就是10個請求包的大小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章