详细说明TCP三次握手四次挥手,并解释报文的状态码

132 阅读3分钟

TCP三次握手

网络10.PNG

最初两端的TCP进程都是关闭状态

1、服务器创建传输控制块,用来存储TCP连接的重要信息(TCP连接表、指向发送和接收缓存的指针、指向重传队列和指针、当前发送和接收序号等),然后进入监听状态,等待TCP客户进程的连接请求

2、客户进程创建传输控制块,发送TCP请求报文段,进入同步已发送状态

SYN = 1(这是个TCP连接请求)

seq = x (客户端初始序号) 这里是不允许带数据

3、服务器端发送确认请求报文段,并进入同步已接收状态

SYN = 1 ACK = 1 (这是TCP连接请求确认报文段)

seq = y (服务器端初始序号)

ack =x+1(确认客户端的初始值) 这里是不允许带数据

4、客户端发送已接收的报文段,并进入连接已建立状态

ACK (确认报文段)

seq = x+1 (因为第一个报文段为x)

ack = y+1 (确认服务端的初始序号) 可以携带数据

TCP四次挥手

网络11.PNG

客户端和服务器端都可以释放连接

假设客户端主动释放连接

1、客户端发送TCP释放报文,并进入终止状态1

FIN = 1 ACK = 1 (TCP释放报文)

seq = u (等于TCP客户进程之前传送过的数据的最后一个字节的序号+1)

ack = v (等于TCP客户进程之前收到的最后一个字节的序号+1)

2、服务器端发送普通TCP确认报文段并进入关闭状态

ACK = 1 (确认报文段)

seq = v (等于服务器进程之前传送过的数据的最后一个字节的序号+1) 和ack=v匹配

ack = u+1 (确认客户端释放报文段)

这时客户进程已经停止对服务器进程发送数据,TCP连接属于半关闭状态,但是服务器还可以发数据给客户端。客户进程进入终止等待2状态(等是否要还要接收数据)

3、服务器端发送TCP连接释放报文段,并进入最后确认状态

FIN = 1 ACK = 1 (TCP连接释放报文段)

seq = w (服务器端可能又发送了一些数据)

ack = u+1 (对客户端的释放报文段的重复确认)

4、客户端发送普通确认报文端并进入时间等待状态

ACK = 1 (确认报文)

seq = u+1 (最开始客户端发送的报文seq = u)

ack = w+1 (对接收到的报文段的确认)

服务端接收到以后进入关闭状态,客户端等待2MSL (MSL报文最长寿命,一般2分钟可以更少),再关闭

为什么不直接关闭呢?

因为如果第四次发送,客户端直接关闭,但是丢失报文段了,服务器端发送重发报文段,但是客户端一直不理睬服务端,服务器端就一直发报文,服务器端就无法关闭。

另外2MSL,可以使本次连接时间内产生的所以报文段都从网络中消失,下一个TCP连接不会出现旧的连接报文段。