TCP建立连接与断开连接的过程

在CS模式的TCP连接建立过程中,客户端与服务器端流程如下:

客户端流程:发送请求->接收服务器端确认->发送对服务器端确认的确认。

服务器端流程:接收客户端的连接建立请求->发送确认->接收客户端发送的对确认的确认。
在这里插入图片描述
1、刚开始客户端和服务端都处于CLOSED状态,服务端开始监听某个端口,进入LISTEN状态。

2、客户端发送连接请求报文,其中包含SYN=1,ACK=0,初始序列号x,进入SYN-SENT状态。

3、服务器端接受请求报文后,向客户端发送确认报文,其中包含SYN=1,ACK=1,确认号x+1,自己的初始序列号y,之后服务器会进入SYN-RCVD状态。

4、客户端收到 服务器端的确认报文后,会发送一个确认报文给服务器,表明已经接收到服务器发送的确认报文。该报文中包含ACK=1,确认号y+1,序列号x+1。同时客户端会进入ESTABLISHED状态。

5、服务器收到上述报文后会进入ESTABLISHED状态。此时客户端与服务器的TCP连接建立完成。

为什么TCP连接不是两次握手?即为什么客户端最后会向服务器发送确认报文。

1:假设只有两次握手,客户端发出了一个连接请求报文A。但是由于网络原因,A并未及时到达服务器。之后客户端发送了连接请求报文B,并到达了服务器,随后双方建立连接,传输数据,最后断开连接。此时客户端进入CLOSED状态,服务器进入LISTEN状态。随后A报文到达服务器,由于服务器处于LISTEN状态,故服务器向客户端发送确认报文后进入ESTABLISHED状态并等待客户端发送数据。但是客户端此时处于CLOSED状态。收到服务器的确认报文后会丢弃该报文。服务器一直等待客户端传输数据,会造成副武器的资源浪费。

2:TCP的可靠传输要求通信双方判断自己发送的数据是否被接收到。TCP依靠的就是TCP报文中的序号和确认号。因此当TCP连接建立时双方均需要确认对方的初始序列号。而第三次握手则是客户端对服务器端的初始序列号的确认。因此第三次握手是必须的,否则无法保证服务器端到客户端的可靠传输。

为什么TCP连接不是4次握手?

三次握手已经能够证明客户端与服务器端之间的信道是可用的。再增加一次握手无非就是增加一点信道的可靠性,但是无论多少次握手都无法使信道100%可靠,因此也没有必要增加一次握手。

TCP断开连接的过程
在这里插入图片描述
1、客户端停止发送数据并发送连接释放请求报文,报文含有FIN=1,seq=u,并且进入FIN-WAIT-1状态。

2、服务器端接收到该报文后,返回一个连接释放确认报文。包含ACK=1,seq=v,ack=u+1,并进入CLOSE-WAIT状态,此状态下服务器端可能还会向客户端发送数据。

3、客户端收到确认报文后,进入FIN-WAIT-2状态,等待服务器发送连接释放请求报文,并接收服务器端可能发送的数据。

4、服务器端发送完所有数据之后,会发送连接请求释放报文。报文包含FIN=1,ACK=1,seq=w,ack=u+1,。之后服务器进入LAST-WAIT状态,等待客户端发来的连接释放确认报文。

5、客户端收到服务器的连接释放报文后,返回,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态,TCP连接此时未释放,因为不确定服务器端是否还有数据没有到达客户端。因此必须经过2MSL(最大报文生存时间)后,才进入CLOSED状态。
6、服务器只要收到了客户端发出的连接释放确认报文,立即进入CLOSED状态。
HTTP1.0和HTTP1.1和HTTP2.0的区别

猜你喜欢

转载自blog.csdn.net/qq_43248623/article/details/114685646