- 博客(56)
- 资源 (1)
- 收藏
- 关注
原创 Linux中TCP listen套接字的查找的变化
内核TCP在收到SYN报文时,会根据报文的目的IP和Port,在本地匹配处于LISTEN状态的套接字进行握手过程。4.17版本以前的listen套接字查找The current listener hashtable is hashed by port only. When a process is listening at many IP addresses with the same po...
2019-09-30 21:44:53
673
原创 Linux内核中reuseport的演进
SO_REUSEPORT选项在Linux 3.9被引入内核,在这之前也有一个很像的选项SO_REUSEADDR。如果你不太清楚这两者的区别和联系,建议阅读How do SO_REUSEADDR and SO_REUSEPORT differ?。如果不想读,那么下面这一节算是为懒人准备的。SO_REUSEADDR 与 SO_REUSEPORT 是什么?TCP/UDP用五元组唯一标识一个连接。任...
2019-09-30 21:44:20
1219
原创 TCP Metrics--remove per-destination timestamp cache
2017年3月,内核主线将TCP Metrics表项中的时间戳缓存,补丁详见patch—tcp: remove per-destination timestamp cache struct tcp_metrics_block { struct inetpeer_addr tcpm_saddr; struct inetpeer_addr tcpm_daddr; unsigned l...
2019-09-30 21:43:17
308
原创 Linux内核TCP Metrics框架
TCP是一个复杂的协议,这种复杂来源于对报文传输的可靠性承诺。对每条TCP连接来说,除了有独立的状态机、定时器之外,还有拥塞控制相关的一些运行变量,比如RTT、CWND、SSTHRESH等,这些运行参数同样也是每连接(Per-Connection)的Per-Connection意味着每条连接的这些参数互不影响,这是理所应当的!但是,想想这个情景:A与B之间已经建立了一条稳定的TCP连接,此时若新...
2019-09-30 21:42:38
657
原创 Linux内核中的udp隧道框架
起源TCP虽然能保证传输的可靠性,但其繁琐的状态机以及复杂的拥塞控制机制让它难以作为隧道报文的外层封装,详见TCP-in-TCP。相对而言,UDP就没这个困扰了,丢包的事情交给应用层处理就行。因而,不少隧道协议都是将UDP作为外层报文的方案。自然而然,与网络发展联系紧密的Linux内核也开始支持这些隧道协议,较新的内核已经支持fou、l2tp、vxlan、tipc、geneve等UDP隧道协议...
2019-09-30 21:42:01
1090
原创 隧道而言, TCP-In-TCP会发生什么
上周晚上在家中,当我搭起熟悉的ss梯子时, 发现不可用了T.T。登陆到控制台查看,发现国内的IP被Block了。昨天瞎逛,看到一个开源项目:udp2raw-tunnel,他实现的是将一个IP报文伪装成TCP报文,目的是穿过网络中UDP防火墙.哈?!这难道是TCP-In-TCP? 这玩意儿不是不可用吗?很早以前就有人说过了:Why TCP Over TCP Is A Bad Idea为了...
2019-09-30 21:41:33
634
原创 XFRM -- IPsec协议的内核实现框架
IPsec协议帮助IP层建立安全可信的数据包传输通道。当前已经有了如StrongSwan、OpenSwan等比较成熟的解决方案,而它们都使用了Linux内核中的XFRM框架进行报文接收发送。XFRM的正确读音是transform(转换), 这表示内核协议栈收到的IPsec报文需要经过转换才能还原为原始报文;同样地,要发送的原始报文也需要转换为IPsec报文才能发送出去。OverviewX...
2019-09-30 21:39:14
3351
原创 IPsec与NAT Traversal(NAT-T)
背景IPsec在两个通信实体之间建立安全的数据传输通道, 但它却与网络中广泛存在的NAT设备(以及PAT)有天生的不兼容性(incompatible)。我们以一个TCP报文为例来看看在不同IPsec的不同模式(Transport和Tunnel)和协议(AH和ESP)下,这种不兼容是如何发生的。先来看Transport模式对AH协议,由于其Authenticate范围是整个IP报文,所以...
2019-09-30 21:37:50
2860
原创 TCP的重传退避与公平
TCP在发送报文后,如果没有收到对端应答,那么在重传定时器超时后会触发重传,超时时间遵循二进制退避原则,也就是**{1,2,4,8,16}这样成倍地扩大超时时间。退避是因为TCP认为丢包意味着网络有拥塞,为了不加重网络的拥塞,TCP选择等待更长的时间再进行重传。这和CSMA/CD**中的二进制退避算法如出一辙。在链接曾经提到过网络拥塞的来历,网络中的网络设备(路由器、交换机)在收到了超过队列限...
2019-09-30 21:28:11
1343
原创 Linux 路由缓存的前世今生
3.6版本一定算得上是Linux网络子系统中一个特别的版本, 这个版本(补丁patch)移除了查找FIB之前的缓存查找。本文就来谈谈路由缓存的前世今生。几个基本概念为了让本文的阅读曲线更加平缓我决定还是将本文涉及的一些术语作个说明。路由:将skb按照规则送到该去的地方,这个地方可能是本机,也可能是局域网中的其他主机,或者更远的主机。从这个角度来说,它一个动词。那么路由发生在哪个时候呢? 我...
2019-09-30 21:26:18
482
原创 inet socket 与 packet socket
[外链图片转存失败(img-jGyWSBRz-1569142979995)(https://s2.ax1x.com/2019/08/17/muuRUg.png)]调试过网络程序的人大多使用过tcpdump,但你知道tcpdump是如何工作的吗?tcpdump这类工具也被称为Sniffer,它可以在不影响应用程序正常报文的情况下,将流经网卡的报文呈现给用户。本文不分析tcpdump的具体实现,...
2019-09-22 17:03:27
1122
原创 IP地址是主机的还是网卡的 ?
读大学时,宿舍每个人都买了电脑,为了节约网费,整个宿舍又从二手市场淘了台TP-LINK路由器。这样每个人的电脑就通过路由器连接到学校网管中心,再连接到外网。从路由器后台界面可以看到,路由器为每个人的电脑分配了一个IP地址。这看上去IP是属于主机的.进入职场以后,公司的电脑都安装了两个物理网卡,通过两根网线分别接入了两个网络(10.X.X.X/8 和 192.X.X.X/24).从适配器管理...
2019-09-22 17:02:53
8292
1
原创 锁与无锁
当我们在编写多线程程序时,常常会涉及到多个线程对共享数据的访问。如果不对这种访问加以限制,往往会导致程序运行结果与预期不符锁编写代码时,我们以及习惯了用锁去保护数据。那么,这里的锁是什么?为什么它能满足我们的要求?它存在于哪里?让我们从一个最简单的例子出发—多个线程并发修改一个全局变量:/* 全局变量 */int g_sum = 0;/* 每个线程入口 */void *thr...
2019-09-22 17:02:13
275
原创 TAILQ 之一二事
TAILQ队列是FreeBSD内核中的一种队列数据结构,在一些著名的开源库中(如DPDK,libevent)有广泛的应用。TAILQ队列的定义TAILQ队列有HEAD和ENTRY两种基本的数据结构#define TAILQ_HEAD(name, type) \struct name { \ struct type *tqh_first; /* first e...
2019-09-22 17:00:58
291
原创 Netfilter 是如何工作的(五):初识连接跟踪(connection track)
报文过滤和连接跟踪可以说是Netfilter提供的两大基本功能。前者被大多数人熟知,因为我们对防火墙的第一印象就是可以阻止有害的报文伤害计算机;而后者就没这么有名了,很多人甚至不知道Netfilter有这项功能。Why 使用连接跟踪顾名思义,连接跟踪是保存连接状态的一种机制。为什么要保存连接状态呢? 举个例子,当你通过浏览器访问一个网站(连接网站的80端口)时,预期会收到服务器发送的源端...
2019-09-22 16:58:59
1139
原创 Netfilter 是如何工作的(四):动作(target)
每一条iptables配置的规则(rule)都包含了匹配条件(match)部分和动作(target)。当报文途径HOOK点时,Netfilter会逐个遍历挂在该钩子点上的表的rule,若报文满足rule的匹配条件,内核就会执行动作(target)。上面是一条普通iptables规则,如果报文匹配前面的条件,就会执行最后的-j DROP,它就是这条规则的动作(target)普通动作 &am...
2019-09-22 16:58:16
581
原创 Netfilter是如何工作的(三) 规则的匹配(match)
每一条iptables配置的rule都包含了匹配条件(match)部分和动作(target)。当报文途径HOOK点时,Netfilter会逐个遍历挂在该钩子点上的表的rule,若报文满足rule的匹配条件,内核就会执行动作(target)。扩展match的表示而match又可以分为标准match和扩展match两部分,其中前者有且只有一个,而后者有零到多个。在Netfilter中,标准mat...
2019-09-22 16:57:41
957
1
原创 Netfilter是如何工作的(二) 表(table)与规则(rule)
在(一)中说到,报文在内核协议栈中会途经5个HOOK点,在每个HOOK点上会依次执行链表上的钩子函数,那么这些钩子函数是如何与用户使用iptables下发的各个rule联系起来的呢?这些rule又是如何存储的呢? 本文详细描述这个问题。table内核使用struct xt_table这个结构来表示一个表(table)。结构中记录了这个表在哪些HOOK点有效,它的private指针保存了这个表包...
2019-09-22 16:57:19
1091
原创 Netfilter是如何工作的(一) HOOK点
写在前面本系列不是介绍How to配置iptables的文章。因为网络上已经有很多这类型的教程了,其中一些还不错(比如链接).本系列也不是一般意义上的Netfilter源码分析文章。因为大段粘贴代码也会让人心生畏惧和厌烦!本系列文章的目标是,用尽量少的文字和图片讲明白How Netfilter workNetfilter 的基本概念Netfilter是一套融入在Linux内核网络协议栈中...
2019-09-22 16:55:11
857
原创 通俗理解IP路由
日常工作环境中,我们习惯于使用ping去测试网络的连通性。如果ping不通,我们往往会去怀疑是不是路由配置错了。路由是什么我们知道,IP地址是网络世界里的门牌号。你可以通过IP地址访问远在天边的网站,那么数据是如何到达网站的呢?靠的就是路径上每个节点的路由。路由,简单的说就是指导IP报文该去哪的指示牌。一般说来,主机会在以下两个时机进行路由查询收到报文时,查询路由决定是上送本机...
2019-09-22 16:53:17
1723
原创 深入浅出TCP中的SYN-Cookies
本文渐进地介绍TCP中的syn-cookie技术,包括其由来、原理、实例测试。SYN Flood 攻击TCP连接建立时,客户端通过发送SYN报文发起向处于监听状态的服务器发起连接,服务器为该连接分配一定的资源,并发送SYN+ACK报文。对服务器来说,此时该连接的状态称为半连接(Half-Open),而当其之后收到客户端回复的ACK报文后,连接才算建立完成。在这个过程中,如果服务器一直没有...
2019-05-26 10:54:16
3923
原创 神奇的backlog参数对TCP连接建立的影响
曾经有人问我套接字编程中listen的第二个参数backlog是什么意思?多大的值合适?我不假思索地回答它表示服务器可以接受的并发请求的最大值。然而事实真的是这样的吗?TCP通过三次握手建立连接的过程应该都不陌生了。从服务器的角度看,它分为以下几步将TCP状态设置为LISTEN状态,开启监听客户端的连接请求收到客户端发送的SYN报文后,TCP状态切换为SYN RECEIVED,并发送...
2019-05-26 10:49:17
1040
原创 packetdrill:测试TCP协议栈行为的利器
`packetdrill`是一个非常有用的用于测试网络协议栈的工具,由`Google`开发,它常用于对网络协议栈进行回归测试,确保新的功能不会影响原有功能。本文主要介绍其基本原理、安装、入门、测试脚本的编写方法。
2019-05-26 10:45:34
1091
原创 TCP拥塞控制基础
TCP要点有四,一曰有连接,二曰可靠传输,三曰数据按照到达,四曰端到端流量控制。注意,TCP被设计时只保证这四点,此时它虽然也有些问题,然而很简单,然而更大的问题很快呈现出来,使之不得不考虑和IP网络相关的东西,比如公平性,效率,因此增加了拥塞控制,这样TCP就成了现在这个样子。为什么要进行拥塞控制要回答这个问题,首先必须知道什么时候TCP会出现拥塞。TCP作为一个端到端的传输层协议,它并...
2019-05-26 10:42:55
346
原创 mTCP:一款面向多核系统的用户态网络协议栈
mTCP 是一款面向多核系统的用户态网络协议栈内核态协议栈的缺陷互联网的发展,使得用户对网络应用的性能需求越来越高。人们不断挖掘CPU处理能力加强,添加核的数量,但这并没有使得网络设备的吞吐率线性增加,其中一个原因是内核协议栈成为了限制网络性能提升的瓶颈。互斥上锁引起的开销互斥上锁是多核平台性能的第一杀手。现在的服务器端应用为了尽可能的实现高并发,通常都是采用多线程的方式监听客户端对服...
2019-05-26 10:35:10
1763
1
原创 探索runC (下)
回顾本文接 探索runC(上)前文讲到,newParentProcess() 根据源自 config.json 的配置,最终生成变量 initProcess ,这个 initProcess 包含的信息主要有cmd 记录了要执行的可执行文件名,即 “/proc/self/exe init”,注意不要和容器要执行的 sleep 5 混淆了cmd.Env 记录了名为 _LIBCONTAINER...
2019-03-02 17:05:34
441
原创 探索 runC (上)
前言容器运行时(Container Runtime)是指管理容器和容器镜像的软件。当前业内比较有名的有docker,rkt等。如果不同的运行时只能支持各自的容器,那么显然不利于整个容器技术的发展。于是在2015年6月,由Docker以及其他容器领域的领导者共同建立了围绕容器格式和运行时的开放的工业化标准,即Open Container Initiative(OCI),OCI具体包含两个标准:运行...
2019-03-02 17:00:15
897
原创 密码学初学者可以理解的密码学库
区块链、加密货币、VPN、数字证书……这些概念的背后基石都是密码学,了解密码学的原理和经典实现方法对于学习理解前面的应用是大有裨益的。cryptoC 作为一个供密码学初学者入门的密码学库,实现了以下经典的密码系统:对称密码系统DES (DES 3-DES)AES公钥密码系统RSAECCMACSHA (SHA1 SHA512)MD5数字签名DSA大...
2019-03-02 16:58:54
695
原创 走进Linux内核网络 套接字的秘密—socket与sock
前言对于有过网络编程经验的人来说,一定听说过 socket 和套接字这两个概念。socket(),bind() , listen() accept(),send()。这些概念那么,究竟什么
2018-11-11 18:19:10
13437
3
原创 走进Linux内核网络 报文是什么—sk_buff
前言今天来聊下sk_buff,如果把内核网络协议栈比作一个人,那么sk_buff就是流淌在血管里
2018-11-05 18:08:33
941
原创 走进Linux内核网络 高屋建瓴—stack layer model
前言今天来说下协议栈模型。曾几何时,在大学课堂里的时候学TCP/IP这门课的时候,我其实并不能分清楚ISO/OSI分层模型和TCP/IP分层模型,只记得他们
2018-11-01 20:24:53
608
原创 走进Linux内核网络 序
前言很早就准备写这样一个系列,但是迟迟也没有动笔,一是因为这部分内容已经算比较成熟了,网上资料很多;二是因为还是担心自己水平不够误人子弟。但今天下定决心开始动笔,一是因为网络上的资料水平真的是良莠不齐,回想自己当初研究这块的时候,要想找到想要的答案真的要找很久;二是因为也不知道还会在这个领域工作多久,虽然没多大长进,但雁过留痕,给自己留下一点纪念也还不错…写作风格回想自己当初开始接触这部分的...
2018-10-27 16:32:07
312
原创 openVswitch 2.10.0 (OVS)源码分析 Vswitchd启动(下)
继续上一篇 Vswitchd启动(上)bridge 重配置bridge 平滑vswitchd启动时, bridge模块需要经过reconfigure使实际生效的配置与数据库中保持一致static void bridge_reconfigure(const struct ovsrec_open_vswitch *ovs_cfg){ /* Destroy "struct brid...
2018-10-24 19:57:39
1179
原创 Ubuntu 16.04 源码安装 openVswitch 2.10.0
环境Ubuntu 16.04内核版本 4.8.0-36-genericopenVswitch 2.10.0下载ovs代码# wget http://openvswitch.org/releases/openvswitch-2.10.0.tar.gz# tar -zxvf openvswitch-2.10.0.tar.gz安装必备的工具# apt-get install auto...
2018-10-19 13:05:34
1648
原创 openVswitch 2.10.0 (OVS)源码分析 内核flow子系统
OVS中, 内核模块datapath负责报文的处理和转发, 当它从一个接收端口(vport)收到报文后, 会提取报文中的字段, 查询流表(flow table)进行流匹配, 如果与其中一条flow匹配成功, 则执行flow中规定的动作(action), 如从另外某个vport转发, 这个过程如上面的Fast Path所示; 如果没有匹配上任何一条flow, 则将报文上送到用户空间, 如上图中的S...
2018-10-17 21:56:34
1110
原创 openVswitch 2.10.0 (OVS)源码分析 FlexArray
FlexArray 是什么FlexArray是ovs中内核模块openvswitch.ko中使用了一种数据结构, 意为灵活数组(Flexible Array)FlexArray 定义#define FLEX_ARRAY_BASE_SIZE PAGE_SIZE#define FLEX_ARRAY_PART_SIZE PAGE_SIZEstruct flex_array { unio...
2018-10-16 21:58:42
684
原创 openVswitch 2.10.0 (OVS) 总览
什么是OVS?Open vSwitch (OVS)是一个高质量的多层虚拟交换机, 支持主流的交换机功能, 包括常见二层协议(LACP, STP, LLDP, BFD)以及QoS流量控制等.而其最大的特点是支持OpenFlow, 可以作为交换机与其他控制器通过OpenFlow协议进行通信. Openflow定义了灵活的数据包处理动作, 使用者可以通过外部编程. 最终下发流表到交换机实现功能.OV...
2018-10-15 21:52:21
849
原创 Cisco思科网络插件Contiv (四) 网络策略实践
网络策略的作用Contiv可以通过网络策略来限制容器之间的访问行为,以实现用户对安全性的方面的要求。比如,我可以限制容器仅对源IP在特定范围的其他容器开放特定的端口,而拒绝其他IP地址的容器的访问。搭建过程环境准备参考Cisco思科网络插件Contiv (一) 环境部署搭建环境,由于本文并不关注Contiv网络的跨主机特性,因此只在一台宿主机上启动master进程和plugin进程就够了。...
2018-09-30 16:49:44
1800
2
原创 Cisco思科网络插件Contiv (三) Plugin 实现原理
Contiv网络结构上图为Contiv的网络模型,大体上可分为Master和Host Agent两个组件,其中Plugin运行在每台宿主机上, 主要负责1. 与Container Runtime交互实现插件逻辑. 2. 配置底层 open vswitch进程实现具体的网络功能....
2018-09-28 11:27:44
1584
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人