TCP状态转移图

以下主要讲的是TCP从建立到关闭的整个流程图。
SYN:建立链接
FIN:关闭连接
ACK:响应,确认号
PSH:tcp缓存区读取数据
ISN:初始化***
RST:重新建立连接
URG:紧急指针是否有效

TCP状态转移图
1.服务器端运行,socket套接字处于LISTEN状态
2.客户端主动发送SYN,此时变为SYN_SENT状态
3.服务器端收到客户端发送的SYN以后,会给客户端发送自己的SYN和ACK,此时变为SYN_RCVD状态
4.客户端收到服务器端发送的SYN和ACK,发送ACK进行确认
5.服务器收到ACK确认后变为ESTABLISHED
此时三次握手已经完成

1.当服务端或客户端一方想要关闭时,会给对方发送FIN。自己的状态变为FIN_WAIT1
2.对方收到FIN后回复ACK(此时对方变为CLOSE_WAIT) ,发送方状态转为FIN_WAIT2
3.对方程序如果要关闭,就会发送一个FIN,此时发送方收到FIN。变为TIME_WAIT(TIME_WAIT会运行一段时间后消失
4.对方发出FIN后,变为LAST_ACK。
此时四次挥手完成

服务器端的LISTEN:处于监听状态,等待客户端连接
ESTABLISHED:便是客户端和服务端正在进行数据交互,当三次握手成功时ESTABLISHED状态
SYN_SENT:当客户端向服务器端请求链接时进入SYB_SENT状态,不过这个状态很短暂
SYN_RCVD:当服务器接收到来自客户端的同步信号时,将标志位ACK和SYN发送给客户端,此时进入SYN_RCVD状态。如果链接成功变为ESTABLISHED,同样它的状态也会很短暂。

TIMA_WAIT

前面讲到,TIME_WAIT会运行一段时间后消失,这是因为:
1.可靠的终止TCP链接
首先知道,先发起关闭连接的一方才会进入TIME_WAIT状态。在最后确认关闭时服务端没有收到客户端发送的ACK(可能丢失),那么服务器就会重新发送FIN确认,此时客户端收到FIN并重新发送ACK。
2.让迟来的报文可以被识别并被丢弃
假设客户端向服务器端发送的数据因为种种原因没有如期到达,此时就将其连接关闭的话,那么这段报文就会成为僵尸进程。此时TIME_WAIT的作用就是将迟来的报文识别并丢弃。

思考一,TIME_WAIT一般存在两分钟的原因是什么?
1.保证客户端发送的最后一个ACK报文可以安全的到达服务器
2.确保在新的连接中没有旧的报文出现

思考二,为什么是三次握手,四次挥手?
在建立连接时,服务器处于LISTEN状态下,收到SYN的请求后,将SYN和ACK放在一个报文中发送给客户端
而在关闭连接时,当服务器收到了来自客户端的FIN请求后(此时客户端变为FIN_WAIT1状态),只是表示客户端不能发数据,但是还可以接收数据。防止服务器还有没有发完的数据。而当客户端再次发送FIN请求时,才真正关闭。