TCP连接三次握手、四次挥手过程

94 阅读3分钟

TCP介绍

TCP(Transmission Control Protocol):传输控制协议,是面向连接的、可靠的、基于字节流的传输层通信协议。

面向连接的:数据发送之前,两端必须先建立连接,方法就是我们熟知的三次握手。并且是一对一的,无法像UDP那样一对多。

可靠的:通过多种机制保证数据包的正确传输,如序列号/确认号应答机制、校验和机制、超时重传机制、流量控制、拥塞避免机制等。

基于字节流的:虽然应用程序和TCP的交互是一次一个数据块(大小不等)。但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传输的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次就发一个字节,TCP也可以等待积累有足够多的字节后构成报文段再发出去。

TCP的三次握手

TCP三次握手.webp

第一次握手:客户端向服务端申请建立TCP连接,并向服务端发送SYN报文,作为第一次握手。这个SYN为一个随机数,此处记作A。

第二次握手:服务端接受到SYN报文后,会向客户端再发送一个报文,这个报文中的ACK为A+1,即将ACK标识为收到的SYN数+1。同时会再返回另一个SYN给客户端,此处的SYN记作B。

第三次握手:客户端收到报文后,会将ACK与此前发送出去的SYN进行比对,若ACK满足A+1,则在客户端判断连接已建立。并给服务器发送确认数据包,SYN为A+1,表明已收到上一报文,ACK为B+1,通知服务器建立连接状态。

TCP的四次挥手

TCP四次挥手.webp

第一次挥手:客户端发送FIN报文给服务端,作为第一次挥手。告知服务端,我已经没有数据可以发送了。但是不知道服务端还有没有数据返回,所以仍然保持连接。

第二次挥手:服务端收到FIN报文,再返回一个ACK报文给客户端。告诉客户端我已经知道你没有东西要发送了,但是我不知道我有没有东西要给你。

第三次挥手:服务端确认自己没有报文需要发送给客户端,便发送FIN报文给客户端,告诉客户端我没有报文要发送给你了,你可以终结连接了。但是,此时服务端不确认客户端是否有收到信息,便继续保持连接。

第四次挥手:客户端在收到ACK和FIN后,得知服务器已经知道自己要终结连接了,并且没有东西要返回,便发送ACK报文给服务端,告知服务端我知道了,你终结连接吧。随后客户端便终结连接,服务端收到ACK后,也终结连接。

TCP报文格式

4649132181864639a2725bf8ee5853b1.png