如何识别HTTP请求中的不同TCP连接?

时间:2009-06-24 12:07:33

标签: http tcp sockets xmlhttprequest

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

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

3 个答案:

答案 0 :(得分:10)

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

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

了解此问题的最佳方法之一是下载Wireshark并观察您自己网络上的流量。它会告诉你这个以及更多。

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

答案 1 :(得分:3)

它们由源端口区分。

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

答案 2 :(得分:0)

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