TCP三次握手之Socket

2021-08-24 17:54:59 字數 1292 閱讀 4693



原文:#include

int listen(int sockfd, int backlog);

本函式的第二個引數規定了核心應該為相應套介面排隊的最大連線個數,一般為以下兩個佇列的大小之和,即未完成三次握手佇列 +  已經完成三次握手佇列

為了更好的理解backlog引數,我們必須認識到核心為任何乙個給定的監聽套介面維護兩個佇列:

1、未完成連線佇列(incomplete connection queue),每個這樣的syn分節對應其中一項:已由某個客戶發出並到達伺服器,而伺服器正在等待完成相應的tcp三路握手過程。這些套介面處於syn_rcvd狀態。

2、已完成連線佇列(completed connection queue),每個已完成tcp三路握手過程的客戶對應其中一項。這些套介面處於established狀態。

當來自客戶的syn到達時,tcp在未完成連線佇列中建立乙個新項,然後響應以三路握手的第二個分節:伺服器的syn響應,其中稍帶對客戶syn的ack(即syn+ack)。這一項一直保留在未完成連線佇列中,直到三路握手的第三個分節(客戶對伺服器syn的ack)到達或者該項超時為止(曾經源自berkeley的實現為這些未完成連線的項設定的超時值為75秒)。如果三路握手正常完成,該項就從未完成連線佇列移到已完成連線佇列的隊尾。當程序呼叫accept時,已完成連線佇列中的隊頭項將返回給程序,或者如果該隊列為空,那麼程序將被投入睡眠,直到tcp在該佇列中放入一項才喚醒它。

linux系統設定未連線佇列最大數限制

linux系統tcp /ip協議棧有個選項可以設定未連線佇列大小限制tcp_max_syn_backlog

可以通過命令:cat /proc/sys/net/ipv4/tcp_max_syn_backlog   檢視

linux 系統中提供somaxconn這個引數,它定義了系統中每乙個埠最大的監聽佇列的長度,這是個全域性的引數,預設值為128

可以通過命令: cat /proc/sys/net/core/somaxconn 檢視

nginx 伺服器設定backlog為512

服務端listen之後,會接著呼叫accept函式來產生乙個新的socket以來對請求進行處理。但是listen的時候就已經有了乙個舊的socket繫結了80埠,這時accept產生的socket系統還是會分配80埠,乙個指定的埠號不能被多個應用程式共用是指多個程序,也就是不同程序之間不能共用乙個埠,但是同乙個程序內部多個socket可以同時繫結乙個埠,服務端會根據socket對應的源埠和源ip來區分接收的資料報來自哪個socket!

tcp三次握手 TCP 三次握手總結

tcp特點概述 tcp segment structure 段結構 step2 server host receives syn,replie with syn ack segment 答覆syn ack報文段 step3 client receives synack,replies with ac...

TCP 三次握手

tcp 三次握手 tcp 連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。以下步驟概述了通常情況下客戶端計算機聯絡伺服器計算機的過程 1.客戶端向伺服器傳送乙個syn置位的tcp報文,其中包含連線的初始序列號x和乙個視窗大小 表示客戶端上用來...

TCP三次握手

1.伺服器準備好接受外來連線。passive open 被動開啟 需呼叫 socket bind listen 函式來完成。2.客戶端通過呼叫 connect 主動開啟 active open 這使得客戶 tcp傳送乙個 syn 表示同步 分節,這個分節告訴伺服器,客戶端將在待建立的連線中傳送的資料...