Web浏览器是否对不同的选项卡使用不同的传出端口?


58

在支持具有多个选项卡的Web浏览器(例如Firefox)中,进入不同网站域的不同选项卡是否为每个域使用专用端口?

还是浏览器使用单个端口来管理所有选项卡,从而管理所有域?


浏览器在连接到网站时使用2个端口,其中80用于http连接,443用于https连接。 zh.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
摩押

7
我知道用于连接服务器的端口,但是我想知道用于从客户端(主机)连接的端口号。
yoyo_fun

2
我认为“出港”一词不准确。端口是双向的。也许你可以说。改为“本地端口”。本地端口用作发送请求的源(传出)端口,以及接收响应的目标(传入)端口。
罗恩·莫平

6
操作系统分配端口,每个新连接分配一个新的本地端口,以使其不同于所有其他打开的连接。
Ex Umbris '16

1
@ExUmbris:这可能是一个明智而简单的策略,但是TCP连接由四边形{本地IP,本地端口,远程IP,远程端口}标识。本地端口对于唯一性不是必需的,这是一件好事:Web服务器完全不能将其本地端口用于唯一性。从网络服务器的角度来看,远程IP也不是唯一的,因为多个用户可能位于单个网关/代理后面。
MSalters

Answers:


55

浏览器是否使用不同的端口连接到不同的网站?

是的,他们有。

这是一个示例,显示了我在Windows 7上当前的Firefox连接(我有9个打开的选项卡):

在此处输入图片说明

笔记:

  • 您可以看到本地端口都不同。

  • 远程端口通常是80(HTTP),443(HTTPS)或8080(HTTP Alternate)。

  • 呈现网页的完整过程如下所述。特别请参阅步骤5、6、13和15(以粗体显示):

    • 通常,渲染单个网页使用多个连接,但并非所有连接都指向同一远程地址。

    • 这是因为网页通常包含托管在其他位置的资源(javascript文件等)。

  • 同一个网站的多个连接(例如stackoverflow.com)也具有不同的本地端口(因为它们是呈现不同页面的不同选项卡中的独立连接)。


渲染网页–逐步

注意:

  • 步骤5、6、13和15(以粗体显示)与问题直接相关。

您是否曾经想过上网时会发生什么?它并不像看起来那么简单:

  1. 您在首选浏览器的地址栏中键入URL。
  2. 浏览器解析URL以查找协议,主机,端口和路径。
  3. 它形成一个HTTP请求(很可能是协议)
  4. 为了到达主机,它首先需要将人类可读的主机转换为IP号,并通过在主机上进行DNS查找来实现。
  5. 然后,需要在指定端口(最常见的端口为80)上,从用户计算机打开该IP地址的套接字。
  6. 打开连接后,HTTP请求将发送到主机
  7. 主机将请求转发到配置为在指定端口上进行侦听的服务器软件(通常是Apache)
  8. 服务器检查请求(通常仅检查路径),并启动处理请求所需的服务器插件(对应于您使用的服务器语言,PHP,Java,.NET,Python?)
  9. 该插件可以访问完整的请求,并开始准备HTTP响应。
  10. 为了构造响应,(最可能)访问数据库。根据请求路径(或数据)中的参数进行数据库搜索
  11. 来自数据库的数据,以及插件决定添加的其他信息,被组合成一长串文本(可能是HTML)。
  12. 该插件将该数据与一些元数据(以HTTP标头的形式)组合在一起,并将HTTP响应发送回浏览器。
  13. 浏览器收到响应,并解析响应中的HTML(概率为95%的HTML被破坏)
  14. DOM树是由损坏的HTML构建而成的
  15. 对于在HTML源代码中找到的每个新资源(通常是图像,样式表和JavaScript文件),都会向服务器发出新请求。返回第3步,并对每个资源重复上述步骤。
  16. 解析样式表,并将每个样式表中的呈现信息附加到DOM树中的匹配节点
  17. 解析并执行Javascript,并移动DOM节点并相应地更新样式信息
  18. 浏览器根据DOM树和每个节点的样式信息在屏幕上呈现页面。
  19. 您会在屏幕上看到该页面
  20. 您会感到恼火,整个过程太慢了。

源代码渲染网页–逐步


63

到网站的每次连接都使用不同的套接字,其默认目的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 -ntpor ss -t命令:

在此处输入图片说明


4
请注意,netstat还将显示非浏览器连接,例如,电子邮件客户端的电子邮件连接,新闻阅读器的新闻连接。这些连接将位于不同的远程端口上。
DavidPostill

