UDP教学模式专注力:UDP中使用bind和connect的作用

2021/09/12 04:31 · 提高专注力训练 ·  · UDP教学模式专注力:UDP中使用bind和connect的作用已关闭评论
专注力注意力训练提升
摘要:

UDP教学模式专注力:UDP中使用bind和connect的作用1:UDP中可以使用connect系统调用2:UDP中connect操作与TCP中connect操作有着本质区别。TCP中调用connect会引起三次握手,client与server建立连结.UDP中调用

UDP教学模式专注力:UDP中使用bind和connect的作用  第1张

UDP教学模式专注力:UDP中使用bind和connect的作用

1:UDP中可以使用connect系统调用
2:UDP中connect操作与TCP中connect操作有着本质区别。
TCP中调用connect会引起三次握手,client与server建立连结.UDP中调用connect内核仅仅把对端ip&port记录下来.
3:UDP中可以多次调用connect,TCP只能调用一次connect.
UDP多次调用connect有两种用途:1,指定一个新的ip&port连结. 2,断开和之前的ip&port的连结.
指定新连结,直接设置connect第二个参数即可.
断开连结,需要将connect第二个参数中的sin_family设置成 AF_UNSPEC即可.
4:UDP中使用connect可以提高效率.原因如下:
普通的UDP发送两个报文内核做了如下:#1:建立连结#2:发送报文#3:断开连结#4:建立连结#5:发送报文#6:断开连结
采用connect方式的UDP发送两个报文内核如下处理:#1:建立连结#2:发送报文#3:发送报文另外一点, 每次发送报文内核都由可能要做路由查询.
5:采用connect的UDP发送接受报文可以调用send,write和recv,read操作.当然也可以调用sendto,recvfrom.
调用sendto的时候第五个参数必须是NULL,第六个参数是0.调用recvfrom,recv,read系统调用只能获取到先前connect的ip&port发送的报文.
UDP中使用connect的好处:1:会提升效率.前面已经描述了.2:高并发服务中会增加系统稳定性.原因:假设client A 通过非connect的UDP与server B,C通信.B,C提供相同服务.为了负载均衡,我们让A与B,C交替通信.A 与 B通信IPa:PORTa <----> IPb:PORTb;
A 与 C通信IPa:PORTa' <---->IPc:PORTc
假设PORTa 与 PORTa'相同了(在大并发情况下会发生这种情况),那么就有可能出现A等待B的报文,却收到了C的报文.导致收报错误.解决方法内就是采用connect的UDP通信方式.在A中创建两个udp,然后分别connect到B,C.

对一个UDP的套接口多次调用connect的情况如何?
连接新的IP和端口
断开前面的连接
第一个目的不同于TCP连接connect的使用:对于TCP连接,connect只能调用一次;针对UDP则可以connect到不同的server,eg:client需要和多个服务器同时通信。
第二个目的为了断开一个已连接的UDP连接,再次调用connect时,把套接字地址结构的地址簇成员(IPv4为sin_family,IPv6为sin6_family),设置为AF_UNSPEC即可。

性能:当进程知道自己要给同一个目的地址发送多个数据报时,显式连接套接字效率更高。
而临时连接未连接的UDP套接字大约会消耗每个UDP传输三分之一的开销。

UDP教学模式专注力:UDP中使用bind和connect的作用  第1张

UDP教学模式专注力:UDP协议发送和接收消息案例详解

简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB的实现 ,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密   Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。   设定字符串为“张三,你好,我是李四”   产生张三的密钥对(keyPairZhang)   张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节   通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥   Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从文件中得到公钥编码的字节数组、如何从字节数组解码公钥。 Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输   Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲UDP教学模式专注力:UDP中使用bind和connect的作用  第3张

UDP教学模式专注力:UDP培训心得体会

