面试官:如何关闭一个 TCP 连接?

TCP如何关闭连接(详细版) 函数关闭的孤⼉连接,由于⽆法再发送和接收数据,所以这个状态不可以持续太久,⽽tcp_fin_timeout 控制了这个状态下连接的持续时⻓,默认值是。,⾜以让两个⽅向上的数据包都被丢弃,使得原来连接的数据包在⽹络中都⾃然消失,再出现的数据包⼀定都是新建⽴连接所产⽣的。状态,就表示主动⽅的发送通道已经关闭,接下来将等待对⽅发送FIN 报⽂,关闭对⽅的发送通道。,如果接收缓冲区有已接收的数据,则将会被丢弃,并且后续再收到新的数据,会对数据进⾏ ACK。函数的⼀⽅的连接叫做「孤⼉连接」,如果你⽤。 阅读详情

今天聊一个比较轻松的问题:如何关闭一个 TCP 连接?

可能大家第一反应是「杀掉进程」不就行了吗?

是的,这个是最粗暴的方式,杀掉客户端进程和服务端进程影响的范围会有所不同:

  • 在客户端杀掉进程的话,就会发送 FIN 报文,来断开这个客户端进程与服务端建立的所有 TCP 连接,这种方式影响范围只有这个客户端进程所建立的连接,而其他客户端或进程不会受影响。

  • 而在服务端杀掉进程影响就大了,此时所有的 TCP 连接都会被关闭,服务端无法继续提供访问服务。

所以,关闭进程的方式并不可取,最好的方式要精细到关闭某一条 TCP 连接。

有的小伙伴可能会说,伪造一个四元组相同的 RST 报文不就行了?

这个思路很好,「伪造 RST 报文来关闭 TCP 连接」的方式其实有个专业术语叫:TCP 重置攻击。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

from 维基百科

我们的墙,在过滤网站的时候,其实就是这么干的。当然,墙除了 TCP 重置连接的方式外,还有很多方式来过滤网站,比如域名劫持、IP封锁、HTTPS 证书过滤等等。

这次我们只重点关注 TCP 重置技术。

TCP 重置技术

伪造 RST 报文说来简单,但是不要忘了还有个「序列号」的问题,你伪造的 RST 报文的序列号一定能被对方接受吗?

如果 RST 报文的序列号不是对方期望收到的序列号,那么这个 RST 报文则会被对方丢弃,就达不到重置 TCP 连接的效果了。

举个例子,下面这个场景,客户端发送了一个长度为 100 的 TCP 数据报文,服务端收到后响应了 ACK 报文,表示收到了这个 TCP 数据报文。服务端响应的这个 ACK 报文中的确认号(ack = x + 100)就是表明服务端下一次期望收到的序列号是 x + 100。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

所以,要伪造一个有用的 RST 报文,关键是要拿到对方下一次期望收到的序列号。

这里介绍两个关闭一个 TCP 连接的工具:tcpkill 和 killcx。

这两个工具都是通过伪造 RST 报文来关闭指定的 TCP 连接,但是它们拿到正确的序列号的实现方式是不同的。

  • tcpkill 工具是在双方进行 TCP 通信时,拿到对方下一次期望收到的序列号,然后将序列号填充到伪造的 RST 报文,并将其发送给对方,达到关闭 TCP 连接的效果。

  • killcx 工具是主动发送一个 SYN 报文,对方收到后会回复一个携带了正确序列号和确认号的 ACK 报文,这个 ACK 被称之为 Challenge ACK,这时就可以拿到对方下一次期望收到的序列号,然后将序列号填充到伪造的 RST 报文,并将其发送给对方,达到关闭 TCP 连接的效果。

可以看到, 这两个工具在获取对方下一次期望收到的序列号的方式是不同的。

tcpkill 工具属于被动获取,就是在双方进行 TCP 通信的时候,才能获取到正确的序列号,很显然这种方式无法关闭非活跃的 TCP 连接,只能用于关闭活跃的 TCP 连接。因为如果这条 TCP 连接一直没有任何数据传输,则就永远获取不到正确的序列号。

killcx 工具则是属于主动获取,它是主动发送一个 SYN 报文,通过对方回复的 Challenge ACK 来获取正确的序列号,所以这种方式无论 TCP 连接是否活跃,都可以关闭。

接下来,我就用这两个工具做个实验,给大家演示一下,它们是如何关闭一个 TCP 连接的。

tcpkill 工具

