导航:首页 > 源码编译 > s型增长速率算法

s型增长速率算法

发布时间:2024-10-26 20:16:18

① 计算机网络(5)| 运输层

从通信和处理信息的角度看,运输层是向它上面的应用层提供通信服务的,它属于面向通信部分的最高层,同时也是用户功能中的最低层。当网络的边缘部分中的两台主机使用网络的核心部分的功能进行端到端的通信时,只有主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用好弊轮到下三层的功能。

运输层的两个主要协议 TCP/IP 都是互联网的正式标准,即:
(1)用户数据报协议UDP
(2)传输控制协议TCP

TCP则是面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播或者多播服务。由于TCP要提供可靠的面向连接的运输服务,因此需要增加很多的开销。

TCP/IP的运输层用一个16位端口号来标志一个端口。端口号只有本地意义。它是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口。

运输层的端口号分为以下两类:
(1)服务器端使用的端口号: 它主要分为系统端口号0~1023和登记端口号1024~49151。

(2)客户端使用的端口号: 49152~65535,这类端口号仅在客户端进程运行时才动态选择。当服务器收到客户端进程的报文时,就知道客户端进程的端口号。因而可以把数据发送给客户进程。

用户数据报协议相比于IP的数据报服务就是只增加了复用、分用和差错检测功能。UDP的主要特点是:
(1)UDP是无连接的, 发送数据之前不需要建立连接,因此减少开销和发送数据之前的时延。
(2)UDP使用尽最大努力交付, 即不保证可靠交付,因此主机不需要维持复杂的连接状态表。
(3)UDP是面向报文的。 发送方的UDP对应用交下来的报文,添加首部后就向下交付给IP层。不对报文做任何处理,因此当报文过长时,IP层可能需要进行分片处理。
(4)UDP没有拥塞控制, 网络出现的拥塞不会使源主机的发送速率减低。
(5)UDP支持一对一、一对多、多对一和多对多的交互通信。
(6)UDP的首部开销小, 只有8个字节。

UDP有两个字段:数据字段和首部字段。先介绍首部字段,它是由4个字段组成的,每个字段只有2个字节,总共有8个字节。各个字段的意义如下:
(1)源端口: 源端口号。在需要对方回信时选用。不需要时可用全0。
(2)目的端口: 目的端口号。在这终点交付报文时必须使用。
(3)长度: UDP用户数据报的长度,其最小值是8(只有首部)。
(4)检验和: 检测UDP用户数据报在传输中是否有错,有错则丢弃。

当在传卜瞎送用户数据报时,如果接收方UDP发现收到的报文中目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议ICMP发送“端口不可达”差错报文给发送方。

TCP的主要特点如下:
(1)TCP是面向连接的运输层协议。 应用程序在使用TCP协议之前,必须先建立TCP连接。传送数据完毕后,必须释放TCP连接。
(2)每一条TCP连接只能有两个端点。 每一条TCP连接只能是点对点的。
(3)TCP提供可靠交付的服务。 通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。
(4)TCP提供全双友信工通信。 TCP允许通信双方的应用进程在任何时候都能发送数据。
(5)面向字节流。 TCP中的流指的是流入到进程或进程流出的字节序列。虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据看成一连串的无结构的字节流。TCP不保证发送方发送的数据块和接收方接收的数据块一致,但保证程序接收到的字节流和程序发送的字节流一致。

TCP连接的端点叫做套接字或者插口。套接字是指将端口号拼接到IP地址之后,即:

每一条TCP连接唯一的被通信两端的两个端点所确定。即:

如图所示,A发送分组M1,发送完毕就暂停发送,等待B的确认,B收到了M1就向A发死你确认。A在收到了对M1的确认之后,就再发送下一个分组M2,以此类推。

如图所示,当B接收M1时检测出了差错,就丢弃M1,其他什么也不做。而A只要超过了一段时间没有收到确认,就会认为刚才发送的分组丢失了,因而重传前面发送过的分组,这就叫做超时重传,而实现超时重传则需要A为每一个已发送的分组都设置一个超时计时器。
需要注意以下三点:
(1)A在发送完一个分组后,必须暂时保留已发送的分组的副本。
(2)分组和确认分组必须编号,这样才能明确哪一个发出的分组收到了确认。
(3)超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长。

如图所示,B所发送的对M1确认丢失了,A在设定的超时重传时间内没有收到确认,所以无法知道自己发送的分组是怎样出错的,所以会重传M1,而当B又收到了重传的分组M1,这时应该采取两个行动:
(1)丢弃这个重复分组M1。
(2)向A发送确认。

