《UNIX网络编程 卷1:套接字联网API(第3版)》——2.9 端口号

简介: 当一个客户想要跟一个服务器联系时,它必须标识想要与之通信的这个服务器。TCP、UDP和SCTP定义了一组众所周知的端口(well-known port),用于标识众所周知的服务。举例来说,支持FTP的任何TCP/IP实现都把21这个众所周知的端口分配给FTP服务器。

本节书摘来自异步社区《UNIX网络编程 卷1:套接字联网API(第3版)》一书中的第2章,第2.9节,作者:【美】W. Richard Stevens , Bill Fenner , Andrew M. Rudoff著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.9 端口号

任何时候,多个进程可能同时使用TCP、UDP和SCTP这3种传输层协议中的任何一种。这3种协议都使用16位整数的端口号(port number)来区分这些进程。

当一个客户想要跟一个服务器联系时,它必须标识想要与之通信的这个服务器。TCP、UDP和SCTP定义了一组众所周知的端口(well-known port),用于标识众所周知的服务。举例来说,支持FTP的任何TCP/IP实现都把21这个众所周知的端口分配给FTP服务器。分配给简化文件传送协议(Trivial File Trqnsfer Protocol,TFTP)的是UDP端口号69。

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

IANA(the Internet Assigned Numbers Authority,因特网已分配数值权威机构)维护着一个端口号分配状况的清单。该清单一度作为RFC多次发布;RFC 1700[Reynolds and Postel 1994]是这个系列的最后一个。端口号被划分成以下3段。

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

端口号80分配时SCTP尚不存在。新的端口分配将针对这3种协议执行,RFC 2960则声明所有现有的TCP端口号对于使用SCTP的同一服务同样有效。

(2)已登记的端口(registered port)为1024~49151。这些端口不受IANA控制,不过由IANA登记并提供它们的使用情况清单,以方便整个群体。可能的话,相同端口号也分配给TCP和UDP的同一给定服务。例如,6000~6063分配给这两种协议的X Window服务器,尽管它的所有实现当前单纯使用TCP。49151这个上限的引入是为了给临时端口留出范围,而RFC 1700[Reynolds and Postel 1994]所列的上限为65535。

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

图2-10展示了端口号的划分情况和常见的分配情况。

screenshot

我们要注意图2-10中以下几点。

Unix系统有保留端口(reserved port)的概念,指的是小于1024的任何端口。这些端口只能赋予特权用户进程的套接字。所有IANA众所周知的端口都是保留端口,分配使用这些端口的服务器(例如FTP服务器)必须以超级用户特权启动。
由于历史原因,源自Berkeley的实现(从4.3BSD开始)曾在1024~5000范围内分配临时端口。这在20世纪80年代初期是可行的,但是如今很容易就找到一个在任何给定时间内同时支持多于3977个连接的主机。于是许多较新的系统从另外的范围分配临时端口以提供更多的临时端口,它们或者使用由IANA定义的临时端口范围,或者使用一个更大的其他范围(如图2-10所示的Solaris)。
由于这个原因,许多较早的系统实现的临时端口范围的上限为5 000。5 000这个上限后来发现是一个排版错误[Borman ],本应该是50 000。

有少数客户(而不是服务器)需要一个保留端口用于客户/服务器的认证:rlogin和rsh客户就是常见的例子。这些客户调用库函数rresvport创建一个TCP套接字,并赋予它一个在513~1023范围内未使用的端口。该函数通常先尝试绑定端口1023,若失败则尝试1022,依次类推,直到在端口513上亦或成功,亦或失败。
注意:BSD的保留端口和rresvport函数都跟IANA众所周知端口的后半部分重叠。这是因为IANA众所周知端口早先的上限为255。1992年的RFC 1340(早先的一个"Assigned Numbers"RFC)开始在256~1023之间分配众所周知的端口。1990年的RFC 1060(更早先的一个"Assigned Numbers"RFC)称256~1023之间的端口为Unix标准服务(Unix Standard Services)。20世纪80年代有不少源自Berkeley的服务器在512以后挑选它们的众所周知的端口(留下256~511这个空档)。rresvport函数选择从1023开始往下寻找,直至513。

