哈哈!TCP泄露了操作系统信息···

作者:轩辕之风O

来源: 编程技术宇宙

前言

大家好,我是轩辕。

前几天,我在读者群里提了一个问题:

这一下,大家总算停止了灌水(这群人都不用上班的,天天划水摸鱼),开始讨论起这个问题来。

有的说通过User-Agent可以看,我直接给了一个狗头。

然后发现不对劲,改口说可以通过HTTP响应的Server字段看,比如看到像这种的,那肯定Windows无疑了。

HTTP/1.1 200 OK
Content-Type: text/html
Last-Modified: Fri, 23 Aug 2019 01:02:08 GMT
Accept-Ranges: bytes
ETag: "e65855634e59d51:0"
Server: Microsoft-IIS/8.0
X-Powered-By: ASP.NET
Date: Fri, 23 Jul 2021 06:02:38 GMT
Content-Length: 1375

还有的说可以通过URL路径来判断,如果大小写敏感就是Linux,不敏感就是Windows。

于是我进一步提高了难度,如果连Web服务也没有,只有一个TCP Server呢?

这时又有人说:可以通过ping这个IP,查看ICMP报文中的TTL值,如果是xxx就是xx系统,如果是yyy就是yy系统···(不过有些情况下也不是太准确)

从TCP重传说起

今天想跟大家探讨的是另外一种方法,这个方法的思路来源于前几天被删掉的那篇文章。就是日本网络环境下访问不了极客时间的问题,当时抓包看到的情况是这个图的样子:

看到了服务器后面在不断的尝试重发了吗?当时我就想到了一个问题:

服务器到底会重传好多次呢?

众所周知,TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。

其中,可靠性的一个重要体现就是它的超时重传机制。

TCP的通信中有一个确认机制,我发给你了数据,你得告诉我你收到没,这样双方才能继续通信下去,这个确认机制是通过序列号SEQ和确认号ACK来实现的。

简单来说,当发送方给接收方发送了一个报文,而接收方在规定的时间里没有给出应答,那发送方将认为有必要重发。

那具体最多重发多少次呢?关于这一点,RFC中关于TCP的文档并未明确规定出来,只是给了一些在总超时时间上的参考,这就导致不同的操作系统在实现这一机制的时候可能会有一些差异。于是我进一步想到了另一个问题:

会不会不同操作系统重传次数不一样,这样就能通过这一点来判断操作系统了呢?

然后我翻看了《TCP/IP详解·卷1》,试图在里面寻找答案,果然,这本神书从来没有让我失望过:

这一段说了个什么事情呢?大意是说RFC标准中建议有两个参数R1和R2来控制重传的次数,Linux中,这俩参数可以这样看:

cat /proc/sys/net/ipv4/tcp_retries1
cat /proc/sys/net/ipv4/tcp_retries2

tcp_retries1默认值是3,tcp_retries2默认值是15。

但需要特别注意的是,并不是最多重传3次或者15次,Linux内部有一套算法,这两个值是算法中非常重要的参数,而不是重传次数本身。具体的重传次数还与RTO有关系,具体的算法有兴趣的朋友可以看看这篇文章:聊一聊重传次数http://perthcharles.github.io/2015/09/07/wiki-tcp-retries/

总体来说,在Linux上重传的次数不是一个固定值,而是不同的连接根据tcp_retries2RTO计算出来的一个动态值,不固定。

而在Windows上,也有一个变量来控制重传次数,可以在注册表中设定它:

键值路径:
HKLM\System\CurrentControlSet\Services\Tcpip\Parameters键值名:
TcpMaxDataRetransmissions默认值:5

我手里有一份Windows XP的源码,在实现协议栈的驱动tcpip.sys的部分中,也印证了这个信息:

从注册表中读取键值
没有读到的默认值

不过就目前的信息来看,由于Linux的重传次数是不固定的,还没法用这个重传次数来判断操作系统。

TCP之SYN+ACK的重传

