如何理解tcp的三次握手原理

TCP通信前需要建立连接,英文为“Three-Way Handshake”,直译为“三向的握手”,意译为“三次消息交互的握手” 。这里的“三”不是“三次握手”,而是“三次消息” 。但是不知道是谁发明创造了“TCP三次握手”,在中文互联网上叫“TCP三次握手”越来越多,众口铄金,“三次消息交互的握手”反而没有多少人知晓 。
Three-Way Handshake
TCP建立连接,需要三次消息交互 。只有成功完成了三次消息交互,双方才能在TCP连接上运输字节数据(Byte Stream) 。
既然在建立连接期间,不能运输数据,那么运输的什么呢?
控制信号
与建立连接有关的只有两种控制信号 。

  • Synchronization (缩写为SYN)
  • Acknowledge (缩写为ACK)
每一个控制信号只占据一个二进制位,要么为“0”、要么为“1” 。
如何理解tcp的三次握手原理

Synchronization是干嘛的?
同步信号 , 或者建立连接的意思 。
Acknowledge是干嘛的?
用于确认收到对方的SYN同步(建立连接的意图)信号 。一旦收到对方的“SYN”信号,如果同意建立连接,必须要“ACK”对方 。
第一次消息交互
Alice主动与Bob建立连接,“SYN”信号 = 1 。
第二次消息交互
Bob同意建立连接 , 发“ACK”信号 = 1,用于确认Alice的建立连接请求 。
问题来了,如果Bob只发“ACK”信号 = 1而没有其它,其实只是同意Alice可以单向发数据给Bob , 而Bob却不可以发数据给Alice!
如果Bob也要发数据给Alice,Bob需要像Alice那样发“SYN”信号 = 1,就有了第三次消息交互 。
第三次消息交互
Bob被动与Alice建立连接,“SYN”信号 = 1 。
第四次消息交互
Alice发“ACK”信号 = 1,用于确认Bob的建立连接请求 。
咦 , 怎么变成了四次消息交互,不是说好的三次吗?
大家仔细瞅瞅,第二个消息与第三个消息都是由Bob一前一后发出的 , 为什么不能把这两个信号放在一个消息报文里发出去呢?它们都有自己独立的信号位,又不冲突,何乐而不为呢?
最终的TCP协议标准将这两个报文合二为一,就有了三次消息交互 。
第一次消息交互
Alice发“SYN”= 1 。
第二次消息交互
Bob发“SYN”= 1, “ACK”= 1 。
第三次消息交互
Alice发“ACK”= 1 。
欢迎大家一起参与讨论!
如何理解tcp的三次握手原理

举个例子 。现在有两支红军围住了一支蓝军,在两个山头上面 。蓝军在山谷里边,现在要来进攻蓝军 。现在可能存在问题,就是红军的一方和另外一方必须要同时发起进攻 , 才可能消灭蓝军 , 如果说一方贸然地去发动攻击,蓝军可能就撤出了包围 , 所以现在面临的问题就是这两只红军怎么样能够传递信息 , 然后共同的出击来消灭蓝军的这样一个问题 。一方的红军可能会派出信使,假设它只能经过蓝军的阵地,到另外一端来传递的信息的一种情况 , 也就可以模拟实际的通信过程A是发送方 , B是接收方,中间有一条不可靠的通信电路 。假设已经确定明天早晨六点钟发起进攻,红军的一方假设是A,另外一方是B,现在A要把明天早晨六点钟发起总攻的信息通过信使派出去传递给另外一支红军B , 信使他要通过蓝军的阵地 , 也就是中间的传输过程是不可靠的 。一般考虑问题的时候,先从理想的状况去加以考虑 。假设A派出去的信使,他把信息完整安全的通过了C的阵地,然后传到了另外一支红军B , 说明天早晨发起总攻 。看起来好像这一次通信传输的过程结束了,一方说明天早晨六点钟发起总攻,然后顺利地把信息传到了另外一方B,那么现在就有一个问题,通信过程结束了吗?答案当然是否定的,因为A现在不知道B是不是准确的收到了信息,B收到了信息它也并不能确定信息就是准确可靠的,就是早晨六点钟发起总攻在通信的过程中间,除了信息从一方传递到另外一方,同时双方都要确认信息 。
如何理解tcp的三次握手原理

【如何理解tcp的三次握手原理】
所以先考虑第一种情况,就是A派出去信使,准确无误的把信息送到了B,但是通信并没有结束,也就是说B现在无法确认消息是否准确,另外A也无法确认消息是不是已经准确的到达了B , 所以怎么办?当然大家都知道了 , B可能会在派信使回来,然后要A来确认 。过程中间假设他也是理想的状况,B准确无误的把信息又返回回来了到了A 。到这为止A可以确认我送出去的信息是”明天早晨六点钟发起总攻” , 然后B又派人回来问我是不是”明天早晨六点钟发起总攻”,A现在就可以确认了 , 我送的消息准确无误的已经到了B地方,到这儿通信过程也结束了吗?还是没有,为什么?因为只有A确认了,而B还没有确认,所以A要接着再发确认的信息到B,说我发给你的信息就是”早晨六点钟发起总攻”,你收到的信息是没有问题的 , 当这第三次信息到了B地方 , B就确认了,确实是”明天早上六点钟发起总攻”,他们就准确无误地接收到了信息,可能在第二天早晨六点钟发起总攻,然后来歼灭了一支蓝军 。这就是典型的通信的实例,刚才也提到了 , 发送方接收方中间有一条不可靠的通信的信号,在通信的过程中间不仅要传递信息 , 而且还要有让收发双方要确认他的信息是准确无误的,这也就是通信中著名的三次握手的过程,什么叫握手的过程?也就是发送方和接收方一次交互的过程叫做一次握手 。

经验总结扩展阅读