Listen第二个参数的意义
Listen第二個(gè)參數(shù)的意義
文章轉(zhuǎn)載于:http://blog.csdn.net/weiyuefei/article/details/52239315????? 今天主要回顧下listen的第二個(gè)參數(shù)的意義。 話(huà)說(shuō)現(xiàn)在現(xiàn)在都是用框架寫(xiě)業(yè)務(wù)代碼。真的很少在去關(guān)注最基本的socket函數(shù)的意義了。該忘得都忘得差不多了。~~~? 要慢慢撿起來(lái)。? 主要是在看Redis網(wǎng)絡(luò)這塊的時(shí)候它的第二個(gè)參數(shù)設(shè)置的是500多。? 而且突然想到當(dāng)初幾年前騰訊電話(huà)面試問(wèn)過(guò)我第二個(gè)參數(shù)是什么意思。當(dāng)時(shí)我一股腦就說(shuō)成connet的連接數(shù)量了。哈哈? 2b.
照例 先上圖,再解析
首先這個(gè)圖是展示的TCP 三次握手。這里就不吸收三次握手了。我們主要是關(guān)注 兩個(gè)隊(duì)列
1:未完成隊(duì)列:每個(gè)這樣的SYN分節(jié)對(duì)應(yīng)其中一項(xiàng),已有某個(gè)客戶(hù)端發(fā)出并到達(dá)服務(wù)器,而服務(wù)器正在等待完成相應(yīng)的TCP三路握手過(guò)程。這些套接口處于SYN_RCVD
2:已完成隊(duì)列:每個(gè)已經(jīng)完成TCP三路握手過(guò)程的客戶(hù)對(duì)應(yīng)其中一項(xiàng)。 這些套接口處于ESTABLISHED
這里說(shuō)下對(duì)著兩個(gè)隊(duì)列的理解
假設(shè)未完成隊(duì)列設(shè)置為100,? 有并發(fā)1000個(gè)請(qǐng)求過(guò)來(lái)。假如系統(tǒng)處理過(guò)慢。那么系統(tǒng)會(huì)做以下幾件事
1) 因?yàn)槲赐瓿申?duì)列只有100個(gè)。先放100個(gè)請(qǐng)求過(guò)來(lái)處理三次握手。其他的請(qǐng)求直接拒絕。TCP會(huì)忽略該分節(jié),也就是不送RST,這樣客戶(hù)端將重發(fā)SYN,期望在未完成隊(duì)列中找到位置
2)每處理完一個(gè)三次握手動(dòng)作。就放一個(gè)SYN請(qǐng)求過(guò)來(lái)。并站住未完成隊(duì)列一個(gè)位置。除非三次握手完成(成功或者失敗)、或者超時(shí)就把該請(qǐng)求連接移除未完成隊(duì)列。如果系統(tǒng)性能好。這個(gè)動(dòng)作會(huì)很快。
3)完成TCP三次握手的請(qǐng)求放到已完成隊(duì)列里。
這個(gè)時(shí)候再去看 listen的第二個(gè)參數(shù)。
其實(shí)這里man listen的時(shí)候已經(jīng)解釋的很清楚了
? ?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.
? ? 第二個(gè)參數(shù)就是未完成隊(duì)列的大小
?
但是繼續(xù)man listen函數(shù) 看到如下解釋
The? behavior? of? the? backlog? argument on TCP sockets changed with?Linux?2.2.? Now it specifies the queue length for completely established sockets waiting to be?accepted,? instead? of? the? number? of? incomplete? connection? requests.?? The? maximum? length? of? the? queue? for? incomplete? sockets?? can?? be?? set?? using ?/proc/sys/net/ipv4/tcp_max_syn_backlog.?? When? syncookies are enabled there is no logical maximum length and this setting is ignored.? See tcp(7) for more information.
? ? ? ? 在linux 2.2以后? listen的第二個(gè)參數(shù)。指的是在完成TCP三次握手后的隊(duì)列。即在系統(tǒng)accept之前的隊(duì)列。已經(jīng)完成的隊(duì)列。如果系統(tǒng)沒(méi)有調(diào)用accpet把這個(gè)隊(duì)列的數(shù)據(jù)拿出來(lái)。一旦這個(gè)隊(duì)列滿(mǎn)了。未連接隊(duì)列的請(qǐng)求過(guò)不來(lái)。導(dǎo)致未連接隊(duì)列里的請(qǐng)求會(huì)超時(shí)或者拒絕。如果系統(tǒng)調(diào)用了accpet隊(duì)列接受請(qǐng)求數(shù)據(jù)。那么就會(huì)把接受到請(qǐng)求移除已完成隊(duì)列。 這時(shí)候已完成隊(duì)列又可以使用了。
最后 說(shuō)了如果開(kāi)啟了syncookies? 忽略listen的第二個(gè)參數(shù)。?
syncookie 主要是為了防止syn flood攻擊。這里暫時(shí)先不說(shuō)。以后再補(bǔ)充
總結(jié)
1,這里可以感受到? 內(nèi)核用了兩個(gè)隊(duì)列。 可以針對(duì)并發(fā)請(qǐng)求的時(shí)候。及時(shí)拒絕掉一部分處理不過(guò)來(lái)的請(qǐng)求。防止盲等待。類(lèi)似有點(diǎn)雪崩處理的感覺(jué)。
2,listen的第二個(gè)參數(shù)。跟系統(tǒng)的鏈接數(shù)量沒(méi)有任何關(guān)系。相當(dāng)于設(shè)置一個(gè)瞬間能夠處理的閾值。
3,一般情況下都會(huì)去開(kāi)啟 syncookie。所有其實(shí)現(xiàn)在已經(jīng)可以不太關(guān)系listen的第二個(gè)值了
總結(jié)
以上是生活随笔為你收集整理的Listen第二个参数的意义的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 4.1串类型的定义
- 下一篇: vue-element-xlsx在线读取