基于eBPF技术的开源项目Kindling之HTTP协议解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: Kindling是一款基于eBPF技术的云原生可观测性开源项目。本文将主要介绍如何通过Kindling对HTTP协议进行解析。

在故障排查过程中,我们通常对请求性能、请求内容和返回内容感兴趣。这使我们能知道请求和接收了什么内容,是否有异常等基本信息。如何获取请求的具体详细信息,传统方式是通过tcpdump获取请求包数据,然后通过wireshark查看其具体协议内容。

tcpdump虽然在生产环境中经常使用,但由于获取的数据量和大小限制,不适合一直开启,只有在排查问题时使用。而获取的数据也无法直接查看,需下载到本地通过wireshark分析查看。基于tcp的诸多问题,所以Kindling通过eBPF方式实现请求的具体分析。

那么Kindling是如何实现实时可用的协议解析功能呢?主要涉及3块功能:

  • 数据采集
  • 请求/响应关联
  • 请求/响应解析

协议解析流程图.png

协议解析流程图


1 数据采集

先来查看下一个简单的HTTP服务

HTTP服务伪代码.png

HTTP服务伪代码


当接收到请求时会有accept/read/write/close等函数执行,这些函数最终执行内核的系统调用。

HTTP服务接收请求流程图.png

HTTP服务接收请求流程图


使用strace命令查看一次请求的系统调用情况

  • read接收HTTP请求/test
  • 第一个write日志输出
  • 第二个write 返回HTTP结果

68427606-C89D-492B-AE4A-1EC4EAA6EDD9.png

从日志中可分析出,请求通过read系统调用,日志和响应都是通过write系统调用。

Kindling已实现对系统事件调用进行抓取,并将相关的read和write系统调用转换为Kindling事件,最终生成3条事件。事件格式定义可参见kindling_event.proto

系统调用与Kindling事件映射.png

系统调用与Kindling事件映射


参数说明:

  • fd 读写请求的文件描述符
  • size 请求报文大小
  • res 返回大小
  • data 请求报文内容
  • latency 读/写操作耗时
  • category 事件类型,NET是指网络事件,FILE是文件读写事件


2 请求/响应关联

常规的TCP请求都会用同一个FD进行通信,只需根据进程号和FD就能关联同一个请求和响应。

请求-响应关联.png

请求-响应关联


3 请求/响应解析

虽然有了报文,但不同的协议定义的规范也不同。那么如何知道该报文是什么协议,并且用该协议进行解析呢?主要涉及2块内容:

  • 协议识别
  • 协议解析

请求-响应解析流程图.png

请求-响应解析流程图


3.1 协议识别

通过特征或关键字快速匹配协议,减少协议解析的次数,提升整体解析的性能。

HTTP报文规范.png

HTTP报文规范


对于HTTP请求来说,通过HTTP版本号(HTTP/1.0或HTTP/1.1)可以快速识别协议。

但由于抓包大小限制,如果一个请求的URL长度超过包的大小,那么无法获取后续的HTTP版本号,于是采用端口协议配置方式也能识别协议。


3.2协议解析

协议解析是为了产生指标用于后续分析,在解析过程中需根据协议自身的格式进行解析。

由于报文内容是byte数组格式,Kindling提供了封装好的API用于解析。

C1919449-34B2-4696-8D90-ABD3CFF328A6.png

以HTTP协议为例,可解析出如下信息:

  • 请求行 - 方法、URL信息
  • HTTP头信息 - traceId信息
  • 状态行 - 状态码信息

HTTP解析样例.png

HTTP解析样例


3.2.1 解析HTTP请求

解析请求过程就是对请求进行逐帧解析,读取到对应的属性后最终将值存储到attribute中

Xnip2022-04-26_15-39-49.jpg


3.2.2 解析HTTP响应

解析响应跟解析请求类似,也是逐帧解析,将解析出的属性存储到attribute中。

此外,需考虑报文非法场景(状态码非数值),确保解析正常结束。

Xnip2022-04-26_15-40-36.jpg


KINDLING项目地址:KINDLING

欢迎对云可观测性感兴趣的小伙伴与我们联系:Kindling官网

目录
相关文章
|
8天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
46 3
|
1月前
|
域名解析 存储 网络协议
深入解析网络通信关键要素:IP 协议、DNS 及相关技术
本文详细介绍了IP协议报头结构及其各字段的功能,包括版本、首部长度、服务类型、总长度、标识、片偏移、标志、生存时间(TTL)、协议、首部检验和等内容。此外,还探讨了IP地址的网段划分、特殊IP地址的应用场景,以及路由选择的大致流程。最后,文章简要介绍了DNS协议的作用及其发展历史,解释了域名解析系统的工作原理。
94 5
深入解析网络通信关键要素:IP 协议、DNS 及相关技术
|
15天前
|
缓存 网络协议 前端开发
Web 性能优化|了解 HTTP 协议后才能理解的预加载
本文旨在探讨和分享多种预加载技术及其在提升网站性能、优化用户体验方面的应用。
|
19天前
|
JavaScript 安全 Java
谈谈UDP、HTTP、SSL、TLS协议在java中的实际应用
下面我将详细介绍UDP、HTTP、SSL、TLS协议及其工作原理,并提供Java代码示例(由于Deno是一个基于Node.js的运行时,Java代码无法直接在Deno中运行,但可以通过理解Java示例来类比Deno中的实现)。
45 1
|
29天前
|
前端开发 JavaScript 安全
深入解析 http 协议
HTTP(超文本传输协议)不仅用于传输文本,还支持图片、音频和视频等多种类型的数据。当前广泛使用的版本为 HTTP/1.1。HTTPS 可视为 HTTP 的安全增强版,主要区别在于添加了加密层。HTTP 请求和响应均遵循固定格式,包括请求行/状态行、请求/响应头、空行及消息主体。URL(统一资源定位符)用于标识网络上的资源,其格式包含协议、域名、路径等信息。此外,HTTP 报头提供了附加信息,帮助客户端和服务端更好地处理请求与响应。状态码则用于指示请求结果,如 200 表示成功,404 表示未找到,500 表示服务器内部错误等。
29 0
深入解析 http 协议
|
1月前
|
数据采集 JSON API
🎓Python网络请求新手指南:requests库带你轻松玩转HTTP协议
本文介绍Python网络编程中不可或缺的HTTP协议基础,并以requests库为例,详细讲解如何执行GET与POST请求、处理响应及自定义请求头等操作。通过简洁易懂的代码示例,帮助初学者快速掌握网络爬虫与API开发所需的关键技能。无论是安装配置还是会话管理,requests库均提供了强大而直观的接口,助力读者轻松应对各类网络编程任务。
99 3
|
1月前
|
机器学习/深度学习 JSON API
HTTP协议实战演练场:Python requests库助你成为网络数据抓取大师
在数据驱动的时代,网络数据抓取对于数据分析、机器学习等至关重要。HTTP协议作为互联网通信的基石,其重要性不言而喻。Python的`requests`库凭借简洁的API和强大的功能,成为网络数据抓取的利器。本文将通过实战演练展示如何使用`requests`库进行数据抓取,包括发送GET/POST请求、处理JSON响应及添加自定义请求头等。首先,请确保已安装`requests`库,可通过`pip install requests`进行安装。接下来,我们将逐一介绍如何利用`requests`库探索网络世界,助你成为数据抓取大师。在实践过程中,务必遵守相关法律法规和网站使用条款,做到技术与道德并重。
41 2
|
1月前
|
JavaScript 网络协议 Windows
|
10天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
26 0
|
10天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
25 0

推荐镜像

更多