一篇學(xué)會(huì)連接與Socket
在TCP/IP協(xié)議中,一個(gè)連接通常由兩個(gè)socket共同構(gòu)成,一個(gè)是客戶端的socket,另一個(gè)是服務(wù)器端的socket。
當(dāng)客戶端想要和服務(wù)器端建立連接時(shí),它首先創(chuàng)建一個(gè)socket并指定要連接的服務(wù)器的IP地址和端口號(hào),然后通過(guò)這個(gè)socket向服務(wù)器端發(fā)送一個(gè)連接請(qǐng)求。服務(wù)器端監(jiān)聽指定端口的socket會(huì)接收到這個(gè)連接請(qǐng)求,并創(chuàng)建一個(gè)新的socket與客戶端的socket建立連接。在這個(gè)過(guò)程中,客戶端和服務(wù)器端都會(huì)擁有一個(gè)socket,用于在連接中進(jìn)行通信。
一旦連接建立成功,客戶端和服務(wù)器端之間就可以通過(guò)各自的socket進(jìn)行數(shù)據(jù)交換。在通信過(guò)程中,每個(gè)socket都有一個(gè)唯一的標(biāo)識(shí)符,由四元組(源IP地址、源端口號(hào)、目標(biāo)IP地址、目標(biāo)端口號(hào))組成。這個(gè)四元組可以唯一確定一個(gè)TCP連接。
因此,一個(gè)TCP連接通常由兩個(gè)socket共同構(gòu)成,每個(gè)socket都有自己的唯一標(biāo)識(shí)符??蛻舳说膕ocket和服務(wù)器端的socket都扮演著不同的角色,在連接建立后它們可以互相通信。
linux系統(tǒng)中,以下兩個(gè)參數(shù)對(duì)TCP連接數(shù)有影響:
- net.core.somaxconn: 這個(gè)參數(shù)用于控制每個(gè)監(jiān)聽socket(如服務(wù)器端socket)的等待連接隊(duì)列的長(zhǎng)度。在Linux 2.6及以后的版本中,默認(rèn)值為128,最大值為/proc/sys/net/core/somaxconn所指定的值。但是,需要注意的是,即使設(shè)置了很大的等待隊(duì)列,也不一定能夠保證系統(tǒng)能夠接受和處理那么多的連接請(qǐng)求。
在TCP/IP協(xié)議中,當(dāng)一個(gè)客戶端向服務(wù)器端發(fā)起連接請(qǐng)求時(shí),服務(wù)器端的監(jiān)聽socket會(huì)接受這個(gè)請(qǐng)求并建立一個(gè)新的已連接socket用于與客戶端通信。但是,如果服務(wù)器端無(wú)法及時(shí)處理連接請(qǐng)求,那么這個(gè)連接請(qǐng)求就會(huì)被放到socket等待隊(duì)列中,等待服務(wù)器端處理。
Socket等待隊(duì)列是一種先進(jìn)先出的隊(duì)列,它存儲(chǔ)了已經(jīng)完成三次握手的連接請(qǐng)求,但是服務(wù)器端還沒有接受的連接。每個(gè)監(jiān)聽socket都有自己的等待隊(duì)列,用于存儲(chǔ)來(lái)自不同客戶端的連接請(qǐng)求。當(dāng)一個(gè)連接請(qǐng)求到達(dá)服務(wù)器端時(shí),它會(huì)首先被加入到對(duì)應(yīng)的監(jiān)聽socket的等待隊(duì)列中,等待服務(wù)器端接受連接。
等待隊(duì)列的長(zhǎng)度是由內(nèi)核參數(shù)控制的,如Linux中的net.core.somaxconn參數(shù)用于控制每個(gè)監(jiān)聽socket的等待隊(duì)列的長(zhǎng)度。當(dāng)?shù)却?duì)列已滿時(shí),新的連接請(qǐng)求將被拒絕,這意味著客戶端無(wú)法建立連接。
- net.ipv4.tcp_max_syn_backlog: 這個(gè)參數(shù)用于控制TCP三次握手中SYN隊(duì)列的長(zhǎng)度,也就是半連接隊(duì)列。在Linux 2.2及以后的版本中,默認(rèn)值為128,最大值為65536。如果SYN隊(duì)列已滿,新的連接請(qǐng)求將被拒絕。但是,需要注意的是,SYN隊(duì)列的長(zhǎng)度僅僅是半連接隊(duì)列的長(zhǎng)度,不等于系統(tǒng)可以同時(shí)處理的TCP連接數(shù)。
因此,具體最大允許多少個(gè)TCP連接的問(wèn)題,取決于系統(tǒng)內(nèi)存、當(dāng)前的內(nèi)核參數(shù)配置、網(wǎng)絡(luò)帶寬等多個(gè)因素。