套接字
在任何類型的通信開始之前,網絡應用程序都必須創建套接字。
套接字最初是為同一主機上的應用程序所創建,使得主機上運行的一個程序(又名一個進程)與另一個運行的程序進行通信。這就是所謂的進程間通信(Inter Process Communication,IPC)
有兩種類型的套接字:基於文件的和面向網絡的。
基於文件的
家族名:AF_UNIX
(又名AF_LOCAL,在POSIX1.g標准中指定),它代表地址家族(addressfamily):UNIX。其他比較舊的系統可能會將地址家族表示成域(domain)或協議家族(protocolfamily),並使用其縮寫PF而非AF。類似地,AF_LOCAL(在2000~2001年標准化)將代替AF_UNIX
面向網絡的
家族名:AF_INET
或者地址家族:因特網。另一個地址家族AF_INET6用於第6版因特網協議(IPv6)尋址。此外,還有其他的地址家族,這些要么是專業的、過時的、很少使用的,要么是仍未實現的。在所有的地址家族之中,目前AF_INET是使用得最廣泛的
總的來說,Python只支持AF_INET、AF_UNIX、AF_NETLINK和AF_TIPC家族
套接字地址:主機-端口對
做個比喻,套接字就像一個電話插孔,主機名和端口號就像區號和號碼。
當程序之間需要通信時,需要知道對端的主機名(IP)和端口號。
有效的端口號范圍為0~65535(小於1024的端口號預留給了系統)
面向連接的套接字與無連接的套接字
面向連接的套接字
- TCP套接字的名字SOCK_STREAM。
- 特點:可靠,開銷大。
在進行通信之前必須先建立一個連接,該連接的通信提供序列化的、可靠的和不重復的數據交付,而沒有記錄邊界。這種類型的通信也稱為虛擬電路或流套接字。
實現這種連接類型的主要協議是傳輸控制協議(縮寫 TCP)
為了創建 TCP套接字,必須使用 SOCK_STREAM 作為套接字類型。
無連接的套接字
- UDP套接字的名字SOCK_DGRAM
- 特點:不可靠(局網內還是比較可靠的),開銷小。
與虛擬電路形成鮮明對比的是數據報類型的套接字,它是一種無連接的套接字。
在通信開始之前並不需要建立連接。此時,在數據傳輸過程中並無法保證它的順序性、可靠性或重復性。數據報確實保存了記錄邊界,這就意味着消息是以整體發送的,而並非首先分成多個片段。
實現這種連接類型的主要協議是用戶數據報協議(縮寫 UDP)。為
了創建UDP套接字,必須使用SOCK_DGRAM作為套接字類型。
UDP套接字的SOCK_DGRAM名字來自於單詞“datagram”(數據報)。