UDP
培训心得体会
?
今年我有幸参加了
13
号到
24
号的二年级和一年级的
UDP
培训,
通过培训,
切实的感受到了自身的提高,
在此感谢领导安排的此次学
习活动,
感谢每一位培训老师精彩的授课。
参加本次培训我主要有以
下几方面体会和收获:
?
一、班级管理方面。通过参加制定培训小组约定,从而体会怎样
让学生制定小组约定以及班规,
让学生自己做主从而担当责任,
激发
学生的主人翁意识,培养学生的自律和担当能力。
?
二、
学生的提问能力方面。
好的教育要培养学生一种质疑和好奇
的文化,
在一天中激发和示范一种好奇的性情,
能更好的激发的好学
生奇心和质疑能力,
老师要重视和处理学生的问题,
培养他们提问的
技巧和知识,当我们把注意力转向“如何”和“为什么”学习,而不
是简单的“是什么”时,我们的教学就会发生一些变化,学生的能力
也会发生一些变化,从而培养了学生思考的能力。
?
三、
课堂形式的变化方面。
UDP
打破我们原来的传统的教学模式,
带领学生认识大自然,认识社会,激发了学生的学习兴趣。并在这个
过程中让认识了我与自己、我与自然、我与社会得关系,从而融合了
各科知识在课堂中,
综合了各学科知识,
培养学生多方面思考问题的
能力。
?
学习能让人进步,相信我们在不断地学习中会越来越优秀,从而
让我们的学生也越来越优秀!
?

UDP教学模式专注力:如何利用UDP实现可靠传输(RUDP)

?

其实在实时通信领域存在一个三角平衡关系——成本、质量和时延三者的制约关系:

?

?

?

?

也就是说投入的成本、获得的质量和通信的时延之间是一个三角制约 (LEQ) 关系,所以实时通信系统的设计者会在这三个制约条件下找到一个平衡点,TCP 属于通过增大延迟和传输成本来保证质量的通信方式,UDP 是通过牺牲质量来保证时延和成本的通信方式,所以在一些特定场景下 RUDP 更容易找到这样的平衡点。RUDP 是怎么去找这个平衡点的,就要先从 RUDP 的可靠概念和使用场景来分析。

在实时通信过程中,不同的需求场景对可靠的需求是不一样的,我们在这里总体归纳为三类定义:

1)尽力可靠:通信的接收方要求发送方的数据尽量完整到达,但业务本身的数据是可以允许缺失的。例如:音视频数据、幂等性状态数据。;

2)无序可靠:通信的接收方要求发送方的数据必须完整到达,但可以不管到达先后顺序。例如:文件传输、白板书写、图形实时绘制数据、日志型追加数据等;

3)有序可靠:通信接收方要求发送方的数据必须按顺序完整到达。

RUDP 是根据这三类需求和上节图中的三角制约关系来确定自己的通信模型和机制的,也就是找通信的平衡点。

说到这里可能很多人会说:干嘛那么麻烦,直接用 TCP 好了!

确实很多人也都是这样做的,TCP 是个基于公平性的可靠通信协议,但是在一些苛刻的网络条件下 TCP 要么不能提供正常的通信质量保证,要么成本过高。为什么要在 UDP 之上做可靠保证,究其原因就是在保证通信的时延和质量的条件下尽量降低成本。

RUDP 主要解决以下相关问题:

1)端对端连通性问题:

一般终端直接和终端通信都会涉及到 NAT 穿越,TCP 在 NAT 穿越实现非常困难,相对来说 UDP 穿越 NAT 却简单很多,如果是端到端的可靠通信一般用 RUDP 方式来解决,场景有:端到端的文件传输、实时音视频传输、交互指令传输等等;

2)弱网环境传输问题:

在一些 Wi-Fi 或者 3G/4G 移动网下,需要做低延迟可靠通信,如果用 TCP 通信延迟可能会非常大,这会影响用户体验。例如:实时的操作类网游通信、语音对话、多方白板书写等,这些场景可以采用特殊的 RUDP 方式来解决这类问题;

3)带宽竞争问题:

有时候客户端数据上传需要突破本身 TCP 公平性的限制来达到高速低延时和稳定,也就是说要用特殊的流控算法来压榨客户端上传带宽,例如:直播音视频推流,这类场景用 RUDP 来实现不仅能压榨带宽,也能更好地增加通信的稳定性,避免类似 TCP 的频繁断开重连;

4)传输路径优化问题:

