理解TCP的握手与挥手

握手

As we know, TCP 相比于 UDP 而言, TCP 提供可靠的连接服务,而它建立一个链接的时候,采用三次握手(three-way handshake),那什么是三次握手呢?

For example:
1. 漆黑的夜里,你在路上散步发现对面有个熟人,你想去聊会天,于是你先向对方打了声招呼.
2. 对方听到了你的招呼声,于是也向你回了一声.
3. 你听到了对方的回应,于是向对方挥挥手致意.

第一次握手,你(client)想和对方(server)说话(connect),于是先和对方打了声招呼(syn=j).
第二次握手,对方听到了你的回应,于是并回了一声,表示自己听到了(ack=j+1, syn=k).
第三次握手,你也听到了对方的回应,知道对方已经认出你了,于是挥手表示自己也听到了.(ack=k+1)

很浅显得道理,但非常有效的连接方式.为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手.

挥手

要知道,一个socket连接是双工的,两端都可以同时收发,相当于一个连接中存在两条管道.因此TCP在关闭连接的时候,需要将两条管道都关闭.

而如何能确保两条管道都安全的关闭呢?

For example:
1. A 和 B已经建立了连接,此时 A 决定要关闭连接了,于是 A 发送一个 FIN,用来关闭 A 到 B 的数据传送.
2. B 收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加 1.和 SYN 一样,一个 FIN 将占用一个序号.
3. B 关闭与 A 的连接,发送一个 FIN 给 A.
4. A 发回 ACK 报文确认,并将确认序号设置为收到序号加 1.

在第一次和第二次挥手的阶段,是 A 要关闭 A 到 B 之间的连接.而第三次和第四次挥手则是 A 到 B 直接的连接已经关闭后, B 决定关闭 B 到 A之间的连接.

这就是TCP的握手与挥手.