UNIX网络编程读书笔记:端口号、套接口对和套接口


端口号

端口号(port number):16位整数,用来区分不同的进程。

服务器使用的端口号:TCP和UDP定义了一组众所周知的端口(well-known port),用于标识众所周知的服务。

客户端使用的端口号:通常使用短期存活的临时端口(ephemeral port)。这些端口号通常由传输层协议自动赋予客户。客户一般不关心其临时端口的具体值,而只需确信它在所在主机中是唯一的就行。传输层协议的代码确保这种唯一性。

端口号被划分成三段:

(1)众所周知的端口为0-1023. 这些端口由IANA分配和控制。可能的话,相同的端口号就分配给TCP、UDP和SCTP的同一给定服务。例如,端口号80不论是TCP还是UDP都被赋予Web服务器,尽管目前它所有的实现都单纯使用TCP。

(2)已登记的端口(registered port)为1024-49151. 这些端口不受IANA控制,不过由IANA登记并提供它们的使用情况清单,以方便整个群体。可能的话,相同端口号也分配给TCP和UDP的同一给定服务。

(3)动态的(dynamic)或私用的(private)端口:49152-65535. IANA不管这些端口,它们就是我们所称的临时端口。(49152这个魔数是65535的四分之三。)

注意:

  • UNIX系统有保留端口(reserved port)的概念,指的是小于1024的任何端口。这些端口只能赋予超级用户进程的套接口。所有众所周知的端口都是保留端口,因此分配这些端口的服务器启动时必须具有超级用户的特权。
  • 由于历史原因,源自Berkeley的实现(从4.3BSD开始)曾在1-24-5000范围内分配临时端口。
  • 有少数客户(而不是服务器)需要一个保留端口用于客户/服务器的认证:rlogin和rsh客户就是常见的例子。这些客户调用库函数rresvport创建一个TCP套接口,并给它分配513-1023范围内的一个未使用的端口。

 

套接口对和套接口

一个TCP连接的套接口对(socket pair)是一个定义该连接的两个端点的四元组:本地IP地址、本地TCP端口号、远地IP地址、远地TCP端口号。一个套接口对唯一标识互联网上的一个TCP连接。

就SCTP而言,一个关联由一组本地IP地址、一个本地端口、一组远地IP地址、一个远地端口标识。

标识每个端点的两个值(IP地址和端口号)通常称为一个套接口(socket)。

举例来说,应用程序通过bind函数为TCP、UDP或SCTP套接口指定本地IP地址和本地端口号。

相关内容