在一些对延时要求很高的场景下,会用应用层 relay 的方式来做传输路由优化,也就是动态智能选路,这时双方采用 RUDP 方式来传输,中间的延迟进行 relay 选路优化延时。还有一类基于传输吞吐量的场景,例如:服务与服务之间数据分发、数据备份等,这类场景一般会采用多点并联 relay 来提高传输的速度,也是要建立在 RUDP 上的(这两点在后面着重来描述);

5)资源优化问题:

某些场景为了避免 TCP 的三次握手和四次挥手的过程,会采用 RUDP 来优化资源的占用率和响应时间,提高系统的并发能力,例如 QUIC。

不管哪类场景,都是要保证可靠性,也就是质量,那么在 UDP 之上怎么实现可靠呢?答案就是重传。

IP 协议在设计的时候就不是为了数据可靠到达而设计的,所以 UDP 要保证可靠,就依赖于重传,这也就是我们通常意义上的 RUDP 行为。

在描述 RUDP 重传之前先来了解下 RUDP 基本框架,如图:

?

?

?

?

RUDP 分为发送端和接收端,每一种 RUDP 在设计的时候会做不一样的选择和精简,概括起来就是图中的单元。RUDP 的重传是发送端通过接收端 ACK 的丢包信息反馈来进行数据重传,发送端会根据场景来设计自己的重传方式,重传方式分为三类:定时重传、请求重传和 FEC 选择重传。

定时重传很好理解,就是发送端如果在发出数据包(T1)时刻一个 RTO 之后还未收到这个数据包的 ACK 消息,那么发送端就重传这个数据包。这种方式依赖于接收端的 ACK 和 RTO,容易产生误判,主要有两种情况:

1)对方收到了数据包,但是 ACK 发送途中丢失;

2)ACK 在途中,但是发送端的时间已经超过了一个 RTO。

所以超时重传的方式主要集中在 RTO 的计算上,如果你的场景是一个对延迟敏感但对流量成本要求不高的场景,就可以将 RTO 的计算设计得比较小,这样能尽最大可能保证你的延时足够小。

例如:实时操作类网游、教育领域的书写同步,是典型的用 expense 换 latency 和 quality 的场景,适合用于小带宽低延迟传输。如果是大带宽实时传输,定时重传对带宽的消耗是很大的,极端情况会有 20% 的重传率,所以在大带宽模式下一般会采用请求重传模式。

请求重传就是接收端在发送 ACK 的时候携带自己丢失报文的信息反馈,发送端接收到 ACK 信息时根据丢包反馈进行报文重传。

如下图:

?

?

?

?

