HTTP同步性质

7

我读到HTTP是一种同步协议。客户端发送请求并等待响应。在发送下一个请求之前,客户端必须等待第一个响应。Ajax使用HTTP协议,但与此相反是异步的。我还读到,同步请求会阻塞客户端,直到操作完成来自这里。我感到困惑,我的问题是:

  1. 当谈论HTTP协议时,同步的定义是什么?
  2. 同步是否与阻塞相关?
2个回答

9

作为一种协议,HTTP是同步的。你发送一个请求,就必须等待响应。与其他协议不同的是,在其他协议中,你可以在同一连接上快速连续地发送数据,而无需等待先前数据的响应。请注意,HTTP/2 实际上更符合这些要求。

话虽如此,你可以通过单独的连接并行发送多个独立的 HTTP 请求。对于 HTTP 请求,没有“全局”锁定,每个打开的连接只有一个 HTTP 请求/响应 。 (此外,HTTP/2 可以解决这个限制。)

现在,从 Javascript 应用程序的角度来看,HTTP 请求是异步的。这意味着,Javascript 将 HTTP 请求发送到服务器,其响应将在 稍后的某个时间 到达。同时,Javascript 可以继续处理其他事情,当 HTTP 响应到达时,它将继续处理该响应。这就是 异步 Javascript 执行。 Javascript 可以 等待 HTTP 响应返回,在此期间阻塞 其他所有操作;但那样做很糟糕,因为相对于在此期间完成的所有其他任务(例如保持 UI 响应),HTTP 响应可能需要相对较长的时间。


非常感谢@deceze,那么理论上我可以强制使用单个HTTP连接来处理所有请求(在前一个响应到达后)吗? - HKIT
如果您一个接一个地发送请求,那么浏览器很可能会重用已有的TCP连接。但是,这仍然比同时进行多个请求要慢得多。在您的应用程序代码中,您实际上不需要担心这个问题;浏览器将管理它可以/将同时执行多少个并行连接。 - deceze
非常感谢,回答得很好。 - HKIT

3

异步意味着,您发出HTTP请求,但不会等待答案到达。当它到达时,您将处理它,并且可以在此期间自由地做其他事情。这意味着:您不会阻塞应用程序的任何其他操作。

同步则恰恰相反,您发送请求并等待答案,然后再执行其他操作。这意味着:您阻塞了应用程序的其他操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接