TCP协议简述
TCP提供面向有连接的通信传输,面向有连接是指传输数据之前必须先建立连接,数据传送完成后要释放连接。
双方发送数据之前都必须在双方建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始建立的,同时由于TCP协议是一种面向连接的,可靠的,基于字节流的运输层通信协议,TCP是全双工模式,所以需要四次挥手关闭连接。
TCP 三次握手建立连接
三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器共发送三个报文。
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确定号,交换TCP窗口大小信息。
第一次握手:
第一次握手由客户端发送资源包给到服务端,若该过程正常,则得出结论:服务端接收、客户端发送服务正常
第二次握手:
第二次握手由服务端发送资源包给到客户端,若该过程正常,则得出结论:服务端发送、客户端接收服务正常
第三次握手:
第一、二次握手只是在单独的过程中得出服务正常的结论,但是在第二次握手结束后,服务端的接收能力和客户端的发送能力未知,这时候便有了 TCP
的第三次握手过程
第三次握手由客户端发送资源包给到服务端,若该过程正常,则得出结论:服务端接收、客户端发送服务正常
为什么需要三次握手?
通过这三次的握手过程我们可以分析得到:第二次是对第一次握手的补充,第三次是对第二次握手的补充,最终正好形成闭环,客户端和服务端都确认了自己的接收、发送能力正常,之后方可进行通信
并且,要完成两者状态的监测,这之间至少需要三次过程,两次并不足以判断自身的服务状态。每一个步骤都相互关联,下一次握手的“响应”由上一次“请求“触发,每次握手得出的结论都是对上一次结果的补充,从而得出最终结果
三次握手过程中,客户端和服务端交换 Initial Sequence Number (ISN
),为了使对方清除下一步接收到的数据信息应以何序列号进行数据整合
并且,ISN 在此过程中是动态生成的。假如 ISN 固定不变,入侵者非常容易就能得出后续数据的确认号,这将会危机到数据信息的安全
TCP 三次握手跟现实生活中的人与人打电话是很类似的:
三次握手:
“喂,你听得到吗?”
“我听得到呀,你听得到我吗?”
“我能听到你,今天 balabala……“
经过三次的互相确认,大家就会认为对方对听的到自己说话,并且愿意下一步沟通,否则,对话就不一定能正常下去了。
TCP 四次挥手关闭连接
四次挥手即关闭TCP连接,就是指断开一个TCP连接时,需要客户端和服务器共发送4个包确定断开连接。(挥手请求可以是客户t端,也可以是服务器端发起的)
第一次挥手
- 客户端发送第一次挥手,之后由
ESTABLISHED
状态转为FIN_WAIT1
状态
第二次挥手
- 服务器收到客户端的第一次挥手之后,发送第二次挥手给服务器,服务器进入
CLOSE_WAIT
状态,等待服务器自身的SOCKET
关闭等处理
第三次挥手
- 客户端收到服务器的第二次挥手,进入
FIN_WAIT2
状态,等待服务器关闭 - 服务器发送第三次挥手,然后进入
LAST_ACK
状态
第四次挥手
- 客户端收到第三次挥手,发送第四次挥手,客户端进入
TIME_WAIT
状态; - 服务器收到第四次挥手,进入
CLOSED
状态,客户端等待 2MSL 后,进入CLOSED
状态
为什么要进行四次挥手
TCP
建立连接的三次握手是指发送了三个报文段,而 TCP
断开连接进行四次挥手是指发送了四个报文段,在此过程中,SYN
和 FIN
均利用重传进行可靠传输
连接的释放本质上两次就可以完成,但若想要完全释放,则需要四次挥手,请看下图
打电话即将结束时,路人甲说完信息“OK,我没事了”后,路人乙回复到“嗯,知道啦”。这是就是完成了 TCP 四次挥手的前两次过程;路人乙马上要挂断电话时,路人甲又忽然想起来某件事,说了很多。这时路人乙又回复到“好的好的”。至此,TCP 四次挥手的后两次过程完毕