TCP/IP協議中backlog分析與設置以及TCP狀態變化

TCP/IP協議卷一中是有說明設置backlog這個值的,這值是作什麼的呢?linux

你們都知道TCP創建鏈接時是要進行三次握手鍊接的,可是否三次握手完成了,服務端就進行處理了(accept)呢,若是沒有處理就變成什麼狀況,假如沒有及時accept的話,後續客戶端就鏈接不上或鏈接失敗。這樣就談不上吞吐量了。想必你們也認爲TCP不是那麼設計的。服務器

backlog實際上是一個鏈接隊列,如下是backlog隊列大小公式。
 backlog隊列總和=未完成三次握手隊列 +  已經完成三次握手隊列socket

以上參數解釋說明以下:函數

未完成三次握手隊列:服務器處於listen狀態時收到客戶端syn 報文(connect)時放入未完成隊列中。spa

已經完成三次握手隊列:三路握手的第二個狀態即服務器syn+ ack響應client後,此時第三個狀態ack報文到達前(客戶端對服務器syn的ack)一直保留在未完成鏈接隊列中,若是三路握手完成,該條目將從未完成鏈接隊列搬到已完成鏈接隊列尾部..net

backlog參數設置既能夠在Linux內核參數設置(修改文件/etc/sysctl相關參數),也能夠在socket系統調用listen函數時設置(第二個參數),這兩者區別是,前者爲全局性的,影響全部socket,後者爲局部性的,影響當前socket。設計

圖1   如下表示backlog隊列的變化狀態server

當server調用accept時,從已完成(三次握手)隊列中的頭部取出一個socket鏈接給進程,如下是變化過程。隊列

相關文章
相關標籤/搜索