MemoryGarden's Blog

努力 -----------大能猫

C++博客 首页 新随笔 联系 聚合 管理
  118 Posts :: 11 Stories :: 20 Comments :: 0 Trackbacks
背景 : 并发服务器中,主服务循环通过派生一个子进程来处理每个新的连接,如果一个子进程继续使用服务器众所周知的端口来服务一个长时间的请求,那将会发生什么?
首先,在一台 IP地址为 10.2.16.48 的服务器,服务器在端口21上执行被动打开(socket,bind,listen) 等待客户请求。
服务器 : {*:21,*:*} 之处服务器的套接字对,服务器在本地端口21上等待连接,外地IP地址和端口都没有指定,用 "*:*" 来表示

稍后,IP地址为 10.22.206.157 的主机上启动第一个客户,它对服务器10.2.16.48 执行主动打开(connect) 假设客户主机的TCP为此选择临时端口为1500,当服务器接收到这个客户的连接的时候,服务器fork一个自身的副本,让子进程来处理该客户的请求

至此,我们必须在服务器上区分监听套接字和已经连接的套接字,监听套接字与已连接的套接字使用共同的端口21。
下一步,我们假设在客户主机上有另外一个客户请求连接到同一台服务器,客户主机的TCP为这个客户的套接字分配一个未使用的端口,1501。

对于服务器来说,这两个连接是有区别的,第一个连接的套接字对{10.22.206.157:1500,10.2.16.48:21} 和第二个连接的套接字对 {10.22.206.157:1501,10.2.16.48:21} 不一样,因为客户的TCP为第二个连接选择了一个未使用的端口 1501

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








posted on 2011-07-05 03:00 memorygarden 阅读(1410) 评论(0)  编辑 收藏 引用 所属分类: 网络编程

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理