1. 程式人生 > >udp接收緩衝設定多大

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個請求包的大小。