自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

TCP/IP

TCP, QUIC 传输优化

  • 博客(2358)
  • 资源 (4)
  • 收藏
  • 关注

原创 现代互联网的TCP拥塞控制(CC)算法评谈

动机写这篇文章本质上的动机是因为前天发了一个朋友圈,见最后的写在最后,但实际上,我早就想总结总结TCP拥塞控制算法点点滴滴了,上周总结了一张图,这周接着那些,写点文字。前些天,Linux中国微信公众号推了一篇文章,上班路上仔细阅读了一下,感受颇深,一方面由于此文说出了很多我想表达却苦于组织语言的观点,另一方面,此文表达了一些我没能认识到的事实,整个一天的时间,我都在思考此文的字词句,我想写...

2018-08-25 08:53:00 11925 8

原创 TCP FIN_WAIT1状态的实验和验收

本文纯属实践和验证。请先阅读下面的文章: 一个有趣的实验—tcp发送缓冲区满, 然后杀掉进程(处于FIN_WAIT1状态), 接收端是无感知的。https://blog.csdn.net/stpeace/article/details/75225733如果你知道其中的缘由,那么本文就不必读了,读过你不知道,请务必花10分钟左右的时间熟读本文。其实以上的文章除了做了一个实验之外,什...

2018-08-19 07:32:48 6972

原创 总结一幅TCP/QUIC拥塞控制(CC)算法的图示

本来这周不想写任何技术方面的文章的,因为小小从欧洲旅行回来了,想听听我最喜欢的欧洲的风土人情,顺便自己也轻松地度个周末…无奈小小回来后依然沉浸在美好的旅行生活,也没跟我们说几句话…还好,给我带了两瓶洋酒…周六的晚上,我八点不到就睡着了,周日早上,也就是就是今天,四点不到就起来了,实在是睡不着,又没有事做,只能写点技术方面的东西,希望能帮到需要的人,又不想打字,那就画图吧…本图包含TCP...

2018-08-19 07:16:45 10475 2

原创 TCP在FIN_WAIT1状态到底能持续多久以及TCP假连接问题

近期遇到一个问题,简单点说,主机A上显示一条ESTABLISHED状态的TCP连接到主机B,而主机B上却没有任何关于主机A的连接信息,经查明,这是由于主机A和主机B的发送/接收缓冲区差异巨大,导致主机B进程退出后,主机A暂时憋住,主机B频繁发送零窗口探测,FIN_WAIT1状态超时,进而连接被销毁,然而主机A并不知情导致。正好昨天也有人咨询另外一个类似的问题,那么就抽昨晚和今天早上的时间,写一...

2018-08-16 08:52:35 43708 6

原创 Linux TCP Finwait2/Timewait状态要义浅析

我讨厌TCP。但是我的工作中总是要接触TCP! 近期三四个礼拜,接连碰到三三两两TCP的问题,这些都无关拥塞控制,这些都是状态机方面的问题,但无论怎样,我是非常讨厌的,以至于恶心,我释放大量的感情色彩在TCP协议…但这不能否认我对TCP的理解以及对其性情的掌握已经超出了大多数人,我在咒骂中成长。我咒骂着TCP,同时也可能被别人鄙视着…那就来吧。本周本来不想写技术文章的,很多的pendin...

2018-08-11 08:37:17 8774

原创 TCP拥塞控制(CC),让我不得开心颜

如题:TCP拥塞控制,让我不得开心颜!!你想让你的TCP连接更快吗?必须想!你有什么办法?没有!我告诉你,你想依靠修改或者创造一个TCP拥塞控制算法来达到加速的目的,你错了,大错特错了,拥塞控制算法不是干这个的,这是不可能的!我告诉你,你要是想加速你的TCP传输速率,你必须更改你的TCP拥塞状态机!拥塞控制,即CC(Congestion Control),不可能让你的连...

2018-08-04 15:16:57 6901

原创 再谈过时且脆弱的TCP长肥管道三宗罪!

