-
Http的3次握手:
- 第一次握手:客户端发送一个带SYN的TCP报文到服务器,表示客户端想要和服务器端建立连接。
- 第二次握手:服务器端接收到客户端的请求,返回客户端报文,这个报文带有SYN和ACK确认标示,访问客户端是否准备好。
- 第三次握手:客户端再次响应服务端一个ACK确认,表示我已经准备好了。
那为什么需要三次而不是两次或者四次呢?看图:
三次是最低要求,四次就多余了。还有的说法是说为了防止已失效的连接请求报文段突然又传送到了服务端,
因而产生错误。
-
Http的4次挥手:
- 第一次挥手:TCP发送一个FIN(结束),用来关闭客户端到服务器端的连接。
- 第二次挥手:服务器端收到这个FIN后发回一个ACK确认标示,确认收到。
- 第三次挥手:服务器端发送一个FIN到客户端,服务器端关闭客户端的连接。
- 第四次挥手:客户端发送ACK报文确认,这样关闭完成
断开连接时为什么需要四次呢?
原因很简单,因为TCP是全双工的通信方式,即一方断开连接后,不能
向另一方发送数据,但是此时另一方可以向自己发送数据,所以双方断开连接是独立的,所以需要四次。
更加形象的说法:
建立TCP连接时会发生:三次握手(three-way handshake)
firefox > nginx [SYN] 在么
nginx > firefox [SYN, ACK] 在
firefox > nginx [ACK] 知道了
关闭TCP连接时会发生:四次挥手(four-way handshake)
firefox > nginx [FIN] 我要关闭连接了
nginx > firefox [ACK] 知道了,等我发完包先
nginx > firefox [FIN] 我也关闭连接了
firefox > nginx [ACK] 好的,知道了
几个报文的标识的解释:
SYN: synchronization(同步)
ACK: acknowledgement(确认:告知已收到)
FIN: finish(结束)