当前位置: 首页 >  信息化服务 >  解决网络协议服务器问题的关键:定位能力与抓包技术

解决网络协议服务器问题的关键:定位能力与抓包技术

导读:本文分享自华为云社区《提升网络协议服务器的定位能力》,作者:张俭。.近期,我再次涉足于协议服务器相关的工作领域,致力于定位并解决各种问题。简单总结一些心得给大家。如果想要定位出协议服务器的问题,那么这些能力可能至关重要。.注:我这里比较偏向协议本身的问题,不涉及一些通用的网络问题

本文分享自华为云社区《提升网络协议服务器的定位能力》,作者:张俭。

近期,我再次涉足于协议服务器相关的工作领域,致力于定位并解决各种问题。简单总结一些心得给大家。如果想要定位出协议服务器的问题,那么这些能力可能至关重要。

注:我这里比较偏向协议本身的问题,不涉及一些通用的网络问题(如网络吞吐量上不去、响应时间长等等)

对CPU和内存的通用分析能力

首先,网络协议服务器本质上也是一个应用程序。因此,需要具备一些关于CPU和内存的通用分析能力。PU/内存火焰图,内存dump分析,锁分析,以及远程调试(研发态手段)这些手段都要具备

日志和网络连接的关联

为了有效地定位网络问题,日志需要精确到毫秒级别。没有毫秒级别的精度,定位网络问题就会变得极其困难。所以golang的logrus默认只有秒级别,我觉得不太好,用rfc3339就很好。

在打印日志时,我们不能太过随意。例如,“connection lost”这样的日志,在调试阶段可能看似无大碍,但当真正的业务量和连接数大幅增加时,这种模糊的日志信息就会让人束手无策。

理想的日志至少应包含网络地址信息,这样我们可以根据网络地址和时间点来查阅日志。如果有抓包的话,那就更好了,可以从中获取大量信息。

当然,我们并不需要在所有的日志中都包含网络地址信息。例如,一旦完成了用户身份的鉴定,我们就可以打印用户的身份信息,这样更方便与后续的业务流程进行整合。如果需要查询网络地址信息,可以回溯到建立连接时的日志。举个🌰

2023-05-30 23:59:01.000 [INFO] 127.0.0.1:62345 connected
2023-05-30 23:59:02.000 [INFO] 127.0.0.1:62345 authed, username is Wolverine
2023-05-30 23:59:03.000 [INFO] Wolverine killed magneto

假设一条数据链上有大量的消息呢?在现代的网络环境中,一条TCP链接可以轻易达到5M bit/s以上的数据流。即使我们提供了时间点信息,仍然很难找到具有问题的报文(在同一秒内可能有上千条报文)。在这种情况下,就需要引入会话的ID信息。许多TCP协议会携带这种信息,换句话说,支持IO复用的协议都会有这种信息(比如MQTT的messageId,Kafka的correlationId等)。此类信息应该被正确地打印在日志中。

针对特征值的跟踪能力

你可能已经在调试日志中包含了非常详尽的信息,然而在实际环境中,这可能并没有太大用处。

原因是一旦全面开启debug日志,性能消耗会大幅增加。除非你的系统性能冗余极大,否则根本无法正常运行。

为此,我们可以提升debug的能力,针对特定的特征值开启debug,例如网络地址、mqtt的clientId、消息中间件的topic等。应用程序仅针对这些特征值打印详细的日志,这样的开销就相对较小,而且这种方法已经在生产环境中被我多次验证。

将网络报文与业务trace关联起来

在网络协议服务器中,我们需要将网络报文与业务trace关联起来。这种关联能力的实现可以大大提高我们定位业务端到端问题的效率和准确性。 理想情况下,我们应该能够根据网络报文来查找相关的业务trace,反之亦然,根据业务trace来查找对应的网络报文。但这些手段都需要业务端的配合,比如在报文中携带traceId,或者在业务trace中携带网络地址信息。

以mqtt协议为例,可以在payload中带上

{
    "traceId": "xxxx",
    "data": "xxxx"
}

在这个例子中,traceId就是我们为业务trace设定的唯一标识符,而data则是实际的业务数据。通过在网络报文中携带这些信息,我们就可以轻松地将网络报文与其对应的业务trace关联起来。

然而,这种方法在研发和测试环境中实现相对容易,但在生产环境中可能会遇到更多的困难。首先,对于在网络报文中携带traceId这一做法,业界并未形成统一的规范和实践。这导致在生产环境,极难做到。

