一、问题描述
不同主机之间通讯,必须依赖套接字,而端口号是套接字的标识(开始是这样认为的),那么假设web服务器进程,开启了80端口号(即监听80端口号),接着客户端浏览器,打开任意端口,发起TCP连接请求,服务器80端口监听到请求,建立TCP连接,最后通过客户端套接字和服务器套接字进行通信,那么其他用户怎么办? 80端口也被占用,改如何建立TCP连接?现实中大家发送http请求好像都可以使用一样的端口,如80。
二、问题解决
首先,明确几点: 1、TCP套接字的唯一标识是一个四元组(源IP地址,源端口号,目的IP地址,目的端口号) 2、TCP创建连接,会进行“三次握手”, 我们这里暂且把TCP建立连接的报文段称为:称为TCP连接 把TCP承载请求数据的报文段称为:TCP请求
客户端浏览器和web服务器的通信过程是这样的:
在建立连接阶段: 浏览器进程打开任意端口,所有的浏览器都是将TCP连接报文,发送给服务器进程监听的端口(如:80),服务器接受到请求,为每个请求创建新的套接字(依据请求报文的源ip,源端口号和自己的ip、端口号) 在发送http请求阶段: 此时连接已经建立,承载了 HTTP请求信息的TCP请求报文会发送到对应的套接字
因此: 多个不同的套接字可以拥有相同的目的端口号80,由于源ip或端口号不同,TCP套接字就可以唯一标识,通信就可以进行。 同时,一个端口号只能被一个进程所监听
举一反三:其实所有使用TCP的应用程序对的通信都是一样的,分为建立连接和发送数据阶段。 在建立连接时,对于 客户端TCP套接字还没有形成,服务器端进程也是如此,它只是监听80端口而已,把所有目的端口号为80的TCP报文段统统接收,然后去处理,即建立套接字,为套接字分配处理进程。当连接建立时,对应着服务器、客户端套接字的形成,之后的通信,不会将TCP报文段在发送给监听80端口的服务器进程,而是发给与连接对应的套接字