套接字对
一个TCP连接的套接字对(socket pair)是一个定义该连接的两个端点的四元组:本地IP地址、本地TCP端口号、外地IP地址、外地TCP端口号。套接字对唯一标识一个网络上的每个TCP连接。就SCTP而言,一个关联由一组本地IP地址、一个本地端口、一组外地IP地址、一个外地端口标识。在两个端点均非多宿这一最简单的情形下,SCTP与TCP所用的四元组套接字对一致。然而在某个关联的任何一个端点为多宿的情形下,同一个关联可能需要多个四元组标识(这些四元组的IP地址各不相同,但端口号是一样的)。

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

我们可以把套接字对的概念扩展到UDP,即使UDP是无连接的。当讲解套接字函数(bind、
connect、getpeername等)时,我们将指明它们在指定套接字对中的哪些值。举例来说,bind函数要求应用程序给TCP、UDP或SCTP套接字指定本地IP地址和本地端口号。

相关文章
|
1月前
|
Python
Python网络编程基础(Socket编程)绑定地址和端口
【4月更文挑战第9天】在UDP服务器编程中,我们首先需要创建一个UDP套接字,然后绑定一个本地地址和端口,以便客户端可以通过这个地址和端口与我们的服务器进行通信。下面,我们将详细讲解如何绑定地址和端口。
|
1月前
|
网络协议 安全 网络安全
Python网络编程详解:Socket套接字的使用与开发
探索Python网络编程:本文详述Socket套接字,关键组件用于设备间通信。理解Socket类型(TCP/UDP),学习创建、绑定、监听、发送/接收数据步骤。示例展示服务端和客户端实现,及Socket聊天室应用。了解并发处理、错误处理和网络安全。通过学习,提升网络应用开发技能。参考书籍深入学习。
124 2
|
1天前
|
网络协议 Java Linux
【探索Linux】P.29(网络编程套接字 —— 简单的TCP网络程序模拟实现)
【探索Linux】P.29(网络编程套接字 —— 简单的TCP网络程序模拟实现)
7 0
|
1天前
|
存储 网络协议 算法
【探索Linux】P.28(网络编程套接字 —— 简单的UDP网络程序模拟实现)
【探索Linux】P.28(网络编程套接字 —— 简单的UDP网络程序模拟实现)
6 0
|
1天前
|
网络协议 算法 Linux
【探索Linux】P.27(网络编程套接字 —— UDP协议介绍 | TCP协议介绍 | UDP 和 TCP 的异同)
【探索Linux】P.27(网络编程套接字 —— UDP协议介绍 | TCP协议介绍 | UDP 和 TCP 的异同)
7 0
|
1天前
|
存储 算法 网络协议
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
7 0
|
1天前
|
存储 网络协议 Unix
【探索Linux】P.25(网络编程套接字基本概念 —— 预备知识)
【探索Linux】P.25(网络编程套接字基本概念 —— 预备知识)
6 0
|
2天前
|
运维 安全 网络协议
即时通讯安全篇(十四):网络端口的安全防护技术实践
网络端口因其数量庞大、端口开放和关闭的影响评估难度大,业务影响程度高、以及异常识别技术复杂度高等特点给网络端口安全防护带来了一定的挑战,如何对端口风险进行有效治理几乎是每个企业安全团队在攻击面管理工作中持续探索的重点项。
14 0
存储 网络协议 Java
13 3
|
10天前
|
网络协议 网络安全 数据库
【专栏】什么是网络端口?或许工作10年的人也很难100%理解
【4月更文挑战第28天】本文深入探讨了网络端口的奥秘,包括基本概念、技术原理和实际应用。网络端口是区分网络服务的抽象概念,与TCP/IP协议密切相关。端口号范围从0到65535,知名端口常分配给标准服务,如HTTP和FTP。TCP提供可靠的数据传输,而UDP则更高效。端口还涉及端口扫描、转发和映射等高级技术。在实际应用中,端口广泛用于Web服务器、数据库通信及网络安全。随着云计算和虚拟化的兴起,端口管理变得更为复杂,对IT专业人员的技能要求提高。理解并掌握网络端口对于提升个人技能和保障网络安全至关重要。