更具挑战性的是,如果你面对的是一个端到端的复杂系统,将traceId从系统的入口传递到出口可能会遇到许多难以预见的问题。例如系统不支持这类数据的专递,这就封死了这条路。

查看原始报文的能力

查看原始报文的能力极其重要,特别是在协议栈的实现尚不成熟的情况下。如果无法查看原始报文,定位问题就会变得非常困难。我曾说过:“如果拿到了原始报文,还是无法复现问题,那我们的研发能力在哪里?”虽然这句话可能有些极端,但它准确地强调了抓包的重要性。

我们可以从抓包看出网络的连通性、网络的延迟、网络的吞吐量、报文的格式、报文的正确性等等。如果途径了多个网元,那么是谁的错?(一般来说,看抓包,谁先发RST,就从谁身上找原因)

虽然抓包的命令比较简单

tcpdump port 8080 -i eth0 -s0 -w my.pcap

就抓了,但实际想做成,最大的阻力是这两个,TLS和复杂的现网环境

在旧版本的TLS密钥交换算法下,只要有私钥和密码,就可以顺利解包,但现在的tls,都支持前向加密,什么叫前向加密呢?简单地来说,就是给你私钥和密码,你也解不出来。有tls debuginfo和ebpf能解决这两个问题,tls debug- info的原理是将密钥交换时的密钥输出持久化到某个地方,然后拿这个去解,实际很少见有人用这个方案。ebpf一需要linux内核高版本,同时还需要开启功能,安装kernel- debug-info,门槛也比较高。

现网环境,像抓包嗅探的这种工具,有时候可能是禁止上传的,或者即使能上传成功,也需要很长的时间。

也许我们可以通过“应用层抓包”来解决上述的问题,在网络层,我们支持受限的抓包能力,比如可以抓针对某个特征值(比如网络地址、messageId)的包,因为我们在应用层,可使用的过滤条件更多,更精细,输出到某个路径,这个报文的组装,完全在应用网络层,虽然看不到物理层的一些信息,但对于应用程序来说,除非我是做nat设备的,一般用不到这些信息。继续用这个报文来分析问题。实现应用层抓包,也要注意对内存的占用等等,不能因为这个功能,把整个进程搞崩溃。

应用层抓包的一些思考

抓包地点的选择

在应用层抓包,第一步就是确定抓包的地点。由于我们是在应用层进行操作,因此抓包地点一般位于应用程序与网络协议栈的交接处。例如,你可以在数据包刚被应用接收,还未被处理之前进行抓包,或者在数据包即将被应用发送出去,还未进入网络协议栈之前进行抓包。

过滤条件的设定

设定过滤条件是抓包的关键,因为在实际环境中,数据流量可能非常大,如果没有过滤条件,抓包的数据量可能会非常庞大,对应用和系统的性能产生影响。在应用层,我们可以设置更多更精细的过滤条件,如网络地址、端口、协议类型、特定的字段等。这些过滤条件可以帮助我们更精确地定位问题,减少无效的数据。

数据存储问题

将抓到的数据存储起来也是很重要的一步。可以选择将数据存储到内存或者硬盘。需要注意的是,如果选择存储到内存,要考虑到内存的大小,避免因为抓包数据过大导致内存溢出。如果选择存储到硬盘,要考虑到硬盘的读写速度和容量,避免因为抓包数据过大导致硬盘满载。

总结

本文首先阐述了网络协议服务器的一些问题定位能力,包括CPU内存分析能力、日志和网络连接的关联能力、针对特征值的跟踪能力,以及查看原始报文的能力,也讨论了将网络报文与业务trace有效关联的重要性和实现挑战。强调了抓包的重要性和对于解密TLS报文的挑战。为了解决网络层抓包遇到的困难,我们可以考虑应用层抓包方案。最后,我们讨论了应用层抓包的一些关键问题,包括抓包地点的选择、过滤条件的设定和数据存储问题。

点击关注,第一时间了解华为云新鲜技术~

