在支持具有多个选项卡的Web浏览器(例如Firefox)中,进入不同网站域的不同选项卡是否为每个域使用专用端口?
还是浏览器使用单个端口来管理所有选项卡,从而管理所有域?
在支持具有多个选项卡的Web浏览器(例如Firefox)中,进入不同网站域的不同选项卡是否为每个域使用专用端口?
还是浏览器使用单个端口来管理所有选项卡,从而管理所有域?
Answers:
是的,他们有。
这是一个示例,显示了我在Windows 7上当前的Firefox连接(我有9个打开的选项卡):
笔记:
您可以看到本地端口都不同。
远程端口通常是80(HTTP),443(HTTPS)或8080(HTTP Alternate)。
HTTP
在TCP和UDP端口号列表中搜索其中一些端口号。呈现网页的完整过程如下所述。特别请参阅步骤5、6、13和15(以粗体显示):
通常,渲染单个网页使用多个连接,但并非所有连接都指向同一远程地址。
这是因为网页通常包含托管在其他位置的资源(javascript文件等)。
与同一个网站的多个连接(例如stackoverflow.com)也具有不同的本地端口(因为它们是呈现不同页面的不同选项卡中的独立连接)。
注意:
您是否曾经想过上网时会发生什么?它并不像看起来那么简单:
- 您在首选浏览器的地址栏中键入URL。
- 浏览器解析URL以查找协议,主机,端口和路径。
- 它形成一个HTTP请求(很可能是协议)
- 为了到达主机,它首先需要将人类可读的主机转换为IP号,并通过在主机上进行DNS查找来实现。
- 然后,需要在指定端口(最常见的端口为80)上,从用户计算机打开该IP地址的套接字。
- 打开连接后,HTTP请求将发送到主机
- 主机将请求转发到配置为在指定端口上进行侦听的服务器软件(通常是Apache)
- 服务器检查请求(通常仅检查路径),并启动处理请求所需的服务器插件(对应于您使用的服务器语言,PHP,Java,.NET,Python?)
- 该插件可以访问完整的请求,并开始准备HTTP响应。
- 为了构造响应,(最可能)访问数据库。根据请求路径(或数据)中的参数进行数据库搜索
- 来自数据库的数据,以及插件决定添加的其他信息,被组合成一长串文本(可能是HTML)。
- 该插件将该数据与一些元数据(以HTTP标头的形式)组合在一起,并将HTTP响应发送回浏览器。
- 浏览器收到响应,并解析响应中的HTML(概率为95%的HTML被破坏)
- DOM树是由损坏的HTML构建而成的
- 对于在HTML源代码中找到的每个新资源(通常是图像,样式表和JavaScript文件),都会向服务器发出新请求。返回第3步,并对每个资源重复上述步骤。
- 解析样式表,并将每个样式表中的呈现信息附加到DOM树中的匹配节点
- 解析并执行Javascript,并移动DOM节点并相应地更新样式信息
- 浏览器根据DOM树和每个节点的样式信息在屏幕上呈现页面。
- 您会在屏幕上看到该页面
- 您会感到恼火,整个过程太慢了。
源代码渲染网页–逐步
到网站的每次连接都使用不同的套接字,其默认目的TCP端口80用于纯HTTP,而443用于HTTPS。为了使套接字唯一,源IP地址,源TCP端口,目标IP地址和目标TCP端口的组合必须不同。
如果您从同一台计算机到同一网站有多个连接(假设该网站仅使用1个IP地址),则必须使用不同的源TCP端口。这样,每个连接都是唯一的。
但是,应注意,从HTTP 1.1开始,所有连接在给定的时间段内都是持久的(除非另行声明)。这意味着,如果请求来自同一网站的多个资源(例如,css / js文件),则浏览器可以重用同一连接。如果浏览器中有同一网站的多个实例,这也适用。
如果您使用的是Windows,该netstat -no -p TCP
命令将显示所有活动的TCP套接字及其对应的进程ID,包括浏览器的进程ID:
如果您使用的是Unix / Linux(在本例中为Debian),则可以使用netstat -ntp
or ss -t
命令:
netstat -n
但在大多数操作系统(包括Linux和Mac OS)上都可以使用。
netstat -n -o
用来查看哪个进程创建了哪个连接。或者,您可以运行SysInternal的tcpview在GUI中查看列表,其中包含进程名称和图标以及全部。
关于到不同网站的选项卡,只要元组{本地IP,本地端口,目标IP,目标端口}是唯一的,TCP中就没有什么要求本地端口不同。对于同一网站上的标签页,情况要复杂得多。
与任何其他客户端软件一样,浏览器对于与同一目标的每个传出连接都使用不同的本地端口。通常,它将形成与任何给定网站的多个连接,以获取嵌入式资源,例如图像,CSS,JavaScript等。还将合并这些连接以供可能的重用。
无法说出同一网站的不同标签页是否会使用不同的连接,因为(a)每个标签页通常都没有一个连接,并且(b)根据时间和身份验证,连接可能是标签之间重用;由于无法识别连接,因此也无法识别本地端口。
首先,浏览器可以使用以下任何策略进行连接:
尽管使用连接池(和重新使用连接)是一个合理的假设,但是您无法知道浏览器将使用哪种策略。
其次,TCP的工作方式是每个连接都有一个源端口和一个目标端口。源地址和目标地址/端口对定义了连接。
您总是[1]使用知名端口(例如80或443)连接到服务器(服务器在其广告地址上侦听),但是另一个端口是随机选择的。因此,取决于您从哪一侧看连接,它可以具有一个或多个可能的端口。
因此,相同的选项卡可能(并且通常会)在其末端使用几个不同的端口,但是原则上,不同的选项卡可能会(如果连接被池化并且从同一服务器加载不同选项卡中的不同资源)使用相同的端口。
由于问题明确提到了outgoing,因此在“正常”情况下,端口号将相同,无论它们位于哪个选项卡中,或者是两个可能的端口(80和443)之一。尽管当然可以在URL中明确要求其他端口(例如8080)。不过,这种情况很少见。