我为什么会想到做一款TCP数据包分析工具?

698 阅读6分钟

在基础架构做几年开发,我觉得一个程序员的技术水平,不是代码写的多漂亮决定的,而是解决问题的能力。代码谁都会写,但是遇到问题能否解决,以及能解决多难的问题,就足以衡量一个人的技术能力水平。

解决问题基本上就四大块,一块是业务问题,考验程序员对业务的理解。一块是代码的bug问题,包括使用的框架和中间件,考验程序员对框架和中间件的研究水平。一块是性能方面的问题,考验程序员对操作系统底层和数据结构,甚至是硬件层面等更深的了解。最后一块是网络层面的问题,考验程序员对网络方面问题解决的能力。

其中性能方面和网络方面这两块是最难的,也是一个技术水平的分水岭。

网络方面难在问题不好定位,不像我们使用框架或中间件,能够直接通过堆栈,或者debug或者打日记的方式解决。一个数据包从客户端发往服务端经过的路径越长,其问题的排查难度就越大。涉及CDN、四层与七层流量代理,云原生环境中的网络还更复杂,有时候出现个调用超时你都不知道在哪超时。

但排除cdn和容器网络等更专业的场景,作为开发者,掌握抓包分析足以解决我们遇到的95%的问题,对于剩下的5%至少也能定位到问题的范围。

做了几年中间件研发,我发现没有什么问题是抓包定位不了的,如果有,那就是涉及一些安全问题不给抓。

抓包不是难的,难的是抓包以后如何分析。一些七层协议的分析工具其实对于一些问题很难发现,比如客户端请求服务端一连上就被断开,为什么?可能是七层协议解码失败,服务端就直接断开了。为什么用七层协议抓一个http数据包是不完整的?可能请求头出现两个换行符,七层协议解码就有问题了。为什么http的event会一直卡到最后才一次返回,实现不了ChatGPT的打字效果?因为框架自动开启了gzip压缩。当然还有很多,这些问题直接用七层协议工具分析是很难看出问题的。还是得从四层去分析。而且七层支持的协议也有限。

为什么是TCP协议呢,因为从目前的情况来看,主流的四层协议还是TCP。除非哪天像XQUIC等基于UDP的四层协议流行起来。当然,UDP其实并不难理解,难的就是这种基于UDP的七层协议了。

其实做中间件研发这几年,遇到业务同事提的很多问题,都可以通过抓包去解决。很多时候我也会指导这些同事通过抓包自己去定位问题,这不仅少麻烦别人,也是提升自己的能力。但很多人对抓包这个事情很抗拒,可以是因为陌生。

作为从小白一路走过来的我,当然也知道学习TCP网络协议,以及学习使用Wireshark的上手难度。而且对于我,也算把理论应用在实战中比较多的了,很多开发者都是面试的时候复习一下理论,用到的时候基本都忘了。我之前都对一些标志位记不清。

作为分享几年技术的博主来说,我就想把这个门槛降低,让更多人不要畏惧学习TCP协议,抓包分析其实是件很好玩,也是能解决很多问题的事。

我按如何把一个技术点,写的让不懂的读者能看明白,而不是写给懂的人看的明白的思路去思考。我发现即便网上非常多的文章都在讲TCP协议,但是真的,看多少gif动图,也没有实战来得明明白白!理论与动手实践是有区别的,就像我们学习物理和化学为什么要做实验一样。于是就有了ChatTCP的Idea:把分析TCP数据包变得跟看聊天记录一样简单!不仅解决TCP协议的理解难度,也解决Wireshark的上手难度。

最初是做一个在线工具,一是因为自己对网站前端比较了解,上手快,二是不用安装,更简单,还可以分享。

在线工具宣传一段时间后,我在思考,还能不能再简单呢?于是就有了解说模式,直接给你讲每个数据包怎么理解,手把手,是不是够简单呢?

后来对于一些经典的三次握手和四次挥手,如何理解三次握手没完成会怎样,以及为什么挥手有的是四次,有的看起来只有“三次”,我觉得让新手自己抓包理解是很难模拟出来抓包的。于是就想到了案例库,把这些案例分享出来,拿来就学,不用自己抓包,是不是更爽?

再后来,要是能辅助发现一些问题就更好了。于是就有了诊断功能,不过这个功能能做的事情还是很有限。有待开发打磨!

后来还有更多用户提了更多建议以及需求,这些都会在后续版本做。

那为什么会考虑做离线版本呢?以及离线版本为什么只支持macOS系统。

在线版本上线一段时间后,我收到更多的反馈是,有离线版本吗?确实,太多场景不适合用在线版本了,因为数据包可能存在敏感数据。企业特别注重数据安全这方面。经不住太多人问有没有离线版本。我开始重新思考这个产品的定位。

所以决定做离线版的ChatTCP macOS APP,并且后面重点都在离线版本。

为什么叫ChatTCP呢,Chat是聊天的意思,这个名字很符合产品定位,让TCP数据包分析像看聊天记录一样简单!

为什么只做macOS呢?因为我喜欢用苹果系统,苹果系统也更接近Linux系统。我已经用macOS九年了,在学校就开始使用。

然后我希望产品的体验更好,做原生会好一些,用跨平台的框架还是会有一些限制。毕竟我最早就是做Android和iOS开发的,对原生和H5的体验还是很清楚的。

精力也有限,只能是做macOS版本先了。

我早期自己是比较喜欢这个创意的,所以把以聊天会话分析TCP数据包这种人机交互方式申请了专利。

ChatTCP现在还不完善,还需要更多时间去迭代。也希望能够获取到更多用户的反馈,包括功能、使用体验等,吐槽也欢迎!