上周的周中,为了回答一位网友的问题,又写了一篇文章(这已经是继TCP FINWAIT2的解释之后接力而写的第四篇了…): 从TCP长肥管道的窗口打开慢的问题看TCP中继的意义:https://blog.csdn.net/dog250/article/details/81295639其中主要提及了TCP长肥管道(长肥管道即一种BDP的特征)窗口打开慢问题以及一个优化方案。该文在某日早上分享...

2018-08-04 06:50:55 8194 2

原创 从TCP长肥管道的窗口打开慢的问题看TCP中继的意义

在经典的《TCP/IP详解(卷1)》中,作者提到了长肥管道,请先细读相关章节。请注意,这本书成书已经二十年,当时的带宽是很低的,假设只有16Mbps,RTT为1个单位,带宽换算成字节的话大概就是2MBps,简单地按照十进制换算,记为2000000Bps,我们假设TCP的段长为1000字节,初始拥塞窗口为1个段,那么按照慢启动原理,需要经过多少个RTT才能填满这2MBps的带宽呢?设需要RR...

2018-08-01 08:53:28 10281 2

原创 知乎上的一个问题,TCP in TCP隧道为什么不好

周六晚上本来是想把遗留的BBC六集纪录片《古罗马-一个帝国的盛衰》最后一集看完的,可是想起一件事还没有总结,就先搁置一下,待我先说事。我一般不刷知乎的,上周有一天下班的路上,坐在公交车的最后一排实在没有什么好玩的了,刷了一会儿知乎,发现了一个问题: 为什么p2p模式的tunnel底层通常用udp而不是tcp?:https://www.zhihu.com/question/39382183...

2018-07-28 23:00:28 12733 8

原创 一个TCP FIN_WAIT2状态细节引发的感慨

昨天下午跟同事讨论TCP挥手断开的细节,越发感到TCP协议真的是非常令人讨厌,这个协议已经成了人们装逼的谈资,就是因为它非常复杂,且毫无确定性可言!如果你能说出它的任何细节方面的前因后果,那你一定就是牛人了,但这其实毫无意义。如果你阅读TCP的诸多RFC,然后对比着4.4 BSD,Linux,Windows的实现,手边再放一本那被捧为圣经的《TCP/IP详解(卷1)》,你会发现太多类似下面的措...

2018-07-28 08:14:15 42444 18

原创 从2-3树到红黑树,B/B+/B*树,唉!

又跟人讨论起了红黑树…于是就又扯到了2-3树,顺便再聊一聊B树…二叉树就是2树; 三叉树就是2-3树; 四叉树就是2-3-4树; 五叉树就是2-3-4-5树; … NNN叉树就是2-3-4-…NNN树; 唉…其实,所谓的数据结构里的树,归根结底就是上面这些。然而,要想表现高逼格,总是离不开一些复杂的概念,比如红黑树,比如B+树,比如B*树…很早以前,我写过一篇文章,...

2018-07-24 09:08:31 10151 2

原创 来自Google持续更新中的TCP BBR v2.0最新进展

昨晚,Google Groups “BBR Development” group发出了一个topic,我早上醒来才看到,大致扫了一眼,这又是BBR进化史上的一个里程碑。先给出slides链接:**BBR Congestion Control Work at Google IETF 102 Update**s:https://datatracker.ietf.org/meeting/102...

2018-07-21 17:03:48 24901

原创 简单说说容器/沙盒(Sandbox)以及Linux seccomp

如果应用程序逻辑有误,会造成操作系统崩溃… 这句话其实不对。如果一个应用程序都能让一个操作系统崩溃了,那这一定是这个系统在设计上或者实现上的BUG!再次重申,我不知道谭浩强的C语言教材现在是怎么讲的,但是至少在15年前,很多老师都会说访问空指针会造成操作系统崩溃,这在32位虚拟内存的系统中是错误的。虽然一个应用程序不能让一个正常的现代操作系统崩溃,但是它却可以对操作系统的运行环境造成巨大...

2018-07-20 08:19:06 19448

原创 Linux Macvlan的虚拟网卡与宿主物理网卡之间的Bridge通信问题

周末的时候写了一篇关于Docker底层支撑技术的文章: 以firejail sandbox解析Docker核心原理依赖的四件套:https://blog.csdn.net/dog250/article/details/81025071 获得了一些反响,总结下来就三点: 1. 确实这四件套支撑了很多的容器技术; 2. 唱衰Docker以及OverlayFS,Cgroup,NS这些,以为它们违...

