1 三次握手
三次握手的主要目的时建立一个TCP连接,过程中需要客户端和服务器总共发生三个包,进行三次握手的目的是为了确认双方的通信能力和发送能力是否正常,并指定初始化序列号,为后面传输的可靠性做准备。
上图太过抽象,可以形象的理解为:
为什么要三次握手呢?
若只客户端发送一次报文(一次握手),客户端对服务器说话,但客户端不知道服务器收没收到。
若只有前两次报文(两次握手),客户端知道了服务器已经收到了信息,但是服务器还不知道客户端有没有收到自己的反馈。
第一次握手可以让服务器知道客户端有发送能力而自己有接收能力。第二次握手能让客户端知道服务器有接收能力和发送能力。第三次握手能让服务器知道客户端有接收能力而自己有发送能力。
综上,三次握手之后,双方都知道了对方和自己有发送能力和接收能力。
2 四次挥手
建立一个连接需要三次握手,而终止一个连接要经过四次挥手。这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。图中FIN=1就是一个关闭连接请求。
TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务器均可主动发起挥手动作。
通俗图:
为什么要四次挥手呢,二三次能不能合并?
因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。
第三次握手如果丢失,则服务器不会收到第四次握手,会有间隔的发送第三次握手的信息。第四次握手如果丢失,那客户端还会收到第三次握手,则继续发送第四次握手。
番外:
TCP由于上述交互机制,所以是可靠的。而可靠的传输服务是指, 能够把数据准确可靠地传给对方。 即TCP 协议为了更容易传送大数据才把数据分割, 而且 TCP 协议能够确认数据最终是否送达到对方。
UDP协议是不可靠的,UDP协议并不管这个发送任务能否成功,它将这个发送的结果抛给上层传输层处理了。数据包在传输时经常要做一个拆分,如下图所示,拆分发送给服务器,再由服务器做一个汇总,这个过程中由于在复杂的网络环境中,网络拥塞,负载过高等经常发生,IP分组发送失败也是每时每刻都在发生的。所以有可能会丢包。
本文部分参考:
[1] https://zhuanlan.zhihu.com/p/86426969
[2] https://www.bilibili.com/video/BV1Ff4y147WP?t=1135&p=306