什麼是套接字 Socket

2022-08-03 22:57:19 字數 2685 閱讀 5229

q:什麼是套接字(socket)?套接字(socket)是什麼意思?

應用層通過傳輸層進行資料通訊時,tcp和udp會遇到同時為多個應用程式

程序提供併發服務的問題。多個tcp連線或多個應用程式程序可能需要通過同乙個tcp協議埠傳輸資料。為了區別不同的應用程式程序和連線,許多計算機作業系統為應用程式與tcp/ip協議互動提供了稱為套接字(socket)的介面,區分不同應用程式程序間的網路通訊和連線。

生成套接字,主要有3個引數:通訊的目的ip位址、使用的傳輸層協議(tcp或udp)和使用的埠號。socket原意是「插座」。通過將這3個引數結合起來,與乙個「插座」socket繫結,應用層就可以和傳輸層通過套接字介面,區分來自不同應用程式程序或網路連線的通訊,實現資料傳輸的併發服務。

socket可以看成在兩個程式進行通訊連線中的乙個端點,乙個程式將一段資訊寫入socket中,該socket將這段資訊傳送給另外乙個socket中,使這段資訊能傳送到其他程式中。如圖:

我們來分析一下上圖,host a上的程式a將一段資訊寫入socket中,socket的內容被host a的網路管理軟體訪問,並將這段資訊通過host a的網路介面卡傳送到host b,host b的網路介面卡接收到這段資訊後,傳送給host b的網路管理軟體,網路管理軟體將這段資訊儲存在host b的socket中,然後程式b才能在socket中閱讀這段資訊。

假設在圖中的網路中新增第三個主機host c,那麼host a怎麼知道資訊被正確傳送到host b而不是被傳送到host c中了呢?基於tcp/ip網路中的每乙個主機均被賦予了乙個唯一的ip位址,ip位址是乙個32位的無符號整數,由於沒有轉變成二進位制,因此通常以小數點分隔,如:198.163.227.6,正如所見ip位址均由四個部分組成,每個部分的範圍都是0-255,以表示8位位址。

值得注意的是ip位址都是32位位址,這是ip協議版本4(簡稱ipv4)規定的,目前由於ipv4位址已近耗盡,所以ipv6位址正逐漸代替ipv4位址,ipv6位址則是128位無符號整數。

要通過網際網路進行通訊,至少需要一對套接字,乙個執行於客戶機端,稱之為clientsocket,另乙個執行於伺服器端,稱之為serversocket。

根據連線啟動的方式以及本地套接字要連線的目標,套接字之間的連線過程可以分為三個步驟:伺服器監聽,客戶端請求,連線確認。

伺服器監聽:是伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連線的狀態,實時監控網路狀態。

客戶端請求:是指由客戶端的套接字提出連線請求,要連線的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連線的伺服器的套接字,指出伺服器端套接字的位址和埠號,然後就向伺服器端套接字提出連線請求。

連線確認:是指當伺服器端套接字監聽到或者說接收到客戶端套接字的連線請求,它就響應客戶端套接字的請求,建立乙個新的執行緒,把伺服器端套接字的描述發給客戶端,一旦客戶端確認了此描述,連線就建立好了。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連線請求。

套接字起源於20世紀70年代加州大學伯克利分校版本的unix,即人們所說的bsd unix。因此,有時人們也把套接字稱為「伯克利套接字」或「bsd套接字」。一開始,套接字被設計用在同一臺主機上多個應用程式之間的通訊。這也被稱作程序間通訊,或ipc。套接字有兩種,分別是基於檔案型的和基於網路型的。

unix套接字是我們要介紹的第乙個套接字家族。其「家族名」為af_unix(在posix1.g標準中也叫af_local),表示「位址家族:unix」。包括python在內的大多數流行平台上都使用術語「位址家族」及其縮寫「af」。而老一點的系統中,位址家族被稱為「域」或「協議家族」,並使用縮寫「pf」而不是「af」。同樣的,af_local(在2000-2023年被列為標準)將會代替af_unix。不過,為了向後相容,很多系統上,兩者是等價的。python自己則仍然使用af_unix。

由於兩個程序都執行在同一臺機器上,而且這些套接字是基於檔案的。所以,它們的底層結構是由檔案系統來支援的。這樣做相當有道理,因為,同一臺電腦上,檔案系統的確是不同的程序都能訪問的。

另一種套接字是基於網路的,它有自己的家族名字:af_inet,或叫「位址家族:internet」。還有一種位址家族af_inet6被用於網際協議第6版(ipv6)定址上。還有一些其他的位址家族,不過,它們要麼是只用在某個平台上,要麼就是已經被廢棄,或是很少被使用,或是根本就還沒有實現。所有位址家族中,af_inet是使用最廣泛的乙個。python 2.5中加入了一種linux套接字的支援:af_netlink(無連線(稍後講解))套接字家族讓使用者**與核心**之間的ipc可以使用標準bsd套接字介面。而且,相對之前那些往作業系統中加入新的系統呼叫、proc檔案系統支援或是「ioctl」等複雜的方案來說,這種方法顯得更為精巧,更為安全。

python只支援af_unix,af_netlink,和af_inet家族。由於我們只關心網路程式設計,所以在本章的大部分時候,我們都只用af_inet。

如果把套接字比做**的插口—即通訊的最底層結構,那主機與埠就像區號與**號碼的一對組合。有了能打**的硬體還不夠,你還要知道你要打給誰,往哪打。乙個網際網路位址由網路通訊所必需的主機與埠組成。而且不用說,另一端一定要有人在聽才可以。否則,你就會聽到熟悉的聲音「對不起,您撥的是空號,請查詢後再撥」。你在上網的時候,可能也見過類似的情況,如「不能連線該伺服器。伺服器無響應或不可達」。

合法的埠號範圍為0~65535。其中,小於1024的埠號為系統保留埠。如果你所使用的是unix作業系統,那麼就可以通過/etc/services檔案獲得保留的埠號(及其對應的服務/協議和套接字型別)。

什麼是套接字Socket

q 什麼是套接字 socket 套接字 socket 是什麼意思?應用層通過傳輸層進行資料通訊時,tcp和udp會遇到同時為多個應用程式 程序提供併發服務的問題。多個tcp連線或多個應用程式程序可能需要通過同乙個tcp協議埠傳輸資料。為了區別不同的應用程式程序和連線,許多計算機作業系統為應用程式與t...

什麼是套接字 Socket

應用層通過傳輸層進行資料通訊時,tcp和udp會遇到同時為多個應用程式程序提供併發服務的問題。多個tcp連線或多個應用程式程序可能需要 通過同乙個tcp協議埠傳輸資料。為了區別不同的應用程式程序和連線,許多計算機作業系統為應用程式與tcp ip協議互動提供了稱為套接字 socket 的介面,區分不同...

什麼是套接字 Socket

什麼是套接字 socket 應用層通過傳輸層進行資料通訊時,tcp和udp會遇到同時為多個應用程式程序提供併發服務的問題。多個tcp連線或多個應用程式程序可能需要 通過同乙個tcp協議埠傳輸資料。為了區別不同的應用程式程序和連線,許多計算機作業系統為應用程式與tcp ip協議互動提供了稱為套接字 s...