还有一种情况就是在传输过程中没有出现差错,但B对分组M1的确认迟到了,而A会收到重复的确认,A收下后就会丢弃,B仍然会收到重复的M1,并且同样要丢弃重复的M1,并且重传确认分组。

停止等待协议的优点是简单,缺点则是信道的利用率太低。我们用TD表示A发送分组需要的时间,TA表示B发送确认分组需要的时间,RTT为往返时间,则:

为了提高传输的效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输的方式。即不必每发完一个分组就停下来等待对方的确认,这样就可以使信道上一直有数据在不间断的传送。

如图表示的是发送方维持的发送窗口,它指的是位于发送窗口内的5个分组都可以连续发送出去而不需要等待对方的确认。同时连续ARP协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。

对于接收方采用的则是累计确认的方式,即接收方不必对收到的分组逐个发送确认。而是在收到几个分组后,对按序到达的最后一个分组发送确认,这就表示:到这个分组为止的所有分组都已正确收到了。这种方式的优点是:容易实现,即使确认丢失也不必重传(意思是发送方不必重传)。但缺点是不能向发送方反映出接收方已经正确收到的所有分组信息。

TCP虽然是面向字节流的,但传送TCP的数据单元却是报文段。一个TCP报文段可以分为首部和数据两部分。

为了后面讲述的方便,我们假设数据传输只在一个方向进行,即A发送数据,B给出确认。

TCP的滑动窗口是以字节为单位的。如图所示,现在假定A收到了B发来的确认报文段,其中的窗口是20字节,而确认号是31,根据这2个数据,A就构造出自己的发送窗口。

发送窗口表示:在没有收到B的确认的情况下,A可以连续把窗口内的数据都发送出去。凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。发送窗口后面的部分表示已发送且已经收到了确认。而发送窗口前沿的部分表示不允许发送的。

现在假定A发送了序号为31~41的数据。这时发送窗口位置并未改变但是发送窗口内靠后面有11个字节表示已发送但是未收到确认。而发送窗口内靠前面的9个字节时允许发送但未发送的。如图所示:

而对于B,它的接收窗口大小是20,在接收窗口外面到30号位置的数据是接收并确认的,因此可以丢弃。在下图中,B收到了32和33的数据,但它们不是按序到达的,因为并没有收到31号数据。B只能对按序达收到的数据中的最高序号给出确认,因此B发送的确认报文字段的确认号依然是31号。

现在假定B收到了序号为31的数据,并把31~33的数据交付主机,然后B删除这些数据。接着把窗口向前移动3个序号,同时给a发送确认,其中的窗口值仍为20,但确认号变为34。表明B已经收到序号33为止的数据。

因为TCP的发送方在规定的时间内没有收到确认就要重传已经发送的报文段,但是重传时间的选择却TCP最复杂的问题之一。为此TCP采用了一种自适应算法,它记录了一个报文段发出的时间以及收到相应的确认的时间。这两个时间之差就是报文段的往返时间RTT,同时TCP保留了RTT的加权平均往返时间RTTs。而RTTD是RTT的偏差加权平均值,它与RTTs和新的RTT样本之差有关。

超时重传时间的算法如下:
第一次测量时,加权平均往返时间取往返时间RTT,以后每次测量到一个新的RTT,按以下公式计算:

第一次测量时,RTT偏差的加权平均等于RTT的一半,以后的测里中,按以下公式计算:

综上超时重传时间RTO计算如下:

若收到的报文无差错,只是未按序号,使用选择确认SACK可是让发送方发送那些未收到的数据,而不重复发送已经收到的那些数据。如果要使用选择确认SACK,那么在建立TCP连接时,就要在TCP首部的选项中加上“允许SACK”的选项,并且双方必须都事先商量好。

流量控制就是指让发送方的发送速率不要太快,要让接收方来得及接收。而利用滑动窗口机制就可以很方便的在TCP连接上实现对发送方的流量控制。

如上图所示,接收方B进行了三次流量控制。第一次把窗口减小到rwnd=300,第二次又减到rwnd=100,最后是rwnd=0,即不允许发送方再发送数据了。

