TCP状态转换图与TIME_WAIT状态


前言


本文主要讲解TCP状态转换图,TCP的三路握手,四次挥手以及半连接,半关闭状态,time_wait状态


提示:以下是本篇文章正文内容,下面案例可供参考

一、TCP状态转换图详解

图片来自

图片引自《Linux高性能服务器编程》。
对于一个TCP状态转移图,我们可以这样来看:
(1)首先假设一个TCP初始为CLOSED关闭状态;
(2)程序打开tcp,服务器进行到LISTEN监听状态,客户端处于SYN_SENT状态;
(3)这时客户端如果发送了一个SYN同步报文,则服务器进入SYN_RCVD状态,这个状态下,服务器要发送一个SYN,ACK报文;
处于这个状态下的TCP连接称为半打开连接,加入客户端不停地发SYN包,因为TCP连接队列有限,就会导致服务器崩溃无法接收新的连接,这也就是我们常说的泛洪攻击。应用端用来解决泛洪攻击的方法最常用的就是增大TCP的backlog。
(4)客户端收到SYN_ACK之后,发送一个ACK报文,如果服务器收到收到客户端ACK,则连接建立,进入到ESTABLISHED状态;
进入到这个状态的TCP连接就称为全连接。
以上就是一个TCP建立连接的过程,总结就是三路握手的过程:客户端发SYN ,服务器回ACK和SYN,客户端收到后回ACK,服务器收到后连接正式建立。

(5)当TCP要关闭时,主动关闭的一端,发FIN,然后进入到FIN_WAIT1状态,如果收到对端发来的ACK,则进入FIN_WAIT2状态,这时如果再收到对端发来的FIN,则进入TIME_WAIT状态,发送ACK,对端如果收到ACK,则连接关闭。
也即使TCP的四次挥手过程:服务器发FIN,客户回ACK,客户发FIN,服务器回ACK(反之也是这样)。
当通信的一段发送结束报文给对方告诉对方本端已完成数据发送时,允许继续接收对端来的数据,直到对方也发送结束报文段关闭连接。这种状态称为半关闭状态
可以看到我们半关闭状态之后还有一个TIME_WAIT状态,为什么会存在这个状态呢。因为我们一端发完FIN,ACK之后,另一端不一定就收到了,假如超时未收到,则需要再次重发,如下图报文段6
在这里插入图片描述
另外一个原因,是为了让一些原连接的包,在网络中消逝,什么意思呢,我们假如没有TIME_WAIT,立马进入关闭状态,然后又立马重新打开一个同样ip,端口的连接,这时原连接中一些由于网络延迟的包,可能会误发到新连接中。一般TIME_WAIT状态要持续2MSL(一般推荐2min),如果在编程时想立即重启服务器,应使用(SO_REUSEADDR选项)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值