1) 【一句话结论】TCP通过三次握手建立全双工连接,四次挥手关闭连接(因全双工需独立确认释放),HTTP1.1采用长连接但无请求复用,HTTP2通过多路复用在同一连接上并发传输多个请求,提升效率。
2) 【原理/概念讲解】
TCP三次握手:
- 客户端发送SYN(同步序列号),标记为1,携带初始序列号seq=x,请求建立连接。
- 服务器收到后,发送SYN+ACK(同步+确认),seq=y,ack=x+1(确认客户端序列号),同意建立连接。
- 客户端收到后,发送ACK(确认),ack=y+1,seq=x+1,完成握手。
类比:两人约会,先打招呼(SYN)→对方回应(SYN+ACK)→再确认(ACK),建立关系。
TCP四次挥手:
- 主动关闭方(如客户端)发送FIN(结束发送),seq=u,表示数据发送完毕,请求关闭连接。
- 被动关闭方(服务器)收到后,发送ACK(确认),ack=u+1,seq=v,ack=x+1(确认客户端的FIN)。
- 服务器处理完数据后,发送FIN(结束发送),seq=w,ack=u+1。
- 客户端收到后,发送ACK(确认),ack=w+1,完成关闭。
类比:两人结束对话,先说“我结束了”(FIN)→对方回应“收到,我确认”(ACK)→对方说“我也结束了”(FIN)→你回应“收到”(ACK),结束关系。
为什么四次?因为TCP是全双工,每个方向(客户端→服务器、服务器→客户端)的连接需独立关闭,每个方向需一个FIN和ACK,故需四次报文。
3) 【对比与适用场景】
| 特性 | HTTP 1.1(连接复用方式) | HTTP 2(连接复用方式) |
|---|
| 连接复用 | 每个请求独立建立长连接(Keep-Alive),无并发请求复用 | 同一个TCP连接上并发传输多个请求(多路复用) |
| 头部压缩 | 无 | 二进制分帧,HPACK头部压缩 |
| 请求优先级 | 无 | 支持请求优先级,提升关键请求响应 |
| 使用场景 | 早期Web应用,简单请求,无高并发 | 高并发、实时应用(如Web应用、API),需要高效传输 |
4) 【示例】
5) 【面试口播版答案】
“TCP三次握手是为了建立全双工连接,过程是客户端发送SYN,服务器回SYN+ACK,客户端再ACK,完成连接。四次挥手是因为TCP全双工,每个方向的连接(客户端到服务器、服务器到客户端)都需要独立关闭,主动方发FIN,被动方ACK,然后被动方发FIN,主动方ACK,共四次。HTTP1.1采用长连接但每个请求独立,而HTTP2通过多路复用,同一连接并发传输多个请求,提升效率,比如HTTP2的流复用让多个请求在同一个TCP连接上同时传输,避免了频繁建立连接的开销。”
6) 【追问清单】
- 问:为什么四次挥手需要四次?
答:因为TCP是全双工,每个方向的连接(客户端→服务器、服务器→客户端)需独立确认释放,每个方向需一个FIN和ACK,所以需四次报文。
- 问:HTTP2如何解决头部重复问题?
答:通过二进制分帧和HPACK头部压缩,减少头部开销,提升传输效率。
- 问:连接复用对HTTP1.1有什么影响?
答:HTTP1.1的长连接(Keep-Alive)减少了连接建立开销,但无并发请求复用,可能导致请求阻塞(如一个慢请求阻塞后续请求)。
- 问:TCP的半关闭状态是什么?
答:当一方发送FIN后,进入半关闭状态,此时仍可接收数据,但不能再发送数据,直到对方也发送FIN。
7) 【常见坑/雷区】
- 坑1:三次握手不是两次,因需确认初始序列号,避免重复连接。
- 坑2:四次挥手顺序错误,如服务器先发FIN,客户端再ACK,再服务器ACK,顺序颠倒。
- 坑3:HTTP1.1的Keep-Alive和HTTP2的连接复用区别,Keep-Alive是长连接,但无多路复用,而HTTP2是同一连接并发传输多个请求。
- 坑4:TCP四次挥手中,FIN和ACK的顺序,主动方先发FIN,被动方回ACK,再被动方发FIN,主动方ACK,顺序不能颠倒。
- 坑5:HTTP2的流复用是否需要依赖TCP连接,是的,HTTP2建立在TCP之上,通过多路复用提升效率。