目录
一、TCP协议简述
传输控制协议 TCP
(Transmission Control Protocol
)是面向连接、可靠的传输层协议(传输数据前,必须建立连接)
二、建立连接:三次握手
第一次握手:客户端先向服务器发送一个同步数据包:同步SYN=1,确认ACK=0
第二次握手:
- 服务器收到客户端发送的第一个数据包后,根据
SYN=1
与ACK=0
,判断出为主动建立连接的数据包。 -
若服务器同意连接,发送给客户端一个数据包:同步SYN=1,确认ACK=1进行回应。
第三次握手:客户端收到服务器的确认之后,再给服务器发送一个数据包:同步SYN=0,确认SYN=0,代表双方已同意建立连接,ACK=1,表示收到服务器的确认数据包。
2.1、三次握手的原因
在建立TCP
连接过程中的前两次握手:
①客户端向服务器发出建立连接的请求、
② 服务器向客户端确认这个请求,足以证明客户端与服务器之间的网络是畅通的。
如果没有最后一个数据包确认(第三次握手),假设一个特殊场景:客户端先发出一个建立连接的请求数据包,由于网络原因,客户端在设定的超时时间内,还未收到服务器的确认数据包。于是发出第二个建立连接的请求数据包,这次网路通畅,数据包很快到达服务器,服务器的确认数据包也很快就到达客户端。于是客户端与服务器开始传输数据。但是客户端第一次发出的建立连接的请求数据包到达服务器,服务器以为是再次建立连接,所以又发出一个确认数据包。由于客户端已经收到了一个确认数据包,所以会忽略服务器发来的第二个确认数据包,但是服务器发出确认数据包之后就要一直等待客户端的回复,而此时的客户端永远也不会回复服务器。由此服务器无效等待,造成资源浪费。如果过于频繁会导致服务器停止响应。
所以,三次握手的主要作用是为了避免重复连接,防止旧的重复连接引起连接混乱问题。
另外,通过三次握手,可以得到一个确认的可靠初始化序列号seq
,用于进行可靠性传输。而如果只有2
次握手,则无法初始化序列号seq
。
综上所述,TCP
协议最少需要通过3
次握手建立连接。当然, TCP
连接也通过4
次握手或5
次握手建立连接,实现 TCP
连接的稳定性,但3
次握手是最节省资源的连接方式。
2.2、三次握手建立TCP连接过程的各个状态
- 客户端发出请求建立连接的数据包之后进入
SYN-SENT
状态,表示发送了请求建立连接的同步数据包。 - 服务器收到客户端发出的请求建立连接的数据包之后,结束
LISTEN
状态,进入SYN-RCVD
状态并向A发出确认数据包。 - 客户端收到确认数据包之后,结束
SYN-SENT
状态,进入ESTABLISHED
状态,并向服务器发送确认数据包。 - 服务器收到客户端的确认数据包之后,结束
SYN-RCVD
状态,进入ESTABLISHED
状态。 - 客户端与B都进入
ESTABLISHED
状态之后,开始传输数据,由此完成三次握手。
三、释放连接:四次挥手
第一次挥手:客户端向服务器发送连接释放的请求数据包:终止FIN=1,确认ACK = 0,并停止发送数据。
FIN=1
,意味着客户端要主动释放客户端 —>
服务器的TCP
连接
第二次挥手:服务器收到连接释放的数据包之后,给客户端发送确认数据包:终止FIN=0,确认ACK=1。从客户端到服务器这个方向上的连接就释放了,TCP连接处于半关闭状态。此时客户端无法发送数据给服务器,但是服务器还可以发送数据给客户端,客户端仍可以接收。
第三次挥手:若服务器已经没有向客户端发送的数据了,其应用进程就通知TCP释放连接,并向客户端发送确认数据包:ACK=1,FIN=1。
- 确认
ACK=1
,表示服务器已经把需要发给客户端的数据发完了 - 终止
FIN=1
,表示服务器要释放服务器—>
客户端的TCP
连接;
第四次挥手:客户端收到服务器的连接释放报文段后,向服务器发出确认确认ACK=1,终止FIN = 0。
确认ACK=1
,表示收到服务器的确认报文,并同意服务器释放连接;