一、 说明
任何时候,多个进程可能同时使用TCP、UDP和SCTP这3种传输层协议中的任何一种。这3种协议都使用16位整数的端口号(port number)来区分这些进程。
**1、**当一个客户端想要跟一个服务器端联系时,它必须标识想要与之通信的这个服务器。
2、TCP、UDP和SCTP定义了一组众所周知的端口(well-known port),用于标识众所周知的服务。如下服务端口使用举例:
- 支持FTP的任何TCP/IP实现都把21这个众所周知的端口分配给FTP服务器
- 分配给简化文件传送协议(Trivial File Trqnsfer Protocol, TFTP)的是UDP端口号69
3、客户通常使用短期存活的临时端口(ephemeral port)。这些端口号通常由传输层协议自动赋予客户端。传输协议的代码确保这种临时端口的唯一性。
二、端口号划分
IANA(the Internet Assigned Numbers Authority,因特网已分配数值权威机构)维护着一个端口号分配状况的清单。该清单一度作为RFC标准多次发布,该系列标准将端口划分为以下3段:
2.1 众所周知的端口
众所周知的端口为0~1023。这些端口由IANA分配和控制。可能的话,相同端口号就分配给TCP、UDP和SCTP的同一给定服务。例如:
- 不论TCP还是UDP端口号80都被赋予Web服务器,尽管它目前的所有实现都单纯使用TCP。
2.2 已登记的端口
已登记的端口为1024~49151。这些端口不受IANA控制,不过由IANA登记并提供它们的使用情况清单。可能的话,相同端口号也分配给TCP和UDP的同一给定服务。例如:
- 6000~6063分配给这两种协议的X Window服务器,尽管它的所有实现当前单纯使用TCP。49151这个上限的引入是为了给临时端口留出范围,而RFC 1700[Reynolds and Postel 1994]标准所列的上限为65535。
2.3 临时端口
49152~65535是动态的(dynamic)或私有的(private)端口。IANA不管理这些端口。这就所谓的临时端口。
三、套接字对
套接字对: 唯一标识一个网络上的每个TCP连接。
一个TCP连接的套接字对(socket pair)是一个定义该连接的两个端点的四元组:
- 本地IP地址
- 本地TCP端口号
- 外地IP地址
- 外地TCP端口号
套接字: 标识每个端点的两个值(IP地址和端口号)通常称为一个套接字。
四、TCP端口号与并发服务器
并发服务器中主服务器循环通过派生一个子进程来处理每个新的连接。如果一个子进程继续使用服务器众所周知的端口来服务一个长时间的请求,那将发生什么?根据一个示例进行理解。
4.1 示例
**(1)准备工作:**在主机上启动tcp服务器程序,同时该主机是多宿的,其IP地址为192.168.42.1和12.106.32.254。tcp服务端侦听一个众所周知的tcp端口(21),且执行被动打开,从而开始等待客户请求,如图1所示:
图1说明1:
- 使用记号**{*:21 *😗}指出服务器的套接字对,也称它为监听套接字**(listening socket)。
- 服务器在任意**本地接口(第一个星号)**的端口21上等待连接请求
- 外地IP地址和外地端口都没有指定,使用“*😗”来表示。
图1说明2:
- 这里指定本地IP地址的星号称为通配符(wildcard)。
- 服务器不能指定一个包含多个地址的清单
- 星号“*”通配符表示的本地地址表示“任意”这个选择
- 通配地址通过在调用bind之前把套接字地址结构中的IP地址字段设置成INADDR_ANY来指定。
(2)客户端连接: 在另一台主机上自动一个客户(客户端),他对服务器(服务端)的IP地址之一12.106.32.254执行主动打开。如图2所示:
图2说明:
- 假设本例中客户主机的TCP为此连接选择的临时端口是1500
(3)服务端fork子进程: 当服务器接收并接受这个客户的连接时,它fork一个自身的副本,让子进程来处理该客户的请求,如图3所示:
图3说明:
- 必须在服务器主机上区分监听套接字和已连接套接字(connected socket)。
- 注意已连接套接字使用与监听套接字相同的本地端口21
- 注意在多宿服务器主机上,连接一旦建立,已连接套接字的本地地址(12.106.32.254)随即填入
(4)另一个客户端连接: 假设在客户(客户端)主机上有另一个客户端请求连接到同一个服务器。客户端主机为这个新客户端的套接字分配一个未使用的临时端口1501,如图4所示:
图4说明:
- 第一个连接的套接字对和第二个连接的套接字对不一样,因为第二个客户端的连接分配了一个未使用的端口1501
4.2 示例说明
- tcp无法仅仅通过查看目的端口号来分离外来的分节到不同的端点。它必须查看套接字对的所有4个元素才能确定有哪个端点接收某个到达的分节。
- 图4中对于同一个本地端口21存在3个套接字。
- 如果一个分节来自IP地址为206.168.112.219与端口号为1500的客户端,且目的地址为12.106.32.254与目的端口为21,他就被传递给第一个子进程。
- 如果一个分节来自IP地址为206.168.112.219与端口号为1501的客户端,且目的地址为12.106.32.254与目的端口为21,他就被传递给第二个子进程。
- 所有目的端口为21的其它tcp分节都被传递给拥有监听套接字的最初那个服务器(服务端,父进程)