Linux套接字
源IP地址和目的IP地址以及源端口和目標端口號的組合稱為套接字。其作用於標識客戶端請求的服務器和服務。
套接字,支持TCP/IP的網絡通信的基本操作單元,可以看做是不同主機之間的進程進行雙向通信的端點 簡單的說就是通信的兩方的一種約定,用套接字中的相關函數來完成通信過程。
非常非常簡單的舉例說明下:Socket=Ip address+ TCP/UDP + port。
套接字連接的過程如同客戶撥打一個電話到一個大公司(系統),接線員(服務器進程)接聽電話並把它轉接到你要找的部門,然后再從那里轉到你要找的人(服務器套接字),然后接線員(服務器進程)再繼續轉接其他(客戶)的電話。
套接字有本地套接字和網絡套接字兩種。本地套接字是linux文件系統中的文件名,一般放在/tmp或/usr/tmp目錄中,網絡套接字的名字是與客戶連接的特定網絡有關的服務標識符(端口號或訪問點),這個標識符允許Linux將進入的針對特定端口號的連接轉到正確的服務器進程。
套接字通信建立過程:
服務器端:
1. 服務器應用程序用系統調用socket創建一個套接字。它是系統分配給服務器進程的類似文件描述符的資源。
2. 服務器進程用系統調用bind命名套接字。然后服務器進程就開始等待客戶端連接到這個命名套接字。
3. 系統調用listen創建一個隊列用來存放來自客戶的進入連接。
4. 服務器通過系統調用accept來接受客戶的連接。accept會創建一個不同於命名套接字的新套接字來與這個特定客戶進行通信,而命名套接字則被保留下來繼續處理其他客戶的連接請求。
客戶端:
1. 調用socket創建一個未命名套接字。
2. 調用connect與服務器建立連接,將服務器的命名套接字作為一個地址。
例子:
nginx服務器:
1. 啟動nginx后,nginx創建一個socket套接字,監聽在80端口,此時狀態為listening
2. 當有客戶端連接80端口時,系統調用accept來接受客戶的連接,並創建一個與listening不同的套接字來接受客戶的請求。此時,一個客戶端的請求就會占用一個 >1024的端口。
ps: Linux系統最大端口數是65535。減去1024系統端口,再減去其他一些服務端口的開銷。基本保持在60000端口。也就是單台服務器建立的套接字不可能超過60000連接的理論值,如果是代理服務器,這個值則要除以2,也就是30000