这个反馈过程最关键的步骤就是回送 ACK 的时候应该携带哪些丢失报文的信息,因为 UDP 在网络传输过程中会乱序会抖动,接收端在通信的过程中要评估网络的 jitter time,也就是 rtt_var(RTT 方差值),当发现丢包的时候记录一个时刻 t1,当 t1 + rtt_var < curr_t(当前时刻),我们就认为它丢失了。 这个时候后续的 ACK 就需要携带这个丢包信息并更新丢包时刻 t2,后续持续扫描丢包队列,如果 t2 + RTO 这种方式是由丢包请求引起的重发,如果网络很不好,接收端会不断发起重传请求,造成发送端不停的重传,引起网络风暴,通信质量会下降,所以我们在发送端设计一个拥塞控制模块来限流,这个后面我们重点分析。 整个请求重传机制依赖于 jitter time 和 RTO 这个两个时间参数,评估和调整这两个参数和对应的传输场景也息息相关。请求重传这种方式比定时重传方式的延迟会大,一般适合于带宽较大的传输场景,例如:视频、文件传输、数据同步等。 除了定时重传和请求重传模式以外,还有一种方式就是以 FEC 分组方式选择重传,FEC(Forward Error Correction)是一种前向纠错技术,一般通过 XOR 类似的算法来实现,也有多层的 EC 算法和 raptor 涌泉码技术,其实是一个解方程的过程。 应用到 RUDP 上示意图如下: ? ? ? ? 在发送方发送报文的时候,会根据 FEC 方式把几个报文进行 FEC 分组,通过 XOR 的方式得到若干个冗余包,然后一起发往接收端,如果接收端发现丢包但能通过 FEC 分组算法还原,就不向发送端请求重传,如果分组内包是不能进行 FEC 恢复的,就向发送端请求原始的数据包。 FEC 分组方式适合解决要求延时敏感且随机丢包的传输场景,在一个带宽不是很充裕的传输条件下,FEC 会增加多余的包,可能会使得网络更加不好。FEC 方式不仅可以配合请求重传模式,也可以配合定时重传模式。 在上面介绍重传模式时多次提到 RTT、RTO 等时间度量,RTT(Round Trip Time)即网络环路延时,环路延迟是通过发送的数据包和接收到的 ACK 包计算的,示意图如下: ? ? ? ? RTT = T2 - T1: 这个计算方式只是计算了某一个报文时刻的 RTT,但网络是会波动的,这难免会有噪声现象,所以在计算的过程中引入了加权平均收敛的方法(具体可以参考 RFC793)。 SRTT = (α * SRTT) + (1-α)RTT: 这样可以求得逼近的 SRTT,在公式中一般α=0.8,确定了 SRTT,下一步就是计算 RTT_VAR(方差),我们设 RTT_VAR = |SRTT – RTT|,那么 SRTT_VAR =(α * SRTT_VAR) + (1-α) RTT_VAR,这样可以得到 RTT_VAR 的值。 但最终我们是需要 RTO,因为涉及到报文重传,RTO 就是一个报文的重传周期,从网络的通信流程我们很容易知道,重传一个包以后,如果一个 RTT+RTT_VAR 之后的时间还没收到确定,那我们就可以再次重传,则可知:RTO = SRTT + SRTT_VAR。 但一般网络在严重抖动的情况下还是会有较大的重复率问题,所以:RTO = β*(SRTT + RTT_VAR),1.2 <β<2.0,可以根据不同的传输场景来选择β的值。 RUDP 是通过重传来保证可靠的,重传在三角平衡关系中其实是用 expense 和 latency 来换取 quality 的行为,所以重传会引来两个问题,一个是延时,一个是重传的带宽,尤其是后者,如果控制不好会引来网络风暴,所以在发送端会设计一个窗口拥塞机制了避免并发带宽占用过高的问题。 RUDP 需要一个收发的滑动窗口系统来配合对应的拥塞算法做流量控制,有些 RUDP 需要发送端和接收端的窗口严格地对应,有些 RUDP 不要求收发窗口严格对应。如果涉及到可靠有序的 RUDP,接收端就要做窗口排序和缓冲,如果是无序可靠或者尽力可靠的场景,接收端一般就不做窗口缓冲,只做位置滑动。 先来看收发窗口关系图: ? ? ? ? 上图描述的是发送端从发送窗口中发了 6 个数据报文给接收端,接收端收到 101,102,103,106 时会先判断报文的连续性并滑动窗口开始位置到 103,接着每个包都回应 ACK,发送端在接收到 ACK 的时候,会确认报文的连续性,并滑动窗口到 103,发送端会再判断窗口的空余,然后填补新的发送数据,这就是整个窗口滑动的流程。 这里值的一提的是在接收端收到 106 时的处理,如果是有序可靠,那么 106 不会通知上层业务进行处理,而是等待 104、105。如果是尽力可靠和无序可靠场景,会将 106 通知给上层业务先进行处理。在收到 ACK 后,发送端的窗口要滑动多少是由自己的拥塞机制定的,也就是说窗口的滑动速度受拥塞机制控制,拥塞控制实现要么基于丢包率来实现,要么基于双方的通信时延来实现,下面来看几种典型的拥塞控制。 TCP 经典拥塞算法分为四个部分:慢启动、拥塞避免、拥塞处理和快速恢复,这四个部分都是为了决定发送窗口和发送速度而设计的,其实就是为了在当前网络条件下通过网络丢包来判断网络拥塞状态,从而确定比较适合的发送传输窗口。 经典算法是建立在定时重传的基础上的,如果 RUDP 采用这种算法来做拥塞控制,一般的场景是为了保证有序可靠传输的同时又兼顾网络传输的公平性原则。先逐个来解释下这几部分。 慢启动(slow start): 当连接链路刚刚建立后,不可能一开始将 cwnd 设置得很大,这样容易造成大量重传,经典拥塞里面会在开始将 cwnd = 1,然后根据通信过程的丢包情况来逐步扩大 cwnd 来适应当前的网络状态,直到达到慢启动的门限阈值 (ssthresh),步骤如下: 1)初始化设置 cwnd = 1,并开始传输数据; 2)收到回馈的 ACK,会将 cwnd 加 1; 3)当发送端一个 RTT 后且未发现有丢包重传,就会将 cwnd = cwnd * 2; 4)当 cwnd >= ssthresh 或发生丢包重传时慢启动结束,进入拥塞避免状态。