就在我想要放弃的时候,我再一次品读《TCP/IP详解·卷1》中的那段话,发现另一个信息:TCP的重传在建立连接阶段和数据传输阶段是不一样的!

上面说到的重传次数限制,是针对的是TCP连接已经建立完成,在数据传输过程中发生超时重传后的重传次数情况描述。

而在TCP建立连接的过程中,也就是三次握手的过程中,发生超时重传,它的次数限定是有另外一套约定的。

Linux:

在Linux中,另外还有两个参数来限定建立连接阶段的重传次数:

cat /proc/sys/net/ipv4/tcp_syn_retries
cat /proc/sys/net/ipv4/tcp_synack_retries

tcp_syn_retries限定作为客户端的时候发起TCP连接,最多重传SYN的次数,Linux3.10中默认是6,Linux2.6中是5。

tcp_synack_retries限定作为服务端的时候收到SYN后,最多重传SYN+ACK的次数,默认是5

重点来关注这个tcp_synack_retries,它指的就是TCP的三次握手中,服务端回复了第二次握手包,但客户端一直没发来第三次握手包时,服务端会重发的次数。

我们知道正常情况下,TCP的三次握手是这个样子的:

但如果客户端不给服务端发起第三个包,那服务端就会重发它的第二次握手包,情况就会变成下面这样:

所以,这个tcp_synack_retries实际上规定的就是上面这种情况下,服务端会重传SYN+ACK的次数。

为了进一步验证,我使用Python写了一段代码,用来手动发送TCP报文,里面使用的发包库是scapy,这个我之前写过一篇文章介绍它:面向监狱编程,就靠它了!。

下面的这段代码,我向目标IP的指定端口只发送了一个SYN包:

def tcp_syn_test(ip, port):# 第一次握手,发送SYN包# 请求端口和初始序列号随机生成# 使用sr1发送而不用send发送,因为sr1会接收返回的内容ans = sr1(IP(dst=ip) / TCP(dport=port, sport=RandShort(), seq=RandInt(), flags='S'), verbose=False)

用上面这段代码,向一台Linux的服务器发送,抓包来看一下:

实际验证,服务器确实重传了5次SYN+ACK报文。

一台服务器说明不了问题,我又多找了几个,结果都是5次。

再来看一下Linux的源码中关于这个次数的定义:

接下来看一下Windows上的情况。

Windows

前面说过,在注册表HKLM\System\CurrentControlSet\Services\Tcpip\Parameters目录下有一个叫TcpMaxDataRetransmissions的参数可以用来控制数据重传次数,不过那是限定的数据传输阶段的重传次数。

根据MSDN上的介绍,除了这个参数,还有另一个参数用来限制上面SYN+ACK重传的次数,它就是TcpMaxConnectResponseRetransmissions

而且有趣的是,和Linux上的默认值不一样,Windows上的默认值是2。

这就有意思了,通过这一点,就能把Windows和Linux区分开来。

我赶紧用虚拟机中的XP上跑了一个nginx,测试了一下:

果然是2次,随后我又换了一个Windows Server 2008,依旧是2次。

为了进一步验证,我通过注册表把这个值设定成了4:

再来试一下:

重传次数果然变成了4次了。

接下来在手中的Windows XP源码中去印证这个信息:

果然,不管是从实验还是从源码中都得到了同一个结论:

Linux上,SYN+ACK默认重传5次。

Windows上,SYN+ACK默认重传2次。

总结

如果一个IP开启了基于TCP的服务,不管是不是HTTP服务,都可以通过向其发送SYN包,观察其回应来判断对方是一个Linux操作系统还是一个Windows操作系统。

当然,这种方法的局限性还是挺大的。

首先,本文只介绍了一些默认的情况,但TCP的重传次数是可以更改的,如果网络管理员更改了这个数值,判断的结果就不准确了。

其次,对于有些网络服务器开启了防DDoS功能,测试发现,其根本不会重传SYN+ACK包,比如我用百度的IP测试就得到了这样的结果。

