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

news/2024/5/17 11:57:13 标签: tcp, 服务器, wildcard, freebsd, socket, 2010

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

2.10 TCP端口号与并发服务器

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

20100601/125023384.jpg" border="0" alt="" width="400" height="146" /> 
图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所示。图中在该客户的下方标出了它的套接字对。

20100601/125049456.jpg" border="0" alt="" width="657" height="144" /> 
(点击查看大图)图2-12 客户对服务器的连接请求

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

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

20100601/125424811.jpg" border="0" alt="" width="933" height="405" /> 
(点击查看大图)图2-13 并发服务器让子进程处理客户

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

20100601/125723477.jpg" border="0" alt="" width="754" height="385" /> 
(点击查看大图)图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分节都被递送给拥有监听套接字的最初那个服务器(父进程)。

 


http://www.niftyadmin.cn/n/923427.html

相关文章

TCP超时时间的计算

转:http://blog.csdn.net/metasearch/archive/2008/03/07/2157017.aspx 超时重传是TCP协议保证数据可靠性的另一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就…

拥塞控制

为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制。最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion avoidance)”组成,后来TCP Reno版本中又针对性的加入了“快速重传(Fast retransmit)”…

Nagle算法

RFC 896[Nagle 1984]中提出了Nagle算法。Nagle算法针对的问题是:广域网上大量的小分组会增加拥塞出现的可能。Nagle算法的思想:该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他小分组。相…

RST复位报文段

TCP首部中的RST比特是用于“复位”的。一般来说,无论何时一个报文段发往基准的连接出现错误,TCP都会发出一个复位报文段。TCP在下列三种情况下产生RST复位报文段。 1.到不存在的端口的连接请求 产生复位的一种常见情况是当连接请求到达时,目…

tcpdump抓包分析TCP三次握手过程

转:http://hi.baidu.com/xxjjyy2008/blog/item/e6566bf837d91903d9f9fdd0.html 一、 tcpdump使用 1、首先看下MAN手册 TCPDUMP(8) …

epoll

I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数。在linux2.6内核中,有了一种替换它的机制,就是epoll。 一、epoll相关的数据结构和函数 epoll用到的所有函数都是在头文件sys/epoll.h中声明的,下面简…

多进程服务器中,epoll的创建应该在创建子进程之后

转:http://blog.csdn.net/wei801004/archive/2009/06/13/4264031.aspx 看我的测试代码,似乎应该是在创建子进程之后创建epoll的fd,否则程序将会有问题,试将代码中两个CreateWorker函数的调用位置分别调用,一个在创建epoll fd之前,一个在之后,在调用在创建之前的代码…

c语言共用体对齐

还从网上找到共用体内存分配原则的文章,下面列几个例子说明: 1.Union data1{ double d; int i; char c1; char c2[9]; }; sizeof(union data1)的值为16.在编译器默认设置的情况下,该共用体最大基本类型为double,它占8字节&#…