首先,抠个字眼,为什么是三次握手,两个人见面握一次手就够了,连握三次手是很神经病的行为。人家明明叫 three-way handshake
,而不是 three handshakes
三步握手是一次握手分三个步骤进行,而不是一共握三次手。
这里分解下人与人之间的三步握手
A,B两人面对面
- A伸手
- B看到A伸手
B也伸出手 - A手迎接向B手
举一些类似三步握手的例子:收集于知乎
例子1:
背景:老家开往北京的大巴,由于没有车站买票,所以采用直接给大巴司机打电话预定的方式订票。
订票流程是这样子的 (三步握手)
第一步:我们前一天上午先给司机打电话订票;
第二步:司机前一天下午打电话向每一个人确认;
第三步:第二天坐车的时候凭借电话号码上车。
备注:有人说:一次握手就够,上车付钱。这就是UDP了,可能坐不上车
例子2:
A: How are you?
B: I'm fine, thanks,and you?
A: I'm fine too.
例子3:
因为TCP是全双工通信的,三步是通信双方能够互相确认收发条件下的最小握手次数。下面我们详细了解TCP的三步握手过程,此前先简单解释一些名称
TCP序列号(序列码SN,Sequence Number):32位的序列号标识了TCP报文中第一个byte在对应方向的传输中对应的字节序号。当SYN出现,序列码实际上是初始序列码(ISN),而第一个数据字节是ISN+1,单位是byte。
TCP应答号(Acknowledgment Number简称ACK Number或简称为ACK Field):32位的ACK Number标识了报文发送端期望接收的字节序列。如果设置了ACK控制位,这个值表示一个准备接收的包的序列码。
ACK(Acknowledgment):取值1代表Acknowledgment Number字段有效,这是一个确认的TCP包,取值0则不是确认包。
SYN(Synchronize):同步序列编号(Synchronize Sequence Numbers)有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。
FIN(Finish):带有该标志置位的数据包用来结束一个TCP会话,但对应端口仍处于开放状态,准备接收后续数据。当FIN标志有效的时候我们称呼这个包为FIN包。
上图已经说明了三次握手的过程。
第一步
SYN=1 客户端提示服务端记得检查我的序号哦,seq=200我的序号是200,ACK=0 我在问你
第二步
SYN=1 服务端提示客户端记得检查我的序号哦,seq=500我的序号是500,ACK=1 我在回你,收到了,ack=200+1,你的序号是200吧
第三步
客户端再进行一次回复确认,不用SYN 。 ACK=1, 我也回一下你,我也收到了, ack=500+1,你的序号是500吧
然后连接建立
注意:
不要将确认序号ack与应答号(标志位)中的ACK搞混了。这两个一起出现
四步挥手
1、当主机A 没有东西要发送时就要释放 A 这边的连接,A会发送一个报文(没有数据),其中 FIN 设置为1。
2、主机B收到后会给应用程序一个信,这时A那边的连接已经关闭,即A不再发送信息(但仍可接收信息)。
3、A收到B的确认后进入等待状态,等待B请求释放连接, B数据发送完成后就向A请求连接释放,也是用FIN=1 表示, 并且用 ack =100+1(如图)。
4、 A收到后回复一个确认信息,并进入 TIME_WAIT 状态, 等待 2MSL 时间。
为什么要等待呢?
为了这种情况: B向A发送 FIN = 1 的释放连接请求,但这个报文丢失了, A没有接到不会发送确认信息, B 超时会重传,这时A在WAIT_TIME 还能够接收到这个请求,这时再回复一个确认就行了。(A收到 FIN = 1 的请求WAIT_TIME会重新记时)
另外主机B存在一个保活状态,即如果A突然故障死机了,那B那边的连接资源什么时候能释放呢? 就是保活时间到了后,B会发送探测信息, 以决定是否释放连接。
再一个例子
三步握手:
A:“喂,你听得到吗?”A->SYN_SEND
B:“我听得到呀,你听得到我吗?”应答与请求同时发出 B->SYN_RCVD | A->ESTABLISHED
A:“我能听到你,今天balabala……”B->ESTABLISHED
四步挥手:
A:“喂,我不说了。”A->FIN_WAIT1
B:“我知道了。等下,上一句还没说完。Balabala…..”B->CLOSE_WAIT | A->FIN_WAIT2
B:”好了,说完了,我也不说了。”B->LAST_ACK
A:”我知道了。”A->TIME_WAIT | B->CLOSED
A等待2MSL,保证B收到了消息,否则重说一次”我知道了”,A->CLOSED
Ref
TCP的三次握手四次挥手
网络的五层划分,TCP与UDP的区别,TCP的三次握手过程