最后,没有测试其他操作系统上的情况,比如Unix和MAC OSX,为什么呢?

因此,文中介绍的这种方法只能作为一种辅助手段,仅供参考,大家能顺便了解一些关于TCP重传的知识也是很有意义的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 自定义view控件,Android 自定义View——自定义View控件

Android给我们提供了大量的View控件,但这还是远远满足不了我们的要求,有时候开发所需要的控件形式是在Android提供的控件中是不存在,这就需要我们自己去定义一个。那么如何自定义控件?学习自定义控件,首先要先掌握Canv…

解读容器的 2020:寻找云原生的下一站

简介: “云原生”到底是什么?它就是容器和 Kubernetes 吗?虚拟机是云原生的吗?…… 2020 年注定是不凡的。它在阴霾中开始,在惊叹中结束,也让未来变得更加扑朔迷离。那么,容器与云原生的 2020 年…

如何用好云的弹性

简介: 如何用好云的弹性 1. 弹性为什么这么重要 做好弹性让IT能力轻松跟上用户的业务发展,做到多、快、好、省。 多:选择多,可以全球建站、机型选择也多、配套云服务也多。 快:部署快,自建IDC的建设时长以…

android笔试添加自定义服务,Android之Listview(item为单选题)自定义adapter,像考试时前面的10几道单选题的实现...

用于展现重复性的东西,Listview比较好用,看了别人的自定义Adapter(item是EditText,能够很好地获取到每一个item的EditText值)。又由于在做项目的需要,故特制了一个item包含RadioGroup的Listview的自定义Adapter。主要功能&#xf…

实现工具自由!开源的桌面工具箱

来源: HelloGitHubRubick,因为开源所有更自由在一切开始之前,首先要致敬 uTools!如果没有它就没有 Rubick。大家好,我是“拉比克”(Rubick)项目的作者木偶。我做的 Rubick 是一款基于 Electron 的开源桌面工具箱&#…

测试一年多,上线就崩溃!微服务到底应该怎么测试?

简介: 只有了解风险,才能及时应对,保障服务高可用。 不久前,也就是11月16日,澳大利亚交易所(Australian Securities Exchange, ASX)上线了一个新的交易系统,但因为出现故障而被迫关闭…

阿里云熊鹰:基于融合、协同系统的边缘云原生架构演进和实践

简介: 云原生和边缘计算是近两年都非常火的技术话题了,在第十届云计算标准和应用大会上,阿里云高级技术专家熊鹰分享了《基于融合、协同系统的边缘云原生架构演进和实践》,希望通过介绍现在阿里云在边缘计算和边缘云原生这些技术领…

漫画:什么是 “建造者模式” ?

作者&#xff1a;东风玖哥来源&#xff1a; 程序员小灰————— 第二天 —————————————————首先&#xff0c;我们来定义一个Product类&#xff1a;public class Product {ArrayList<String> parts new ArrayList<String>();public void add(S…

阿里云云效何勉:云原生是“精益实践”的最佳助力

简介&#xff1a; 1月15日&#xff0c;国内知名“精益产品开发”研究和实践者、阿里云云效资深技术专家何勉在阿里云《云计算情报局》线上直播栏目中&#xff0c;分享其对研发新模式的最新思考&#xff0c;提出“下一代精益开发方法”&#xff0c;助力企业在研发效能上提升10倍…

开发效率提升15倍!批流融合实时平台在好未来的应用实践

简介&#xff1a; 本文由好未来资深数据平台工程师毛祥溢分享&#xff0c;主要介绍批流融合在教育行业的实践。内容包括两部分&#xff0c;第一部分是好未来在做实时平台中的几点思考&#xff0c;第二部分主要分享教育行业中特有数据分析场景。 1.背景介绍 好未来介绍 好未来是…

那些公司都配不上我,所以我选择创业

【CSDN 编者按】她&#xff0c;一个89年的农村姑娘&#xff0c;从种蘑菇到卖煤球&#xff0c;再到敲代码做云原生&#xff0c;成为企业创始人&#xff0c;一路走来她都经历了哪些困难与挑战&#xff0c;对于新生代程序员又有哪些建议&#xff1f;让我们一起来看看她是怎么说的。…