拥塞避免:

当通信连接结束慢启动后,有可能还未到网络传输速度的上线,这个时候需要进一步通过一个缓慢的调节过程来进行适配。一般是一个 RTT 后如果未发现丢包,就将 cwnd = cwnd + 1。一但发现丢包和超时重传,就进入拥塞处理状态。

拥塞处理:

拥塞处理在 TCP 里面实现很暴力,如果发生丢包重传,直接将 cwnd = cwnd / 2,然后进入快速恢复状态。

快速恢复:

通过确认丢包只发生在窗口一个位置的包来确定是否进行快速恢复,如图 6 中描述,如果只是 104 发生了丢失,而 105 和 106 是收到了的,那么 ACK 总是会将 ACK 的 base = 103,如果连续 3 次收到 base 为 103 的 ACK,就进行快速恢复,也就是立即重传 104,而后如果收到新的 ACK 且 base > 103,将 cwnd = cwnd + 1,并进入拥塞避免状态。

经典拥塞控制是基于丢包检测和定时重传模式来设计的,在三角平衡关系中是一个典型的以 latency 换取 quality 的案例,但由于其公平性设计避免了过高的 expense,也就会让这种传输方式很难压榨网络带宽,很难保证网络的大吞吐量和小时延。

对于经典拥塞算法的延迟和带宽压榨问题 Google 设计了基于发送端延迟和带宽评估的 BBR 拥塞控制算法。

这种拥塞算法致力于解决两个问题:

1)在一定丢包率网络传输链路上充分利用带宽;

2)降低网络传输中的 buffer 延迟。

BBR 的主要策略是周期性通过 ACK 和 NACK 返回来评估链路的 min_rtt 和 max_bandwidth。最大吞吐量(cwnd)的大小就是:cwnd = max_bandwidth / min_rtt。

传输模型如下:

?

?

?

?

BBR 整个拥塞控制是一个探测带宽和 Pacing rate 的状态,有 4 个状态:

1)Startup:启动状态(相当于慢启动),增益参数为 max_gain = 2.85;

2)DRAIN:满负荷传输状态;

3)PROBE_BW:带宽评估状态,通过一个较小的 BBR 增益参数来递增(1.25)或者递减 (0.75);

4)PROBE_RTT:延迟评估状态,通过维持一个最小发送窗口(4 个 MSS)进行的 RTT 采样。

那么这几种状态是怎么来回切换的呢?以下是 QUIC 中 BBR 大致的步骤如下:

1)初始化连接时会设置一个初始的 cwnd = 8,并将状态设置 Startup;

2)在 Startup 下发送数据,根据 ACK 数据的采样周期性判断是否可以增加带宽,如果可以,将 cwnd = cwnd *max_gain。如果时间周期数超过了预设的启动周期时间或者发生了丢包,进行 DRAIN 状态;

3)在 DRAIN 状态下,如果 flight_size(发送出去但还未确认的数据大小) >cwnd, 继续保证 DRAIN 状态,如果 flight_size

4)在PROBE_BW状态下,如果未发生丢包且flight_size cwnd,将cwnd = cwnd * 1.25,如果发生丢包,cwnd = cwnd * 0.75;

5)在 Startup/DRAIN/PROBE_BW 三个状态中,如果持续 10 秒钟的通信中没有出现 RTT <= min_rtt,就会进入到 PROBE_RTT 状态,并将 cwnd = 4 *MSS; 6)在 PROBE_RTT 状态,会在收到 ACK 返回的时候持续判断 flight_size >= cwnd 并且无丢包,将本次统计的最小 RTT 作为 min_rtt,进入 Startup 状态。

