TCP之listen&backlog

出處:http://www.cnblogs.com/wanpengcoder/p/5354469.html

1. listen函數:

#include <sys/socket.h>

int listen(int sockfd, int backlog);

ret-成功返回0 失敗返回-1

listen僅由服務器調用,它做兩件事情:

(1) 當socket創建一個套接字的時候,它被假設爲一個主動套接字,也就是說,它是一個將調用connect發起連接的客戶套接字。listen函數把一個未連接的套接字轉換成一個被動套接字,指示內核應該接受指向該套接字的連接請求;調用listen使得套接字從CLOSED狀態轉換到LISTEN狀態;

(2) backlog規定了內核應該爲相應的套接字排隊的最大連接個數;

 

2. backlog含義:

內核爲給定的監聽套接字維護兩個隊列,兩個隊列項之和不超過backlog:

(1) 未完成連接隊列,每個syn分節對應其中一項,已經由某個客戶端發出併到達服務器,而服務器正在等待完成相應的tcp三次握手過程,這些套接字處於SYN_RCVD狀態;

(2) 已完成連接隊列,每個已經完成三次握手過程的客戶對應其中的一項,這些套接字處於ESTABLISHED狀態;

注:如下圖,accept是從已完成隊列頭取一個連接進行服務,所以accept是在三次握手之後的過程;

 

3. 三次握手和兩個隊列:

(1) syn到達時,tcp在未完成隊列中創建一個新項,然後響應三次握手的第二個分節,這項一直保留在未完成隊列中,一直到三次握手的第三個分節到達或者超時爲止;

(2) 當一個syn到達時,隊列是滿的,tcp將忽略該分節,客戶端重新發送syn,期望不久就能在這些隊列中找到可用空間;發送rst是不對的,因爲客戶端無法區分rst是無服務還是隊列滿;

(3) 如果三次握手正常完成,該項從未完成隊列移動到已完成隊列的隊尾;

(4) 當進程調用accept時,已經完成連接隊列中的對頭項將返回給進程,或者如果該隊列爲空,那麼進程將投入睡眠,直到tcp在該隊列中放入一項才喚醒它;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章