如何跑通第一个 SQL 作业

简介&#xff1a; 本文由阿里巴巴技术专家周凯波&#xff08;宝牛&#xff09;分享&#xff0c;主要介绍如何跑通第一个SQL。 一、SQL的基本概念 1.SQL 分类 SQL分为四类&#xff0c;分别是数据查询语言&#xff08;DQL&#xff09;、数据操纵语言&#xff08;DML&#xff09…

云原生DevOps的5步升级路径

简介&#xff1a; 究竟什么是云原生DevOps呢&#xff1f;我们认为&#xff1a;云原生DevOps是充分利用云原生基础设施&#xff0c;基于微服务/无服务架构体系和开源标准&#xff0c;语言和框架无关&#xff0c;具备持续交付和智能自运维能力&#xff0c;从而做到比传统DevOps更…

数据创新的四个陷阱

简介&#xff1a; 数据的重要性在当今已经无需在多言&#xff0c;所有的企业都意识到数据的重要性&#xff0c;都希望利用数据来驱动业务的发展。但是&#xff0c;很多企业信息化管理者依然存在对于数据智能&#xff0c;数据驱动的一些误解&#xff0c;这些误解会让企业的数据利…

Parallels 发布 Desktop 17版本,支持 Windows 11 和 macOS Monterey

Parallels Desktop 17 亮点速揽&#xff1a;性能提升&#xff0c;对图像效果加以改进、增强了 Windows 游戏体验&#xff0c;同时是全球首个在搭载 Apple M1 芯片的 Mac 上运行的 macOS Monterey 虚拟机&#xff0c;带来更为无缝的跨平台工作体验。 编辑 | 宋慧 头图 | Paralle…

如何将实时计算 Flink 与自身环境打通

简介&#xff1a; 如何使用实时计算 Flink 搞定数据处理难题&#xff1f;实时计算 Flink 客训练营产品、技术专家齐上阵&#xff0c;从 Flink的发展、 Flink 的技术原理、应用场景及行业案例&#xff0c;到开源Flink功能介绍和实时计算 Flink 优势详解&#xff0c;现场实操&…

一文知晓浪潮云海OS在SPEC Cloud测试中的调优实践!

日前&#xff0c;SPEC&#xff08;Standard Performance Evaluation Corporation&#xff0c;即国际标准性能评测组织&#xff09;公布了最新 Cloud IaaS 2018 Benchmark 测试成绩&#xff0c;在同规模测试场景下浪潮数据核心产品浪潮云海OS再次刷新世界纪录&#xff0c;性能得…

阿里云 EMR Delta Lake 在流利说数据接入中的架构和实践

简介&#xff1a; 为了消灭数据孤岛&#xff0c;企业往往会把各个组织的数据都接入到数据湖以提供统一的查询或分析。本文将介绍流利说当前数据接入的整个过程&#xff0c;期间遇到的挑战&#xff0c;以及delta在数据接入中产生的价值。 背景 流利说目前的离线计算任务中&…

怎么提升写代码的能力

简介&#xff1a; 对于程序员而言&#xff0c;我始终认为代码是展现能力的关键&#xff0c;一个优秀程序员写的代码&#xff0c;和一个普通程序员写的代码是很容易看出差别的&#xff0c;代码作为程序员的硬实力和名片的展示&#xff0c;怎么提升写代码的能力始终是一个关键的话…

发力LPWAN 升哲打磨数智城市物联网通信之“芯”

8月上旬&#xff0c;随着多项物联网芯片与通信领域技术发明专利证书的下发&#xff0c;升哲科技&#xff08;SENSORO&#xff09;已在低功耗广域物联网&#xff08;LPWAN&#xff09;及相关领域拥有近百项独家专利&#xff0c;突破国外专利封锁实现国产、自主、可控。这些专利技…