2018-07-17 08:47:04 17900 1

原创 以firejail sandbox解析Docker核心原理依赖的四件套

Docker大红大紫之时,我错过了什么,可能是因为我并没有必须使用Docker的动机,毕竟我不是编程者,我可是一个典型的实用主义者,也可以理解为消费主义,我从来不学习那些当前自己并不需要的东西。但是近期用到Docker了,总要记录以备忘,就趁着下雨写下本文。OK,接下来的时间属于Docker。本文并不会详细描述Docker的用法,本文的目的是解析Docker得以成型所依托的核心组件原理,以...

2018-07-14 07:59:34 16999 3

原创 系统崩溃,TCP协议栈

上学那会儿,学的是谭浩强的C语言教材,书里说“访问空指针会造成系统崩溃”。我记得大学老师讲到这里的时候,我就会较真儿什么是系统崩溃,老师便告诉我,访问任意指针,系统的行为将会是未知的,访问空指针系统会直接崩溃,我再问什么是系统,如何崩溃的时候,老师说,系统就是操作系统,崩溃就是蓝屏,司机之类的,反正就是系统不能继续用了…那是2003年左右,Windows XP系统刚刚发布不到两年,大红大紫之时...

2018-07-08 18:41:30 12982 1

原创 从Telnet到TCP,从HTTP2.0到QUIC

前序好久没有写软文了,这是一篇软文。软文,在普通人眼里,就是广告,但从专业的角度看,就是没有技术含量的宣传性文章,一般都是穿西装皮鞋的经理喜欢写这种东西,其实你问他们技术细节他们根本就不懂,但是他们嘴里却能像弹珠一样吧嗒吧嗒地扯五个小时…五个小时的内容,就是软文(这是我的定义)。然而,在中国,现实是,写软文的或者吧嗒吧嗒五个小时的人赚钱会比温州皮鞋厂老板这种纯工程师,这种talk is...

2018-07-07 08:37:18 14121

原创 QUIC协议是如何做到0RTT加密传输的(addons)

QUIC作为HTTP2.0形成草案,提上日程以来最重要的(我认为是最重要的,如果你非要说TCP,就当我什么都没说)传输协议,它有很多可以快速秒掉TCP的特质,本文来介绍其中一个,即0RTT。首先解释一下什么是0RTT。所谓的0RTT就是,通信双方发起通信连接时,第一个数据包便可以携带有效的业务数据。而我们知道,这个使用传统的TCP是完全不可能的,除非你使能了TCP Fast Open特...

2018-07-06 08:51:46 34066 17

原创 原教旨主义的TCP BBR初始pacing rate计算

首先看看下面的tcptrace图:我的配置如下:初始窗口:4 mss拥塞控制算法:BBRqdisc:fq有原教旨般洁癖的看到那个silence gap是什么感觉?是不是想填掉它?这一点和只要是常量就有人想改它相反(对于常量,原教旨主义者往往需要一种数学上的诠释和推导)…对于这个gap,我的意思就是,为了bbr启动曲线的优美平滑无毛刺,初始的pacing rate不再乘以...

2018-06-30 07:45:07 18200

原创 再谈Linux epoll惊群问题的原因和解决方案

差别是什么?差别只是西装!缘起近期排查了一个问题,epoll惊群的问题,起初我并不认为这是惊群导致,因为从现象上看,只是体现了CPU不均衡。一共fork了20个Server进程,在请求负载中等的时候,有三四个Server进程呈现出比较高的CPU利用率,其余的Server进程的CPU利用率都是非常低。中断,软中断都是均衡的,网卡RSS和CPU之间进行了bind之后依然如故,既然系统层面查...

2018-06-29 08:49:24 31359 19

原创 TCP BBR Startup gain计算总结和Startup失速问题

浙江温州皮鞋湿!在前面几篇文章中,我采用纯数学的方式推导了TCP BBR Startup gain的由来,本文将通过一个BBR动力学模型对Startup gain的值做出直观地解释。BBR动力学模型BBR的动力学模型很简单,即:send_rate(t)=gain×Delivery_rate(t−1)send_rate(t)=gain×Delivery_rate(t−1)send...

