套接字
最后更新于
这有帮助吗?
套接字是计算机网络数据结构,在任何类型的通讯开始之前,网络应用程序必须创建套接字。
套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名进程)与另一个运行的进程进行通信。这就是所谓的 进程间通信(Inter Process Communication, IPC)。有两种类型的套接字:基于文件的和面向网络的。
UNIX套接字是套接字的第一个家族,并且拥有一个家族名字AF_UNIX
(又名AF_LOCAL
),它代表地址家族(address family): Unix
。包括Python在内的大多数受欢迎的平台都使用术语地址家族及其缩写 AF。
基于网络的套接字,有自己的家族名字AF_INET
,或者 地址家族: Internet
。
套接字地址是主机-端口
对。
有效的端口号范围为0~65535
,小于1024
的端口预留给了系统。给常用服务预留的端口号可以在查看。
不管采用哪种地址家族,都有两种不同风格的套接字连接。一种是面向连接的,意味着在进行通信之前必须先建立一个连接。
面向连接的通信提供序列化的、可靠的和不重复的数据交付,而没有记录边界。这意味着每条消息可以拆分成多个片段,并且每一条消息片段都确保能够到达目的地,然后将它们按顺序组合在一起,最后将完整消息传递给正在等待的应用程序。
实现这种连接类型的主要协议是TCP。创建TCP套接字,必须使用SOCK_STREAM
作为套接字类型。TCP套接字的名字SOCK_STREAM
基于流套接字的其中一种表示。因为这些套接字(AF_INET
)的网络版本使用IP来搜索网络中的主机,所以整个系统通常结合这两种协议(TCP
和IP
)来进行。
与虚拟电路形成鲜明对比的是数据报类型的套接字,它是一种无连接的套接字。这意味着,在通讯开始之前并不需要建立连接。此时,在数据传输过程中并无法保证它的顺序性、可靠性或重复性。然而,数据报确实保存了记录的边界,这就意味着消息是以整体发送的,而并非首先分成多个片段,例如,使用面向连接的协议。
为了将其添加到并发通信中,在网络中甚至可能存在重复的消息。
由于面向连接的套接字所提供的保证,因此它们的设置以及对虚拟电路连接的维护需要大量的开销。然而,数据报不需要这些开销,即它的成本更加低廉。因此,它们通常能提供更好的性能,并且可能适合一些类型的应用程序。
实现这种连接类型的主要协议是用户数据报协议(UDP
)。为了创建UDP
套接字,必须使用SOCK_DGRAM
作为套接字类型。你可能知道,UDP
套接字的SOCK_DGRAM
名字来自于单词datagram
(数据报)。因为这些套接字也使用英特网协议(IP
)来寻找网络中的主机,所以这个系统也有一个更加普通的名字,即这两种协议(UDP
和IP
)的组合名字,或UDP/IP
。