在这里, 我用 nc 工具来模拟一个 TCP 服务端,监听 8888 端口。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

模拟一个 TCP 服务端

接着,在客户端机子上,用 nc 工具模拟一个 TCP 客户端,连接我们刚才启动的服务端,并且指定了客户端的端口为 11111。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

客户端连接服务端

这时候, 服务端就可以看到这条 TCP 连接了。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

TCP 连接的四元组信息

注意,我这台服务端的公网 IP 地址是 121.43.173.240,私网 IP 地址是 172.19.11.21,在服务端通过 netstat 命令查看 TCP 连接的时候,则会将服务端的地址显示成私网 IP 地址 。至此,我们前期工作就做好了。

接下来,我们在服务端执行 tcpkill 工具,来关闭这条 TCP 连接,看看会发生什么?

在这里,我指定了要关闭的客户端 IP 为 114.132.166.90 和端口为 11111 的 TCP 连接。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

执行 tcpkill

可以看到,tcpkill 工具阻塞中,没有任何输出,而且此时的 TCP 连接还是存在的,并没有被干掉。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

TCP 连接还存在

为什么 TCP 连接没用被干掉?

因为在执行 tcpkill 工具后,这条 TCP 连接并没有传输任何数据,而 tcpkill 工具是需要拦截双方的 TCP 通信,才能获取到正确的序列号,从而才能伪装出正确的序列号的 RST 报文。

所以,从这里也说明了,tcpkill 工具不适合关闭非活跃的 TCP 连接。

接下来,我们尝试在客户端发送一个数据。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

客户端断开了

可以看到,在发送了「hi」数据后,客户端就断开了,并且错误提示连接被对方关闭了。

此时,服务端已经查看不到刚才那条 TCP 连接了。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

刚才那条 TCP 连接已经不存在

然后,我们在服务端看看 tcpkill 工具输出的信息。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

tcpkill 工具输出的信息

可以看到, tcpkill 工具给服务端和客户端都发送了伪造的 RST 报文,从而达到关闭一条 TCP 连接的效果。

到这里我们知道了, 运行 tcpkill 工具后,只有目标连接有新 TCP 包发送/接收的时候,才能关闭一条 TCP 连接。因此,tcpkill 只适合关闭活跃的 TCP 连接,不适合用来关闭非活跃的 TCP 连接。

上面的实验过程,我也抓了数据包,流程如下:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

最后一个 RST 报文就是 tcpkill 工具伪造的 RST 报文。

killcx 工具

在前面我提到过,killcx 工具则是属于主动获取,它是主动发送一个 SYN 报文,通过对方回复的 Challenge ACK 来获取正确的序列号,然后将这个正确的序列号填充到伪造的 RST 报文,并将 RST 报文发送给对方,达到关闭连接的效果。

可能有的小伙伴听到发送 SYN 报文觉得很奇怪,SYN 报文不是建立 TCP 连接时才发送的吗?为什么都已经建立好的 TCP 连接,还要发送 SYN 报文?

不着急,我先给大家讲讲「已建立连接的TCP,收到 SYN 会发生什么?」

处于 Establish 状态的服务端,如果收到了客户端的 SYN 报文,会回复一个携带了正确序列号和确认号的 ACK 报文,这个 ACK 被称之为 Challenge ACK。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

上图中,服务端针对 SYN 报文响应的 Challenge ACK 报文里的「确认号」,就是服务端下一次期望收到的序列号,Challenge ACK 报文里的「序列号」,就是客户端下一次期望收到的序列号。

killcx 工具正是通过伪造一个四元组相同的 SYN 报文,来拿到“合法”的序列号的!

如果处于 establish 状态的连接,在收到四元组相同的 SYN 报文后,会回复一个 Challenge ACK,这个 ACK 报文里的「确认号」,正好是下一次想要接收的序列号,说白了,就是可以通过这一步拿到对方下一次预期接收的序列号。

然后用这个确认号作为 RST 报文的序列号,发送给对方,此时对方会认为这个 RST 报文里的序列号是合法的,于是就会释放连接!

killcx 的工具使用方式也很简单,如果在服务端执行 killcx 工具,只需指明客户端的 IP 和端口号,如果在客户端执行 killcx 工具,则就指明服务端的 IP 和端口号。



killcx <IP地址>:<端口号>

killcx 工具的工作原理,如下图,下图是在客户端执行 killcx 工具。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

