一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
网络协议系列 第1篇--网络分层,TCP/IP五层模型【掘金日新计划】
网络协议系列 第2篇--传输层工作原理【掘金日新计划】
网络协议系列 第3篇--TCP有哪些机制【掘金日新计划】
网络协议系列 第4篇--应用层HTTP发展史【掘金日新计划】
网络协议系列 第5篇--HTTPS原理【掘金日新计划】
网络协议系列 第6篇--网络协议串讲【掘金日新计划】
网络协议系列 第7篇--补充一些底层网络知识【掘金日新计划】
前言:每日革新自我、追求进步。积土而为山,积水而为海。
周尛先森
网络协议虽然是大家都应了解的基本知识,但网上很多相关文章总会忽略一些内容,没有阐明完整的逻辑脉络,我当年学习它的时候也废了挺大功夫。
网络分层、TCP协议、HTTPS中对称与非对称加密,除了了解“它是什么”,你是否有想过“为什么是它”?我认为理解了后者才真正理解了网络协议。
本文以问题的形式逐步展开,一步步揭开计算机网络的面纱,希望能帮助你彻底搞懂网络协议。
TCP是如何做到可靠交付?
在上一篇文章中讲到,TCP是可靠交付的,那他是怎么做到的呢。我们再来看看TCP包头有什么信息,或许能获取到一些关键信息。
通过查看包头信息,我们发现,TCP包头其中有两行(第二行和第三行),是用来存放序号的。在尽量压缩包头的情况下,序号还是占了两行,可想而知这两行的分量是多么重。原来TCP的可靠性很大程度依赖序号完成。
为了保证顺序性,每一个包都有一个标识。在建立连接的时候,会商定标识的初始值,然后按顺序一个一个包发送。同样对于每一个包,都会进行应答。为了记录所有发送的包和接收的包,TCP也需要发送端和接收端分别有缓存保存这些记录。发送端的缓存里是按照包的标识一个一个排列,根据处理的情况分成四部分:
第一部分 :发送并且已经确认的。
第二部分 :发送但是还没有确认的。
第三部分 :没有发送的,但是已经是等待发送。
第四部分 :没有发送的,并且暂时不会发送的。
发送端中的数据结构:
图1(图片来源于网络)
接收端中的数据结构:
图2(图片来源于网络)
确认与重发机制,中途丢包了怎么办?
假设,上图1中的5的ACK包丢失了,或者5这个包丢失了,这时候TCP会利用一种方法:超时重连,对每一个发送了,但是没有ACK的包,设置一个定时器,超过了一定的时间,就重新尝试。但是这个超市的时间不宜过短,时间必须大于往返时间RTT,否则会引起不必要的重传。也不宜过长,这样访问就变慢了。
发送包的过程中怎么做到流量控制?
TCP包头中携带有一个窗口大小,窗口大小的作用就是流量控制。发送方和接收方有可能两个设备性能不同,处理信息的能力也不同,所以窗口大小限制数据包的发送速度。滑动窗口可以看作成一条从左往右的滚动条,滚动条总长度就是所有数据内容,滚动条可拖动的部分就是窗口大小,可拖动部分就是正在发送但可能还没确认的数据包,可拖动部分的左边至滚动条开始是已经发送,并且已经确认的数据包,而右边则是未发送的数据包。
当数据包发送到接收端,接收端返回ACK,这个数据包才算传输完成,这时候滑动窗口就会向右移,移到最后一个发送已确认的数据包中,这样就能腾出新的位置给发送、接收方继续传输数据包了。
TCP 的拥塞控制主要来避免两种现象,包丢失和超时重传。一旦出现了这些现象就说明,发送速度太快了,要慢一点。
TCP的慢启动是如何工作的?
通过数据包守恒原则,我们知道可以通过ack来决定是否发送新的数据,而要收到ack就要先发送数据。慢启动就开始发送数据时的行为控制。慢启动的总体思路就是从一个很低的初始值开始,逐渐增加数据发送的速度,直到达到超时或者丢包为止。慢启动的工作流程为:每个链接维护一个变量congestion window,当链接刚建立或者遇到丢包市,把这个变量congestion window设置为1,当收到一个新的ACK时,congestion window加1。可以预见,在没有出现超时或者丢包时,慢启动增长的速度是指数级的,所以慢启动实际上并没有那么“慢”,“慢”是慢在它的起点只有1个MSS。
小结
我们从TCP的顺序问题、丢包问题、流量控制入手,介绍了TCP滑动窗口原理,拥塞控制问题,流量控制问题。
最后,让我们一起加油吧!
都看到这了,不如顺手点个赞再走 ( *ˇωˇ* )