内容
  • Unity_Photon
    Unity_Photon
    2023-12-07
    Photon.1.0 Photon搭建.(2条消息) 【Unity3D】Photon环境搭建_photon框架_litt
  • 「微服务」这10道Consul面试题值得一看
    「微服务」这10道Consul面
    2023-12-06
    前言.Consul 是一种非常强大的分布式服务发现和配置管理工具 ,它可以帮助开发人员和运维人员更好地管理和维护分布式系
  • 计算机网络概念汇总
    计算机网络概念汇总
    2023-12-05
    1. 模型结构.五层模型 :.应用层、传输层、网络层、数据链路层、物理层。.应用层 :为应用程序提供交互服务。在互联网中
  • python实现基于RPC协议的接口自动化测试
    python实现基于RPC协议的
    2023-12-05
    01什么是RPC.RPC(Remote Procedure Call)远程过程调用协议.是一个用于建立适当框架的协议。从
  • 微服务面试必读:拆分、事务、设计的综合解析与实践指南
    微服务面试必读:拆分、事务、设计
    2023-12-03
    谈谈你对微服务的理解,微服务有哪些优缺点?.首先,微服务是对传统单体架构的一种优化。当一个单体架构随着业务的增加而变得臃
  • 使用telnet来调试游戏
    使用telnet来调试游戏
    2023-12-02
    telnet是什么.Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它
  • 翻译:REST 和 gRPC 详细比较
    翻译:REST 和 gRPC 详
    2023-12-02
    译者注:在微服务架构设计,构建API和服务间通信技术选型时,对 REST 和 gRPC 的理解和应用还存在知识盲区,近期
  • ET8开发微信小游戏之部署云服务器Nginx代理
    ET8开发微信小游戏之部署云服务
    2023-12-01
    最近用ET8搞微信小游戏测试,部署到云服务器,手机上运行,必须要用https备案过得域名,客户端使用websocket创
  • 20 张图带你全面了解 HTTPS 协议,再也不怕面试问到了!
    20 张图带你全面了解 HTTP
    2023-12-01
    本文详细介绍了 HTTPS 相较于 HTTP 更安全的原因,包括对称加密、非对称加密、完整性摘要、数字证书以及 SSL/
  • 如何用 30s 给面试官讲清楚什么是 Session-Cookie 认证
    如何用 30s 给面试官讲清楚什
    2023-12-01
    引言.由于 HTTP.协议是无状态的,完成操作关闭浏览器后,客户端和服务端的连接就断开了,所以我们必须要有一种机制来保证
  • 如何用 30s 给面试官讲清楚什么是 Token?
    如何用 30s 给面试官讲清楚什
    2023-12-01
    引言.前文介绍了 Session-Cookie 的认证过程,简单回顾下基本步骤:.客户端(浏览器)向服务器发送用户名和密
  • 园林绿化养护服务
    园林绿化养护服务
    2024-01-10
    园林绿化养护服务.产品功能.园林绿化养护服务是一项专业的服务,旨在为客户提供全方位的园林绿化管理和养护服务。我们团队的专
  • 园林景观设计
    园林景观设计
    2023-12-11
    园林景观设计产品介绍.产品功能.园林景观设计是一项专业的设计服务,主要用于规划和设计公共和私人的园林空间。其功能包括根据
  • 绿化工程材料供应
    绿化工程材料供应
    2023-12-16
    绿化工程材料供应.产品功能.我们的绿化工程材料供应主要用于城市绿化、园林景观建设、庭院绿化等相关项目。产品种类丰富,覆盖
  • 城市绿化规划设计
    城市绿化规划设计
    2024-01-15
    城市绿化规划设计.随着城市化进程的不断加快,城市绿化规划设计成为了一个备受关注的问题。如何在城市中保护和增加绿地,促进城
  • 喷泉景观设计
    喷泉景观设计
    2024-01-05
    喷泉景观设计.喷泉是一种极具观赏性和装饰性的景观设计元素,它不仅可以为周围的环境增添一份生气与动感,更可以为人们带来一份
  • 公园景观规划设计
    公园景观规划设计
    2024-01-10
    公园景观规划设计.产品功能.我们的公园景观规划设计产品旨在为城市和乡村地区提供高质量的公共休闲空间。我们致力于通过规划和
  • 园林休闲座椅制作
    园林休闲座椅制作
    2024-01-20
    园林休闲座椅制作.产品功能.园林休闲座椅是专门为户外休闲空间设计制作的座椅产品。产品具有耐候性强、外观美观、舒适度高等特
  • 喷泉设计与安装
    喷泉设计与安装
    2023-12-21
    喷泉设计与安装.喷泉是园林景观中不可或缺的元素之一,无论是在公园、**还是私人花园中,喷泉都能为环境增添灵动的气息,成为
  • 室外园林景观配套设施制作
    室外园林景观配套设施制作
    2024-01-15
    室外园林景观配套设施制作.产品功能.我们的室外园林景观配套设施制作主要提供定制化的户外景观配套设施,包括花池、凉亭、栏杆
  • 景观照明工程
    景观照明工程
    2023-12-16
    景观照明工程.产品功能.景观照明工程是一种专门为户外景观设计的照明方案。它既可以美化城市风景,提升城市形象,也可以为人们