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

TCP-BPF(又称sockops)允许通过BPF技术定制TCP参数,优化TCP性能,如调整缓冲区大小、RTO和初始拥塞窗口。文章介绍了TCP-BPF的设计思路、内核实现,包括其与cgroupv2的绑定、多个调用点的特性,以及如何通过钩子遍历TCP协议栈。此外,文章提供了案例分析,帮助理解TCP-BPF的潜力和使用方法。
摘要由CSDN通过智能技术生成

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 函数

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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值