【基础】三报文握手与四报文挥手详解以及 Q&A

概念

三报文握手:客户端与服务器通过传输三条报文建立连接

四报文挥手:客户端与服务器通过传输四条报文断开连接

标识符说明

先看下图

【基础】三报文握手与四报文挥手详解以及 Q&A

图中的 A1 - B2 表示报文代号(方便后续说明),一个箭头表示一条报文,报文上的标识符依次为:

SYN:表示建立连接标志,发起建立连接请求时,其值为1 ,即 SYN = 1

seq:表示报文序列,连续的报文 seq 值也会连续

ACK:表示确认标志,ACK = 1 即表示收到报文

ack:表示确认编号,其值为接收到报文的 seq + 1

FIN:表示断开连接标志,发起断开连接请求时,其值为 1,即 FIN = 1

详细过程

三报文握手:

1、客户端向服务器发送报文请求建立连接

2、服务器接受报文并向客户端发送确认报文,表示自己已收到客户端发送的请求连接报文

3、客户端收到服务器的确认报文,向客户端发送确认报文(确认自己已收到服务器发来的确认报文),连接建立

四报文挥手:

1、客户端向服务器发送报文请求断开连接

2、服务器接受报文并向客户端发送确认报文,表示自己已收到客户端发送的请求断开报文

3、服务器向客户端发送报文请求断开连接

4、客户端接受报文并向服务器发送确认报文,表示自己已收到服务器发送的请求断开报文

Q&A

Q:图 A 中,客户端发送 A1 请求报文,服务器接受 A1 并发送 B1 确认报文,为什么之后客户端还需要发送 A2 确认报文?

A:这种情况是为了避免 A1 报文发生阻塞等因网络波动导致的问题。若 A1 发生阻塞,服务器就接受不到请求报文,此时客户端会第二次发送 A1 报文,发送成功服务器发送 B1 确认报文,若没有 A2 这一步,则此时会建立连接,后续断开连接,此时第一次阻塞的报文 A1 可能还会再次到达服务器(超时重传机制),然后服务器再次发送 B1 报文,这样就会建立一次不希望得到的连接。在有报文 A2 的情况下,客户端接收到报文 B1 后,若 B1 是因为阻塞的 A1 产生的,则客户端会识别自己之前没有发送建立请求(正常发送的请求已建立并结束,此时客户端会认为自己没有发送建立连接请求),因此避免了不希望得到的连接建立。

 

Q:图 B 中,A1 报文和 B1 报文完成后为什么还没有断开连接,还需要 B2 报文和 A2 报文?

A:首先,请求断开的开的 A1 报文和确认收到请求的 B1 报文这个过程结束后断开的为客户端→服务器的连接,这时服务器 → 客户端的连接仍然存在,且仍会传送信息(服务器的两次报文 B1、B2 的 seq 序列不连续即可说明两次报文中间传送了其他报文),所以需要 B2 报文和 A2 报文这一过程以断开服务器 → 客户端的连接。

 

Q:图 B 中,客户端发送完报文 A2 为什么还需要等待一个 TIME-WAIT 过程?

A:这是因为客户端发送报文 A2 后,报文可能因阻塞等问题没有到达服务器,这时服务器会认为自己的 B2 报文没有发送成功,便会再次向客户端发送,如果没有 TIME-WAIT 过程,客户端因为已经关闭就不会接收到后续的 B2 报文。正是因为TIME-WAIT 过程,才避免了 A2 报文发送失败的情况下服务器再次发送的 B2 报文会被客户端接受,从而完成连接断开的过程。