跳到主要内容

3. 背景 (Background)

3. 背景 (Background)

传输控制协议 (Transmission Control Protocol, TCP) [RFC0793] 和用户数据报协议 (User Datagram Protocol, UDP) [RFC0768] 作为 Internet 上使用最广泛的两个传输协议, 几十年来取得了显著成功. 它们依赖"端口 (ports)"这一概念, 将端口作为 Internet 通信中的逻辑实体. 端口有两个用途: 第一, 它们提供解复用标识符, 用于区分同一对端点之间的传输会话; 第二, 它们也可以标识进程所连接的应用协议及相关服务. 较新的传输协议, 例如流控制传输协议 (SCTP) [RFC4960] 和数据报拥塞控制协议 (DCCP) [RFC4342], 也在其通信会话中采用端口概念, 并以与 TCP 和 UDP (以及 UDP 的变体 UDP-Lite [RFC3828]) 相同的方式使用 16 位端口号.

端口号是 Internet 上最早且使用最广泛的应用和服务识别方式. 端口是 16 位数字, 源端口号和目的端口号与通信端系统的 IP 地址组合在一起, 可以唯一标识某个传输协议的一次会话. 端口号也可通过其关联的服务名称来识别, 例如端口号 23 对应 "telnet", 端口号 80 对应 "http" (以及 "www" 和 "www-http").

所有相关方, 包括运行服务的主机, 访问其他主机上服务的主机, 以及限制服务的中间设备 (例如防火墙和 NAT), 都需要就某个特定目的端口对应哪个服务达成一致. 虽然这最终是一个本地决定, 其意义只存在于连接端点之间, 但许多服务通常会在可能的情况下拥有一个默认端口供服务器监听, 这些端口由互联网号码分配机构 (Internet Assigned Numbers Authority, IANA) 通过服务名称和端口号注册表 [PORTREG] 记录.

随着时间推移, 特定端口号必然表示特定服务这一假设可能越来越不成立. 例如, 同一主机上同一服务的多个实例通常不能监听同一个端口, 同一 NAT 网关后面的多台主机也不能都在 NAT 网关外侧映射到同一个端口, 无论这些映射是用户手动配置的静态端口映射, 还是使用 NAT Port Mapping Protocol [NAT-PMP] 或 Internet Gateway Device [IGD] 等端口映射协议自动配置的动态端口映射.

应用可以直接使用端口号, 也可以通过 UNIX 上的 getservbyname() 等系统调用按服务名称查找端口号, 或通过查询 DNS SRV 记录 [RFC2782] [DNS-SD] 查找端口号, 还可以通过 TCP Port Service Multiplexer (TCPMUX) [RFC1078] 等其他多种方式确定端口号.

应用和应用层协议的设计者可以向 IANA 申请为特定应用分配服务名称和端口号, 并且在分配完成后可以假定没有其他应用会在其通信会话中使用该服务名称或端口号. 如果应用不需要固定端口号, 例如使用 DNS SRV 记录在运行时动态查找端口号的应用, 应用设计者也可以选择只请求分配服务名称而不请求对应的固定端口号. 由于端口号空间是有限的 (因此节约是一个重要目标), 只要可能, 就 RECOMMENDED 使用服务名称而不是端口号.