来源
后端技术指南针
头图
CSDN付费下载自视觉中国
先唠唠嗑
在正式开始文章技术点之前,想先聊一下我对面试中的TCP/IP问题的一些拙见,希望对盆友们有所帮助。
在招聘岗位描述中,几乎必然有一条熟悉、掌握、精通TCP/IP协议、Http协议、网络编程技术。
对于我们求职者来说,肯定知道的越多越好,但是就像过日子一样钱要花在刀刃上,准备面试也是一样的,我们该怎么准备这部分呢?
我个人认为合理的优先级排序是:网络编程技术Http协议TCP/IP协议热点问题TCP/IP协议普通问题。
从面试官的角度来说,面试中还是要注重实战,问一些边边角角的细节或者自己平时遇到的奇怪问题,并不能探测出侯选人的边界,反而让侯选人觉得这个面试官抓不住重点。
有时候遇到一些侯选人说自己哪块掌握的比较好,那可以交流一下,比如之前遇到侯选人说自己读过Redis源码,顿时让我很有兴趣,简单了解了对方阅读的版本之后,就开始切磋,很快就可以探测出侯选人的所说的Redis源码边界。
回到网络这块,C/C++的话轮子比较少,有时候需要自己搞一个Socket写个小型的服务端或者客户端,像Python/Go这些语言做的已经非常好了,可能不到5行一个简单的echo服务就跑起来了。因为之前自己是写C++服务端的,回忆起第一次用Python的Tornado框架写服务,着实被惊艳了,开发速度着实很快,性能也很不错。
说这个的目的在于,如果对于时间紧任务重的求职者就不要胡子眉毛一把抓,抓几个重点问题好好理解一下就可以了,如果真遇到问边角问题的面试,那也不必懊恼,可能大概率以后共事脑回路也不一样,还是相忘于江湖比较好。
在掌握一些重点问题的面试套路和回答之后,还是建议去深入了解一些这些技术细节,更多的是去培养和锻炼我们思考问题的方法和意识,之前在知乎就有这样的问题,就像研究往年的高考题一样,我们去思考TCP/IP在发展过程中的问题以及解决方案,并且当前存在的瓶颈作出自己的判断和思考,都是很有益的。
我想这也是打开TCP/IP的正确方式吧:实战派和训练思维派。
今天和大家一起学习下TCP/IP中的热点问题:拥塞控制。本文本着实战和思维训练兼顾的原则将从以下几个方面展开:
拥塞控制的算法策略分类拥塞控制出现的意义和目的实现拥塞控制的几种算法和侧重点拥塞控制的主要过程和关键点BBR算法的一些原理和思路
我和TCP/IP协议
我在5年前研究生刚毕业的时候,在一家做深度包检测DPI的公司待了差不多两年,可能读者要问啥是深度包检测?
简单提一下哈,深度包检测DPI(DeepPacketInspection)就是识别TCP/IP网络协议中各种各样的报文,来进行流量管控和分析,在网络安全领域应用很多,属于通信互联网领域的交叉业务。
整个DPI系统是非常复杂的,目前业界有硬件DPI和软件DPI两种主流类型,硬件的吞吐量大造价也高,软件的比较灵活成本也相对低廉。
当时每天的工作就是抓包分析、用C++写业务插件来处理各种丢包/乱序/重传问题等等,有时候业务需要还要单独开发wireshark的插件来解析自定义的报文。
现在看看这份工作开启了我和TCP/IP协议网络的友谊之门。
在刚毕业前3年换工作的时候,几乎总会被问到TCP/IP协议的一些东西,碰到一些专业人士问的就比较深入,好在近两年的经验让这些问题基本都在射程之内。
所以经历都是财富,好好学一下,说不准哪天就派上用场了呢。
走心推荐
TCP/IP协议是一个协议族,如果真的非常感兴趣或者工作需要建议直接卷一卷二卷三,但是对于大多数读者来说,应付面试或者平时排查问题掌握一些重点内容也就够了。
TCP/IP详解的三本书译文难免失真,有决心和兴趣的同学可以搞几本英文原版的,这是豆瓣读书上的一些评分:
聊聊拥塞控制算法
我们知道TCP/IP协议栈是一个简化的分层模型,是互联网世界连接一切的基石,一起来看一张七层模型vs四层模型的简图:
看到一篇文章说到TCP拥塞控制算法并不是简单的计算机网络的概念,也属于控制论范畴,感觉这个观点很道理。
TCP拥塞控制算法的目的可以简单概括为:公平竞争、充分利用网络带宽、降低网络延时、优化用户体验,然而就目前而言要实现这些目标就难免有权衡和取舍。
但是现在的网络通信基础设施水平一直在飞速提高,相信在未来的某个时间点这些目标都可以达到,小孩子才选择,我们大人全都要!
算法演进
在理解拥塞控制算法之前我们需要明确一个核心的思想:闻道有先后术业有专攻,笔者觉得这是一个非常重要的共识问题,把A踩在泥土里,把B吹捧到天上去,都不是很好的做法。
实际的网络环境十分复杂并且变化很快,并没有哪个拥塞控制算法可以全部搞定,每一种算法都有自己的特定和适用领域,每种算法都是对几个关键点的权衡,在无法兼得的条件下有的算法选择带宽利用率,有的算法选择通信延时等等。
在明确这个共识问题之后,我们对待各个拥塞控制算法的态度要平和一些,不要偏激地认为谁就是最好,几十年前的网络状况和现在是截然不同的,我们永远都是站在巨人的肩膀之上的,这也是科学和文明进步的推动力。
算法分类
传统拥塞控制算法并不是一蹴而就的,复杂的网络环境和用户的高要求推动着拥塞控制算法的优化和迭代,我们看下基于丢包策略的传统拥塞控制算法的几个迭代版本,如图所示:
与此同时还有一类算法是基于RTT延时策略来进行控制的,但是这类算法在发包速率上可能不够激进,竞争性能不如其他算法,因此在共享网络带宽时有失公平性,但是算法速率曲线却是很平滑。
4.1流量控制和拥塞控制
大约在年之前TCP/IP是没有拥塞控制的,但是随着网络接入规模的发展之前仅有的端到端窗口控制已经无法满足要求,在年引发大规模网络瘫痪,此时就要提到一个重量级人物:VanJacobson范·雅各布森。
这位力挽狂澜的人物入选了计算机名人堂InternetHallofFame,VanJacobson大神提出并设计实施了TCP/IP拥塞控制,解决了当时最大的问题,来简单看下VanJacobson的维基百科简介(笔者做了部分删减):
范·雅各布森VanJacobson是目前作为互联网技术基础的TCP/IP协议栈的主要起草者,他以其在网络性能的提升和优化的开创性成就而闻名。
年8月,他加入了帕洛阿尔托研究中心担任研究员,并在位于相邻的施乐建筑群的PacketDesign公司担任首席科学家。在此之前,他曾是思科系统公司首席科学家,并在位于劳伦斯伯克利国家实验室的网络研究小组任领导者。
范·雅各布森因为在提高IP网络性能提升和优化所作的工作而为人们所知,到年间,他重新设计了TCP/IP的流控制算法(Jacobson算法),他因设计了RFC中的TCP/IP头压缩协议即范·雅各布森TCP/IP头压缩协议而广为人知。此外他也曾与他人合作设计了一些被广泛使用的网络诊断工具,如traceroute,pathchar以及tcpdump。
范·雅各布森于年4月入选第一批计算机名人堂,计算机名人堂简介: