TCP如何区分监听套接字和已连接套接字???

 

TCP如何区分监听套接字和已连接套接字

分类: TCP/IP与套接字编程   868人阅读  评论(0)  收藏  举报

转:http://book.51cto.com/art/201005/203019.htm

2.10 TCP端口号与并发服务器

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

 
图2-11 TCP服务器在端口21上执行被动打开

我们使用记号{*: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所示。图中在该客户的下方标出了它的套接字对。

 
(点击查看大图)图2-12 客户对服务器的连接请求

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

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

 
(点击查看大图)图2-13 并发服务器让子进程处理客户

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

 
(点击查看大图)图2-14 第二个客户与同一个服务器的连接

通过本例应注意,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分节都被递送给拥有监听套接字的最初那个服务器(父进程)。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
套接字(Socket)是一个抽象的概念,它是计算机网络通信中的一个端点,用于描述 IP 地址和端口,通过套接字可以实现进程之间的通信。套接字分为两种类型:流套接字和数据报套接字套接字连接状态取决于它所处的网络协议。在 TCP 协议中,套接字连接状态通常有以下几种: 1. CLOSED:套接字处于关闭状态,没有连接。 2. LISTEN:套接字正在监听连接请求,等待客户端的连接。 3. SYN-SENT:客户端发送了连接请求,等待服务器回应。 4. SYN-RECEIVED:服务器接收到客户端的连接请求,并发送了确认信息。 5. ESTABLISHED:连接已经建立,双方可以互相通信。 6. FIN-WAIT-1:客户端发送了关闭连接的请求,等待服务器响应。 7. FIN-WAIT-2:服务器已经发送了关闭连接的请求,等待客户端响应。 8. CLOSING:双方同时发送了关闭连接的请求,等待对方响应。 9. TIME-WAIT:双方已经完成了关闭连接的操作,等待一段时间后释放套接字。 10. CLOSE-WAIT:服务器已经发送了关闭连接的请求,等待客户端响应。 11. LAST-ACK:客户端已经发送了关闭连接的请求,等待服务器响应。 12. CLOSED:套接字关闭,连接已经结束。 维护套接字连接状态是很重要的,因为不同的状态下套接字的行为是不同的,如何处理连接请求和数据传输都要依赖于套接字连接状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值