The Three Way Handshake Of TCP

Table of Contents

从没想过会有人问我三次握手和四次挥手,我一时也是比较无语。那么这个到底是什么呢?为什么是三次握手,四次挥手呢?这个问题很蠢,蠢到我再也不想回答。我习惯把这个过程解释为「确权」,但它不能简单理解为「确认权利」的缩写。因为它是为了确定或者确认某些事情是否如同双方约定或认为的那样,而不是其他别的什么样。

1 TCP的整个通信过程

tcp-header.png

TCP的整个通信过程,可简单总结为以下三个阶段。

  1. 建立连接
  2. 数据传输
  3. 终止连接

在开始解释之前,我们先认识几个单词。

  • ISN (initial sequence number)初始化序列号
  • AN(acknowledgment number)确认号
  • SYN (synchronize)同步
  • ACK (acknowledge)确认
  • FIN (finish)完成

1.1 建立连接(握手阶段)

  1. 客户端发起建立请求,其中包含一个随机ISN(序列号)并将SYN(同步)flag设置为1。当然还有其他参数。
  2. 服务端收到建立请求后,发出响应。其中包含另一个随机的ISN(序列号)和一个AN(确认号),确认号为客户端发送来的ISN+1而来。同时SYN和ACK的flag设置为1。
  3. 客户端收到服务端的响应后,将发送有一个随机的ISN(序列号)和一个AN(确认号),由服务端发回来的ISN+1而来,并将ACK(确认)设置为1,表示确认。

所以我们可以看到在建立连接的时候,每次都会带一个序列号,它起到了一定的「确权」作用,当然它不是唯一的因素,还有端口号和IP层IP等。

1.2 数据传输(传输阶段)

一旦建立连接,即表明双方都确认了彼此的位置及网络通信是正常的。则HTTP层开始发送请求,响应。

1.3 终止连接(挥手阶段)

  1. 当客户端收到HTTP层的响应数据后,客户端TCP层则会发送ACK(确认)信号。
  2. 服务端收到ACK信号之后,和建立连接时类似,AN(响应号)为ISN+1操作。此时FIN的flag设置为1,ACK的flag设置为1。
  3. 客户端收到ACK/FIN请求后,返回确认FIN/ACK信号。
  4. 服务端收到确认关闭信号FIN/ACK后,发出ACK并关闭连接。

2 场景类比记忆

下面举个例子来帮助你理解三次握手和四次挥手过程。

三次握手(寒暄)

A: 在吗?
B:在的,有事么?
A:嗯。

切入正题(借钱)

A: 最近手头有点紧,能借点钱嘛?
B:可以呀,需要多少?
A:一个亿。
B:OK,转你了,你确认下。

四次挥手

A: 收到了哈。
B:好的,收到了就行,那我先去忙了。
A:好的,去忙吧,再见。
B:再见。

3 值得一读