TCP和HTTP请求之间有什么关系?
参考答案:
我们知道开启一个TCP链接之后,HTTP请求就会并行发出。 首先我们来思考一个问题,浏览器与服务器建立一个TCP链接之后,会不会在完成一个HTTP请求后立马断开?
- HTTP/1.0的时候是会的,需要手动设置
Connection: keep-alive。 - HTTP/1.1的时候
Connection默认为keep-alive。
一般情况下,复用的 TCP连接在等待设置的超时时间之后还没有被任何连接使用的话,就会主动断开。
一个TCP链接可以对应多少个HTTP请求?
一个TCP链接可以对应多个HTTP请求,只要这个TCP链接没有断开,就可以发送HTTP请求。
这些HTTP请求可以同时发送,同时响应么,在一个TCP链接中?比如:三个HTTP请求同时发送,同时接收响应。
在HTTP/1.1中,单个TCP链接在同一时刻只能处理一个请求,意思就是:任意两个 HTTP 请求从开始到结束的时间在同一个 TCP链接里不能重叠。HTTP/1.1 规范中规定了 Pipelining 来试图解决这个问题, 但是浏览器默认关闭了这个功能。
原因:
- 一些代理服务器不能正确的处理 HTTP Pipelining。
- 正确的流水线实现是复杂的。
- Head-of-line Blocking 连接头阻塞:在建立起一个 TCP 连接之后,假设客户端在这个连接连续向服务器发送了几个请求。按照标准,服务器应该按照收到请求的顺序返回结果,假设服务器在处理首个请求时花费了大量时间,那么后面所有的请求都需要等着首个请求结束才能响应。
HTTP/2.0 提供了Multiplexing 多路传输(多路复用)。可以在一个TCP链接中同时发起多个HTTP请求,同时响应多个HTTP请求。
所以,解决办法也就出现了:
- HTTP/1.1 中可以利用 Pipelining。
- 重用TCP
浏览器http请求的并发性是如何体现的?并发请求的数量有没有限制?
有人会说,我们客户端发起HTTP请求明明是异步,并行发送的。怎么到你这里就一个一个发送,一个一个响应了?
其实浏览器会同时与服务器建立多个TCP链接,来支持多个HTTP同时请求的。
就例如:Chrome浏览器最多允许对同一个域名Host建立6个TCP连接,不同的浏览器有所区别。
补充
关于HTTPS如果图片都是HTTPS的连接,并且在同一域名下,浏览器会先和服务器协商使用HTTP2的Multiplexing功能进行多路传输,不过未必所有的挂在这个域名下的资源都会使用同一个TCP连接。如果用不了HTTPS或者HTTP2(HTTP2是在HTTPS上实现的),那么浏览器会就在同一个host建立多个TCP连接,每一个TCP连接进行顺序请求资源。
题目要点:
当浏览器与服务器建立TCP连接后,HTTP请求的发送和响应行为取决于HTTP版本和浏览器设置。以下是关于TCP连接和HTTP请求的一些关键点:
- TCP连接的复用:
- HTTP/1.0:默认情况下,每个HTTP请求都会建立一个新的TCP连接,并在请求完成后立即关闭。可以通过设置
Connection: keep-alive头部来保持连接。 - HTTP/1.1:默认支持长连接(
Connection: keep-alive),浏览器和服务器之间可以复用同一个TCP连接。
- HTTP/1.0:默认情况下,每个HTTP请求都会建立一个新的TCP连接,并在请求完成后立即关闭。可以通过设置
- TCP连接的关闭:
- 如果在等待超时时间后,连接未被使用,它会自动断开。
- HTTP请求的并发性:
- HTTP/1.1:虽然单个TCP连接在同一时刻只能处理一个请求,但浏览器可以同时与服务器建立多个TCP连接,从而支持并发请求。
- HTTP/2.0:引入了多路复用(Multiplexing),允许在一个TCP连接中同时发送和接收多个请求和响应。
- 浏览器限制:
- 浏览器对同一个域名Host的TCP连接数量有限制,例如Chrome浏览器最多允许建立6个TCP连接。
- HTTPS和HTTP/2.0:
- 如果资源都是HTTPS连接,并且处于同一域名下,浏览器会尝试使用HTTP/2.0的多路复用功能。
- 如果无法使用HTTP/2.0,浏览器会在同一个host建立多个TCP连接,每个连接按顺序请求资源。
HTTP/1.1通过长连接和浏览器的多连接支持实现了并发性,而HTTP/2.0通过多路复用进一步提高了效率。浏览器和服务器之间的TCP连接管理和HTTP请求的并发性是确保高效网页性能的关键因素。