08-端口号
58.6.1 端口号
传输层协议的任务是向位于不同主机(或有时候位于同一主机)上的应用程序提供端到端的通信服务。为完成这个任务,传输层需要采用一种方法来区分一个主机上的应用程序。在TCP和UDP中,这种区分工作是通过一个16位的端口号来完成的。
众所周知的、注册的以及特权端口
有些众所周知的端口号已经被永久地分配给特定的应用程序了(也称为服务)。例如ssh(安全的shell)daemon使用众所周知的端口22,HTTP(Web服务器和浏览器之间通信时所采用的协议)使用众所周知的端口80。众所周知的端口的端口号位于0~1023之间,它是由中央授权机构互联网号码分配局(IANA, http://www.iana.org/)来分配的。一个众所周知的端口号的分配是由一个被核准的网络规范(通常以RFC的形式)来规定的。
IANA还记录着注册端口,将这些端口分配给应用程序开发人员的过程就不那么严格了(这也意味着一个实现无需保证这些端口是否真正用于它们注册时申请的用途)。IANA注册的端口范围为1024~41951。(不是所有位于这个范围内的端口都被注册了。)
IANA众所周知的更新列表和注册端口分配情况可以在http://www.iana.org/assignments/port-numbers上找到。
在大多数TCP/IP实现(包括Linux)中,范围在0到1023间的端口号也是特权端口,这意味着只有特权(CAP_NET_BIND_SERVICE)进程可以绑定到这些端口上,从而防止了普通用户通过实现恶意程序(如伪造ssh)来获取密码。(有些时候,特权端口也被称为保留端口。)
尽管端口号相同的TCP和UDP端口是不同的实体,但同一个众所周知的端口号通常会同时被分配给基于TCP和UDP的服务,即使该服务通常只提供了其中一种协议服务。这种惯例避免了端口号在两个协议中产生混淆的情况。
临时端口
如果一个应用程序没有选择一个特定的端口(即在socket术语中,它没有调用bind()将其socket绑定到一个特定的端口上),那么TCP和UDP会为该socket分配一个唯一的临时端口(即存活时间较短)。在这种情况下,应用程序——通常是一个客户端——并不关心它所使用的端口号,但分配一个端口对于传输层协议标识通信端点来讲是有必要的。这种做法的另一个结果是位于通信信道另一端的对等应用程序就知道如何与这个应用程序通信了。TCP和UDP在将socket绑定到端口0上时也会分配一个临时端口号。
IANA将位于49152到65535之间的端口称为动态或私有端口,这表示这些端口可供本地应用程序使用或作为临时端口分配。然后不同的实现可能会在不同的范围内分配临时端口。在Linux上,这个范围是由包含在文件/proc/sys/net/ipv4/ip_local_port_range中的两个数字来定义的(可通过修改这两个数字来修改范围)。