Tcp在出现任何异常时候,会采用reset报文“复位”。RST报文的tcp头里RST标志置位。
发送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包强制把连接关了。
举报/反馈

紫金大课堂

79获赞 35粉丝
资深网络从业者,IT技术交流爱好者。
关注
0
0
收藏
分享