但是我们应该考虑一种情况,就是当接收方B的存储已满时,会向发送方发送零窗口的报文段,接着B的存储又有了一些空间,B再向A发送一个不为零的窗口值,但这个报文丢失了,结果就是双方一直等待下去。所以为了解决这个问题,TCP为每一个连接设有一个持续计时器。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,当计时器到期后,就发送一个探测段文段,而对方就在确认这个探测段时给出了现在的窗口值。如果窗口仍然是0,那么收到这个报文段的一方就重新设置持续计时器,反之则死锁的僵局就可以打破了。

应用程序把数据传送到TCP的发送缓存后,TCP在何时发送这些数据?,在TCP的实现中广泛使用了Nagle算法。具体算法如下:
(1)若发送应用进程要把数据逐个字节地送到TCP的发送缓存,则发送方就把第一个数据字节先发出去,把后面到达的数据字节都缓存起来。
(2)方发送方收到对第一个数据字节的确认后,再把发送缓存中的所有数据组装成一个报文发送出去,同时继续对后续到来的数据进行缓存。
(3)只有收到对前一个报文段的确认后才继续发送下一个报文段。

当数据到达快而网络速度慢时,这种方法可以明显减少网络带宽。Nagle还规定:当到达的数据达到窗口的一半或最大报文长度时就立即发送一个报文。

但还还需要考虑一个叫做糊涂综合征的问题,具体内容是若接收方的缓存已满,应用进程每次只从缓存中取1个字节,然后向发送方确认,并把窗口设为1个字节(缓存只空了1个字节的空间),接着发送方发来1个字节,接收方发回确认,仍然将窗口设为1,这样进行下去,网络的利用率很低。

为了解决这个问题,可以让接收方等待一段时间,使得或者缓存已有足够的空间或者等到接收缓存已有一半的空闲空间。此时,接收方就发出确认报文,并向发送方通知当前窗口的大小。

拥塞 是指在某一段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏的情况。而所谓的 拥塞控制 就是防止过多的数据注入到网络当中,这样可以使网络中的路由器或者链路不致过载,它是一个全局性的过程,涉及到所有的主机和路由器,而流量控制往往是指点对点通信量的控制。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。

TCP进行拥塞控制的算法有4种:慢开始、拥塞避免、快重传和快恢复。下面在讨论这些算法时我们假定:
(1)数据是单方向传送的,对方只传送确认报文。
(2)接收方总是有足够大的缓存空间。

发送方维持一个拥塞窗口的状态变量,其大小取决于拥塞程度,并且动态变化。发送方让自己的发送窗口小于拥塞窗口(如果考虑接收方的接收能力的话,发送窗口可能小于拥塞窗口)。发送方控制拥塞窗口的原则是:只要网络没有拥塞,拥塞窗口就再增大一点,以便把更多的分组发送出去,只要出现拥塞,就减小拥塞窗口,以减少注入到网络的分组数。

下面会从“慢开始算法”讲起来讨论拥塞窗口的大小如何变化的。

慢开始的算法思路是:当主机开始发送数据时,由于并不清楚网络的负荷情况,所以如果立即把大量数据字节注入到网络中,就有可能引起网络拥塞。因此会采用由小逐渐增大发送窗口。即在通常开始发送报文时,先将拥塞窗口cwnd的值设为一个最大报文段MSS的数值,而在每收到一个新的报文段确认后,把拥塞窗口增加至多一个MSS的数值。

如上图所示,开始时cwnd=1,发送方发送一个M1,接收方收到M1发送确认,发送方收到一个确认后将cwnd加1,此时cwnd=2,因此发送方发送M2和M3两个报文段,接收方收到后返回两个确认,因此cwnd增加两次,此时cwnd=4,接着发送方发送M4~M7四个报文段。依次类推。因此使用慢开始算法后,每经过一个传输轮次,拥塞窗口就加倍。

但是为了防止拥塞窗口cwnd增加过大导致网络拥塞,需要设置一个慢开始门限ssthresh,慢开始门限用法如下:
当cwnd<ssthresh时,使用上述的慢开始算法。
当cwnd>ssthresh时,停止使用慢开始算法,使用拥塞避免算法。
当cwnd=ssthresh时,既可以使用慢开始算法,也可以使用拥塞避免算法。
这里的拥塞避免算法是指让拥塞窗口缓慢的增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是像慢开始阶段那样加倍增长。

需要注意的是无论在慢开始阶段还是拥塞避免阶段,只要发送方判断网络出现拥塞(根据是没有按时收到确认),立即把慢开始门限ssthresh设为出现拥塞时的发送窗口的一半。然后发送窗口cwnd重新设为1,执行慢开始算法。目的是迅速减少主机发送到网络分组的分组数。