2018-06-23 08:08:51 13328 5

原创 TCP BBR之Startup gain的另一种推导法以及最新进展

自从上周有个大半夜帮温州皮鞋厂老板计算了那个2ln22ln⁡2\displaystyle\frac{2}{\ln2}之后,就着这个问题又进行了一些思考,过程中非常感谢BBR的作者之一Neal Cardwell,帮忙解释了很多的细节并同时放出了关于BBR Startup gain的最新模型,看这里: https://github.com/google/bbr/tree/master/Documen...

2018-06-21 08:25:16 13924

原创 设计一个对向车道的左转待转区提高十字路口的并行通行率

浙江温州皮鞋湿。我是一个非常讨厌拥堵人,嗯,谁都讨厌,但是我的这种厌恶之感已经影响严重影响到了我的作息时间,加上我同意讨厌太阳,所以说我一般早上七点左右就到公司上班了,下午没要紧事的话我必须五点五十前离开公司,我必须在所有人都动起来之前,提前行动!但是能不能让早晚高峰期的交通网络更加畅通一些呢?显然,很难。不过只要心里能时刻想着如何来优化这个网络,心情总不至于太糟糕,假期里太阳高挂,非...

2018-06-17 08:15:08 6703

原创 再聊TCP BBR的2/ln2 bbr_high_gain问题

嗯,确实还真有人看了我在雨夜写的上一篇文章: BBR的startup gain为什么是2/ln2?:https://blog.csdn.net/dog250/article/details/80660091 并且提出了问题。我就再写一篇文字解释一下这些问题。 问题1: init_cwnd×2n=cwndinit_cwnd×2n=cwndinit\_cwnd×2^n=cwnd对nnn求导...

2018-06-14 08:33:20 12461

原创 TCP BBR的startup bbr_high_gain为什么是2/ln2?

温州老板上周就一直在问这个。f(RTT)=2RTTf(RTT)=2RTTf(RTT)=2^{RTT}可以抽象成:f(x)=2xf(x)=2xf(x)=2^x假设在第nnn个RTTRTTRTT时其PacingRate是R0×2nR0×2nR_0\times 2^n,那么在下一个RTTRTTRTT,即n+1n+1n+1个RTTRTTRTT时,它的PacingRate就会变成R0×2n+...

2018-06-13 04:56:10 14537

原创 闲来无事看两个好玩的C语言面试题

昨天最后一天工作日,让我碰到了两个有意思的C语言编程问题,周末前权当轻松一下,挺有意思就过去了,因为今晚雨夜通宵,就把它们记录了下来。事件1:关于结构体对齐和packed属性下午跟同事下楼抽烟,聊到一个有意思的问题,不讲故事了,直接看问题:#include <stdio.h>#include <stdlib.h>#include <string.h&...

2018-06-09 04:29:02 14666 4

原创 让人们久等了的TCP BBR v2.0快要出炉了!

这是连续的第四个雨夜了,这几天暴雨我几乎每晚都半通宵,晚上10点半左右睡觉,然后1点多就会醒来,听雨作文,无视并嘲笑着蚊子和飞机。雨季来得晚了些,但却是猛的,我知道本周这可能是最后的雨夜了,所以我必须在这夜里写点东西或者做点事情,正好今天看到了bbr-dev list上的一篇topic,觉得有益,就想把它写下来,也就有了本文。正文2016年9月份,Google放出了其研究测试了...

2018-06-09 03:21:17 55428 9

原创 从CPU cache一致性的角度看Linux spinlock的不可伸缩性(non-scalable)

凌晨一点半的深圳雨夜: 引用上一篇文章: 优化多核CPU的TCP新建连接性能–重排spinlock:https://blog.csdn.net/dog250/article/details/80575731 在这篇文章中,我将一个spinlock拆解成了per cpu的,然而并没有提及spinlock本身的性能和可伸缩性(scalable),那么本文就来说一下。一点说明正...

2018-06-07 03:26:05 17193 5

原创 优化多核CPU的TCP新建连接性能--重排spinlock

