一篇學會連接與Socket

2023.03.17


一旦連接建立成功,客戶端和服務器端之間就可以通過各自的socket進行數據交換。在通信過程中,每個socket都有一個唯一的標識符,由四元組(源IP地址、源端口號、目標IP地址、目標端口號)組成。這個四元組可以唯一確定一個TCP連接。

在TCP/IP協議中,一個連接通常由兩個socket共同構成,一個是客戶端的socket,另一個是服務器端的socket。

當客戶端想要和服務器端建立連接時,它首先創建一個socket並指定要連接的服務器的IP地址和端口號,然後通過這個socket向服務器端發送一個連接請求。服務器端監聽指定端口的socket會接收到這個連接請求,並創建一個新的socket與客戶端的socket建立連接。在這個過程中,客戶端和服務器端都會擁有一個socket,用於在連接中進行通信。

一旦連接建立成功,客戶端和服務器端之間就可以通過各自的socket進行數據交換。在通信過程中,每個socket都有一個唯一的標識符,由四元組(源IP地址、源端口號、目標IP地址、目標端口號)組成。這個四元組可以唯一確定一個TCP連接。

因此,一個TCP連接通常由兩個socket共同構成,每個socket都有自己的唯一標識符。客戶端的socket和服務器端的socket都扮演著不同的角色,在連接建立後它們可以互相通信。

linux系統中,以下兩個參數對TCP連接數有影響:

  1. net.core.somaxconn: 這個參數用於控制每個監聽socket(如服務器端socket)的等待連接隊列的長度。在Linux 2.6及以後的版本中,默認值為128,最大值為/proc/sys/net/core/somaxconn所指定的值。但是,需要注意的是,即使設置了很大的等待隊列,也不一定能夠保證系統能夠接受和處理那麼多的連接請求。

在TCP/IP協議中,當一個客戶端向服務器端發起連接請求時,服務器端的監聽socket會接受這個請求並建立一個新的已連接socket用於與客戶端通信。但是,如果服務器端無法及時處理連接請求,那麼這個連接請求就會被放到socket等待隊列中,等待服務器端處理。

Socket等待隊列是一種先進先出的隊列,它存儲了已經完成三次握手的連接請求,但是服務器端還沒有接受的連接。每個監聽socket都有自己的等待隊列,用於存儲來自不同客戶端的連接請求。當一個連接請求到達服務器端時,它會首先被加入到對應的監聽socket的等待隊列中,等待服務器端接受連接。

等待隊列的長度是由內核參數控制的,如Linux中的net.core.somaxconn參數用於控制每個監聽socket的等待隊列的長度。當等待隊列已滿時,新的連接請求將被拒絕,這意味著客戶端無法建立連接。

  1. net.ipv4.tcp_max_syn_backlog: 這個參數用於控制TCP三次握手中SYN隊列的長度,也就是半連接隊列。在Linux 2.2及以後的版本中,默認值為128,最大值為65536。如果SYN隊列已滿,新的連接請求將被拒絕。但是,需要注意的是,SYN隊列的長度僅僅是半連接隊列的長度,不等於系統可以同時處理的TCP連接數。

因此,具體最大允許多少個TCP連接的問題,取決於系統內存、當前的內核參數配置、網絡帶寬等多個因素。