【TCP连接】与【HTTP请求】的相关面试问题详解
【问题一】:现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开?
Http1.0版本【我说它是低配版...会不会被骂...】
每次TCP连接只能发送一个请求,当服务器响应后就会关闭这次连接,下一个请求需要再次建立TCP连接,就是不支持keepalive。
(性能比较差:开始时发送速率较慢)
Http1.1版本【主流协议版本】
引入持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。
明确要求服务器关闭TCP连接:
Connection: close
【补充】:目前,对于同一个域名,大多数浏览器允许同时建立6个持久连接。降低了延迟同时提高了带宽的利用率。
Http1.1版本 加入了管道机制,在同一个TCP连接里,允许多个请求同时发送,增加了并发性,进一步改善了HTTP协议的效率;
举例来说,客户端需要请求两个资源。以前的做法是,在同一个TCP连接里面,先发送A请求,然后等待服务器做出回应,收到后再发出B请求。
管道机制 则是允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序,先回应A请求,完成后再回应B请求。
Http2.0版本
增加双工模式,即不仅客户端能够同时发送多个请求,服务端也能同时处理多个请求,解决了队头堵塞的问题。
【问题二】:一个 TCP 连接可以对应几个 HTTP 请求?
既然是维持TCP连接,那么支持多个HTTP请求复用。
【问题三】:一个 TCP 连接中 HTTP 请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)?
这一问在【问题一】中有详细的解释,http1.1版本 加入了管道机制,在同一个TCP连接里,允许多个请求同时发送(不需要等待任意请求的响应),但是对请求的处理依然是按照请求收到的顺序发送响应。
A client that supports persistent connections MAY "pipeline" its requests (i.e., send multiple requests without waiting for each response). A server MUST send its responses to those requests in the same order that the requests were received.
但是在Http2.0版本中,增加双工模式,即不仅客户端能够同时发送多个请求,服务端也能同时处理多个请求。
【问题四】:为什么有的时候刷新页面不需要重新建立 SSL 连接?
【答】:TCP 连接有的时候会被浏览器和服务端维持一段时间。TCP 不需要重新建立,SSL 自然也不会断开,所以不需要重新建立SSL 连接。
要了解这个问题中的SSL是什么?
【参考】:https://blog.csdn.net/wang_gongzi/article/details/82853060
SSL协议,用于Web浏览器与服务器之间的身份认证和加密数据传输.它位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。
SSL协议可分为两层:
- SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
- SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
【问题五】:浏览器对同一 Host 建立 TCP 连接的数量有没有限制?
【答】:有限制。目前,对于同一个域名,大多数浏览器允许同时建立6个持久连接。
【有限制的优点】:降低了延迟同时提高了带宽的利用率。