一文详解TCP的三次握手:为什么偏偏是三次

解答这个问题之前,要先解答为什么需要握手这个操作, 能不能不握手?

如果对比一下 UDP 的通信流程和 TCP 的通信流程, 可以发现, 在 UDP 协议中, 是没有握手这个操作的。

这里就引出了 TCP 与 UDP 的一个基本区别, TCP 是可靠的通信协议, 而 UDP 是不可靠的通信协议。

TCP 为什么可靠? 接收方收到的数据是完整, 有序, 无差错的。

UDP 为什么不可靠? 接收方接收到的数据可能存在部分丢失, 顺序也不一定能保证。

TCP 协议是为了实现可靠传输, 通信双方需要判断自己已经发送的数据包是否都被接收方收到, 如果没收到, 就需要重发,为了实现这个需求, 所以引出序号(sequence ) 和 确认号(ack) 的使用。

如上图为TCP三次握手的过程。

由TCP连接发起方(图中Clinent),发送第一个SYN位置1的TCP报文。初始序列号J为一个随机生成的数字,因为没收到过来自PC2的任何报文,所以确认序列号为无。

接收方(图中Server)接收到合法的SYN报文之后,回复一个SYN和ACK置1的TCP报文。初始序列号K为一个随机生成的数字,同时因为此报文是回复给PC1的报文,所以确认序列号为J+1;

PC1接收到PC2发送的SYN和ACK置位的TCP报文后,回复一个ACK置位的报文确认序列号为K+1。PC2收到之后,TCP双向连接建立。

那么为什么TCP需要三次握手,而非两次?

正如上文所描述的,为了实现可靠传输,发送方和接收方始终需要同步( SYN)序号。 需要注意的是, 序号并不是从 0 开始的, 而是由发送方随机选择的初始序列号 ( Sequence Number, )开始 。 由于 TCP 是一个双向通信协议, 通信双方都有能力发送信息, 并接受响应。 因此, 通信双方都需要随机产生一个初始的序列号, 并且把这个起始值告诉对方。

为了实现可靠的数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认。

猜你喜欢

转载自blog.csdn.net/zhynet000001/article/details/125206068