外科手术的英文术翻译术英语怎么说-六级成绩查询无准考证
2023年3月30日发(作者:快的打车优惠)
1400协议是什么和28181区别_可靠UDP,KCP协议快在哪?
云真机已经⽀持⼿机端的画⾯投影。云真机实时操作,对延迟的要求⽐远程视频对话的要求更⾼(100ms以内)。在⽆线⽹络下,如何更
实时、更可靠的传输视频流就成了⼀个挑战。通过websocket、RTMP、UDP的⽐较,最后选择了可靠的UDP协议KCP来进⾏实时⾳视频
的传输。
1简介
KCP是⼀个快速可靠协白居易杭州春望 议,能以⽐TCP浪费10%-20%的带宽的代价,换取平均延迟降低30%-40%,且最⼤延迟降低三倍的传输效果。
纯算法实现,并不负责底层协议(如UDP)的收发,需要使⽤者⾃⼰定义下层数据包的发送⽅式,以callback的⽅式提供给KCP。连时钟
都需要外部传递进来,内部不会有任何⼀次系统调⽤。本⽂传输协议之考虑UDP的情况。
名词说明(源码字段):
⽤户数据:应⽤层发送的数据,如⼀张图⽚2Kb的数据
MTU:最⼤传输单元。即每次发送的最⼤数据
RTO:RetransmissionTimeOut,重传超时时间。
cwnd:congestionwindow,拥塞窗⼝,表⽰发送⽅可发送多少个KCP数据包。与接收⽅窗⼝有关,与⽹络状况(拥塞控制)有关,与发
送窗⼝⼤⼩有关。
rwnd:receiverwindow,接收⽅窗⼝⼤⼩,表⽰接收⽅还可接收多少个KCP数据包
snd_queue:待发送KCP数据包队列
snd_nxt:下⼀个即将发送的kcp数据包序列号
snd_una:下⼀个待确认的序列号
1.1
使⽤⽅式
1.创建KCP对象:
//初始化kcp对象,conv为⼀个表⽰会话编号的整数,和tcp的conv⼀样,通信双
//⽅需保证conv相同,相互的数据包才能够被认可,user是⼀个给回调函数的指针
ikcpcb*kcp=ikcp_create(conv,user);
2.设置传输回调函数(如UDP的send函数):
//KCP的下层协议输出函数,KCP需要发送数据时会调⽤它
//buf/len表⽰缓存和长度
//user指针为kcp对象创建时传⼊的值,⽤于区别多个KCP对象
intudp_output(constchar*buf,intlen,ikcpcb*kcp,void*user)
{
....
}
//设置回调函数
kcp->output=udp_output;
3.循环调⽤update:
//以⼀定频率调⽤ikcp_update来更新kcp状态,并且传⼊当前时钟(毫秒单位)
//如10ms调⽤⼀次,或⽤ikcp_check确定下次调⽤update的时间不必每次调⽤
ikcp_update(kcp,millisec);
4.输⼊⼀个应⽤层数据包(如UDP收到的数据包):
//收到⼀个下层数据包(⽐如UDP包)时需要调⽤:ikcp_input(kcp,received_udp_packet,received_udp_size);
处理了下层协议的输出/输⼊后KCP协议就可以正常⼯作了,使⽤ikcp_send来向
远端发送数据。⽽另⼀端使⽤ikcp_recv(kcp,ptr,size)来接收数据。
[kcp源码流程图]
总结:UDP收到的包,不断通过kcp_input喂给KCP,KCP会对这部分数据(KCP协议数据)进⾏解包,重新封装成应⽤层⽤户数据,应
⽤层通过kcp_recv获取。应⽤层通过kcp_send发送数据,KCP会把⽤户数据拆分kcp数据包,通过kcp_output,以UDP(send)的⽅式
发送。
1.2
KCP的配置模式
这部分KCP⽂档有介绍,理解KCP协议⽆需过于关注。协议默认模式是⼀个标准的ARQ,需要通过配置打开各项加速开关:
1.⼯作模式:
intikcp_nodelay(ikcpcb*kcp,intnodelay,intinterval,intresend,intnc)
nodelay:是否启⽤nodelay模式,0不启⽤;1启⽤。
interval:协议内部⼯作的interval,单位毫秒,⽐如10ms或者20ms
resend:快速重传模式,默认0关闭,可以设置2(2次ACK跨越将会直接重传)
nc:是否关闭流控,默认是0代表不关闭,1代表关闭。
普通模式:普通模式:ikcp_nodelay(kcp,0,40,0,0);
极速模式:极速模式:ikcp_nodelay(kcp,1,10,2,1)
1.最⼤窗⼝
intikcp_wndsize(ikcpcb*kcp,intsndwnd,intrcvwnd);
该调⽤将会设置协议的最⼤发送窗⼝和最⼤接收窗⼝⼤⼩,默认为32.这个可以理解为TCP的SND_BUF和RCV_BUF,只不过单位不⼀
样SND/RCV_BUF单位是字节,这个单位是包。
2.最⼤传输单元:
纯算法协议并不负责探测MTU,默认mtu是1400字节,可以使⽤ikcp_setmtu来设置该值。该值将会影响数据包归并及分⽚时候的最⼤
传输单元。
3.最⼩RTO:
不管是TCP还是KCP计算RTO时都有最⼩RTO的限制,即便计算出来RTO为40ms,由于默认的RTO是100ms,协议只有在100ms
后才能检测到丢包,快速模式下为30ms,可以⼿动更改该值:
kcp->rx_minrto=10;
1.3
KCP为什么存在?
⾸先要看TCP与UDP的区别,TCP与UDP都是传输层的协议,⽐较两者的区别主要应该是说TCP⽐UDP多了什么?
⾯向连接:⾯向连接:TCP接收⽅与发送⽅维持了⼀个状态(建⽴连接,断开连接),双⽅知道对⽅还在。可靠的:可靠的:发送出去的数据对⽅⼀定能够接
收到,⽽且是按照发送的顺序收到的。流量控制与拥塞控制:流量控制与拥塞控制:TCP靠谱通过滑动窗⼝确保,发送的数据接收⽅来得及收。TCP⽆私TCP⽆私,发⽣
数据包丢失的时候认为整个⽹络⽐较堵,⾃⼰放慢数据发送速度。
TCP协议的可靠与⽆私让使⽤TCP开发更为简单,同时它的这种设计也导致了慢的特点。UDP协议简单,所以它更快。但是,UDP毕竟是
不可靠的,应⽤层收到的数据可能是缺失、乱序的。KCP协议就凄凉的读音 是在保留UDP快的基础上,提供可靠的传输,应⽤层使⽤更加简单。
其他差别,TCP以字节流的形式,UDP以数据包的形式。很多⼈以为,UDP是不可靠的,所以sendto(1000),接收端recvfrom(1000)可
能会收到900。这个是错误的。所谓数据包,就是说UDP是有界的,sendto(300),sendto(500);接收
到,recvfrom(1000),recvfrom(1000)那么可能会收到300,500或者其中⼀个或者都没收到。UDP应⽤层发送的数据,在接收缓存⾜
够的情况下,要么收到全的,要么收不到。
总结:TCP可靠简单,但是复杂⽆私,所以速度慢。KCP尽可能保留UDP快的特点下,保证可靠。
2KCP原理
2.1
协议简介
KCP是⼀个可靠的传输协议,UDP本⾝是不可靠的,所以需要额外信息来保证传输数据的可靠性。因此,我们需要在传输的数据上增加⼀
个包头。⽤于确保数据的可靠、有序。
04568(BYTE)
+-------------------+----+----+----+
|conv|cmd|frg|wnd|
+-------------------+----+----+----+8
|ts|sn|
+-------------------+----------------+16
|una|len|
+-------------------+----------------+24
||
|DATA(optional)|
||
+-------------------------------------+
conv:连接号。UDP是⽆连接的,conv⽤于表⽰来⾃于哪个客户端。对连接的⼀种替代
cmd:命令字。如,IKCP_CMD_ACK确认命令,IKCP_CMD_WASK接收窗⼝⼤⼩询问命令,IKCP_CMD_WINS接收窗⼝⼤⼩告知命令,
frg:分⽚,⽤户烟涛微茫信难求 数据可能会被分成多个KCP包,发送出去
wnd:接收窗⼝⼤⼩,发送⽅的发送窗⼝不能超过接收⽅给出的数值
ts:时间序列
sn:序列号
una:下⼀个可接收的序列号。其实就是确认号,收到sn=10的包,una为11
len:数据长度
data:⽤户数据
后⾯的讲解,主要以极速模式:ikcp_nodelay(kcp,1,10,2,1)为主,启⽤nodelay设置,刷新间隔控制在10ms,开启快速重传模式,
关闭流量控制。
2.2
数据发送过程
2.2.1数据发送准备
⽤户发送数据的函数为ikcp_send。
ikcp_send(ikcpcbkcp,constcharbuffer,intlen)
该函数的功能⾮常简单,把⽤户发送的数据根据MSS进⾏分⽚。如上图,⽤户发送1900字节的数据,MTU为1400byte。因此,该函数会
把1900byte的⽤户数据分成两个包,⼀个数据⼤⼩为1400,头frg设置为1,len设置重阳节图片素材 为1400;第⼆个包,头frg设置为0,len设置为
500。切好KCP包之后,放⼊到名为snd_queue的待发送队列中。
注:流模式情况下,kcp会把两次发送的数据衔接为⼀个完整的kcp包。⾮流模式下,⽤户数据%MSS的包,也会作为⼀个包发送出去。
MTU,数据链路层规定的每⼀帧的最⼤长度,超过这个长度数据会被分⽚。通常MTU的长度为1500字节,IP协议规定所有的路由器均应
该能够转发(512数据+60IP⾸部+4预留=576字节)的数据。MSS,最⼤输出⼤⼩(双⽅的约定),KCP的⼤⼩为MTU-kcp头24字
节。IP数据报越短,路由器转发越快,但是资源利⽤率越低。传输链路上的所有MTU都⼀⾄的情况下效率最⾼,应该尽可能的避免数据传输
的⼯程中,再次被分。UDP再次被分的后(通常1分为2),只要丢失其中的任意⼀份,酸字组词 两份都要重新传输。因此,合理的MTU应该是保因此,合理的MTU应该是保
证数据不被再分的前提下,尽可能的⼤。
以太⽹的MTU通常为1500字节-IP头(20字节固定+40字节可选)-UDP头8个字节=1472字节。KCP会考虑多传输协议,但是在UDPKCP会考虑多传输协议,但是在UDP
的情况下,设置为1472字节更为合理。
2.2.2实际发送
KCP会不停的进⾏update更新最新情况,数据的实际发送在update时进⾏。发送过程如下图所⽰:
[KCP发送过程]
步骤1:待发送队列移⾄发送队列
KCP会把snd_queue待发送队列中的kcp包,移⾄snd_buf发送队列。移动的包的数量不会超过snd_una+cwnd-snd_nxt,确保发送的数
据不会让接收⽅的接收队列溢出。该功能类似于TCP协议中的滑动窗⼝。cwnd=min(snd_wnd,rmt_wnd,kcp->cwnd)的最⼩值决
定,snd_wnd,rmt_wnd⽐较好理解可发送的数据,可发送的数据最⼤值,应该是发送⽅可以发送的数据和接收⽅可以接收的数据的最⼩
值。kcp->cwnd是拥塞控制的⼀个值,跟⽹络状况相关,⽹络状况差的时候,KCP认为应该降低发送的数据,后⾯会有详细的介绍。
如上图中,snd_queue待发送队列中有4个KCP包等待发送,这个时候snd_nxt下⼀个发送的kcp包序列号为11,snd_una下⼀个确认的
KCP包为9(8已经确认,9,10已经发送但是还没得到接收⽅的确认)。因为cwnd=5,发送队列中还有2个发送了但是还未得到确认,所
以可以从待发送队列中取前⾯的3个KCP包放⼊到发送队列中,序列号分别设置为11,12,13。
步骤2:发送发送队列的数据
发送队列中包含两种类型的数据,已发送但是尚未被接收⽅确认的数据,没被发送过的数据。没发送过的数据⽐较好处理,直接发送即可。
重点在于已经发送了但是还没被接收⽅确认的数据,该部分的策略直接决定着协议快速、⾼效与否。该部分的策略直接决定着协议快速、⾼效与否。KCP主要使⽤两种策略来决定是否
需要重传KCP数据包,超时重传、快速重传、选择重传。超时重传、快速重传、选择重传。
1、超时重传
TCP超时计算是RTOx2,这样连续丢三次包就变成RTOx8了,⽽KCP⾮快速模式下每次+RTO,急速模式下+0.5RTO(实验证明1.5这个
值相对⽐较好),提⾼了传输速度。提⾼了传输速度。
[RTO算法对⽐图]
2、快速重传
发送端发送了1,2,3,4,5⼏个包,然后收到远端的ACK:1,3,4,5,当收到ACK3时,KCP知道2被跳过1次,收到ACK4时,知道2被跳过
了2次,此时可以认为2号丢失,不⽤等超时斜的拼音组词是什么 ,直接重传2号包,⼤⼤改善了丢包时的传输速度。⼤⼤改善了丢包时的传输速度。TCP有快速重传算法,TCP包被跳过3次
之后会进⾏重传。
注:可以通过统计错误重传(重传的包实际没丢,仅乱序),优化该设置。
3、选择重传
⽼的TCP丢包时会全部重传从丢的那个包开始以后的数据,KCP是选择性重传,只重传真正丢失的数据包。但是,⽬前⼤部分的操作系
统,linux与android⼿机均是⽀持SACK选择重传的。
步骤3:数据发送
通过步骤2判定,kcp包是否需要发送,如果需要发送的kcp包则通过,kcp_setoutput设置的发送接⼝进⾏发送,UDP通常为sendto。步
骤3,会对较⼩的kcp包进⾏合并,⼀次性发送提⾼效率。
2.3
数据接收过程
KCP的接收过程是将UDP收到的数据进⾏解包,重新组装顺序的、可靠的数据后交付给⽤户。
2.3.1KCP数据包接收
kcp_input输⼊UDP收到的数据包。kcp包对前⾯的24个字节进⾏解压,包括conv、frg、cmd、wnd、ts、sn、una、len。根据
una,会删除snd_buf中,所有una之前的kcp数据包,因为这些数据包接收者已经确认。根据wnd更新接收端接收窗⼝⼤⼩。根据不同的
命令字进⾏分别处理。数据接收后,更新流程如下所⽰:
[接收处理流程图]
1、IKCP_CMD_PUSH数据发送命令
a、KCP会把收到的数据包的sn及ts放置在acklist中,两个相邻的节点为⼀组,分别存储sn和ts。update时会读取acklist,并以update时会读取acklist,并以
IKCP_CMD_ACK的命令返回确认包IKCP_CMD_ACK的命令返回确认包。如下图中,收到了两个kpc包,acklist中会分别存放10,123,11,124。
b、kcp数据包放置rcv_buf队列。丢弃接收窗⼝之外的和重复的包。然后将rcv_buf中的包,移⾄rcv_queue。原来的rcv_buf中已经有
sn=10和sn=13的包了,sn=10的kcp包已经在rcv_buf中了,因此新收到的包会直接丢弃掉,sn=11的包放置⾄rcv_buf中。
c、把rcv_buf中前⾯连续的数据sn=11,12,13全部移动⾄rcv_queue,rcv_nxt也变成14。
rcv_queue的数据是连续的,rcv_buf可能是间隔的
d、kcp_recv函数,⽤户获取接收到数据(去除kcp头的⽤户数据)。该函数根据frg,把kcp包数据进⾏组合返回给⽤户。
2、IKCP_CMD_ACK数据确认包
两个使命:1、RTO更新,2、确认发送包接收⽅已接收到。
正常情况:正常情况:收到的sn为11,una为12。表⽰sn为11的已经确认,下⼀个等待接收的为12。发送队列中,待确认的⼀个包为11,这个时候
snd_una向后移动⼀位,序列号为11的包从发送队列中删除。
[数据确认包处理流程]
异常情况:异常情况:如下图所⽰,sn!=11的情况均为异常情况。sn<11表⽰,收到重复确认的包,如本来以为丢失的包重新⼜收到了,所以产⽣重
复确认的包;sn>17,收到没发送过的序列号,概率极低,可能是conv没变重启程序导致的;112,则启动快速重传
[KCP快速确认]
确认包发送,接收到的包会全部放在acklist中,以IKCP_CMD_ACK包发送出去
3流量控制与拥塞控制
3.1
RTO计算(与TCP完全⼀样)
RTT:⼀个报⽂段发送出去,到收到对应确认包的时间差。
SRTT(kcp->rx_srtt):RTT的⼀个加权RTT平均值,平滑值。
RTTVAR(kcp->rx_rttval):RTT的平均偏差,⽤来衡量RTT的抖动。
3.2
流量控制
流量控制是点对点的通信量的控制,是⼀个端到端的问题。总结起来,就是发送⽅的速度要匹配接收⽅接收(处理)数据的速度。发送⽅要
抑制⾃⾝的发送速率,以便使接收端来得及接收。
KCP的发送机制采⽤TCP的滑动窗⼝⽅式,可以⾮常容易的控制流量。KCP的头中包含wnd,即接收⽅⽬前可以接收的⼤⼩。能够发送的
数据即为snd_una与snd_una+wnd之间的数据。接收⽅每次都会告诉发送⽅我还能接收多少,发送⽅就控制下,确保⾃⼰发送的数据不多
于接收端可以接收的⼤⼩。
KCP默认为32,即可以接收最⼤为32*MTU=43.75kB。KCP采⽤update的⽅中秋节来历简短40字 式,更新间隔为10ms,那么KCP限定了你最⼤传输速率为
4375kB/s,在⾼⽹速传输⼤内容的情况下需要调⽤ikcp_wndsize调整接收与发送窗⼝。
KCP的主要特⾊在于实时性⾼,对于实时性⾼的应⽤,如果发⽣数据堆积会造成延迟的持续增⼤。建议从应⽤侧更好的控制发送流量与⽹络
速度持平,避免缓存堆积延迟。(详见参考资料)
3.3
拥塞控制(KCP可关闭)
KCP的优势在于可以完全关闭拥塞控制,⾮常⾃私的进⾏发送。KCP采⽤的拥塞控制策略为TCP最古⽼的策略,⽆任何优势。完全关闭拥
塞控制,也不是⼀个最优策略,它全是会造成更为拥堵的情况。
⽹络中链路的带宽,与整条⽹络中的交换节点(路由器、交换机、基站等)有关。如果,所有使⽤该链路的流量超出了,该链路所能提供的
能⼒,就会发⽣拥塞。车多路窄,就会堵车,车越多堵的越厉害。因此,TCP作为⼀个⼤公⽆私的协议,当⽹络上发送拥堵的时候会降低⾃
⾝发送数据的速度。拥塞控制是整个⽹络的事情,流量控制是发送和接收两⽅的事情。
当发送⽅没有按时接收到确认包,就认为⽹络发⽣了拥堵⾏为。TCP拥塞控制的⽅式,归结为慢开始、拥塞避免,如下图所⽰
[拥塞控制算法]
KCP发⽣丢包的情况下的拥塞控制策略与TCPTahoe版本的策略⼀致。TCPReno版本已经使⽤快恢复策略。因此,丢包的情况下,其实因此,丢包的情况下,其实
KCP拥塞控制策略⽐TCP更为苛刻。
KCP在发⽣快速重传,数据包乱序时,采⽤的是TCP快恢复的策略。控制窗⼝调整为已经发送没有接收到ack的数据包数⽬的⼀半
+resent。
注:⽬前kernel3.2以上的linux,默认采⽤google改进的拥塞控制算法,ProportionalRateReductionforTCP。该算法的主要特点
为,的cwnd如下图所⽰:
参考资料:
⼿机投射静态演⽰
关注腾讯WeTest,了解更多热门测试产品:WeTest腾讯质量开放平台-专注游戏,提升品质
更多推荐
1400是什么意思0在线翻译读音例句
发布评论