killcx 工具伪造客户端发送 SYN 报文,服务端收到后就会回复一个携带了正确「序列号和确认号」的 ACK 报文(Challenge ACK),然后就可以利用这个 ACK 报文里面的信息,伪造两个 RST 报文:

  • 用 Challenge ACK 里的「确认号」伪造 RST 报文发送给服务端,服务端收到 RST 报文后就会释放连接。

  • 用 Challenge ACK 里的「序列号」伪造 RST 报文发送给客户端,客户端收到 RST 也会释放连接。

正是通过这样的方式,成功将一个 TCP 连接关闭了!

这里给大家贴一个使用 killcx 工具关闭连接的抓包图,大家多看看序列号和确认号的变化。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

总结

要伪造一个能关闭 TCP 连接的 RST 报文,必须同时满足「四元组相同」和「序列号是对方期望的」这两个条件。

今天给大家介绍了两种关闭 TCP 连接的工具:tcpkill 和 killcx 工具。

这两种工具都是通过伪造 RST 报文来关闭 TCP 连接的,但是它们获取「对方下一次期望收到的序列号的方式是不同的,也正因此,造就了这两个工具的应用场景有区别。

  • tcpkill 工具只能用来关闭活跃的 TCP 连接,无法关闭非活跃的 TCP 连接,因为 tcpkill 工具是等双方进行 TCP 通信后,才去获取正确的序列号,如果这条 TCP 连接一直没有任何数据传输,则就永远获取不到正确的序列号。

  • killcx 工具可以用来关闭活跃和非活跃的 TCP 连接,因为 killcx 工具是主动发送 SYN 报文,这时对方就会回复 Challenge ACK ,然后 killcx 工具就能从这个 ACK 获取到正确的序列号。

怎么样,是不是觉得很巧妙!

                                              资源获取:
大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻微信公众号获取联系方式👇🏻👇🏻👇🏻
精彩专栏推荐订阅:下方专栏👇🏻👇🏻👇🏻👇🏻

Yolov5实现道路裂缝检测 Yolov5实现道路裂缝检测 参考代码链接 Github代码链接 基于Pytorch的Yolov5道路裂缝检测程序运行说明。大家可以结合我的说明和原文说明使用,有问题欢迎询问。 文章目录Yolov5实现道路裂缝检测环境要求测试训练自己的数据集1.创建dataset.yaml文件2.创建标签文件3.组织文件路径4.选择模型5.开始训练 环境要求 Python 3.8或之后的版本 还要安装requirements.txt文件中所有依赖包,包括1.7及以上版本的torch $ pip install -r req 阅读详情

相关推荐

【unity游戏开发入门到精通——UGUI】文本控件 —— TextetMeshPro新文本控件(TextMeshPro - Text(UI)和TextMeshPro - Text)

文本组件是UGUI中最常用的组件,它的作用是对文本数据进行处理并显示。UGUI的文本组件可以分两为种——Text旧文本控件、TextMeshPro新文本组件。本文主要是介绍TextMeshPro新文本控件,而TextMeshPro新文本控件又可以分为两种——TextMeshPro - Text(UI)和TextMeshPro - Text。TextMeshPro是Unity收购的一个第三方插件,现在已经自动内置到编辑器中,只要使用一次就会自动导入到工程。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3696

TCP关闭连接

TCP关闭连接

kk的任意门 4898

C# wpf 实现自定义界面操作分离的MessageBox

提供了一个MessageBoxHelper类封装的MessageBox所有操作逻辑,通过泛型使用不同的绑定属性窗口进行显示。操作与界面分离后,方便了界面的灵活设计,在不同的项目只需要定义MessageBox的界面即可,操作逻辑直接使用MessageBoxHelper,减少了造轮子。本资源为文章附加资源,原文链接:https://blog.csdn.net/u013113678/article/details/120922903

网络基础知识(4)——建立与关闭连接

客户端收到确认后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将标志位 ACK 置为 1,ack=K+1, 并将该数据包发送给服务器端,服务器端检查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功, 客户端和服务器端进入 ESTABLISHED 状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。经过三次的互相确认,大家就会认为对方对听的到自己说话,才开始接下来的沟通交流,否则,如果不进行确认,那么你在说话的时候,对方不一定能听到你的声音。

cj_lsk的博客 1363

TCP连接的建立与关闭

心怀敬畏,好好整理学习网络协议的杰作——TCP协议,图源参考链接,文字部分多数来源于《Linux高性能服务器编程》,还有部分参考了链接好文。

Dunzier的博客 674

如何正确关闭TCP连接