BBR 通过以上几个步骤来周期性计算 cwnd,也就是网络最大吞吐量和最小延迟,然后通过 pacing rate 来确定这一时刻发送端的码率,最终达到拥塞控制的目的。

BBR 适合在随机丢包且网络稳定的情况下做拥塞,如果在网络信号极不稳定的 Wi-Fi 或者 4G 上,容易出现网络泛洪和预测不准的问题,BBR 在多连接公平性上也存在小 RTT 的连接比大 RTT 的连接更吃带宽的情况,容易造成大 RTT 的连接速度过慢的情况。BBR 拥塞算法在三角平衡关系中是采用 expense 换取 latency 和 quality 的案例。

说到实时音视频传输就必然会想到 开源实时音视频工程WebRTC,在 WebRTC 中对于视频传输也实现了一个拥塞控制算法 (GCC),WebRTC 的 GCC 是一个基于发送端丢包率和接收端延迟带宽统计的拥塞控制,而且是一个尽力可靠的传输算法,在传输的过程中如果一个报文重发太多次后会直接丢弃,这符合视频传输的场景(更多 WebRTC 文章点此进入)。

借用一张图来看个究竟:

?

?

?

?

(本图来自:《WebRTC基于GCC的拥塞控制(上) - 算法分析》一文)

GCC 的发送端会根据丢包率和一个对照表来 pacing rate,当 loss < 2% 时,会加大传输带宽,当 loss >=2% &&loss <10%,会保持当前码率,当 loss>=10%,会认为传输过载,进行调小传输带宽。

GCC 的接收端是根据数据到达的延迟方差和大小进行 KalmanFilter 进行带宽逼近收敛,具体的细节不介绍了,请查看:《WebRTC视频接收缓冲区基于KalmanFilter的延迟模型》。

这里值得一说的是 GCC 引入接收端对带宽进行 KalmanFilter 评估是一个非常新颖的拥塞控制思路,如果实现一个尽力可靠的 RUDP 传输系统不失为是一个很好的参考。

但这种算法也有个缺陷,就是在网络间歇性丢包情况下,GCC 可能收敛的速度比较慢,在一定程度上有可能会造成 REMB 很难反馈给发送端,容易出现发送端流控失效。GCC 在三角平衡关系算一个以 quality 和 expense 换取 latency 的案例。

其实在很多场景是不用拥塞控制或者只要很弱的拥塞控制即可,例如:师生双方书写同步、实时游戏,因为本身的传输的数据量不大,只要保证足够小的延时和可靠性就行,一般会采用固定窗口大小来进行流控,我们在系统中一般采用一个 cwnd =32 这样的窗口来做流控,ACK 确认也是通过整个接收窗口数据状态反馈给发送方,简单直接,也很容易适应弱网环境。

RUDP 除了优化连接、压榨带宽、适应弱网环境等以外,它也继承了 UDP 天然的动态性,可以在中间应用层链路上做传输优化,一般分为多点串联优化和多点并联优化。我们具体来说一说。

在实时通信中一些业务场景对延迟非常敏感,例如:实时语音、同步书写、实时互动、直播连麦等,如果单纯的服务中转或者 P2P 通信,很难满足其需求,尤其是在物理距离很大的情况下。

在解决这个问题上 SKYPE 率先提出全球 RTN(实时多点传输网络),其实就是在通信双方之间通过几个 relay 节点来动态智能选路,这种传输方式很适合 RUDP,我们只要在通信双方构建一个 RUDP 通道,中间链路只是一个无状态的 relay cache 集合,relay 与 relay 之间进行路由探测和选路,以此来做到链路的高可用和实时性。

如下图:

?

?

?

?

通过多点 relay 来保证 RUDP 进行传输优化,这类场景在三角平衡关系里是典型的用 expense 来换取 latency 的案例。

在服务与服务进行媒体数据传输或者分发过程中,需要保证传输路径高可用和带宽并发,这类使用场景也会使用传输双方构建一个 RUDP 通道,中间通过多 relay 节点的并联来解决。

如下图所示:

?

?

?

?

