面试题答案
一键面试应用层协议选择
- HTTP/2:
- 理由:
- 多路复用:它允许在一个连接上同时发送多个请求和响应,避免了HTTP/1.1中的队头阻塞问题,大大提高了并发性能。在高并发场景下,多个用户请求可以更高效地传输,提升用户体验。
- 头部压缩:HTTP/2使用HPACK算法对头部进行压缩,减少了传输的数据量,尤其在数据量较大时,能有效降低网络带宽占用。
- 服务器推送:服务器可以主动向客户端推送资源,减少客户端额外的请求次数,加快页面加载速度,适合频繁请求的场景。
- 理由:
数据传输流程
- 客户端发起请求:
- 客户端构建HTTP/2请求,将用户请求数据封装在请求体中,并设置相关的请求头信息,如目标URL、请求方法等。
- 通过TCP连接将请求发送到服务器。
- 服务器处理请求:
- 服务器接收到请求后,解析HTTP/2请求头和请求体,获取用户请求的具体内容。
- 根据请求处理业务逻辑,生成响应数据。
- 将响应数据封装在HTTP/2响应体中,并设置响应头信息,如状态码、内容类型等。
- 通过TCP连接将响应发送回客户端。
- 客户端处理响应:
- 客户端接收到响应后,解析HTTP/2响应头和响应体,获取服务器返回的数据。
- 根据响应数据进行相应的展示或后续处理。
拥塞解决
- TCP拥塞控制机制:
- 慢启动:在连接建立初期,拥塞窗口(cwnd)初始化为一个较小的值(通常为1个MSS,即最大段长度)。每收到一个确认(ACK),cwnd就增加1个MSS,使数据发送速率逐渐增加。
- 拥塞避免:当cwnd达到慢启动门限(ssthresh)时,进入拥塞避免阶段。此时每收到一个ACK,cwnd增加1/cwnd个MSS,使数据发送速率增长变缓,避免网络拥塞。
- 快速重传和快速恢复:如果连续收到3个重复的ACK,说明可能有数据包丢失,但网络尚未完全拥塞。此时执行快速重传,无需等待超时就重传丢失的数据包,并将ssthresh设置为当前cwnd的一半,cwnd设置为ssthresh + 3个MSS,然后进入拥塞避免阶段,继续发送数据。
- HTTP/2流量控制:
- HTTP/2在每个流上进行流量控制,客户端和服务器都可以设置接收窗口大小(rwnd),通过WINDOW_UPDATE帧来通知对方自己的接收窗口变化。发送方根据接收方的rwnd来控制数据发送速率,避免接收方缓冲区溢出,从而间接缓解网络拥塞。
可靠性问题解决
- TCP可靠性保证:
- 校验和:TCP在发送数据时会计算校验和,并将其放入TCP首部。接收方收到数据后,重新计算校验和并与首部中的校验和进行比较,若不一致则丢弃该数据包,确保数据在传输过程中没有损坏。
- 序列号和确认机制:每个TCP数据包都有一个序列号,接收方通过确认(ACK)机制告知发送方已成功接收的数据。发送方根据ACK确认号和序列号来判断哪些数据需要重传,保证数据的有序到达和不丢失。
- HTTP/2可靠性增强:
- 错误处理:HTTP/2定义了一系列错误码,当发生错误时,服务器或客户端可以通过发送RST_STREAM帧来终止一个流,并在帧中携带错误码,告知对方错误原因,便于进行错误排查和处理,保证数据传输的可靠性。