【问题标题】:How are different TCP connections in HTTP requests identified?如何识别 HTTP 请求中的不同 TCP 连接?
【发布时间】:2009-06-24 12:07:32
【问题描述】:

据我了解,每个 HTTP 请求都使用自己的 TCP 连接(如果我错了,请纠正我)。所以,假设有两个当前连接到同一台服务器。例如,客户端 javascript 代码使用 XMLHttpRequest 对象触发几个 AJAX POST 请求,一个接一个,然后得到第一个响应。所以我们谈论的是到同一服务器的两个连接,每个连接都在等待响应,以便将其路由到每个单独的回调函数。

现在这是我不明白的事情:TCP 数据包包括源和目标 ip 和端口,但是这两个连接不会有相同的 src 和 dest ip 地址以及端口 80?如何区分数据包并将其路由到适当的位置?是不是和每个连接不同的包序号有关系?

【问题讨论】:

    标签: http tcp sockets xmlhttprequest


    【解决方案1】:

    当您的浏览器创建与 HTTP 服务器的新连接时,它使用不同的源端口。

    例如,假设您的浏览器创建了两个到服务器的连接,并且您的 IP 地址是 60.12.34.56。第一个连接可能来自源端口 60123,第二个来自 60127。这嵌入在发送到服务器的每个数据包的 TCP 标头中。当服务器回复每个连接时,它会使用适当的端口(例如 60123 或 60127),以便数据包返回正确的位置。

    了解这一点的最佳方法之一是下载 Wireshark 并观察您自己网络上的流量。它将向您展示这一点以及更多内容。

    此外,这可以深入了解网络地址转换 (NAT) 如何在路由器上工作。您可以让多台计算机共享同一个 IP 地址,路由器将重写请求以使用不同的端口,以便两台计算机可以同时连接到 AOL Instant Messenger 等位置。

    【讨论】:

      【解决方案2】:

      它们由源端口区分。

      顺便说一句,每个 HTTP 请求不生成单独的 TCP 连接的主要原因称为keepalives

      【讨论】:

        【解决方案3】:

        在分组网络通信中,套接字被认为是 4 个元素的组合:服务器 IP、服务器端口、客户端 IP、客户端端口。第二个通常固定在协议中,例如http 通常监听 80 端口,但客户端端口是一个随机数,通常在 1024-65535 范围内。这是因为操作系统可以将这些端口用于已知的服务器协议(例如 21 用于 FTP,22 用于 SSH 等)。同一个网络设备不能使用相同的客户端端口打开两个不同的连接,即使是到不同的服务器,如果两个不同的客户端使用相同的端口,服务器可以通过它们的 IP 地址来区分它们。如果一个端口在系统中用于侦听连接或建立连接,则它不能用于其他任何事情。这就是操作系统在网卡接收到数据包后如何将数据包发送到正确的进程的方式。

        【讨论】:

          猜你喜欢
          • 2016-02-02
          • 2015-10-27
          • 2011-07-24
          • 1970-01-01
          • 2012-10-16
          • 2011-04-24
          • 1970-01-01
          • 1970-01-01
          • 2019-01-22
          相关资源
          最近更新 更多