关注
鸿蒙技术社区
,回复
【鸿蒙】
送
价值
399元
的鸿蒙
开发板套件
(数量有限,先到先得)
,还可以
免费下载
鸿蒙
入门资料
!
👇
点击
立刻关注
👇
专注开源技术,共建鸿蒙生态
我是一个网络监控软件,我被开发出来的使命就是监控网络中进进出出的所有通信流量。
图片来自 Pexels
这个网络中所有人的上网内容我都看的清清楚楚,是不是很可怕?
我被一家公司老板买来运行在一个配置极高的 Linux 服务器上,这台服务器上的网卡可不得了,公司进出的网络数据包都得流经它,它源源不断的把数据包抓上来交给我来分析。
你们应该也知道,网络通信是分层的,最常见的就是那个 TCP/IP 协议体系了。
拿到数据包后,我就得按照这个协议规范,一层层的脱去协议的外壳,拿到它们的负载数据。
我重点要照顾的是 TCP 协议,因为好多应用都要使用 TCP 来传输,像上网冲浪 HTTP、发邮件 SMTP、微信聊天等等。
我想要掌控网络中的通信,第一个就要拿 TCP 开刀,得想办法把 TCP 传输的一个个数据包给重组起来,形成一个完整的会话,这样我才好知道应用层传了什么东西,这个步骤叫做会话重组。
不过这个 TCP 协议有点复杂,抛开我们抓到的包本来就存在乱序的情况不说,它本身还有三次握手、四次挥手、超时重传、延迟回复等很多机制。
有时候还会遇到时间跨度很久的长连接,这无疑都给我想要重组 TCP 会话造成了很大的难度。
而我重组 TCP 会话的唯一线索就是数据包包头中的序列号 SEQ 和确认号 ACK。
不过我还是死磕 RFC 规范,把这些问题都攻克了,能够成功重组出一个个的 TCP 会话数据,成功率还蛮高的。
TCP 会话重组出来了,我就可以拿到里面传输的数据了。接下来要做的一件事就是识别应用层到底是什么应用在传输的呢?
用我们的行话说,那就是做应用协议识别,这个时候我就得看一下端口了。
我根据三次握手数据包的方向,就可以确定出谁是客户端,谁是服务端。
再看一下服务端的端口号(这个在 TCP 包头里面就可以看到),就能知道这是一个什么服务了。
像常见的有下面这些:
-
22:
SSH 远程登陆
-
25:
邮件服务
-
53:
域名解析服务
-
80:
HTTP Web 服务
-
3306:
MySQL 数据库服务
-
3389:
远程桌面连接服务
-
······
最常见的就是 80 端口的 Web 服务了,人类每天上网都在用到。
有时候 Web 服务不走 80 端口,换成了别的,不过这难不倒我,我可以通过分析 TCP 的负载数据特征,看看有没有 HTTP 协议的特征出现,因为 HTTP 协议的特征实在是太明显啦!
到了后来,根据端口的经验出错的概率越来越大了,我就统一根据内容来进行识别判断,不再相信端口。
每个应用都有它们各自的协议特征,这个识别我可是下了点功夫,轻易不会透露。