快重传算法要求接收方每收到一个失序的报文段后就立即发送重复确认,如下图接收了M1和M2后,又接收到一个M4,M4属于失序报文,则发送对M2的重复确认。发送方只要连续收到三次确认重复就立即重传对方未收到的报文段M3。

与快重传算法配合的还有快恢复算法,过程如下:
(1)当发送方连续收到三个重复确认时,就把慢开始门限ssthresh减半,这是为了防止网络拥塞,接着并不执行慢开始算法。
(2)由于上图这种情况很可能不是因为网络拥塞引起的,因此这里不执行慢开始算法(即不把拥塞窗口cwnd设为1,这样速度太慢),而是把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法。

TCP的运输连接有是三个阶段:连接建立、数据传送和连接释放。在TCP的连接过程中要解决以下三个问题:
(1)要使每一方能够确知对方的存在。
(2)要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量)。
(3)能够对运输实体资源进行分配。

TCP建立连接的过程叫做握手,握手需要在客户和服务器之间交换3个TCP报文段。如图是三报文握手建立的连接过程:

A最后还要发送一次确认的原因是为了防止已经失效的连接请求报文段突然又传送到了B,因而产生错误。试想一种情况:如果只有第一次和第二次握手,第二次B向A发送的确认丢失了,此时B进入了连接建立状态,A没有收到确认,过一段时间后会再次向B发送连接请求,B收到后又会再次建立连接,白白浪费B的资源。

A在TIME-WAIT状态等待2MSL(MSL,最长报文段寿命),主要是因为以下两点考虑:首先是为了保证A发送的最后一个ACK报文段能够到达B,因为这个ACK报文段可能丢失,此时B会重传连接释放报文,如果A已经关闭,则无法收到这个报文。其次,当A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续时间内产生的所有报文段都从网络中消失。这样,下一个新连接中不会出现这种旧的连接请求报文段。

在图中每一个方框即TCP可能具有的状态。每个方框中的大写英文字符串时TCP标准所使用的的TCP连接状态名。状态之间的箭头表示可能发生的状态变迁。箭头旁边的字表明引起这种变迁的原因,或表明发生状态变迁后又出现什么动作,在图中粗实线箭头表示对客户进程的正常变迁,粗虚线箭头表示对服务器进程的正常变迁,细线箭头表示异常变迁。

② 公务员考试中资料分析题有没有什么快速解题方法

资料分析十大速算技巧★【速算技巧一:估算法】
要点:"估算法"毫无疑问是资料分析题当中的速算第一法,在所有计算进行之前必须考虑
能否先行估算。所谓估算,是在精度要求并不太高的情况下,进行粗略估值的速算
方式,一般在选项相差较大,或者在被比较数据相差较大的情况下使用。估算的方
式多样,需要各位考生在实战中多加训练与掌握。
进行估算的前提是选项或者待比较的数字相差必须比较大,并且这个差别的大小决
定了"估算"时候的精度要求。
★【速算技巧二:直除法】
“直除法”是指在比较或者计算较复杂分数时,通过“直接相除”的方式得到商的首位(首一位或首两位),从而得出正确答案的速算方式。“直除法”在资料分析的速算当中有非常广泛的用途,并且由于其“方式简单”而具有“极易操作”性。
“直除法”从题型上一般包括两种形式:
一、比较多个分数时,在量级相当的情况下,首位最大/小的数为最大/小数;
二、计算一个分数时,在选项首位不同的情况下,通过计算首位便可选出正确答案。
“直除法”从难度深浅上来讲一般分为三种梯度:
一、简单直接能看出商的首位;
二、通过动手计算能看出商的首位;
三、某些比较复杂的分数,需要计算分数的“倒数”的首位来判定答案。
根据首两位为1.5*得到正确答案为C。
★【速算技巧三:截位法】
所谓"截位法",是指"在精度允许的范围内,将计算过程当中的数字截位(即只看或
者只取前几位),从而得到精度足够的计算结果"的速算方式。
在加法或者减法中使用"截位法"时,直接从左边高位开始相加或者相减(同时注意
下一位是否需要进位与借位),直到得到选项要求精度的答案为止。
在乘法或者除法中使用"截位法"时,为了使所得结果尽可能精确,需要注意截位近
似的方向:
一、 扩大(或缩小)一个乘数因子,则需缩小(或扩大)另一个乘数因子;
二、 扩大(或缩小)被除数,则需扩大(或缩小)除数。
如果是求"两个乘积的和或者差(即a×b±c×d)",应该注意:

