如何保证网络传输的可靠性?

多点头发,少点代码git

本文已经收录至个人GitHub,欢迎你们踊跃star 和 issues。github

https://github.com/midou-tech/articles面试

唠叨几句

前几天在群里问了下你们最近春招的状态。算法

若是你还在参加春招,不论是社招仍是校招。龙叔都想唠叨几句,今年总体经济形势不好,可能有些人还没意识到有多差,但我相信不少人都能感觉到。不少公司入不敷出,基本都在裁人和压缩成本,不少公司把原来的扩张计划改为了活下去缓存

正在找工做的各位,不可对市场预期过高,不要感受我专业的学长学姐都是非bat不进的,如今市场供求关系变了,需求变得愈来愈少了,供给却一直在增长,找工做的你也应该调整本身的预期。固然好能力的人仍是会非bat不去的,但很重要的点是 好能力,但不可能人人都是好能力的,因此你要有正确的内心预期和不断的打磨本身的能力。安全

准备跳槽的你也必定要思考清楚在跳,之前每一年都是金三银四跳槽季。今年,听到几个准备跳槽的学长说,好多公司都是象征性的面面,根本不发offer。微信

顺便说一下什么叫象征性的面面,公司是对外的,公司无论在何时都会招人的,若是你看到一个公司的对外网站不招人了,基本说明该公司凉了。除非真的倒闭,通常状况下公司都会在官网放出招聘信息,可是真的在招人么?网络

因此就有了面了好多就是不过,面的也很是好,就是不发offer。若是是这样,不是你不行,是市场不行。若是有个公司真心要你,就好好珍惜吧。数据结构

行了,龙叔就唠叨这么多,接下来上干货。今天主要说TCP的可靠性问题,包括一些重点面试题。架构

正文

计算机网络知识在面试中可算是继数据结构以后问的最为频繁的了。龙叔对这块的知识很是重视,由此校招的时候但是没少被面试官夸,这也是龙叔拿了20几个offer中一个不可或缺的因素。

以前讲了计算机网络的体系架构 计算机网络五层结构的解析TCP粘包问题怎么解流量控制&拥塞控制 (戳我便可看到该文章喔)。

今天再讲讲TCP的可靠性问题,网络里面的重要知识点基本都说完了,要是还有什么不懂那就后台获取龙叔微信,悄咪咪的暗示下龙叔。

可靠性很好理解吧,就是可靠。什么是可靠?咱们常常听到老师说某某同窗很靠谱,同窗之间会说谁谁很靠谱,在社会上领导也会很喜欢那些靠谱的下属,老板喜欢靠谱的员工。靠谱就是交代的事情都能如期、保质的完成。

TCP的功能是交付数据,因此TCP的可靠就是保证每次数据按序、按时、不丢数据,顺利的交付给对端。

龙叔必须说清楚一件事情,可靠不等于安全,TCP尽最大可能的保证数据可靠性,可是没有任何措施保证数据的安全性。所谓安全就是你的数据不会被别人看到或者窃取到,TCP上的数据是明文传输的。

TCP如何保证可靠性

TCP是一种可靠传输协议,到底如何保证可靠性呢?TCP协议里面有以下几种机制去保证

1、字节编号机制

编号机制很好理解,就是给TCP的数据段里面的数据部分 ,每一个字节都进行编号。

为何须要编号?

好说,就是为了更清楚的接收和发送。TCP数据是按序的,接收完以后按序组装好,才会交付给上层。

平常生活中也常常遇到这样的状况,你去银行还不得在门口取个号,先取号的先办理,既保证处理事情不乱,也不用你们站着长长的队,叫到号就是你。

2、数据段的确认机制

也就是咱们经常听到的确认应答机制,一问一答,保证问的问题,对方必定接收到,若是确实没有接收到就会重复去问。

TCP确认应答就是每个数据段发送都会收到接收端返回的一个确认号,收到的确认号表示该号前面的数据所有接收。

确认应答机制里面有几个重要的问题,也是面试高频问题,龙叔必须唠叨几句。

  1. TCP能够一次连续发送多个数据段

TCP能够连续发送多个数据段,具体发送数据段的多少取决于对方返回的窗口大小。只要知足窗口大小可容纳,Negale 算法处于关闭状态就能够连续发送多个数据段。

  1. 仅对连续接受的数据段进行确认

假设你发送了数据段序号为10一、20一、30一、40一、50一、601,接收端接收到了10一、20一、501,此时接收端只会返回201的确认,不会返回501确认,由于301和401还没接收到。当收到301和401以后才会返回501的确认(在不超时的状况下)。

  1. 不连续序号的数据先缓存下来

如上面的例子,接收端收到10一、20一、501,此时501不能被确认,由于有不连续的数据,可是501的会被缓存在本地,后面收到30一、401当即返回501的确认。

3、TCP的超时重传机制

前面两条都是预防和减小出错,超时重传机制是保证TCP在传输过程当中数据丢失了一个回复措施。所以超时重传机制是保证可靠性很重要的机制。

每发送一个TCP数据段都会启动一个超时重传计时器(Retransmission Timer,RTT)。若是在计时器时间内没有收到确认应答号,会启动重传,从新发送该数据段。

这里面还有个点,TCP每发送一个数据段不是马上把该数据段从缓冲区删除的,收到确认应答之后才会从发送队列丢掉。

超时重传原理看起来比较简单,重传的步骤也比较简单,其实也就是如此简单。有一个难的点是,超时重传计时器的时间是一个很复杂的问题。

表面看起来很简单,不就是一次数据发送到出去到接收端收到消息的时间*2么?

事情并无那么简单

一次往返中间通过的网络路段是不固定的,网络拥塞程度不肯定的。

就像你平时开车,导航不可能只给你一条路线,每次给出的路线也会不一样,由于道路的拥堵程度不一样。

TCP保证可靠性,所以TCP要求不论处在何种网络环境下都要提供高性能通讯,而且不管网络拥堵状况发生何种变化,都必须保持这一特性。

TCP目前采用一种自适应的算法计算RTT值。

给定一个初始的RTT值,初始RTT值是6s,后面每次收到确认应答会进行一次计算,计算本次往返的时间和RTT波动,也就是RTT误差。最终把RTT+RTT误差获得新的RTT值。

= (1-α) + α

RFC 6298推荐的α值为1/8,即0.125。

数据也不会被无限、反复地重发。达到必定重发次数以后,若是仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭链接。而且
通知应用通讯异常强行终止。

我是龙叔,一个分享互联网技术和心路历程的大叔,感谢你的阅读。你的小小点赞将成为我继续授人以渔的大大动力。

相关文章
相关标签/搜索