2018/06/05 凌晨,雨夜! 迟到的雨,还是来了!人们几乎已经逼近了单CPU的处理时延极限,于是人们希望通过多CPU的方式来提高处理带宽,从而得到更多的处理容量,理论上讲,这无可厚非,但现实中,这太难了。几乎所有上世纪70年代以来的操作系统都不是为多核CPU并行编程而设计的,因此当它们遇到多核CPU的各种问题时,无一不是东填西补,最终情况依然不容乐观。这里说一个典型的,就是Li...

2018-06-05 09:21:45 7531 5

原创 TCP/IP协议栈到底是内核态的好还是用户态的好?

“TCP/IP协议栈到底是内核态的好还是用户态的好?”这根本就是一个错误的问题,问题的根源在于,干嘛非要这么刻意地去区分什么内核态和用户态。引子为了不让本人成为干巴巴的说教,在文章开头,我以一个实例分析开始。最近一段时间,我几乎每天深夜都在做一件事,对比mtcp,Linux内核协议栈的收包处理和TCP新建连接的性能,同时还了解了一下腾讯的F-Stack。这里指明,我的mtcp使...

2018-06-02 08:10:51 17557 3

原创 关于TCP同时打开-无需Listener的TCP连接建立过程

六一儿童节的大清早,竟然用这么一篇技术博客来总结童真,也挺好。我把早上的发的朋友圈文字附于文后,以应景。周中写了一篇关于socket查找的文章,次日,也就是昨天上午,收到一封反馈邮件,好快,十分高兴能和大家一起进行技术讨论。在这封邮件里,一位朋友提出了一种查询socket的优化方案,瞄准的是__inet_lookup函数,我以3.10内核为例,将该函数贴如下:static inli...

2018-06-01 07:59:33 16285 4

原创 Linux socket hash查找的持续优化历程

最新的Linux 4.17内核为TCP Listener socket的查找增加了一个2nd hash,这大大提升了协议栈收到连接建立请求包时查询Listener socket的效率。我们先从下面的汇总中管中窥豹:https://lkml.org/lkml/2018/1/31/589: 4) Add a 2nd listener hash table for TCP, similar to...

2018-05-30 08:19:04 7209 6

原创 关于Linux UDP/TCP reuseport 二三事

聊到reuseport,大致要从四年前说起。OpenVPN-以往的故事当时要优化OpenVPN的并发性能,了解到socket有一个reuseport特性,于是非常兴奋,本着拿来主义的想法,无非就是在OpenVPN的源码里加一个setsockopt吧…我们当时基于Linux 2.6.32开发,无奈并没有实现这个特性,后来的版本也只是实现了reuseport热备份模式,并没有实现负载均衡模...

2018-05-26 08:19:23 23962 7

原创 关于TUN/TAP网卡二三事以及物理网卡Ring buffer

初识TUN/TAP虚拟网卡是因为OpenVPN,至今已有八个年头了,后来断断续续跟这块网卡打交道,从OpenVPN,到用户态协议栈,再到packetdrill。不管怎么说,我觉得这块虚拟网卡是那种可以让人眼前一亮的东西,小巧,简单,用它可以做很多比较复杂的事情。  也因此,我曾经几乎没有关注过它的性能。随它去吧,毕竟就这么个小东西,怎么指望它能匹敌那些个物理网卡,正如没人会指望netcat跑出...

2018-05-25 05:31:51 18121 6

原创 架构决定可扩展性--重排和压缩/分组交换网

最近跟朋友又聊起我对iptables规则的重排优化,同时就想到了压缩。重排和压缩按照matches重排而不是按照rule排列规则,这便可以将一系列线性的规则组织成一棵查找树,差别是什么?差别就是定位规则的时间变短了,同时代价重排后的规则集占用的空间变大了,毕竟我们进行了小区间的细分。  再来看另一种重排,Nginx对Apache的HTTP逻辑执行顺序进行了重排,按照流水线阶段分配C...

2018-05-20 07:38:55 13519 2

原创 架构决定可扩展性--聊聊用户态协议栈的意义