除非我没有遗漏任何东西,否则似乎您正在假设询问者正在使用Windows,尽管他没有提到操作系统。列出提供控制台命令时所指的操作系统也很不错。
user45623

9
@ user45623:尽管屏幕截图是Windows屏幕截图,netstat -n但在大多数操作系统(包括Linux和Mac OS)上都可以使用。
Heinzi '16

1
在Windows上(也许还有其他操作系统),您可以netstat -n -o用来查看哪个进程创建了哪个连接。或者,您可以运行SysInternal的tcpview在GUI中查看列表,其中包含进程名称和图标以及全部。
乔纳森

现在的问题是,如果网络浏览器通向同一服务器,是否可以重用来自不同选项卡的连接?
John Dvorak

11

关于到不同网站的选项卡,只要元组{本地IP,本地端口,目标IP,目标端口}是唯一的,TCP中就没有什么要求本地端口不同。对于同一网站上的标签页,情况要复杂得多。

与任何其他客户端软件一样,浏览器对于与同一目标的每个传出连接都使用不同的本地端口。通常,它将形成与任何给定网站的多个连接,以获取嵌入式资源,例如图像,CSS,JavaScript等。还将合并这些连接以供可能的重用。

无法说出同一网站的不同标签页是否会使用不同的连接,因为(a)每个标签页通常都没有一个连接,并且(b)根据时间和身份验证,连接可能是标签之间重用;由于无法识别连接,因此也无法识别本地端口。


谢谢。“汇集”连接是什么意思?
yoyo_fun

而不是关闭它,而是将其返回到池中,并且仅当它在空闲超时间隔内保持空闲状态时才关闭它。并在创建到该目标的新连接之前先在池中查找。这就是实现HTTP保持活动的方式。
user207421'3

因此,池是内存中存储打开的和尚未关闭的连接的数据结构吗?
yoyo_fun

没错,通常是由目标IP:端口作为键的映射。
user207421 '16

2
@EJP:请注意,对于HTTPS,通过目标IP和端口来键入映射并不安全。您还需要区分与不同主机名的连接,即使它们碰巧解析为相同的IP和端口。可以说,如果至少一个标签处于隐身模式,则浏览器还应将不同标签的连接保持分开。
Henning Makholm '16

6

是。不会吧 这取决于。

首先,浏览器可以使用以下任何策略进行连接:

  1. 单一连接(对于1995年以后的任何浏览器都不太可能)
  2. 每个分页一个连接(与#1基本相同,稍好一点)
  3. 每个资源一个连接(天真,但效果不佳)
  4. 具有活动连接,重用连接的连接池
  5. 有所不同(读作:怪异的东西)

尽管使用连接池(和重新使用连接)是一个合理的假设,但是您无法知道浏览器将使用哪种策略。

其次,TCP的工作方式是每个连接都有一个源端口和一个目标端口。源地址和目标地址/端口对定义了连接。
您总是[1]使用知名端口(例如80或443)连接到服务器(服务器在其广告地址上侦听),但是另一个端口是随机选择的。因此,取决于您从哪一侧看连接,它可以具有一个或多个可能的端口。

因此,相同的选项卡可能(并且通常会)在其末端使用几个不同的端口,但是原则上,不同的选项卡可能会(如果连接被池化并且从同一服务器加载不同选项卡中的不同资源)使用相同的端口。

由于问题明确提到了outgoing,因此在“正常”情况下,端口号将相同,无论它们位于哪个选项卡中,或者是两个可能的端口(80和443)之一。尽管当然可以在URL中明确要求其他端口(例如8080)。不过,这种情况很少见。


[1]好吧,并非总是如此 ...但是我们不要使其过于复杂。


另一个因素...客户端端口通常由操作系统而不是浏览器选择;如果连接通过NAT设备,则服务器看到的客户端端口可能与浏览器看到的客户端端口不同。大多数操作系统在(可配置的)临时端口范围内线性分配或随机分配,但是浏览器可以通过与不同服务器的多个连接请求相同的源端口。(OP询问的是客户端端口,而不是服务器端口。)
大卫

@david:很难说出哪个是正确的(或答案是什么),因为Q是一个花哨的模棱两可的东西,因此我的篇幅比较长。OP正在询问客户端上的传出端口。“客户端”表明我们正在谈论源端口(以TCP术语),它是由实现自由或随机选择的(通过实现),但是“传出”表明它实际上是我们正在谈论的目标端口。用外行话更好地描述为“服务器上的端口”。从服务器可以看到,您对NAT的评论是正确的,但不会影响客户端。
戴蒙
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.