这种模型需要在发送端设计一个多点路由表探测机制,以此来判断各个路径同时发送数据的比例和可用性,这个模型除了链路备份和增大传输并发带宽外,还有个辅助的功能,如果是流媒体分发系统,我们一般会用 BGP 来做中转,如果节点与节点之间可以直连,这样还可以减少对 BGP 带宽的占用,以此来减少成本。

到这里 RUDP 的介绍也就结束了,说了些细节和场景相关的事,也算是个入门级的科普文章。RUDP 的概念从提出到现在也差不多有 20 年了,很多从业人员希望通过一套完善的方案来设计一个通用的 RUDP,我个人觉得这不太可能,就算设计出来了,估计和现在 TCP 差不多,这样做的意义不大。

RUDP 的价值在于根据不同的传输场景进行不同的技术选型,可能选择宽松的拥塞方式、也可能选择特定的重传模式,但不管怎么选,都是基于 expense(成本)、latency(时延)、quality(质量)三者之间来权衡,通过结合场景和权衡三角平衡关系 RUDP 或许能帮助开发者找到一个比较好的方案。

?

?

?

?

袁荣喜:学霸君资深架构师,16 年的 C 程序员,擅长 P2P 通信网络、TCP/IP 通信协议栈和鉴权加密技术,2015 年加入学霸君,负责构建学霸君的智能路由实时音视频传输系统和网络,解决音视频通信的实时性的问题。

作者:Jack Jiang
链接:https://zhuanlan.zhihu.com/p/
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

UDP教学模式专注力:解析山东潍坊市钢城现代学校“UDP”课程

由知识走向真实世界----解析山东潍坊市钢城现代学校“UDP”课程
臧秀霞
“我们学校迫切需要有一套内容连贯的课程,它要超越孤立的课程,还能帮助学生看到事物之间的联系和规律,并把所学知识充分地运用到生活中去。”基于这样的认识,经过三年的研究与实践,潍坊市高新区钢城现代学校探索出实施UDP课程的一条行之有效的道路。
所谓UDP(understanding理解力development发展
practice实践)课程,就是通过实践使学生理解力得到发展的一种课程体系。它是在对国际文凭组织(IBO)的《小学项目课程框架(PYP)》进行追根溯源,以及对《概念过程教学》深入研究的基础上,通过实验形成的一套逆向设计的课程框架。
 学习内容——建立学科间联系
  已故当代著名的教育家、美国卡内基教学促进基金会主席波伊尔博士提出,人类的核心共性包括八个方面,即:生命周期、标志符号的使用、个体和群体、时间和空间、审美观、人与大自然、生产与消费、有目的的生活。仔细比较我们不难发现,波伊尔研究的八大人类核心共性与我们常说的综合实践活动课程的三条线索——我与自我,我与自然,我与他人、社会这三大关系是高度契合的。
  基于此认识,学校将三大关系具体化为人类的八大核心共性,从八大核心共性中选取主题,然后把语言、数学、英语、科学、艺术等学科内容融合到八个综合的主题中,打通学科与学科、学科与生活、学校与家庭的联系,实现知识的融会贯通,让学生感受和体验到知识与真实世界的关系。
  比如,一年级第一学期的第一个跨学科主题“时间和空间——认识校园”,围绕中心思想“学校是孩子们游戏和学习的地方”,通过“学校里有什么,它们是什么样子的?教室里有什么,它们是做什么用的?我们在学校里做什么?”等一系列与学习主题相关的问题,老师带领学生走进校园探究。孩子们在数一数学校的教室与楼房有多少的过程中,认识了数字1至20;在观察中认识了物体的形状、分类及相关汉字;学唱表演了四首与主题相关的歌曲;画校园、教室的样子,创作出想象画,比较学校和家的异同……学生们获得了远远超出课程标准规定的知识与能力水平。不仅仅是这些,在反复与校园“拥抱”后,学生们不但在知识、情感、技能方面有了很大的提升,而且在快乐“玩耍”中爱上了校园。
  把注意力放在人类共同经验上,孩子们不仅学到了基础知识的核心内容,而且发现了各个学科间的内在联系。
  教学方式——协同备课和上课
  UDP课程打破学科边界,避免了分科教学中过于高估学科价值、教学内容重复等缺点,把重点放在培养全面发展的人上。教师以该课程框架为工具,通过协同备课与协同教学来生成课程。在协同备课中,各学科教师在一起,不再围绕某一学科或某一知识点进行教学设计,而是打破学科之间的壁垒,实现学科之间的统合和知识的融会贯通。整个教学过程以概念驱动为本,以探究为主要学习方式,用活动实现对教学目标的理解。所有的探究活动从学生实践经验出发,引领学生在做中学,真正实现了变被动接受为主动探究学习。教师协同备课的过程体现了教师们课程建设和课程实施的创造活力。
  如一年级《节日》探究单元,主班老师确定好主题后,任教语文、数学、英语、艺术、体育、科学的教师聚集到一起,汇集了各学科的相关资源,通过讨论确定了本主题的三个重要概念“庆祝、纪念、警示”,三个重要概念联结成了本主题的中心思想“节日是庆祝、纪念、警示的方式”;围绕中心思想,教师们确定了探究线索:为什么要有节日?人们在节日里做什么?节日的古今中外的异同;根据探究线索、孩子的生活环境、学习特点、认知规律,老师们各抒己见,一起设计了介绍节日照片、做元宵、讲节日故事、感恩妇女节、一起来过植树节、自选节日庆祝等活动,并围绕中心思想和活动讨论确定了技能目标和态度目标。至此,一个完整的探究单元备课计划完成了。在具体上课时,各学科教师再协同上课,以达成让学生综合学习的目的。
