我制作了使用 Ajax 更新某些值而不重新加载页面的网页。我正在使用 XMLHttpRequest 对象发送 POST 请求,并分配了一个回调函数,该函数在响应到达时被调用,它工作得很好。
但是……浏览器到底怎么知道来自某个 ip:port 的一些数据应该发送到这个特定的回调函数?我的意思是,在最坏的情况下,如果我让 Firefox 和 IE 从同一台服务器大致同时发出一些 POST 请求,甚至在响应到达之前的请求之前发出后续 POST 请求,那么数据如何进入被路由到正确的回调函数??
我制作了使用 Ajax 更新某些值而不重新加载页面的网页。我正在使用 XMLHttpRequest 对象发送 POST 请求,并分配了一个回调函数,该函数在响应到达时被调用,它工作得很好。
但是……浏览器到底怎么知道来自某个 ip:port 的一些数据应该发送到这个特定的回调函数?我的意思是,在最坏的情况下,如果我让 Firefox 和 IE 从同一台服务器大致同时发出一些 POST 请求,甚至在响应到达之前的请求之前发出后续 POST 请求,那么数据如何进入被路由到正确的回调函数??
每个请求都有自己的连接。意思是如果你有单连接,当然你会有单响应,这个响应会在你的回调中。
一般的想法是您的浏览器完全打开一个新连接,向服务器发出请求并等待响应。这一切都在一个连接中,由浏览器通过 JavaScript API 管理。当浏览器向下推某些东西时,连接不会被切断,然后又被重新拾起,因此发起请求的浏览器知道在请求完成时要做什么。
真正使事情异步的是,这些连接可以在后台单独发生,这允许多个请求出去和返回,同时等待响应。这为您提供了很好的 AJAX 效果,似乎是服务器稍后返回的东西。
发出的每个 HTTP 请求都在单独的 TCP 连接上。浏览器只是等待该连接上的数据返回,然后调用您的回调函数。
在较低级别上,您的操作系统上的 TCP 实现将通过为每个套接字使用不同的“源端口”来跟踪哪些数据包属于每个套接字(即连接)。将有一些查找表映射源端口以打开套接字。
值得注意的是,浏览器与任何一台服务器建立的同时连接数是有限的(通常为 2)。在过去,当页面重新加载以发送和接收数据时,这是明智的,但在 AJAX 的这些开明的日子里,这是一个真正的麻烦。有关该问题的有趣讨论,请参见页面。