讲解 TCP 三次握手和四次握手之前,我们先了解一下 TCP 和 UDP 这两个重量级的传输层协议。
用户数据报协议 UDP(User Datagram Protocol):
- UDP 在传送数据之前不需要先建立连接,远程主机在收到 UDP 报文后,不需要给出任何确认。
- UPD是面向报文的,没有拥塞控制,所以速度快,适合即时通信,比如: QQ 语音、 QQ 视频 、直播(一对一、一对多、多对一、多对多)等等
传输控制协议 TCP(Transmission Control Protocol):
- TCP 提供面向连接的一对一的可靠性传播的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。
- TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。
- TCP通过以下方式提供可靠性:(1. 超时重发,发出的报文段如果没有收到及时的确认,会重发;2. 数据包的校验,校验首部数据和;3. 对失序的数据进行重新排序;4. 进行流量控制,防止缓存区的溢出;5. 快重传和快恢复;6. TCP会将数据截取为合理长度)
三次握手,四次挥手
三次握手
进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常,并指定自己的初始化序列号(Init Sequense Number, ISN
)为后面的可靠性传输做准备。
图中字符串的含义:
-
SYN
:连接请求/接收 报文段 -
seq
:发送的第一个字节的序号 -
ACK
:确认报文段 -
ack
:确认号。希望收到的下一个数据的第一个字节的序号
三次握手过程:
1)第一次握手:客户端向服务端发送一个 SYN 报文(SYN = 1),并指明客户端的初始化序列号 ISN(x),即图中的 seq = x,表示本报文段所发送的数据的第一个字节的序号。此时客户端处于 SYN_Send
状态。
SYN-SENT
:在发送连接请求后等待匹配的连接请求
2)第二次握手:服务器收到客户端的 SYN 报文之后,会发送 SYN 报文作为应答(SYN = 1),并且指定自己的初始化序列号 ISN(y),即图中的 seq = y。同时会把客户端的 ISN + 1 作为确认号 ack 的值,表示已经收到了客户端发来的的 SYN 报文,希望收到的下一个数据的第一个字节的序号是 x + 1,此时服务器处于 SYN_REVD
的状态。
SYN-RECEIVED
:在收到和发送一个连接请求后等待对连接请求的确认
3)第三次握手:客户端收到服务器端响应的 SYN 报文之后,会发送一个 ACK 报文,也是一样把服务器的 ISN + 1 作为 ack 的值,表示已经收到了服务端发来的的 SYN 报文,希望收到的下一个数据的第一个字节的序号是 y + 1,并指明此时客户端的序列号 seq = x + 1(初始为 seq = x,所以第二个报文段要 +1),此时客户端处于 Establised
状态。
服务器收到 ACK 报文之后,也处于 Establised
状态,至此,双方建立起了 TCP 连接。
ESTABLISHED
:代表一个打开的连接,数据可以传送给用户
通俗点讲,只有经过三次握手才能确认双发的收发功能都正常,缺一不可:
- 第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
- 第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。
- 第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力,服务端的发送、接收能力是正常的。
四次挥手
图中字符串的含义:
-
FIN
:连接终止位
刚开始双方都处于 ESTABLISHED
状态,假设是客户端先发起关闭请求。四次挥手的过程如下:
1)第一次挥手:客户端发送一个 FIN 报文(请求连接终止:FIN = 1),报文中会指定一个序列号 seq = u。并停止再发送数据,主动关闭 TCP 连接。
2)第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了。
此时的 TCP 处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认,等待服务端发出的连接释放报文段。
3)第三次挥手:如果服务端也想断开连接了(没有要向客户端发出的数据),和客户端的第一次挥手一样,发送 FIN 报文,且指定一个序列号。
4)第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答(ack = w+1),且把服务端的序列值 +1 作为自己 ACK 报文的序号值(seq=u+1)。
参考文档:
https://zhuanlan.zhihu.com/p/53374516
https://segmentfault.com/a/1190000039165592