《节日》探究单元进行了六周的时间,孩子们在学到学科知识的同时,还培养了“尊重、投入、热诚”的品格及探究、沟通的能力。用家长的话说就是:“六周的时间,孩子似乎一下子长大了。”
  课时安排——把时间交给老师
  传统教学中我们经常会听到老师们这样一些指令:“请在30分钟的时间里完成‘空气助燃’的实验。”“请在40分钟时间里完成一篇《快乐的节日》的作文。”“请在20分钟时间里自学完‘列方程解应用题’。”真正有价值的工作是需要时间的,而我们每节课却固定教学时间,这样呆板的上课时间往往限制了学生的学习。
  当然,学校每天的时间应该有计划。教师也必须认真考虑在各门课程上要花多少时间。但是,这种时间表只能是指导性的,而不是强制命令。UDP课程要求,时间应该为学习服务。每个课堂里的教师可以自由调整课时,他只需对教学结果负责,而不要跟着时钟转。于是就出现了这样的一个小故事:一节上了90分钟的美术课。
  这是《秋天》探究单元的一节课。按备课活动安排,董龙龙老师和孩子们参观秋天的校园并完成说话练习后,便开始了主题为《我眼中的秋天》的绘画课。因为有了亲身体验,更因孩子们想象力丰富,孩子们的绘画里呈现出了这样的一些画面:有兴致勃勃观赏校园的小朋友,有摇曳在枝头的色彩斑斓的各种树的叶子,有或青或黄的路边小草,有正绽放着的金黄的雏菊和不知名的小野花……孩子们如此细腻的观察让我们每个大人无比惊讶。更令我们想不到的是,刚刚进入小学两个月的孩子,为了完成这幅画,竟然不愿意下课,结果一节课上了90分钟。
  教育专家常说“把时间还给学生,把学习的自主权还给学生。”可是,怎么做才能把时间真正还给学生?UDP课程的真实课堂告诉我们,首先要把时间还给老师,让老师根据课程内容和活动确定每节课的时间,这样老师才能把时间还给学生,把学习的自主权还给学生。
  UDP课程效果怎么样?实施UDP课程后,我们明显感觉到,孩子学习更快乐、更积极了。随着课程的实施,老师们也一步一步成长起来,适应了从一名知识传授者到学生成长的陪伴者的角色转变,并不知不觉地成为了一名课程设计者。
  (作者:臧秀霞,单位:山东潍坊市高新区钢城现代学校)
中国教育报

您可能感兴趣的文章

本文地址:https://www.wskee.cn/80523.html
文章标签:
版权声明:本文为原创文章,版权归 专注力训练与注意力训练网 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!