嗯,很多人都是DPDK粉,所以不能得罪。就像我只要一写编程者怎么怎么地就会得到一堆踩一样,我不得罪群体。

2018-05-19 06:30:26 19157 2

原创 Linux系统下深究一个malloc/brk/sbrk新内存后的page fault问题

有耳可听的,就应当听 —《马可福音》周四的休假团建又没有去,不因别的,只因年前东北行休假太多了,想缓缓…不过真实原因也确实因为假期剩余无几了…思考了一些问题,写下本文。  本文的缘起来自于和同事讨论一个关于缺页中断按需调页的讨论。真可谓是三人行必有我师,最近经常能从一些随意的比划或招架中悟出一丝意义,所以非常感谢周围的信息输出者!甚至从小小学校全员禁言的作业群里,我都能每天重温一...

2018-05-18 16:49:59 24657 13

原创 非常有意思的Flowlet

周五了解到一个叫做Flowlet的东西,比较有意思。大体上说来,它是由一个问题而引出的一个解决方案,由于理解还不够深入,所以也暂时只能这么说。  我先从问题说起。ISP的动态负载均衡由于公共骨干网上流量的不确定性,每一条链路的负载不尽相同,为了保证总带宽的最佳利用率,ISP往往会做一些动态负载均衡的策略。如下图所示:时刻1: 时刻2: packet负载均衡和flow负...

2018-05-12 10:41:01 24606 9

原创 六度分隔,邓巴数和幂律如何主宰我们的社交网络

在研究社交网络的时候,首先要知道社交网络是一种无标度网络,而无标度网络受幂律的控制,这个要作为基本前提。  接下来,我们来看一下什么是六度分隔。  六度分隔说的是,你只需要经由最多6个人,就能联系到世界上任何地方的任何其它人。注意,仅仅是通过6个人建立联系,而这并不意味着你们可以通过6个人成为亲密的朋友…抛开个人情感因素,就把每一个人当成一个节点,世界上除了那些与世隔绝的部落之外,所有人会...

2018-05-09 08:31:18 10741 1

原创 简单的算法编程题-任意段落按照单词逆序输出

把这个问题抛给温州皮鞋厂老板,老板直接就说这个题目的本意是让你提出stack的解决方案。  what?stack?too low!  因为这么个问题还要实现一个stack有点场面大了,事实上谁不知道你把一个个单词push进去,然后再pop出来不就好了吗?所以说stack方案太通用,不足挂齿。…周末没事干时折腾点此类问题,没有错,错在拉开蚊帐睡觉时吵醒疯子和小小,事情偶尔会变严重。  另...

2018-05-06 02:15:03 13774 2

一个iptables的stateless NAT模块实现

如果你在寻找Linux上配置诸如Cisco设备上的static双向NAT的方法,这个或许就是你想要的; what?你觉得它完不成PAT?是的,它不行。但是想做PAT为何不使用现有的iptables实现呢?它可以自动为你解决元组唯一性问题。不要从概念上分析,事实上,static双向NAT是完全对称的,一对一的 ,也只有在BOX两边的网络在拓扑级别是完全对等的情形下,这种NAT或许才是有用的,Cisco设备经常处在这样的位置,比如一个很大的stub节点的出口位置,比如两个domain的中间位置... 我将名字取为STATIC-2-WAY-NAT,比较长也比较怪,完全不符合UNIX的小写短名传统,我的想法是:这样可以少写很多的帮助信息,因为名字就是自解释的。

2014-12-27

模块化的nf-HiPAC

原版的nf-hipac需要为内核打patch,且只支持较低版本的内核,构建起来相对比较麻烦。 模块化后的nf-hipac可以直接作为内核可加载模块编译,且适配了高版本的Linux内核。为了移植工作简化,去掉了和iptables模块的联动支持!

2014-11-21

关于linux内核以及其他个人体会的文集

本文集是我用将近两年的时间写成的,大多数文章是关于linux内核的,另外还有一些我自己对计算机的理解,还有一些历史,音乐方面的东西。适合于对linux内核思想感兴趣的阅读,文章偏重于对于思想的理解。

2009-09-07

配置文件还有一些other

代码和配置iptables配置文件,还有一些别的东西

2010-04-16

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除