博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《UNIX网络编程 卷1:套接字联网API(第3版)》——2.10 TCP端口号与并发服务器...
阅读量:6880 次
发布时间:2019-06-27

本文共 1554 字,大约阅读时间需要 5 分钟。

本节书摘来自异步社区《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分节都被递送给拥有监听套接字的最初那个服务器(父进程)。

转载地址:http://zzbbl.baihongyu.com/

你可能感兴趣的文章
从顺丰到菜鸟,洋女婿“爆改”俄罗斯邮政
查看>>
开源大数据周刊-第90期
查看>>
SpringBoot项目多环境配置(亲测有效)
查看>>
微软262亿美元收购LinkedIn
查看>>
c/c++(hiredis)异步调用redis【转】
查看>>
SQLSERVER排查CPU占用高的情况
查看>>
InterSystems发布TrakCare企业级实验室业务管理系统
查看>>
丰田生产方式(TPS)的本质
查看>>
Django之提交表单与前后端交互
查看>>
mongos-sharding连接池配置
查看>>
html2canvas的踩坑之路
查看>>
wumii 爆款总结经验
查看>>
芯咖汇沙龙首战告捷,与诸位AI大咖一起探讨人工智能
查看>>
BLUEGUARD-E智能锁,门锁和手机自动组成cp
查看>>
在家也能逛家居商场!宜家推出VR购物应用
查看>>
java学习笔记--常用类(System,Runtime,date类, Math 数学类,Random 随机数类 )
查看>>
面对前车之鉴的AR,现在的VR要做些什么?
查看>>
Fitbit表高兴太早,廉价手环和智能手表的威胁就在眼前
查看>>
为什么SAP默默开始区块链研究测试
查看>>
Redis Sentinel安装、配置和部署
查看>>