天天看點

listen第二個參數數字的含義[随手筆記]listen函數原型第一種解釋第二種解釋參考連結

網上的回答分為兩種,更認可第一種說法,更加有理有據并且有實際的嘗試。

文章目錄

  • listen函數原型
  • 第一種解釋
  • 第二種解釋
  • 參考連結

listen函數原型

  • int listen(int sockfd, int backlog);
    • 第一個參數我們都知道是socket傳回的描述符
    • 第二個參數表示什麼呢,之前一直以為是connet的連接配接數量,但後面寫小項

第一種解釋

這張圖是展示的三次握手的過程,這裡我們要關注兩個隊列

listen第二個參數數字的含義[随手筆記]listen函數原型第一種解釋第二種解釋參考連結
  • 未完成三次握手的隊列

    :每個這樣的SYN分對應其中的一項,某個用戶端發起了請求并到達服務端,而伺服器正在等待處理對應的三次握手過程。這些套接口處于SYN_RCVD。
  • 已完成隊列

    :每個都已經完成了三路握手過程的用戶端對應其中一項。這些套接口處于ESTABLISHED。

    如何了解這兩個隊列:

如何了解這兩個隊列

  • 比如未完成的隊列設定為50,現在有并發100個請求,假如系統處理速度緩慢,則系統會做這幾件事
    1. 因為未完成的隊列設定為50個,系統會先拿50個請求來處理三次握手,其他的請求直接拒絕。TCP會忽略該分節,也就是不發送RST(RST為重置連接配接,一般是在FIN之後才會出現為1的情況,表示的是連接配接重置。一般地,當出現FIN包或RST包時,我們便認為用戶端與伺服器端斷開了連接配接),這樣用戶端将重新發送SYN請求連接配接,期望在未完成的隊列中找到位置。
    2. 每處理完一個三次握手動作,系統就會讓出一個未完成隊列的位置,來接受一個SYN請求。
    3. 完成三次握手的請求放到已完成的隊列中
  • 在man手冊中有這麼一段話
The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow. If a connection request arrives when the queue is full, the client may receive an error with an indication of ECONNREFUSED or, if the underlying protocol supports retransmission, the request may be ignored so that a later reattempt at connection succeeds.
  • 大緻的意思是backlog定義的是隊列的最大長度,當隊列已滿時還有請求到達,用戶端可能會接收到錯誤消息,如果基礎協定支援,則指ECONNREFUSED 或者重新傳輸時,請求可能會被忽略,以便稍後在連接配接成功。下面還有一段
The behavior of the backlog argument on TCP sockets changed with Linux2.2. Now it specifies the queue length for completely establishedsockets waiting to be accepted, instead of the number of incomplete connection requests. The maximum length of the queue for incompletesockets can be set using /proc/sys/net/ipv4/tcp_max_syn_backlog. When syncookies are enabled there is no logical maximum length and this set‐ting is ignored. See tcp(7) for more information.
  • 大緻意思是在三次握手成功後的隊列,如果系統還沒有通過accept調用這個隊列中的資料,一旦這個隊列滿了。未連接配接的請求過不來,導緻未完成三次握手的請求會逾時或拒絕,如果系統調用了accept隊列接收資料,就會把接受的請求移除已完成隊列,這時已完成隊列又可以使用。

    最後補充,如果開啟了syncookies,則忽略listen第二個參數。

  • 總結起來就是一下三句話

    • 核心用了兩個隊列來處理,當并發請求超過能處理的上限時過濾一部分,防止盲目等待。
    • 第二個參數跟系統連接配接數無關,相當于設定一個瞬間能處理的門檻值
    • 一般可以開啟syncookies,這樣可以不太關心listen第二個值

第二種解釋

  • 這個數字是完成三次握手隊列和未完成三次握手的隊列之和的上限

參考連結

參考連結一

  • 參考連結2
  • 參考連結3

繼續閱讀