单片机tcp异常处理_Tcp的reset报文

Tcp在出现任何异常时候,会采用reset报文“复位”。RST报文的tcp头里RST标志置位。

6c691363ff9bdf17d8491b30f2e463de.png

发送RST报文的场景包括以下几种

1、 请求的tcp端口不存在

2、 协议栈任何异常

Tcp请求的端口不存在

对于udp,如果报文请求一个不存在的端口,将产生一个icmp报文通知端口不可达‘

对于tcp报文,当请求一个不存在的端口,将会rst复位这个链接’

链接出现异常后

正常链接关闭,是通过fin方法“文雅”的方式关闭。Fin关闭所有数据已经发送完毕,没有数据丢失。

使用rst关闭,一般出现异常情况了,这种关闭中途释放链接,称为异常关闭。

Rst关闭链接的特点:

1、 发送RST的一方,将丢弃任何待发送数据,立刻释放链接。

2、 收到RST的链接将进入关闭状态,不会回应任何响应

3、 收到RST后,协议栈通知应用程序api处理。

API 通过 "linger on close" 选项(即 SO_LINGER)提供了这种异常关闭的能力

Tcp状态机里的任何状态收到RST都会关闭,但是Time_wait状态收到RST报文,RFC 1337 提另一种方式,不关心这个RST,避免过早关闭。

协议栈在任何时间,觉得状态不对或者莫名原因下,都会发送rst状态。

比如,以前曾做一个项目,tcp报文被中间代理插入新数据,这样tcp两端发现序列号和ACK对应不起来,经过一番ack确认后,tcp协议栈发现序列号始终是错误的,就会RST复位链接。

半打开状态

半打开连接是指,已经建链的连接,一端重启,对方不知道,这种情况称为半打开

比如工作中telnet场景,上班期间客户端telnet服务器,下班后客户端关机后,如果服务器不和客户端发送数据,服务器将不知道客户端已经关闭。第二天上班客户端重新telnet,那么服务器上将会有很多这种半打开的链接。这种情况,Tcp通过保活机制检测对方是否正常工作。

比如,AB两个协议栈正常建立了链接,A向B发送了FIN包要求关连接,B发送ACK后,这时网络断了,然后A重启了。重启后,网通了后,B又开始发数据包,A收到后就不知道这个(数据的)连接哪来的,A就会发RST包强制把连接关了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值