开发者社区> 异步社区> 正文

《UNIX网络编程 卷1:套接字联网API(第3版)》——2.10 TCP端口号与并发服务器

简介: 我们用冒号来分割IP地址和端口号,因为这是HTTP的用法,其他地方也常见。netstat程序使用点号来分割IP地址和端口号,不过如此表示有时候会让人混淆,因为点号既用于域名(如freebsd.unpbook.com.21),也用于IPv4的点分十进制数记法(如12.106.32.254.21)。
+关注继续查看

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

2.10 TCP端口号与并发服务器

并发服务器中主服务器循环通过派生一个子进程来处理每个新的连接。如果一个子进程继续使用服务器众所周知的端口来服务一个长时间的请求,那将发生什么?让我们来看一个典型的序列。首先,在主机freebsd上启动服务器,该主机是多宿的,其IP地址为12.106.32.254和192.168.42.1。服务器在它的众所周知的端口(本例为21)上执行被动打开,从而开始等待客户的请求,如图2-11所示。
screenshot

我们使用记号{:21, :}指出服务器的套接字对。服务器在任意本地接口(第一个星号)的端口21上等待连接请求。外地IP地址和外地端口都没有指定,我们用“.*”来表示。我们称它为监听套接字(listening socket)。

我们用冒号来分割IP地址和端口号,因为这是HTTP的用法,其他地方也常见。netstat程序使用点号来分割IP地址和端口号,不过如此表示有时候会让人混淆,因为点号既用于域名(如freebsd.unpbook.com.21),也用于IPv4的点分十进制数记法(如12.106.32.254.21)。

这里指定本地IP地址的星号称为通配(wildcard)符。如果运行服务器的主机是多宿的(如本例),服务器可以指定它只接受到达某个特定本地接口的外来连接。这里要么选一个接口要么选任意接口。服务器不能指定一个包含多个地址的清单。通配的本地地址表示“任意”这个选择。在图1-9中,通配地址通过在调用bind之前把套接字地址结构中的IP地址字段设置成INADDR_ANY来指定。

稍后在IP地址为206.168.112.219的主机上启动第一个客户,它对服务器的IP地址之一12.106.32.254执行主动打开。我们假设本例中客户主机的TCP为此选择的临时端口为1500,如图2-12所示。图中在该客户的下方标出了它的套接字对。

screenshot

当服务器接收并接受这个客户的连接时,它fork一个自身的副本,让子进程来处理该客户的请求,如图2-13所示。(我们将在4.7节中讲解fork函数。)
screenshot

至此,我们必须在服务器主机上区分监听套接字和已连接套接字(connected socket)。注意已连接套接字使用与监听套接字相同的本地端口(21)。还要注意在多宿服务器主机上,连接一旦建立,已连接套接字的本地地址(12.106.32.254)随即填入。

下一步我们假设在客户主机上另有一个客户请求连接到同一个服务器。客户主机的TCP为这个新客户的套接字分配一个未使用的临时端口,譬如说1501,如图2-14所示。服务器上这两个连接是有区别的:第一个连接的套接字对和第二个连接的套接字对不一样,因为客户的TCP给第二个连接选择了一个未使用的端口(1501)。

screenshot

通过本例应注意,TCP无法仅仅通过查看目的端口号来分离外来的分节到不同的端点。它必须查看套接字对的所有4个元素才能确定由哪个端点接收某个到达的分节。图2-14中对于同一个本地端口(21)存在3个套接字。如果一个分节来自206.168.112.219端口1500,目的地为12.106.32.254端口21,它就被递送给第一个子进程。如果一个分节来自206.168.112.219端口1501,目的地为12.106.32.254端口21,它就被递送给第二个子进程。所有目的端口为21的其他TCP分节都被递送给拥有监听套接字的最初那个服务器(父进程)。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
服务端编程示例|学习笔记
快速学习服务端编程示例
67 0
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 28 章 监控数据库活动_28.1. 标准 Unix 工具
28.1. 标准 Unix 工具 在大部分 Unix 平台上,PostgreSQL会修改由ps报告的命令标题,这样个体服务器进程可以被标识。一个显示样例是 $ ps auxww | grep ^postgres postgres 15551 0.
1174 0
高并发场景下如何优化服务器的性能?
最近,有小伙伴在群里提问:Linux系统怎么设置tcp_nodelay参数?也有小伙伴说问我。那今天,我们就来根据这个问题来聊聊在高并发场景下如何优化服务器的性能这个话题。
62 0
三丰云”免费虚拟主机免费云服务器yum出错
三丰云”免费虚拟主机免费云服务器yum出错,怎么回事?
224 0
在C#中调用API获取网络信息和流量
原文 在C#中调用API获取网络信息和流量  最近一项目中要求显示网络流量,而且必须使用C#。 事实上,调用 IpHlpApi.dll 的 GetIfTable API 可以轻易获得网络信息和网络流量。
672 0
Python网络编程——TCP服务端程序开发
TCP服务端,需要与客户端建立连接,接收并处理客户端传输来的数据。
4612 0
服务器虚拟化的趋势与优势
  企业目前对于IT预算的投入处于停滞状态。企业对于IT人才的招聘也跟不上新技术的需求。正是迫于这些趋势的影响,使得企业当下的IT人员们被不断的要求以更少的资金完成更多的工作任务。   企业IT预算开支的持平与企业IT人员配置的减少所带来的不可避免的后果便是:涉及传统应用程序的项目的优先级被降低。
1018 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
12049
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载