TCP-BPF :通过BPF定制TCP行为

2024-09-06 08:38
文章标签 定制 行为 tcp bpf

本文主要是介绍TCP-BPF :通过BPF定制TCP行为,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

TCP-BPF :通过BPF定制TCP行为

作者介绍
jianmingfan@126.com 如何以通俗的方式讲解技术
前腾讯云专家工程师,长期专注于操作系统,网络,BPF技术发展。

TCP-BPF又名sockops,由facebook工程师开发。它的缘起是工程师考虑如何针对数据中心内部的网络特征,定制TCP参数,优化TCP的表现。例如可以灵活的修改TCP 缓冲区大小,SYN RTO, SYN-ACK RTO, 初始拥塞窗口等参数。插上BPF的翅膀,TCP-BPF表现出了其超能力。例如可编程,易部署升级,调优能力强等。这些都是传统的调优方法所不能及的。那么TCP-BPF 都能干些什么事情呢?其能力的边界在哪里呢?如何降低其学习门槛呢?从这些问题出发,本文介绍了TCP-BPF背后的设计思路和源码实现,同时也给出了案例分析。遇到部分TCP参数,也给出了一些解释。希望此文能帮助开发者理解TCP-BPF的潜能,并有助于迅速上手。

介绍

Linux 本身提供了一些机制可以修改TCP的一些参数。

  1. setsockopt
    我们知道当我们建立了socket 之后,可以通过setsockopt 修改一些TCP的参数,例如SO_RCVBUF可以设置接受缓冲区大小。这种机制需要修改应用层代码。
  2. ip-route
    通过ip route可以基于route信息调整一些tcp参数。例如initcwnd 参数可以设置某一条路由上的tcp 连接的初始拥塞窗口大小。
  3. sysctl
    通过sysctl 可以修改一些TCP参数,但是它以网络命名空间为粒度,使用起来也有诸多不便之处。

读者可能还能举出其他的定制方法,例如在内核中增加新的TCP option,用户态协议栈等。前者部署周期漫长,后者还存在诸多的问题,应用范围受限。

针对以上方法的局限性,facebook 工程师基于BPF技术实现了一套TCP-BPF框架,并把这些框架提交到了内核主干了。这个方法一开始只是针对数据中心的场景,修改了SYN,SYN-ACT RTO, 初始拥塞窗口等参数。后来随着钩子越来越丰富,其使用场景就远远超过了这些参数了。

设计概论

相对于其他类型的BPF程序,TCP-BPF可以说是有其自身的一些特点。

cgroupv2

TCP-BPF 是一种新的BPF 程序的类型,它和cgroupv2紧密绑定的。用户首先要创建一个cgroupv2的组,将BPF程序挂载到该组。为什么要这么做呢?其设计的初衷是属于不同组的应用程序可以挂载不同的BPF 程序。这样就可以为不同组的应用设计不同的策略和BPF程序呢。

一个BPF 程序,多个调用点

读者知道,目前的BPF程序的使用模式一般都是一种程序类型对应一个内核中的调用点,例如XDP,TC ,其对应的调用点都是唯一的。但是TCP-BPF这种程序类型是一个例外。一段TCP-BPF程序可以从TCP执行过程中的多个调用点进入。那么在BPF程序中如何区分不同的调用点呢?答案是不同的调用点会传入不同的ops 值到BPF程序中。

那么这么复杂的设计初衷是什么呢?为了完成一件事情,往往需要一段BPF程序,在不同的调用点紧密合作。比方说,为了优化数据中心内部的TCP连接,需要同时将SYN RTO, SYN-ACK RTO,socket 缓冲区设置成小值,而这几个操作就需要从不同的调用点进入。假如不同的调用点对应不同的BPF程序,那么上述的协作就非常困难。

遍布TCP协议栈的钩子

在最新的5.15的Linux内核代码中,已经有15个TCP-BPF的钩子了,而且还在持续增加。透过这些钩子可以一窥其能力。通过这些钩子可以充分的了解TCP连接的状态,从而对它进行运行时调整。例如可以通过BPF实现自定义的TCP option;覆盖TCP默认的参数,例如SYN RTO (SYN 超时重传的时间),还可以和sockhash 配合,为主机内进程网络通信提供捷径。

helper 函数

读者朋友也许会说以上介绍的钩子很强大,可是还有很多参数不能修改啊,例

这篇关于TCP-BPF :通过BPF定制TCP行为的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141536

相关文章

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Spring Boot 事务详解(事务传播行为、事务属性)

《SpringBoot事务详解(事务传播行为、事务属性)》SpringBoot提供了强大的事务管理功能,通过@Transactional注解可以方便地配置事务的传播行为和属性,本文将详细介绍Spr... 目录Spring Boot 事务详解引言声明式事务管理示例编程式事务管理示例事务传播行为1. REQUI

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。 我们再来看一下TCP报文段的组成结构 TCP 三次握手 过程 假设有一台客户端,B有一台服务器。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端