三次握手
- 客户端发送syn0给服务器。
- 服务器收到syn0,回复syn1,ack(syn0 + 1)。
- 客户端收到syn1,回复ack(syn1 + 1)。
本来握手应该和挥手一样都是需要确认两个方向都能联通的,本来模型应该是:
- 客户端发送syn0给服务器
- 服务器收到syn0,回复ack(syn0+1)
- 服务器发送syn1
- 客户端收到syn1,回复ack(syn1+1)
因为tcp是全双工的,上边的四部确认了数据在两个方向上都是可以正确到达的,但是2,3步没有没有上下的联系,可以将其合并,加快握手效率,所有就变成了3步握手。
四次握手
- 客户端发送syn0给服务器。
- 服务器收到syn0,回复ack(syn0 + 1)。
- 服务器发送syn1。
- 客户端收到syn1,回复ack(syn1 + 1)。
换句话说,以客户端主动断开为例:
- 客户端发送fin
- 服务端收到fin,回复ack,然后服务器去处理其他事
- 服务器事情处理完,回复fin
- 客户端回复ack