HTTP面试之实战经验与总结

94 阅读6分钟

在这次技术面试中,面试官通过多个问题考察了我对HTTP协议及相关技术的理解。以下是我对面试过程中遇到的一些关键问题和答案的总结:


1. 输入URL到浏览器发生了什么?都用到了哪些协议?

   当输入URL并按下回车时,浏览器会通过以下步骤处理:
- DNS解析:浏览器通过DNS查询域名对应的IP地址。
- 建立TCP连接:浏览器通过TCP协议与服务器建立连接。
- 发送HTTP请求:浏览器通过HTTP协议向服务器发送请求。
- 等待响应:服务器处理请求后返回HTTP响应。
- 渲染页面:浏览器解析HTML、CSS、JavaScript等内容,并呈现网页。    
所涉及的协议包括:DNS、TCP、IP、HTTP


2. DNS基于TCP还是UDP,为什么?

   DNS通常使用UDP协议。原因是DNS查询非常短小且要求响应快速,UDP协议在低开销下能高效地完成查询任务。然而,当DNS响应的数据包过大(如超过512字节)时,它会自动切换到TCP协议,以保证数据完整性。


3. 域名解析的流程

   - 浏览器缓存:首先检查浏览器的DNS缓存,看看是否有该域名的IP地址。
- 操作系统缓存:如果浏览器没有缓存,操作系统会查询本地缓存。
- DNS查询:若操作系统也没有缓存,会向本地DNS服务器发送请求。
- 递归查询:如果本地DNS服务器没有答案,它会向根DNS服务器或其他DNS服务器递归查询。
- 返回结果:最终DNS服务器返回域名的IP地址,浏览器通过这个IP地址建立TCP连接。


4. 描述HTTP状态码,401, 301, 302, 201代表什么

   - 401 Unauthorized:请求需要用户身份验证,通常表示身份验证失败。
- 301 Moved Permanently:资源永久性移动到新位置。
- 302 Found:资源暂时移动到新位置(临时重定向)。
- 201 Created:请求成功并创建了新的资源。


5. 描述Session和Cookie,Cookie是怎么传输的

   - Session:服务器存储用户状态信息(如登录状态),通过Session ID在用户和服务器之间传递。
- Cookie:客户端存储的键值对数据,每次请求时会随请求头一起发送到服务器,直到Cookie过期或被删除。Cookie通过**HTTP请求头(Cookie字段)**传输。


6. 如何告诉客户端,响应的是什么数据类型?

   通过Content-Type响应头,告诉客户端响应数据的类型。例如,Content-Type: text/html 表示返回的是HTML数据,Content-Type: application/json 表示返回的是JSON数据。


7. HTTP2.0的优点和QUIC的实现

   - HTTP2.0的优点
- 多路复用:允许在一个连接上同时发送多个请求和响应,避免了HTTP1.x中的队头阻塞问题。
- 头部压缩:通过HPACK压缩减少头部数据的传输。
- 服务器推送:服务器可以主动推送资源到客户端,减少延迟。
- QUIC的实现:QUIC是基于UDP的传输协议,旨在减少TCP连接的延迟。QUIC通过0-RTT连接建立和集成加密,进一步提高了性能和安全性。


8. HTTP2.0和1.x的区别,1.x如何保证高并发

   - HTTP2.0与1.x的区别
- HTTP2.0使用二进制协议,而HTTP1.x是文本协议。
- HTTP2.0支持多路复用,HTTP1.x是串行的。
- HTTP2.0支持头部压缩,而HTTP1.x不支持。
- HTTP1.x高并发处理:通过多个TCP连接来模拟并行请求,但这会增加开销。浏览器通过开多个连接来应对高并发,但也会造成资源浪费。


9. HTTPS握手过程,证书如何验证?为什么不用非对称加密通信?

   - HTTPS握手过程
1. 客户端发起SSL/TLS连接请求。
2. 服务器返回公钥证书(包含公钥、签名等信息)。
3. 客户端验证服务器证书的合法性(通过CA根证书)。
4. 客户端生成预主密钥并加密,用服务器的公钥加密后发送给服务器。
5. 服务器使用私钥解密预主密钥,双方生成对称密钥进行加密通信。
- 证书验证:通过检查证书是否由受信任的CA签发,以及证书是否有效。
- 非对称加密通信的局限性:非对称加密速度较慢,因此只用于密钥交换,后续通信使用对称加密。


10. HTTP哪些接口是幂等的?

   - GET、HEAD、PUT、DELETE等方法是幂等的。即多次相同请求对服务器的结果不产生副作用,结果不会改变。


11. Client是如何实现长连接的?HTTP Keep-Alive是什么?如何工作?

   - 长连接:客户端与服务器建立一个TCP连接,连接不会在请求和响应后关闭,而是保持一段时间,后续的请求可以复用这个连接。
- HTTP Keep-Alive:这是HTTP/1.1引入的机制,允许在同一TCP连接中多次发送请求和响应。通过在请求和响应头中加入Connection: keep-alive来保持连接。


12. 介绍一下计算机网络七层模型

   - 应用层:负责网络应用的服务,如HTTP、FTP。
- 表示层:负责数据的编码、加密和压缩。
- 会话层:管理会话建立、维护和终止。
- 传输层:提供端到端的通信控制,如TCP、UDP。
- 网络层:负责数据包的路由与转发,如IP。
- 数据链路层:负责数据帧的传输,如Ethernet。
- 物理层:负责实际的物理连接,如电缆、无线传输。


13. HTTP GET和HEAD区别、GET和POST区别

   - GET与HEADGET请求返回完整的响应数据,HEAD请求只返回响应头,不返回数据体。
- GET与POSTGET请求通过URL传输数据,数据暴露在URL中;POST通过请求体传输数据,更适合传输大量数据。


14. 客户端在建立连接时发现很多connect reset by peer的异常,你觉得问题出在哪?

   可能是服务器端由于负载过高或配置问题,关闭了连接。也可能是网络中间设备(如防火墙)断开了连接。


15. 网络的性能指标有哪些?

   - 延迟:数据从源到目的地的时间。
- 带宽:网络在单位时间内可以传输的数据量。
- 吞吐量:实际的数据传输速率。
- 丢包率:数据在传输过程中丢失的比例。


16. HTTP能不能一次连接多次请求,不等后端返回?

   是的,通过HTTP2.0的多路复用机制,一个连接可以并行处理多个请求和响应,减少延迟。


17. Go中的HTTP包的实现原理

   Go的http包基于标准的HTTP协议栈实现,使用net/http库处理请求和响应。Go的HTTP包支持连接池、持久连接和HTTP2,能够高效地处理并发请求。


这次面试让我深入思考了很多网络通信和协议层的知识,也帮助我进一步了解了如何优化HTTP请求、提升性能以及确保系统的高可用性。