专栏首页专注网络研发应用层如何强制发送RST即相关内核实现

应用层如何强制发送RST即相关内核实现

前几天群里有个同学问,“如何让应用层强制发送RST中止连接”,而不是通过FIN包的四次交互来关闭连接。当时,我只是凭借以往的经验,猜测使用linger选项可以做到。之所以这么猜测,完全是出于对TCP和linger的理解。

当TCP套接字正常关闭时,close会立刻返回,内核会尽力去保证把未发送的缓存发送出去——注意,是尽力保证,并没有说一定会发出去。使用linger选项时,可以设置一个延时时间。调用close时,不再立刻返回,而是尝试在设置的延时时间内,将数据发送出去。当全部发送成功,或者到达设置的超时时间时,close就会返回。注意,网上很多资料,都说在延时时间内还没有成功发送所有的数据时,close会返回错误,但这些说法网上资料都是错的。实际上不管是否在linger的时间内成功发送了所有数据,close都返回0。

回过头来,先继续咱们的原来话题。linger选项有一个特殊的情况。即开启linger选项,但是超时时间为0,这意味着内核根本不会尝试发送缓存中的数据,而是直接关闭fd。这样的处理,对于TCP来说,实际上是一种异常情况。如果仍然是正常的发送FIN包关闭连接,就等于告诉对端,我所有的数据已经发送完毕,但实际情况则不是。所以,这时就需要使用RST来中断连接,来通知对端发生了异常情况。

下面就看,应用层如何强制发送RST来中止连接的关键代码:

启用linger选项,同时linger的超时时间设置为0。完整的测试代码位于:https://github.com/gfreewind/LinuxDetails/blob/master/networks/7.tcp_send_rst/tcp_send_rst.c。

利用nc监听指定的TCP端口,然后运行测试程序,抓包如下:

可以明显的看到,在关闭TCP套接字时,应用层强制发送了RST中止连接。

任务达成!接下来就要看看内核对于linger的处理。在tcp_close函数中,

如果套接字设置了linger且lingertime值为0,那么就调用disconnect函数,即tcp_disconnect。在这个函数中,

只要tcp_need_reset(old_state)为真,就会调用tcp_send_active_reset来发送RST报文中止连接。而“已连接”的TCP状态是TCPF_ESTABLISHED,就是需要RESET的状态之一。

至此,就已经了解了设置linger选项,强制发送RST的内核实现。还剩下一点:就是开头提到的,内核没有在linger时间内发送完所有数据,会不会返回错误。

这个证据很简单。我们都不用去分析tcp_close,直接看sock_close。

其无不关心具体的套接字的实现,之间返回0。所以对于套接字的fd来说,其close永远返回0——至少到目前的linux最新内核是这样的:D

本文分享自微信公众号 - LinuxerPub(LinuxerPub),作者:glinuxer

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-07-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 细说TCP的MSS选项(1)

    前几天,我厂剑英和晓培同学在定位一个TCP通信失败问题时,发现原因是客户端发送的TCP数据过长(1460字节),导致数据包无法成功发送到服务端。...

    glinuxer
  • TCP的MTU Probe和MSS(1)

    在前面两篇文章中,我们研究了在TCP三次握手时MSS选项的值:一般情况下,都是由出口路由的MTU大小决定:MTU-40。也就是说,TCP在握手阶...

    glinuxer
  • TCP的MTU Probe和MSS(2)

    在上一篇《TCP的MTU Probe和MSS(1)》介绍了TCP使用MTU Probe来避免PMTU变小而导致发送失败的方法。其主要思想是在TC...

    glinuxer
  • 前端工具类项目规范化-使用TS

    TypeScript 是微软开发一款开源的编程语言,本质上是向 JavaScript 增加静态类型系统。它是 JavaScript 的超集,所有现有的 Java...

    腾讯IVWEB团队
  • 细说TCP的MSS选项(1)

    前几天,我厂剑英和晓培同学在定位一个TCP通信失败问题时,发现原因是客户端发送的TCP数据过长(1460字节),导致数据包无法成功发送到服务端。...

    glinuxer
  • 关于STM32代码自动生成的工具的进度....

    首先说一下那几天大家的反应,有的持观望态度,毕竟STM32CUBE很香;有的很激动,期待我快点出东西;还有的很淡定,知道我在挖坑,填坑遥遥无绝期;还有的,希望...

    MCU起航
  • 腾讯分享日干货之腾讯新闻的海量服务

    在2014年4月11日的腾讯分享日活动上,腾讯OMG移动媒体产品部助总郑坚分享了有关腾讯新闻海量服务的一些技术原则。本文根据这次分享内容整理而成。 腾讯很多海量...

    腾讯高校合作
  • 腾讯新闻的海量服务

    在2014年4月11日的腾讯分享日活动上,腾讯OMG移动媒体产品部助总郑坚分享了有关腾讯新闻海量服务的一些技术技术原则。本文根据这次分享内容整理而成。 腾讯很...

    腾讯大讲堂
  • itSeez3D 推出 Avatar SDK:让自拍创建出 3D 虚拟形象

    Avatar SDK 是一项基于智能手机的高级 3D 扫描技术,由美国公司 itSeez3D 研发,可以将用户的单张自拍照转换成逼真的 3D 形象。网页版 Av...

    BestSDK
  • BUG赏金 | Unicode与WAF—XSS WAF绕过

    通过标题,您可能会知道这是有关使用UNICODE进行 XSS WAF绕过的文章。因此,让我们给你一个关于我正在测试的应用程序的小想法。有一个名为“以后保存” 的...

    Timeline Sec

扫码关注云+社区

领取腾讯云代金券