如何使用RST来解决TCP断开问题

Linger选项的定义了当socket中还有未发送的数据的情况下,执行了close的动作之后,后续会由什么样的表现。如果开启的Linger选项的情况,close会阻塞直到系统传输万所有的数据,或者到达指定超时时间,执行了close之后,再收到对端的消息的时候,会直接回复RST报文。

实现RST的方式就是通过开启Linger选项,并且超时时间设置为0,这样的话,就能直接丢弃掉没有发送的数据,发出RST报文。

golang版本的代码验证

客户端代码

服务端代码

通过客户端的代码中添加了如下代码

完成设置Linger选项的功能,关于需要转换相应的类型,是因为对应的方法是TCPConn而不是net.Conn的原因。

正常TCP关闭过程

执行结果的抓包数据如下所示

通过报文可以看到,服务端在读取写入数据之后执行了正常的TCP四次挥手的关闭过程。

RST方式关闭过程

执行结果的抓包数据如下所示

通过报文可以看到,服务端在读取写入数据之后直接发送RST的报文终止整个的连接过程。

通过以上的代码实现,以及抓包对报文的分析,可以看到通过Linger选项的设置,能够实现预期的通过RST的方式替代原有的FIN的关闭方式。对于Linger选项在各种实现方式下的不同表现,以及相应的限制,后续会持续的跟进。

RESET TCP and Linger