三、 扩大(或缩小)加号的一侧,则需缩小(或扩大)加号的另一侧;
四、 扩大(或缩小)减号的一侧,则需扩大(或缩小)减号的另一侧。
到底采取哪个近似方向由相近程度和截位后计算难度决定。
一般说来,在乘法或者除法中使用"截位法"时,若答案需要有N位精度,则计算过程
的数据需要有N+1位的精度,但具体情况还得由截位时误差的大小以及误差的抵消
情况来决定;在误差较小的情况下,计算过程中的数据甚至可以不满足上述截位方
向的要求。所以应用这种方法时,需要考生在做题当中多加熟悉与训练误差的把握
,在可以使用其它方式得到答案并且截位误差可能很大时,尽量避免使用乘法与除
法的截位法。
【速算技巧四:化同法】
要点:所谓"化同法",是指"在比较两个分数大小时,将这两个分数的分子或分母化为相同
或相近,从而达到简化计算"的速算方式。一般包括三个层次:

一、 将分子(或分母)化为完全相同,从而只需要再看分母(或分子)即可;
二、 将分子(或分母)化为相近之后,出现"某一个分数的分母较大而分子较小"或
"某一个分数的分母较小而分子较大"的情况,则可直接判断两个分数的大小。
三、 将分子(或分母)化为非常接近之后,再利用其它速算技巧进行简单判定。
事实上在资料分析试题当中,将分子(或分母)化为完全相同一般是不可能达到的
,所以化同法更多的是"化为相近"而非"化为相同"。
★【速算技巧五:差分法】

“差分法”是在比较两个分数大小时,用“直除法”或者“化同法”等其他速算方式难以解决时可以采取的一种速算方式。

适用形式:
两个分数作比较时,若其中一个分数的分子与分母都比另外一个分数的分子与分母分别仅仅大一点,这时候使用“直除法”、“化同法”经常很难比较出大小关系,而使用“差分法”却可以很好地解决这样的问题。
基础定义:
在满足“适用形式”的两个分数中,我们定义分子与分母都比较大的分数叫“大分数”,分子与分母都比较小的分数叫“小分数”,而这两个分数的分子、分母分别做差得到的新的分数我们定义为“差分数”。例如:324/53.1与313/51.7比较大小,其中324/53.1就是“大分数”,313/51.7就是“小分数”,而324-313/53.1-51.7=11/1.4就是“差分数”。
“差分法”使用基本准则——
“差分数”代替“大分数”与“小分数”作比较:
1、若差分数比小分数大,则大分数比小分数大;
2、若差分数比小分数小,则大分数比小分数小;
3、若差分数与小分数相等,则大分数与小分数相等。
比如上文中就是“11/1.4代替324/53.1与313/51.7作比较”,因为11/1.4>313/51.7(可以通过“直除法”或者“化同法”简单得到),所以324/53.1>313/51.7。
特别注意:
一、“差分法”本身是一种“精算法”而非“估算法”,得出来的大小关系是精确的关系而非粗略的关系;
二、“差分法”与“化同法”经常联系在一起使用,“化同法紧接差分法”与“差分法紧接化同法”是资料分析速算当中经常遇到的两种情形。
三、“差分法”得到“差分数”与“小分数”做比较的时候,还经常需要用到“直除法”。
四、如果两个分数相隔非常近,我们甚至需要反复运用两次“差分法”,这种情况相对比较复杂,但如果运用熟练,同样可以大幅度简化计算。
★【速算技巧六:插值法】
"插值法"是指在计算数值或者比较数大小的时候,运用一个中间值进行"参照比较"
的速算方式,一般情况下包括两种基本形式:
一、在比较两个数大小时,直接比较相对困难,但这两个数中间明显插了一个可以
进行参照比较并且易于计算的数,由此中间数可以迅速得出这两个数的大小关系。
比如说A与B的比较,如果可以找到一个数C,并且容易得到A>C,而B<C,即可以判定
A>B。
二、在计算一个数值f的时候,选项给出两个较近的数A与B难以判断,但我们可以
容易的找到A与B之间的一个数C,比如说A<CC,则我们知道
f=B(另外一种情况类比可得)。
★【速算技巧七:凑整法】
"凑整法"是指在计算过程当中,将中间结果凑成一个"整数"(整百、整千等其它方
便计算形式的数),从而简化计算的速算方式。"凑整法"包括加/减法的凑整,也包
括乘/除法的凑整。

