本文主要是介绍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的一些参数。
- setsockopt
我们知道当我们建立了socket 之后,可以通过setsockopt 修改一些TCP的参数,例如SO_RCVBUF可以设置接受缓冲区大小。这种机制需要修改应用层代码。 - ip-route
通过ip route可以基于route信息调整一些tcp参数。例如initcwnd 参数可以设置某一条路由上的tcp 连接的初始拥塞窗口大小。 - 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行为的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!