如何正确关闭TCP连接 参考自:https://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable 假设我们在两个POSIX兼容操作系统上运行以下两个程序,目的是从程序A发送100万字节来编程B(这里可以在此处找到程序): A: sock = socket(AF_INET, SOCK_STREAM, 0); connect(sock, &remot

专注于C/C++/Linux领域创作 6727

面试官一个 TCP 连接可以发多少个 HTTP 请求

在面试前我花了三个月时间刷了很多大厂面试题,最近做了一个整理并分类,主要内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。HTML5新特性,语义化浏览器的标准模式和怪异模式xhtml和html的区别使用data-的好处meta标签canvasHTML废弃的标签。

m0_57473261的博客 1243

看完这篇TCP,和面试官扯皮就没问题了

上周我投递出了简历,岗位是java后端开发工程师。这周阿里面试官给我进行了面试。面试过程中他问了HTTP与TCP的区别。于是今天结合面试问题先详细讲一讲TCP

1万+

面试官一个 TCP 连接可以发多少个 HTTP 请求?

编程基础的初级开发者,计算机科学专业的学生,以及平时没怎么利用过数据结构与算法的开发人员希望复习这些概念为下次技术面试做准备。或者想学习一些计算机科学的基本概念,以优化代码,提高编程技能。这份笔记都是可以作为参考的。

2401_85147934的博客 1093

动画:用动画给面试官解释 TCP 三次握手过程

作者 | 小鹿 来源 | 公众号:小鹿动画学编程 写在前边 TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐。 对于这部分掌握以及 TCP 的四次挥手,小鹿将会以动画的形式呈现给每个人,这样将复杂的知识简单化,理解起来也容易了很多,尤其对于一个初学者来说。 学习导图 一、TCP 是什么? TCP(Transmissio...

小鹿动画学编程 6万+

连接url后关闭连接_腾讯一面面试官让我关闭连接

接着上一篇的四次挥手后说起,将会为你展示面试官的威武!面试官:你刚才说了四次挥手,主动一方会进入TIME_WAIT状态,那么我问你,你了解半连接是啥不?暖蓝:知道的面试官。因为TCP是全双工通信,意味着客户端和服务端需要都关闭了才能算关闭。举个例子来说,假设此时客户端想断开连接了,意味着不会再给服务端发任何消息,此时服务端自然也收不到任何数据,这并不能说明TCP连接已经完全关闭,因为作为...

weixin_39806603的博客 256

基础连接已经关闭_腾讯一面面试官让我关闭连接

接着上一篇的四次挥手后说起,将会为你展示面试官的威武!面试官:你刚才说了四次挥手,主动一方会进入TIME_WAIT状态,那么我问你,你了解半连接是啥不?暖蓝:知道的面试官。因为TCP是全双工通信,意味着客户端和服务端需要都关闭了才能算关闭。举个例子来说,假设此时客户端想断开连接了,意味着不会再给服务端发任何消息,此时服务端自然也收不到任何数据,这并不能说明TCP连接已经完全关闭,因为作为...

weixin_39913105的博客 199

面试官一个 TCP 连接可以发多少个 HTTP 请求?(1)

小编综合了阿里的面试题做了一份前端面试题PDF文档,里面有面试题的详细解析开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

2401_84437095的博客 919

TCP 建立连接的三次握手,TCP关闭连接的四次握手!!!面试官就那点事

闻道有先后,先者可为达之,后者亦可通之   TCP三次握手与四次握手 最近面试了许多家公司,除了百度外,其它公司淘宝等都会问你TCP三次握手到底是什么,为什么是三次握手而不是四次握手呢? 大家看完了我这篇文章后,相信一定会找到答案了。 1、建立连接协议(三次握手) (1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。 (2) 服务器端回应客户端的,这

计算机全方位学习 1345

疯了疯了!面试官一个 TCP 连接可以发多少个 HTTP 请求?

一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么,大多数回答都是说请求响应之后 DOM 怎么被构建,被绘制出来。但是你有没有想过,收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢? 要搞懂这个问题,我们需要先解决下面五个问题: 现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开? 一个 TCP 连接可以对应几个 HTTP 请求? 一个 TCP 连接中 HTTP

LoveSummer 2624
上一篇: 硬核!互联网资深大佬手码高并发编程速成笔记(2023版)限时开源
下一篇: 好家伙!阿里最新SpringBoot进阶笔记涵盖了SpringBoot所有骚操作
我有一头小花驴
博客等级 码龄6年 2553粉丝 · 2035原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值