TCP连接管理(三):服务器选项

由于大部分TCP服务器是并发的,当多个连接请求到达时,服务器调用新的线程或进程处理。本文描述TCP如何使用端口号及处理多个并发的客户端。

一、端口号

我们的实验环境为使用macOS系统的ssh命令连接一台Ubuntu系统的22端口(sshd应用),并观察其端口号的使用情况。sshd应用程序执行安全外壳协议(RFC4254),该协议提供可加密认证的远程终端功能。下图为在已启动openssh-server服务的终端上查看端口监听情况:

该终端安装ssh服务并启用ipv4/ipv6双栈协议,netstat -ant命令用于显示所有状态的TCP连接。返回结果表明该主机监听了ipv4和ipv6双协议的22端口,ipv4的本地地址为0.0.0.0,ipv6本地地址为:::22,这种地址表示方法也称为“通配符地址”,这意味着一个针对22端口的连接进入请求(SYN)会被任何本地接口接受。

现我们从另一台主机上开启一个针对22端口的连接,并查看22端口的连接情况,返回结果如下:

端口号为22的最后一行为一个ESTABLISHED状态的连接,该行显示了与本地节点连接相关的四元组,其中包括本地IP地址与端口号、外部IP地址与端口号,本地IP地址与连接请求到达的接口相关。处于LISTEN状态的本地节点会继续独自运行,并为新传入的连接创建新的连接节点。现在我们用同一个系统向服务器发起ssh连接,并使用netstat -ant命令查看连接:

现在我们获得了两个从同一个客户端发起的处于ESTABLISHED状态的连接,两条连接的目的端口号均为22,因此源主机的端口号必须不同。大部分TCP应用程序使用随机本地端口与服务器建立连接,且这个端口必须是未被其它连接使用的端口(包括处于FINWAIT、TIMEWAIT状态的连接)。

这个例子说明TCP依靠四元组多路分解(demultiplex)获得的报文段,不能仅仅根据目的端口号来决定哪个进程该得到接收的报文段。在所有节点中只有处于LISTEN状态的节点能接收SYN报文并建立新连接。

下面我们从另一个系统向该服务器发起连接,端口连接情况如下:

在这台多宿主的主机上,第三条TCP连接的IP地址与本地IPv4接口地址(192.168.199.201)相关联,建立了另一个不同四元组的ESTABLISHED状态连接。

二、本地限制

通过修改sshd配置文件,我们可以将该服务与本地某个特定IP地址绑定,外部主机到达22端口的请求必须发送到该地址才能得到响应,服务器监听端口如下:

如果我们从一台目的地址不是192.168.199.201(甚至包括本地地址127.0.0.1)的主机连接服务器,连接请求将不会被TCP模块处理。通过查看tcpdump可以看出SYN会引发一个RST报文:

服务器的应用程序不会察觉到连接请求,因为拒绝接收的操作是由操作系统的TCP模块根据应用程序的配置发出的,系统限制本地IP的能力是非常严格的。

三、外部节点限制

RFC0793中介绍的TCP抽象接口函数允许一台服务器为一个完全指定的外部节点或一个未被指定的外部节点执行被动打开,但通用的TCP模块实现方式中并没有支持这一方法。服务器无法指定外部节点,只能等待客户端的到来,然后检查该客户端的IP地址和端口号。

在服务器允许的地址绑定中,最常见的是绑定本地所有地址的特定端口号与外部所有地址和端口号,或绑定本地地址(如127.0.0.1)的指定端口号(不常见,常用语DNS服务器),而绑定外部特定地址的特定端口号通常是不支持的。当收到连接请求时,TCP模块优先匹配最严格的地址绑定方式,最后匹配所有本地地址与所有外部地址(*.local_port - > *.*)的绑定方式。

四、连接队列

一个并行的服务器可以为每个到达的客户端分配进程或线程,这样负责侦听的服务器能够始终准备处理下一个到达的连接请求。然而,当连接到达时服务器正在创建一个新进程,或在运行其他优先级更高的进程时,多个请求可能会同时到达,此时操作系统将进行如下处理:

3.如果队列中仍有空间分配给新的连接,TCP会应答SYN并完成连接。当客户端完成连接开始传送数据时,服务器上的连接可能还未被应用程序使用,此时TCP会将从该连接发来的数据存入队列中。

当连接队列溢出时发送重置报文段是不可取的,因为连接队列满的服务器通常处于正常的繁忙状态,在有空闲资源时仍然可以继续建立连接,若服务器发送了RST报文,客户端会认为该服务器已经出现问题中断服务,之后放弃主动打开操作,停止向该服务器发起连接。最合理的方法是暂时延迟对溢出队列连接的应答,同时也不主动重置这个连接,客户端的现象为等待一段时间后获得这个连接。

有关TCP连接管理部分的文章已经全部结束,从下期开始将进入TCP数据传输阶段,讲解关于超时与重传的相关技术。

邮箱:ie-evolution@ie-evolution.xin

网站:

www.i-learner.xin

www.ie-evolution.xin

知乎专栏:IE进化论

公众平台:IE进化论(ie_evolution)

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180813G1HXD800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券