TCP三次握手
最初两端的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四次挥手
客户端和服务器端都可以释放连接
假设客户端主动释放连接
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连接不会出现旧的连接报文段。