- 博客(48)
- 收藏
- 关注
原创 netfilter&iptables探讨(4)——nat的实现与使用
在之前的几篇文章中,我们讨论了netfilter与iptables的实现原理与基本用法。在netfilter&iptables的各种使用场景中,nat是最常用也是最复杂的用法之一。许多常用的网络使用模式都是通过nat iptables规则实现的,例如docker默认的bridge网络模式。本文将具体分析iptables中nat规则的实现方式,介绍报文经过nat规则实现地址转换的过程。并以docker bridge模式使用的nat规则为例,具体了解nat规则的实际用法。
2022-12-11 01:50:35 1298
原创 linux内核ip_forward参数详解
linux服务器经常被用来提供防火墙、路由器、NAT等功能,在这些场景下,linux内核需要将网卡上收到的报文转发给其他网络设备。linux内核提供了ip_forward参数用于开关内核的报文转发功能,只有这个开关被打开时,内核才会执行报文的转发。网上能找到不少文章介绍ip_forward参数的基本用途和配置方式,但没有什么文章具体介绍这个参数配置后具体会对内核的网络行为产生哪些影响,以及在内核中是如何实现的。而这些问题的答案对转发功能的使用方式会产生很大的影响。
2022-10-20 00:26:26 9809 1
原创 uverbs的交互方式——ioctl和write
verbs是RDMA设备的标准使用接口,verbs接口中控制面相关的接口实现由用户态的libibverbs.so和内核态的ib_uverbs.ko配合完成。用户态的libibverbs负责将RDMA控制命令信息封装成特定的数据结构,之后通过系统调用传递到内核中;ib_uverbs.ko负责实际实现这些系统调用,根据系统调用传入的参数获取RDMA控制命令的信息,并执行相应的命令。libibverbs与ib_uverbs间传递命令信息的syscall有两种:ioctl和write。...
2022-08-31 00:58:13 958
原创 netfilter&iptables探讨(3)——iptables的功能与实现
介绍iptables的基本概念、功能和用法。包括链、表的概念和原理,规则的匹配模式、处理动作和管理命令。
2022-08-26 00:13:42 691
原创 netfilter&iptables探讨(2)——netfilter原理与实现
在上一篇文章《netfilter&iptables探讨(1)——基本原理》中,我们分析了netfilter和iptables机制的基本原理以及相关的模块和接口。本文将进一步探讨这套机制的基石——netfilter的原理和实现。
2022-08-09 01:03:09 1220
原创 netfilter&iptables探讨(1)——基本原理
在Linux内核中,netfilter和iptables就提供了这样一套内核网络定制机制。本文将简单介绍netfilter和iptables的原理、用途以及两者的关系,从而说明这套机制是如何实现通过用户态的简单配置,就能修改linux内核网络行为的。对netfilter和iptables的具体实现和用法将在后续的文章中讨论。......
2022-08-07 22:31:10 633
原创 traceroute用法与原理分析
traceroute是linux/unix系统中用于分析本地到目标网络地址间的路由转发路径的工具,也常用于诊断网络链路不通或异常的发生位置。在windows中也有类似功能的工具,名为tracert。本文将介绍traceroute的用法并分析其原理。...
2022-07-13 23:49:40 5058
原创 Android学习笔记——第一个应用
近期在学习一下Android开发的基本知识。本文简单记录学习官方教程Build your first app过程中涉及的一些知识点。一个Android应用可以由多个组件和模块构成,不同的使用场景可能会使用到不同的组件。例如activity是UI组件,通过应用图标打开应用时就会执行main activity这个组件,而通过通知消息或者其他应用的接口可能会执行其他的activity来展示不同的页面或功能。又例如WorkManager是应用在后台执行时会使用的组件,这种组件就不需要UI。一个应用可以有多个执行
2022-05-11 00:19:28 399
原创 内核RDMA模块(siw)代码分析
siw是内核中实现的RDMA设备驱动模块。与其他RDMA设备驱动不同的是,这个模块没有对应的硬件设备,而是通过软件方式模拟了一个使用iWARP协议的RDMA设备,通过内核的socket接口完成tcp报文的收发。本文将基于5.9.11内核中的siw模块代码分析一下这个虚拟设备的实现逻辑。
2022-03-11 00:09:19 1737
原创 RDMA知识小结
近期学习了一些RDMA的基础知识,在这里做个整理记录,供以后快速查阅。概念RDMA是Remote Direct Memory Access的缩写,即远程DMA。顾名思义,RDMA最大的特点是支持对远端内存的直接读写,而不需要远端CPU介入。RDMA的主要特点和优势有以下几点:1. zero-copy。RDMA的网络收发接口可以直接把用户态的buffer地址交给RDMA网卡,网卡负责将buffer中的数据发送到远端,或将收到的远端数据写入buffer。这就避免了socket网络收发接口中需要先
2022-01-25 00:31:52 5782
原创 容器相关资料与问题
本文记录工作中用到的容器相关的资料和遇到的一些问题。k8s网络k8s网络之设计与实现 - 金色旭光 - 博客园pod内部网络实现 - 金色旭光 - 博客园k8s网络之Flannel网络 - 金色旭光 - 博客园k8s网络之Calico网络 - 金色旭光 - 博客园...
2022-01-18 11:13:14 459
原创 开发调试工具相关资料与问题
本文记录工作中用到的开发调试工具相关的资料和遇到的一些问题。gdb:定义调试变量:set $i=0修改变量:set $i=$i+100断点自动执行命令:commands id_of_br(gdb) commands 2Type commands for breakpoint(s) 2, one per line.End with a line saying just "end".>set $i=$i+1>continue>end......
2022-01-13 17:34:36 240
原创 golang相关资料与问题
本文记录工作中用到的golang相关的资料和遇到的一些问题。Golang语言原理和runtime的设计与实现详解:Go 语言设计与实现 | Go 语言设计与实现
2022-01-07 00:39:14 893
原创 网络虚拟化——vduse
在上一篇文章《网络虚拟化-vDPA_dillanzhou的博客-CSDN博客》中,我们讨论了vDPA技术。通过vDPA技术,guest/host上的用户态/内核态virtio驱动都可以通过同一套vDPA框架和驱动来和vDPA设备交互,获得硬件数据面加速。由于vDPA在virtio/vhost和vDPA设备之间又增加了一层中间层,因此理论上说可以在vDPA框架中实现纯软件的vDPA设备和对应的驱动。这个软件vDPA设备可以在内核实现,intel就在内核中实现了一个vdpa_sim设备,用于在没有vDPA硬件设
2021-12-09 01:03:12 1748 2
原创 网络虚拟化-vDPA
在virtio硬件实现的基础上,又出现了一种技术,称作vDPA(virtio data path acceleration)。顾名思义就是只用硬件加速virtio的数据面。在vDPA技术框架中,硬件设备只需要支持virtio的数据面接口,也就是virtqueue/vring队列结构,控制面接口和实现仍然可以保留设备特有的方式。vDPA的意义在于降低了网卡支持virtio接口的难度。本文将讨论vDPA技术的原理和实现。
2021-12-02 02:00:36 9409 5
原创 网络虚拟化——SR-IOV
之前的多篇文章介绍了网络虚拟化常见的技术实现,特别是virtio/vhost技术的实现。虽然virtio/vhost架构显著改善了虚拟网络的性能,但virtio网卡仍然是软件模拟的设备,其性能稳定性和资源占用率显然无法达到物理网卡的水平。虚拟网络其实还有一种实现方式——设备直通,让虚拟机与网卡直接交互,从而获得最高的网络性能。但这种方式显然无法大规模使用,因为物理网卡的数量是有限的,成本也很高,无法为每个虚拟机分配一个。SR-IOV(Single Root I/O Virtualization)技术就是
2021-11-16 00:10:36 11730
原创 网络虚拟化——virtio-user
在上一篇文章(网络虚拟化——vhost-user_dillanzhou的博客-CSDN博客)中,介绍了通过DPDK框架,将vhost移入用户态的技术——vhost-user的原理。其中也提到了可以将virtio设备驱动也放到用户态,从而实现更高效率的基于virtio设备的网络收发应用。DPDK中提供了virtio网卡的用户态驱动,称为virtio-user。从前面几篇文章的介绍中我们可以发现,virtio设备和驱动从虚拟机角度来看和普通的网卡设备没有什么区别,只是数据面和控制面接口符合virtio规范而
2021-11-03 23:45:26 3277 4
原创 网络虚拟化——vhost-user
在上一篇文章(网络虚拟化——vhost_dillanzhou的博客-CSDN博客)中,介绍了vhost技术和vhost-net内核模块的原理。
2021-10-23 23:40:08 3362 1
原创 网络虚拟化——vhost
在上一篇文章(网络虚拟化——virtio)中,我们讨论了virtio技术的由来、原理和实现。virtio为虚拟IO设备提供了一套标准的接口和实现。同时由于其半虚拟化的特质,virtio驱动在设计和实现时尽可能减少了主要操作路径上会触发host后端操作(vmexit)的指令以提升IO效率。但在执行IO操作时,仍会不可避免的需要触发后端操作。例如virtio-net驱动发包时,在向tx virtqueue写入buffer后必然要kick后端来处理buffer,这个kick就是一个IO写操作。当后端在用户态q
2021-10-10 22:29:14 6593
原创 网络虚拟化——virtio
前言在上一篇文章(网络虚拟化——QEMU虚拟网卡)中,讨论了经典的网络设备全虚拟化技术。这种技术不需要guest内核对虚拟网络设备有任何的感知和特殊处理,但性能较差,一次读写操作可能会产生多次需要Hypervisor模拟实现的行为。为了改善虚拟网络设备的性能,各类Hypervisor都提供了自己的半虚拟化网络技术。在这种模式下,guest内核中使用的网络设备和驱动是为虚拟化场景特殊设计和实现的,驱动的实现特别适配了Hypervisor的一些特性,尽量减少了需要Hypervisor介入进行模拟实现的指
2021-09-28 00:39:27 11266
原创 网络虚拟化——QEMU虚拟网卡
写在前面网络虚拟化曾经只是内核虚拟化功能开发者才会关注的技术。但随着云计算模式和云原生概念的推广,云上业务的部署形态都已转向了虚拟机和容器,而两者都依赖网络虚拟化技术提供高性能网络功能,因此虚拟网络已经是云环境下的主流网络形态。而云上的虚拟机和容器对网络虚拟化技术的易用性、功能和性能都提出了更高的要求。对于云上环境的网络基础设施开发者来说,网络虚拟化已经成为了一种必须掌握的技术。但在学习网络虚拟化技术时,笔者没能找到一个能够完整介绍网络虚拟化技术类型、原理和实现的信息源,特别是中文资料。因此,笔者计
2021-09-10 01:06:19 8700
原创 低时延环境下的TCP RTO设置
TCP连接的可靠传输依靠的是数据确认与重传机制。当发送方发送的数据在一定时间内没有得到对方的确认时,发送方就会认为发送的数据丢失而触发重传。这个等待的时间长度就是RTO(Retransmission TimeOut)。当然在快速重传等机制的作用下,很多情况下数据重传不需要真正等待RTO时间这么久,但在很多场景特别是单报文交互式的场景下,RTO仍然是报文重传的主要触发方式。在RFC6298中,规定了RTO的计算方法。从原理上说,RTO是和TCP连接两端的报文往返交互时延(RTT)相关的,可以认为是RTT加
2021-07-04 14:06:56 2349
原创 docker、containerd、runc、shim... 容器技术名词全解析
云原生的概念在最近两年得到了广泛的关注,各大云厂商和技术团队都纷纷推出了各种“云原生”的技术和产品。虽然云原生到底包括哪些概念和技术并没有一个公认的答案,但容器技术是云原生的基础和核心应该是现阶段的一个共识。但是容器技术经过多年的发展和演变,各种实现方案和早期版本相比已经有了巨大的差异,而且仍然在不断演进的过程中。各种组件的产生、随之而来的接口规范、基于接口规范实现的新可选组件让相关的名称和概念更加复杂。新的开发使用者很难全面理解容器相关的各类名词和概念,以及这些名词和概念在真实的容器部署环境中的作用和
2021-05-13 01:38:28 6113 2
原创 在CentOS7中搭建单机kubernetes集群
最近需要在自己的虚拟机中搭建一个单机的k8s集群,以便于学习k8s的基本原理和操作。但由于版本和国内网络状况的差异,根据官方和网上的各种文档都无法直接完成集群的搭建。因此在此记录一下完整的搭建过程供后续参考。使用kubeadm搭建单机集群在官方的安装文档https://kubernetes.io/zh/docs/tasks/tools/中,建议使用minikube、kind或kubeadm搭建集群。笔者首先尝试了使用minikube搭建集群,但遇到的问题是minikube start命令启动后会
2021-04-24 22:55:04 406
原创 io_uring技术的分析与思考
io_uring是Linux 5.1中引入的一套新的syscall接口,用于支持异步IO。近来这套机制颇受关注,很多人认为它代表了与内核实现高性能交互的一种模式。本文将对io_uring的原理和实现进行分析,了解其相对于原有IO机制的优势,并尝试预测其应用场景和发展趋势。异步IO机制在介绍io_uring之前,需要先了解一下其实现的异步IO机制,以及io_uring之前的异步IO是如何实现的。在linux下,目前绝大部分程序中的IO操作都是同步的,最后通过read/write系列的系统调用实现对
2020-12-03 00:56:18 9365
原创 gVisor中的vdso实现
什么是vdso?vdso是virtual ELF dynamic shared object的缩写,即虚拟动态共享库,其实就是“虚拟的so库”。根据linux手册https://man7.org/linux/man-pages/man7/vdso.7.html的介绍,vdso是内核中内置的一个so库。在启动ELF程序时,内核会自动将其映射到进程的虚拟地址空间。通过cat /proc/$pid/maps可以看到每个进程中vdso映射的虚拟地址。vdso的主要存在意义,是为一些频繁调用的内核功能提供用户
2020-10-28 01:29:38 617
原创 golang gc实现分析(go1.14.4)
GC(garbage collection,垃圾回收/自动内存回收)是golang的关键特性。基于标记-清除(Mark and Sweep)算法的golang GC比java中基于引用计数的GC更加简单易用。为了降低GC暂停任务执行(STW,Stop The World)的时间,golang中的GC采用三色标记算法,最大程度的将标记过程和任务执行并行。介绍golang GC原理和三色标记算法原理的中文文章不少,例如:Golang GC 探究:https://www.open-open.com/li.
2020-09-02 00:29:02 2147 1
原创 golang的heap profile原理
golang中提供了多种profile用于分析golang程序的CPU、内存等使用情况。heap profile是堆内存使用情况的profile信息,用于分析程序当前的堆内存使用情况,在分析内存开销和内存泄露问题时是一种有效的分析工具。https://lrita.github.io/2017/05/26/golang-memory-pprof/介绍了heap profile的用法。https://golang.org/doc/diagnostics.html和https://golang.org/pkg
2020-07-02 01:32:18 4508
原创 makefile中.PHONY目标的意义
在makefile文件中,会频繁的看到许多".PHONY"目标,例如:.PHONY: build_docker_imagebuild_docker_image: # build dockerfile from stdin so that we don't send the build-context; source is bind-mounted in the develo...
2019-09-07 21:41:08 2533
原创 bash中的点(".")命令
在看docker的启动脚本时,看到其中有一行". /etc/sysconfig/docker"。这"."是什么意思?百度得知,"."命令就是"source"命令的另一种写法,是bash内建的命令。source命令比较常用,就是在当前bash环境下运行目标脚本内容。https://www.jb51.net/article/103657.htm中解释的比较清楚。贴一个bash的manual...
2019-09-07 20:31:46 1452
原创 使用ebpf分析网络报文传输时延
最近需要分析某个链路上的单向网络延迟,数据的发送端使用一个用户态协议栈,而接收端则使用linux内核协议栈。获取延迟的方式是在发送端在发送报文的尾部添加一个发送时间戳,在接收端获取报文后将接收端时间戳与发送时间戳进行对比,从而获得中间的延迟时间。由于发送端和接收端位于同一设备(使用不同的网卡),又分别处于用户态和内核态,因此使用了两端都能高性能访问的tsc时钟作为时间戳来源。为了在接收端尽可能...
2019-08-31 23:13:06 2679 1
原创 tcpdump与libpcap原理分析
tcpdump是linux上常用的网络报文抓取分析工具,主要功能是抓取系统中的网络报文,根据条件过滤出需要的报文,最后将报文打印或保存到文件中。本文将对tcpdump的实现原理进行分析,由于报文解析展示和保存的逻辑比较直观,本文主要关注报文获取和过滤部分。为了兼容各类平台和不同版本的内核,tcpdump的代码中有大量用于兼容的逻辑和分支,本文只介绍面向最新版本linux平台接口的分支逻辑。...
2019-07-30 23:41:27 2502
原创 TCP keepalive机制分析
TCP keepalive是由TCP协议栈提供的连接存活性检测功能。如果打开这个功能特性,如果一条已建立的TCP连接一段时间没有收到报文,就会开始发送TCP keepalive报文,如果keepalive报文多次没有获得响应,则判定连接的对端已经断开,本地协议栈会将连接关闭。TCP keepalive一般用于服务器软件中,目的是避免客户端异常断开连接造成服务端大量无效连接残留,消耗过多资源。...
2019-07-29 00:29:02 1383
原创 fuse用户态文件系统下ls命令的执行过程分析
关于fuse文件系统的基本概念,可以参考https://blog.csdn.net/ty_laurel/article/details/51685193这篇文章。在这篇文章里,较详细了介绍了fuse文件系统的代码结构和原理,以及工作流程。本文从一次实际的文件系统访问操作出发,分析在fuse文件系统下,ls命令的执行过程。通过这次分析,对系统命令、文件系统、fuse文件系统实现进行一次剖面的微观...
2018-10-10 16:13:13 4704
原创 在Ubuntu中使用8192eu无线网卡的AP功能
前段时间买了一个瑞昱8192芯片的无线网卡,想在Ubuntu系统下作为AP给手机提供热点。安装时却发现厂家只提供了windows下的驱动和控制端软件,在Linux下只有一个芯片的官方驱动,作为普通wifi是可以的,但AP模式却无法生效。通过调整驱动代码、手动配置网卡和ap服务程序,终于成功启用了网卡的AP功能,具体步骤如下: 重新编译8192eu的驱动,在config/autoconf....
2018-09-28 14:34:06 1564
原创 gcc编译时使用-include参数添加头文件引用
编写C和C++程序时,需要在代码中使用#include来引用头文件。除了这个方法外,gcc支持参数-include,可以在编译时直接向目标代码中添加头文件,而不需要在代码中加入include语句。通过这个方式可以在不修改代码的情况下增加或改变头文件引用,在大量文件都要引用相同的公共头文件时减少代码量。以DPDK为例,在DPDK中,编译时会将config配置文件中的所有配置信息全部转换为宏定...
2018-09-28 09:58:03 8420
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人