在资料分析的计算当中,真正意义上的完全凑成"整数"基本上是不可能的,但由于
资料分析不要求绝对的精度,所以凑成与"整数"相近的数是资料分析"凑整法"所真
正包括的主要内容。
★【速算技巧八:放缩法】
要点:
"放缩法"是指在数字的比较计算当中,如果精度要求并不高,我们可以将中间结果
进行大胆的"放"(扩大)或者"缩"(缩小),从而迅速得到待比较数字大小关系的
速算方式。
要点:
若A>B>0,且C>D>0,则有:

1) A+C>B+D
2) A-D>B-C
3) A×C>B×D
4) A/D>B/C

这四个关系式即上述四个例子所想要阐述的四个数学不等关系,是我们在做题当中
经常需要用到的非常简单、非常基础的不等关系,但却是考生容易忽略,或者在考
场之上容易漏掉的数学关系,其本质可以用"放缩法"来解释。
★【速算技巧九:增长率相关速算法】
计算与增长率相关的数据是做资料分析题当中经常遇到的题型,而这类计算有一些常用的速算技巧,掌握这些速算技巧对于迅速解答资料分析题有着非常重要的辅助作用。

两年混合增长率公式:
如果第二期与第三期增长率分别为r1与r2,那么第三期相对于第一期的增长率为:
r1+r2+r1× r2

增长率化除为乘近似公式:
如果第二期的值为A,增长率为r,则第一期的值A′:
A′=A/1+r≈A×(1-r)
(实际上左式略大于右式,r越小,则误差越小,误差量级为r2)

平均增长率近似公式:
如果N年间的增长率分别为r1、r2、r3……rn,则平均增长率:
r≈r1+r2+r3+……rn/n
(实际上左式略小于右式,增长率越接近,误差越小)
求平均增长率时特别注意问题的表述方式,例如:
1.“从2004年到2007年的平均增长率”一般表示不包括2004年的增长率;
2.“2004、2005、2006、2007年的平均增长率”一般表示包括2004年的增长率。

“分子分母同时扩大/缩小型分数”变化趋势判定:
1.A/B中若A与B同时扩大,则①若A增长率大,则A/B扩大②若B增长率大,则A/B缩小;A/B中若A与B同时缩小,则①若A减少得快,则A/B缩小②若B减少得快,则A/B扩大。
2.A/A+B中若A与B同时扩大,则①若A增长率大,则A/A+B扩大②若B增长率大,则A/A+B缩小;A/A+B中若A与B同时缩小,则①若A减少得快,则A/A+B缩小②若B减少得快,则A/A+B扩大。

多部分平均增长率:
如果量A与量B构成总量“A+B”,量A增长率为a,量B增长率为b,量“A+B”的增长率为r,则A/B=r-b/a-r,一般用“十字交叉法”来简单计算:
A:a r-b A
r =
B:b a-r B
注意几点问题:
1.r一定是介于a、b之间的,“十字交叉”相减的时候,一个r在前,另一个r在后;
2.算出来的A/B=r-b/a-r是未增长之前的比例,如果要计算增长之后的比例,应该在这个比例上再乘以各自的增长率,即A′/B′=(r-b)×(1+a)/(a-r)×(1+b)。
等速率增长结论:
如果某一个量按照一个固定的速率增长,那么其增长量将越来越大,并且这个量的数值成“等比数列”,中间一项的平方等于两边两项的乘积。
★【速算技巧十:综合速算法】
“综合速算法”包含了我们资料分析试题当中众多体系性不如前面九大速算技巧的速算方式,但这些速算方式仍然是提高计算速度的有效手段。

平方数速算:
牢记常用平方数,特别是11~30以内数的平方,可以很好地提高计算速度:
121、144、169、196、225、256、289、324、361、400
441、484、529、576、625、676、729、784、841、900

尾数法速算:
因为资料分析试题当中牵涉到的数据几乎都是通过近似后得到的结果,所以一般我们计算的时候多强调首位估算,而尾数往往是微不足道的。因此资料分析当中的尾数法只适用于未经近似或者不需要近似的计算之中。历史数据证明,国考试题资料分析基本上不能用到尾数法,但在地方考题的资料分析当中,尾数法仍然可以有效地简化计算。
错位相加/减:
A×9型速算技巧:A×9=A×10-A;如:743×9=7430-743=6687
A×9.9型速算技巧:A×9.9=A×10+A÷10;如:743×9.9=7430-74.3=7355.7
A×11型速算技巧:A×11=A×10+A;如:743×11=7430+743=8173
A×101型速算技巧:A×101=A×100+A; 如:743×101=74300+743=75043

