網上的回答分為兩種,更認可第一種說法,更加有理有據并且有實際的嘗試,
文章目錄
- listen函式原型
- 第一種解釋
- 第二種解釋
- 參考鏈接
listen函式原型
-
int listen(int sockfd, int backlog);
- 第一個引數我們都知道是socket回傳的描述符
- 第二個引數表示什么呢,之前一直以為是connet的連接數量,但后面寫小項
第一種解釋
這張圖是展示的三次握手的程序,這里我們要關注兩個佇列

未完成三次握手的佇列:每個這樣的SYN分對應其中的一項,某個客戶端發起了請求并到達服務端,而服務器正在等待處理對應的三次握手程序,這些套介面處于SYN_RCVD,已完成佇列:每個都已經完成了三路握手程序的客戶端對應其中一項,這些套介面處于ESTABLISHED,
如何理解這兩個佇列:
如何理解這兩個佇列
-
比如未完成的佇列設定為50,現在有并發100個請求,假如系統處理速度緩慢,則系統會做這幾件事
- 因為未完成的佇列設定為50個,系統會先拿50個請求來處理三次握手,其他的請求直接拒絕,TCP會忽略該分節,也就是不發送RST(RST為重置連接,一般是在FIN之后才會出現為1的情況,表示的是連接重置,一般地,當出現FIN包或RST包時,我們便認為客戶端與服務器端斷開了連接),這樣客戶端將重新發送SYN請求連接,期望在未完成的佇列中找到位置,
- 每處理完一個三次握手動作,系統就會讓出一個未完成佇列的位置,來接受一個SYN請求,
- 完成三次握手的請求放到已完成的佇列中
-
在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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/298338.html
標籤:其他
上一篇:網路基礎——分層與常見協議
