【基础】三报文握手与四报文挥手详解以及 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 报文会被客户端接受,从而完成连接断开的过程。