乘/除以5、25、125的速算技巧:
A×5型速算技巧:A×5=10A÷2;A÷5型速算技巧:A÷5=0.1A×2
例8739.45×5=87394.5÷2=43697.25
36.843÷5=3.6843×2=7.3686

A× 25型速算技巧:A×25=100A÷4;A÷ 25型速算技巧:A÷25=0.01A×4
例7234×25=723400÷4=180850
3714÷25=37.14×4=148.56

A×125型速算技巧:A×125=1000A÷8;A÷125型速算技巧:A÷125=0.001A×8
例8736×125=8736000÷8=1092000
4115÷125=4.115×8=32.92

减半相加:
A×1.5型速算技巧:A×1.5=A+A÷2;
例3406×1.5=3406+3406÷2=3406+1703=5109

“首数相同尾数互补”型两数乘积速算技巧:
积的头=头×(头+1);积的尾=尾×尾
例:“23×27”,首数均为“2”,尾数“3”与“7”的和是“10”,互补
所以乘积的首数为2×(2+1)=6,尾数为3×7=21,即23×27=621
这种题是没有意义的
请补充完善 可以先查阅下资料

③ TCP那些事儿

目录:

以前我也认为TCP是相当底层的东西,我永远不需要去了解它。虽然差不多是这样,但是实际生活中,你依然可能遇见和TCP算法相关的bug,这时候懂一些TCP的知识就至关重要了。( 本文也可以引申为,系统调用,操作系统这些都很重要,这个道理适用于很多东西
这里推荐一篇小短文, 人人都应该懂点TCP

使用TCP协议通信的双方必须先建立TCP连接,并在内核中为该连接维持一些必要的数据结构,比如连接的状态、读写缓冲区、定时器等。当通信结束时,双方必须关闭连接以释放这些内核数据。TCP服务基于流,源源不断从一端流向另一端,发送端可以逐字节写入,接收端可以逐字节读出,无需分段。

需要注意的几点:

TCP状态(11种):
eg.

以上为TCP三次握手的状态变迁

以下为TCP四次挥手的状态变迁

服务器通过 listen 系统调用进入 LISTEN 状态,被动等待客户端连接,也就是所谓的被动打开。一旦监听到SYN(同步报文段)请求,就将该连接放入内核的等待队列,并向客户端发送带SYN的ACK(确认报文段),此时该连接处于 SYN_RECVD 状态。如果服务器收到客户端返回的ACK,则转到 ESTABLISHED 状态。这个状态就是连接双方能进行全双工数据传输的状态。
而当客户端主动关闭连接时,服务器收到FIN报文,通过返回ACK使连接进入 CLOSE_WAIT 状态。此状态表示——等待服务器应用程序关闭连接。通常,服务器检测到客户端关闭连接之后,也会立即给客户端发送一个FIN来关闭连接,使连接转移到 LAST_ACK 状态,等待客户端对最后一个FIN结束报文段的最后一次确认,一旦确认完成,连接就彻底关闭了。

客户端通过 connect 系统调用主动与服务器建立连接。此系统调用会首先给服务器发一个SYN,使连接进入 SYN_SENT 状态。
connect 调用可能因为两种原因失败:1. 目标端口不存在(未被任何进程监听)护着该端口被 TIME_WAIT 状态的连接占用( 详见后文 )。2. 连接超时,在超时时间内未收到服务器的ACK。
如果 connect 调用失败,则连接返回初始的 CLOSED 状态,如果调用成功,则转到 ESTABLISHED 状态。
客户端执行主动关闭时,它会向服务器发送一个FIN,连接进入 TIME_WAIT_1 状态,如果收到服务器的ACK,进入 TIME_WAIT_2 状态。此时服务器处于 CLOSE_WAIT 状态,这一对状态是可能发生办关闭的状态(详见后文)。此时如果服务器发送FIN关闭连接,则客户端会发送ACK进行确认并进入 TIME_WAIT 状态。

流量控制是为了控制发送方发送速率,保证接收方来得及接收。

接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。

如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。 流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。

TCP 主要通过四种算法来进行拥塞控制: 慢开始、拥塞避免、快重传、快恢复。

在Linux下有多种实现,比如reno算法,vegas算法和cubic算法等。
发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。
为了便于讨论,做如下假设:

发送的最初执行慢开始,令 cwnd=1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 ...

注意到慢开始每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能也就更高。设置一个慢开始门限 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。

如果出现了超时,则令 ssthresh = cwnd/2,然后重新执行慢开始。

在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。

在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3。

在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd/2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。

慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。

  发送端的每个TCP报文都必须得到接收方的应答,才算传输成功。

  TCP为每个TCP报文段都维护一个重传定时器。
  发送端在发出一个TCP报文段之后就启动定时器,如果在定时时间类未收到应答,它就将重发该报文段并重置定时器。

  因为TCP报文段最终在网络层是以IP数据报的形式发送,而IP数据报到达接收端可能是乱序或者重复的。TCP协议会对收到的TCP报文进行重排、整理,确保顺序正确。

TCP报文段所携带的应用程序数据按照长度分为两种: 交互数据 成块数据

对于什么是粘包、拆包问题,我想先举两个简单的应用场景:

对于第一种情况,服务端的处理流程可以是这样的:当客户端与服务端的连接建立成功之后,服务端不断读取客户端发送过来的数据,当客户端与服务端连接断开之后,服务端知道已经读完了一条消息,然后进行解码和后续处理...。对于第二种情况,如果按照上面相同的处理逻辑来处理,那就有问题了,我们来看看 第二种情况 下客户端发送的两条消息递交到服务端有可能出现的情况:

第一种情况:

服务端一共读到两个数据包,第一个包包含客户端发出的第一条消息的完整信息,第二个包包含客户端发出的第二条消息,那这种情况比较好处理,服务器只需要简单的从网络缓冲区去读就好了,第一次读到第一条消息的完整信息,消费完再从网络缓冲区将第二条完整消息读出来消费。

第二种情况:

服务端一共就读到一个数据包,这个数据包包含客户端发出的两条消息的完整信息,这个时候基于之前逻辑实现的服务端就蒙了,因为服务端不知道第一条消息从哪儿结束和第二条消息从哪儿开始,这种情况其实是发生了TCP粘包。

第三种情况:

服务端一共收到了两个数据包,第一个数据包只包含了第一条消息的一部分,第一条消息的后半部分和第二条消息都在第二个数据包中,或者是第一个数据包包含了第一条消息的完整信息和第二条消息的一部分信息,第二个数据包包含了第二条消息的剩下部分,这种情况其实是发送了TCP拆,因为发生了一条消息被拆分在两个包里面发送了,同样上面的服务器逻辑对于这种情况是不好处理的。

我们知道tcp是以流动的方式传输数据,传输的最小单位为一个报文段(segment)。tcp Header中有个Options标识位,常见的标识为mss(Maximum Segment Size)指的是,连接层每次传输的数据有个最大限制MTU(Maximum Transmission Unit),一般是1500比特,超过这个量要分成多个报文段,mss则是这个最大限制减去TCP的header,光是要传输的数据的大小,一般为1460比特。换算成字节,也就是180多字节。

tcp为提高性能,发送端会将需要发送的数据发送到缓冲区,等待缓冲区满了之后,再将缓冲中的数据发送到接收方。同理,接收方也有缓冲区这样的机制,来接收数据。

发生TCP粘包、拆包主要是由于下面一些原因:

既然知道了tcp是无界的数据流,且协议本身无法避免粘包,拆包的发生,那我们只能在应用层数据协议上,加以控制。通常在制定传输数据时,可以使用如下方法:

写了一个简单的 golang 版的tcp服务器实例,仅供参考:
例子

参考和推荐阅读书目:

注释:

eg.

阅读全文

与s型增长速率算法相关的资料

热点内容
建筑考二建刷视频用什么app 浏览:233
取消纸质文件夹密码 浏览:769
程序员级别提升 浏览:432
编译运行后停止工作 浏览:779
白虎通pdf 浏览:673
linux开启关闭端口 浏览:228
单片机加一个芯片 浏览:723
vs编译方式 浏览:211
安卓的掌盟盒子可以查什么 浏览:864
上下学app有什么好处 浏览:363
程序员做信贷项目的好跳槽吗 浏览:252
粘土服务器的礼盒为什么开不了 浏览:506
乐高机器人pdf 浏览:863
退出scala命令 浏览:366
不管什么情况下军人必须服从命令 浏览:267
云计算和服务器模式有什么区别 浏览:524
s型增长速率算法 浏览:978
c语言迷宫算法入门 浏览:240
android列表动画 浏览:361
外企算法面试 浏览:321