鉴于这个例子,我的操作系统如何区分每个请求。
假设我打开了 3 个标签页,并且它们同时转到http://google.com
。我的操作系统如何区分返回的回复数据?它们会不会完全相同?在 TCP 标头中,源端口和目标端口以及源 IP 地址和目标 IP 地址以及方案 (http) 都将相同。
我知道 IP 数据包头有一个 ID 头,但这不是为了处理碎片,而不是物理识别数据包。此外,IP 数据包应该是无连接的,对吗?
例如,在 ICMP 回显请求中,回显请求和响应具有 ID,以便将每个数据包与每个响应进行匹配。那么在我的场景中该如何实现这一点呢?我猜数据是通过 TCP 数据包发送来区分的,但我不确定。
编辑:我做了一个错误的假设。仅仅因为数据包被发送到端口 80 并不意味着源也需要是端口 80。例如,查看此 NAT 示例,我们可以看到这并没有完成。这允许源段为每个请求使用不同的源端口。
答案1
当客户端程序(例如浏览器)连接到服务器时,它会打开一个套接字。并且(除非程序指定一个,这种情况非常罕见),操作系统会为套接字分配一个唯一的端口号。这通常在 1000-2000 范围内。源 IP 当然是客户端主机的地址。服务器确定目标参数;例如,google.com 的 IP 地址和 80。
所以,您说得对;从同一台客户端计算机到同一服务器端口的单独 TCP 连接通过不同的源端口号来区分。这与 NAT 无关。
如果你检查的输出,你就会看到这一点netstat
。
答案2
如果你查看一些层,这会更简单。只需记住 HTTP 请求的生命周期:
客户端浏览器发起与 Web 服务器的套接字连接
向服务器发送一个http标准的请求。
服务器处理请求并以HTTP标准向客户返回响应。
客户端浏览器接收响应。
与服务器的连接已关闭。
浏览器客户端解释答案并在屏幕上显示结果
因此,当浏览器打开请求时,它会等待响应。考虑到活着由于 TCP/IP 连接的性质,此响应发生在同一连接上。然后浏览器可以区分哪个请求是针对该选项卡的。
浏览器同时打开多个连接。