long time ago,通讯并不发达,两国之间的贸易却络绎不绝。但码头始终有限,若是贸然的把货物运过去,若是这时候有别的商家已经占领了码头。这样不得不排队了。后来,他们训练了一种海鸟,运送以前,先用海鸟报个信: 算法
一开始这个方式挺好用的,直到有一年夏天,五弟找上门来了:我等了你一天,你的货呢?我交了钱借用了一天的码头,都白交了。二哥:我也着急呀,你一直没回信,我都等了两天,我不知道咋肥四,就没发了。应该是回信的那只鸟,被大风刮走了。最近海上天气很差,想必我放的那只鸟也是历经千辛万苦才去到你那。这样吧,五弟,我改一下流程吧:缓存
五弟琢磨了一下,前面的鸟可以一来一回,二哥能看出海上没有危险。我收到二哥的消息后也能看出海上无风雨,这时我再去借码头,也能节省一些时间,妙,实在妙,仍是二哥聪明,只是二哥要比我多训练一倍的鸟。五弟哪里的话,浪费这点资源算什么呢。服务器
三次握手就这样诞生了。网络
过了一些时日,五弟又来找二哥商量了:码头上的仓库空间,人力始终有限,二哥一次派了这么多艘船来,五弟实在忙不过来,船都堵在渡口,人家的船进不来,出不去啊。为了此事二哥想了一宿,找来了五弟商量:五弟呀,这个确实是个头疼的问题呀。并发
最简单的办法就是一开始你就告诉我你能处理多少货,我就派一批船过去。等你处理完了通知我,我再派一批过去。可是这种方式应变能力过低了,假设港口一开始没这么堵,可是可能还有一些商家在海上来往,结果我这一批派过去,就致使堵塞拥挤了。这个应变能力能理太差了,要提升这个应变能力,就不能派太多的船涌进港口,只能一小批,一小批的派了。指针
这样你每次收到货以后,就让回来的船告诉我你那里剩余多少空间,我好安排下一趟船只。五弟挠挠头,不明白。二哥敲了下这木鱼脑壳道:假设咱们要运送720的货,你码头的仓库最多能存360的货物,我每次派100的货物,固然个人每艘船只能载重是10(MTU 最大传输单元限制)。cdn
借助窗口解决了流量控制的问题。中间件
再加上海上风云莫测,每次来回的时间不是固定的。只能动态的估算这个值了。这样,每批次的船只一来一回算一个单位(RTT)。而后根据这个RTT的时间计算超时时间(RTO)。当发生了重发,就会将超时时间加倍。防止太频繁重传致使更加拥挤。blog
可是这样的会有一个问题,假设7号船一直没回来,这时候再派一个7号船过去,许久后,终于回来了,那么这艘船是第一艘的仍是重发的那艘呢?忽略说能认出船老大的陈独秀同窗(抠鼻)。队列
这是一个苦差事,具体怎么算,仍是请位大师来算吧。此事算了了。
五弟又过了找二哥了:运720的货都跑了8趟了,那送7200的货那还不得九九八十一趟啊。这效率不行啊,二哥道:你想到的我也想到了,一开始我并不知道海上的拥挤状况,因此不敢派太多的船,我想了一个办法,先发的慢一点,探测一下状况,而后再慢慢提速。假设我一开始派n艘船。
这样,就能够解决效率低的问题了。
固然,不可能一直是增长。这样拥堵只是时间问题。因此须要一个阈值。
拥塞避免算法的思路就是下降加速度,让它缓慢的增加。
以上都是正常的状况,当发生了重传,说明发生了拥挤,就不能再发这么多船了,这时候cwnd减半,从新进入慢启动。
好了,故事就讲到这里了。
当出现了RTO超时重传,由于ack都收不到了,因此它的处理会比较猛烈:
cwnd决定了发送窗口的大小,若是只是出现了轻度的拥堵,就直接猛烈缩小窗口,进入慢启动后,cwnd恢复的很慢,这显然得不偿失,因此须要一种主动触发重传的机制,就有了后来的快速重传和快速恢复。
仅仅只是靠超时重传,并不能发生了包丢失,却要等到超时才开始重传,这显然效率不够,因此须要找到重传的规律。虽然咱们发的包是有序的,可是IP包是无序的,因此会致使到达的包出现无序的状况。先来看下下面一组数据。
要保证可靠性,就必需要保证顺序和完整,来看看事故发生现场。
从上面的状况能够看出不论是乱序仍是丢包,都会收到重复的ack的。在快速重传算法中,当收到三次重复的ack,就认定它是丢包了。但实际上,三次重复ack并不能判断出是丢包或乱序,只能说出现了问题,它只是在效率和过早重传之间的一个权衡。
收到了三次重复的ack,进入快速重传须要作几件事情:
因为快速重传有多是由于顺序的问题而误判,或者只是轻微的拥堵,致使进入了拥塞避免阶段,这时候为了达到快速恢的目的,将会中止发送后面的数据,只发送重传数据,为了提升恢复效率,将会使用快速恢算法。
为了保证快速重传效率,进入快速恢复阶段会有如下几个步骤。
总的来讲就是腾出空间,马不停蹄。
在上面的重传原理介绍中,咱们还忽视了一个问题,例如客户端在发送1,2,3,4,5,6,7包时,2,4,6,包丢了,这种状况仍是比较常见的,这时候就会面临一个问题,究竟是一个一个重传,仍是将2后面的包都重发过去。
后退n帧协议虽然效率高,可是遇到大场面,在网络比较差或者带宽比较低的状况,若是仍然使用这个协议会致使状况更加恶劣,这种状况停等协议虽然效率比较低,可是仍是比较适用的。
窗口的滑动
TCP提供体积可变的滑动窗口机制,支持端对端的流量控制:
在传输的过程当中,窗口是滑动的
看下图5-15,TCP链接阶段,双方协商窗口的尺寸,同时接收方预留数据缓存区看图5-16,假设窗口的阈值是一半,因此A发送11个帧,发送后,等待确认,发送窗口位置不变。这时候发生了丢包,32,33没有收到。虽然31已经收到了,窗口理论上能够往右移动一个位置,可是为了节省宽带,不会每个帧都回复ack,而是累积几个以后在发出,因此31不会回复ack,窗口就卡在这了。
看图5-17,这时候30-33的已经确认了,因此窗口能够往右滑动三帧。37,38,40也许延迟还未收到。
看图5-18,在重传机制生效以前,A继续发送了后面的数据,这时候窗口已经所有用完,A会中止发送数据,等待B的窗口可用,B处理完以后会等待A发送数据,这样就形成了双方在等待,为了解决这个问题,TCP使用了Zero Window Probe技术,缩写ZWP。在窗口尺寸变成0以后,发送端会发送ZWP包询问接收端是否有足够的空间能够发送数据了,TCP使用持续计时器,若是结果仍然为0,则重置定时器继续等待。
标志位
链接过程的状态
服务器维护了一个半链接的队列,该队列为每一个客户端的SYN包(SYN=X)开设一个条目,表示服务器已经收到SYN包,并向客户端发出确认,正在等待客户端的确认包。当服务器收到客户端的确认包时,删除该条目,该链接进入ESTABLISHED状态。
两台电脑之间通讯都须要把数字信号01转化成电信号,再调制成电磁波(好比光)。电磁波自己没法承载信息的,可是咱们能够控制电磁波的变化(幅度AM,频率FM,相位PM),让这些变化能够表明0和1。也就是说在信号线中走的是电磁波,因此在布线的时候要注意线与线之间的串扰。
电磁波有不少频段好比2515MHz-2675MHz、4800MHz-4900MHz,在空气中存在不少不一样频段的波,因此须要进行定宽调频,也就是说肯定带宽,而后再进行滤波,所谓的滤波就是经过滤波算法,好比卡尔曼滤波,根据截止频率是否靠近特征频率以及衰减程度来分类的,最后转换成01信号。带宽又叫频宽是指在固定的的时间可传输的资料数量,亦即在传输管道中能够传递数据的能力。在数字设备中,频宽一般以 bps表示,即每秒可传输之位数。
截止频率
用来讲明电路频率特性指标的特殊频率。当保持电路输入信号的幅度不变,改变频率使输出信号降至最大值的0.707倍,或某一特殊额定值时该频率称为截止频率。在高频端和低频端各有一个截止频率,分别称为上截止频率和下截止频率。两个截止频率之间的频率范围称为通频带。
将信号转化成字节,再将字节组装成帧。再以太网链路上的数据包被称为以太帧,在802.3标准理,规定了一个以太帧的数据部分(Playload)的最大长度是1500个字节(MTU),另外,以太网帧最小长度为64字节。