TCP 状态转移机

TCP协议可靠传输协议,它的可靠性是有它的面向连接的性质所决定,在TCP连接与断开的时候会出现不同的状态,各种状态之间的存在相互转换,因此便有了状态转移机这个概念,下图就是TCP连接的11种状态之间的转换图
图片来自网络
注意在TCP连接过程中没有固定的客户端与服务端的概念,是一个相对的存在,两者可交换身份,服务端可作为发起者,也可作为接受者,客户端同理。

服务端:
1. 客户端主动断开连接:
首先服务端应用进程打开断开处于listen状态,如下图所示服务端的状态从CLOSED–>LISTEN服务端的状态从CLOSED-->LISTEN
在接收到客户端发送的请求后也就是说收到了第一个SYN后进入SYN收到状态,在收到从客户端发送的ACK后进入ESTABLISHED状态,说明连接已经建立,可进行数据交互。交互完成后收到客户端发送的FIN并发送ACK同时进入CLOSE_WAIT状态,在自己的交互完成后向客户端发送FIN并进入LAST_ACK状态,在收到客户端的ACK后进入CLOSED状态等待下一次连接。
2. 服务端主动断开连接:
当服务端主动发送FIN并进入FIN_WAIT1状态 ,接下来分3中情况转移:
1.收到ACK后进如FIN_WAIT2状态,收到FIN并发送ACK进入TIME_WAIT状态等待2MSL超时后进入CLOSED状态。
2.收到FIN和ACK并发送ACK,状态转移到TIME_WAIT状态,等待2MSL超时后进入CLOSED状态。
3.收到FIN并发送ACK,先转移到CLOSING状态,之后收到ACK后进入TIME_WAIT状态,等待2MSL超时后进入CLOSED状态。

客户端:
客户端主动发送FIN进入SYN_SEND状态,在没收到来自服务端的ACK时会超时关闭进程也就是进入初始状态,可以认为是CLOSED状态
当收到来自对端的SYN后进入ESTABLISHED状态,表示连接已经建立,其他的状态转移方式与服务端相同。

在上文中有一个特殊的状态为TIME_WAIT状态,此状态是一个很重要的状态。为什么会存在呢,一个重要的原因就是防止回给对方FIN的ACK丢失。由于服务端并不会对该ACK做确认,因此只能等待一段时间寄希望于服务端收到,如果服务端没有收到对其FIN的确认会继续发一个FIN,这样客户端还有机会继续回一个ACK。另外一个原因是防止上一次连接中迟到的数据包影响新的连接,而在TIME_WAIT状态中这些包会被丢弃。但是这种状态的存在容易被攻击,攻击者发送大量请求,使其进入time_wait状态,拒绝服务正常的连接,从而导致服务器进入瘫痪模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值