帧同步算法
⑴ 计算机网络(三)数据链路层
结点:主机、路由器
链路:网络中两个结点之间的物理通道,链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路。
数据链路:网络中两个结点之间的逻辑通道,把实现控制数据传输协议的硬件和软件加到链路上就构成数据链路。
帧:链路层的协议数据单元,封装网络层数据报。
数据链路层负责通过一条链路从一个结点向另一个物理链路直接相连的相邻结点传送数据报。
数据链路层在物理层提供服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造成为 逻辑上无差错的数据链路 ,使之对网络层表现为一条无差错的链路。
封装成帧就是在一段数据的前后部分添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。首部和尾部包含许多的控制信息,他们的一个重要作用:帧定界(确定帧的界限)。
帧同步:接收方应当能从接收到的二进制比特流中区分出帧的起始和终止。
组帧的四种方法:
透明传输是指不管所传数据是什么样的比特组合,都应当能够在链路上传送。因此,链路层就“看不见”有什么妨碍数据传输的东西。
当所传数据中的比特组合恰巧与某一个控制信息完全一样时,就必须采取适当的措施,使收方不会将这样的数据误认为是某种控制信息。这样才能保证数据链路层的传输是透明的。
概括来说,传输中的差错都是由于噪声引起的。
数据链路层编码和物理层的数据编码与调制不同。物理层编码针对的是单个比特,解决传输过程中比特的同步等问题,如曼彻斯特编码。而数据链路层的编码针对的是一组比特,它通过冗余码的技术实现一组二进制比特串在传输过程是否出现了差错。
较高的发送速度和较低的接收能力的不匹配,会造成传输出错,因此流量控制也是数据链路层的一项重要工作。数据链路层的流量控制是点对点的,而传输层的流量控制是端到端的。
滑动窗口有以下重要特性:
若采用n个比特对帧编号,那么发送窗口的尺寸W T 应满足: 。因为发送窗口尺寸过大,就会使得接收方无法区别新帧和旧帧。
每发送完一个帧就停止发送,等待对方的确认,在收到确认后再发送下一个帧。
除了比特出差错,底层信道还会出现丢包 [1] 问题
“停止-等待”就是每发送完一个分组就停止发送,等待对方确认,在收到确认后再发送下一个分组。其操作简单,但信道利用率较低
信道利用率是指发送方在一个发送周期内,有效地发送数据所需要的时间占整个发送周期的比率。即
GBN发送方:
GBN接收方:
因连续发送数据帧而提高了信道利用率,重传时必须把原来已经正确传送的数据帧重传,是传送效率降低。
设置单个确认,同时加大接收窗口,设置接收缓存,缓存乱序到达的帧。
SR发送方:
SR接收方:
发送窗口最好等于接收窗口。(大了会溢出,小了没意义),即
传输数据使用的两种链路
信道划分介质访问控制将使用介质的每个设备与来自同一通信信道上的其他设备的通信隔离开来,把时域和频域资源合理地分配给网络上的设备。
当传输介质的带宽超过传输单个信号所需的带宽时,人们就通过在一条介质上同时携带多个传输信号的方法来提高传输系统的利用率,这就是所谓的多路复用,也是实现信道划分介质访问控制的途径。多路复用技术把多个信号组合在一条物理信道上进行传输,使多个计算机或终端设备共享信道资源,提高了信道的利用率。信道划分的实质就是通过分时、分频、分码等方法把原来的一条广播信道,逻辑上分为几条用于两个结点之间通信的互不干扰的子信道,实际上就是把广播信道转变为点对点信道。
频分多路复用是一种将多路基带信号调制到不同频率载波上,再叠加形成一个复合信号的多路复用技术。在物理信道的可用带宽超过单个原始信号所需带宽的情况下,可将该物理信道的总带宽分割成若千与传输单个信号带宽相同(或略宽)的子信道,每个子信道传输一种信号,这就是频分多路复用。
每个子信道分配的带宽可不相同,但它们的总和必须不超过信道的总带宽。在实际应用中,为了防止子信道之间的千扰,相邻信道之间需要加入“保护频带”。频分多路复用的优点在于充分利用了传输介质的带宽,系统效率较高;由于技术比较成熟,实现也较容易。
时分多路复用是将一条物理信道按时间分成若干时间片,轮流地分配给多个信号使用。每个时间片由复用的一个信号占用,而不像FDM那样,同一时间同时发送多路信号。这样,利用每个信号在时间上的交叉,就可以在一条物理信道上传输多个信号。
就某个时刻来看,时分多路复用信道上传送的仅是某一对设备之间的信号:就某段时间而言,传送的是按时间分割的多路复用信号。但由于计算机数据的突发性,一个用户对已经分配到的子信道的利用率一般不高。统计时分多路复用(STDM,又称异步时分多路复用)是TDM 的一种改进,它采用STDM帧,STDM帧并不固定分配时隙,面按需动态地分配时隙,当终端有数据要传送时,才会分配到时间片,因此可以提高线路的利用率。例如,线路传输速率为8000b/s,4个用户的平均速率都为2000b/s,当采用TDM方式时,每个用户的最高速率为2000b/s.而在STDM方式下,每个用户的最高速率可达8000b/s.
波分多路复用即光的频分多路复用,它在一根光纤中传输多种不同波长(频率)的光信号,由于波长(频率)不同,各路光信号互不干扰,最后再用波长分解复用器将各路波长分解出来。由于光波处于频谱的高频段,有很高的带宽,因而可以实现多路的波分复用
码分多路复用是采用不同的编码来区分各路原始信号的一种复用方式。与FDM和 TDM不同,它既共享信道的频率,又共享时间。下面举一个直观的例子来理解码分复用。
实际上,更常用的名词是码分多址(Code Division Multiple Access.CDMA),1个比特分为多个码片/芯片( chip),每一个站点被指定一个唯一的m位的芯片序列,发送1时发送芯片序列(通常把o写成-1) 。发送1时站点发送芯片序列,发送o时发送芯片序列反码。
纯ALOHA协议思想:不监听信道,不按时间槽发送,随机重发。想发就发
如果发生冲突,接收方在就会检测出差错,然后不予确认,发送方在一定时间内收不到就判断发生冲突。超时后等一随机时间再重传。
时隙ALOHA协议的思想:把时间分成若干个相同的时间片,所有用户在时间片开始时刻同步接入网络信道,若发生冲突,则必须等到下一个时间片开始时刻再发送。
载波监听多路访问协议CSMA(carrier sense multiple access)协议思想:发送帧之前,监听信道。
坚持指的是对于监听信道忙之后的坚持。
1-坚持CSMA思想:如果一个主机要发送消息,那么它先监听信道。
优点:只要媒体空闲,站点就马上发送,避免了媒体利用率的损失。
缺点:假如有两个或两个以上的站点有数据要发送,冲突就不可避免。
非坚持指的是对于监听信道忙之后就不继续监听。
非坚持CSMA思想:如果一个主机要发送消息,那么它先监听信道。
优点:采用随机的重发延迟时间可以减少冲突发生的可能性。
缺点:可能存在大家都在延迟等待过程中,使得媒体仍可能处于空闲状态,媒体使用率降低。
p-坚持指的是对于监听信道空闲的处理。
p-坚持CSMA思想:如果一个主机要发送消息,那么它先监听信道。
优点:既能像非坚持算法那样减少冲突,又能像1-坚持算法那样减少媒体空闲时间的这种方案。
缺点:发生冲突后还是要坚持把数据帧发送完,造成了浪费。
载波监听多点接入/碰撞检测CSMA/CD(carrier sense multiple access with collision detection)
CSMA/CD的工作流程:
由图可知,至多在发送帧后经过时间 就能知道所发送的帧有没有发生碰撞。因此把以太网端到端往返时间为 称为争周期(也称冲突窗口或碰撞窗口)。
截断二进制指数规避算法:
最小帧长问题:帧的传输时延至少要两倍于信号在总线中的传播时延。
载波监听多点接入/碰撞避免CSMA/CA(carrier sense multiple access with collision avoidance)其工作原理如下
CSMA/CD与CSMA/CA的异同点:
相同点:CSMA/CD与CSMA/CA机制都从属于CSMA的思路,其核心是先听再说。换言之,两个在接入信道之前都须要进行监听。当发现信道空闲后,才能进行接入。
不同点:
轮询协议:主结点轮流“邀请”从属结点发送数据。
令牌:一个特殊格式的MAC控制帧,不含任何信息。控制信道的使用,确保同一时刻只有一个结点独占信道。每个结点都可以在一定的时间内(令牌持有时间)获得发送数据的权利,并不是无限制地持有令牌。应用于令牌环网(物理星型拓扑,逻辑环形拓扑)。采用令牌传送方式的网络常用于负载较重、通信量较大的网络中。
轮询访问MAC协议/轮流协议/轮转访问MAC协议:基于多路复用技术划分资源。
随机访问MAC协议: 用户根据意愿随机发送信息,发送信息时可独占信道带宽。 会发生冲突
信道划分介质访问控制(MAC Multiple Access Control )协议:既要不产生冲突,又要发送时占全部带宽。
局域网(Local Area Network):简称LAN,是指在某一区域内由多台计算机互联成的计算机组,使用广播信道。其特点有
决定局域网的主要要素为:网络拓扑,传输介质与介质访问控制方法。
局域网的分类
IEEE 802标准所描述的局域网参考模型只对应OSI参考模型的数据链路层与物理层,它将数据链路层划分为逻辑链路层LLC子层和介质访问控制MAC子层。
以太网(Ethernet)指的是由Xerox公司创建并由Xerox、Intel和DEC公司联合开发的基带总线局域网规范,是当今现有局域网采用的最通用的通信协议标准。以太网络使用CSMA/CD(载波监听多路访问及冲突检测)技术。 以太网只实现无差错接收,不实现可靠传输。
以太网两个标准:
以太网提供无连接、不可靠的服务
10BASE-T是传送基带信号的双绞线以太网,T表示采用双绞线,现10BASE-T 采用的是无屏蔽双绞线(UTP),传输速率是10Mb/s。
计算机与外界有局域网的连接是通过通信适配器的。
在局域网中,硬件地址又称为物理地址,或MAC地址。MAC地址:每个适配器有一个全球唯一的48位二进制地址,前24位代表厂家(由IEEE规定),后24位厂家自己指定。常用6个十六进制数表示,如02-60-8c-e4-b1-21。
最常用的MAC帧是以太网V2的格式。
IEEE 802.11是无线局域网通用的标准,它是由IEEE所定义的无线网络通信的标准。
广域网(WAN,Wide Area Network),通常跨接很大的物理范围,所覆盖的范围从几十公里到几千公里,它能连接多个城市或国家,或横跨几个洲并能提供远距离通信,形成国际性的远程网络。
广域网的通信子网主要使用分组交换技术。广域网的通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网,它将分布在不同地区的局域网或计算机系统互连起来,达到资源共享的目的。如因特网(Internet)是世界范围内最大的广域网。
点对点协议PPP(Point-to-Point Protocol)是目前使用最广泛的数据链路层协议,用户使用拨号电话接入因特网时一般都使用PPP协议。 只支持全双工链路。
PPP协议应满足的要求
PPP协议的三个组成部分
以太网交换机
冲突域:在同一个冲突域中的每一个节点都能收到所有被发送的帧。简单的说就是同一时间内只能有一台设备发送信息的范围。
广播域:网络中能接收任一设备发出的广播帧的所有设备的集合。简单的说如果站点发出一个广播信号,所有能接收收到这个信号的设备范围称为一个广播域。
以太网交换机的两种交换方式:
直通式交换机:查完目的地址(6B)就立刻转发。延迟小,可靠性低,无法支持具有不同速率的端口的交换。
存储转发式交换机:将帧放入高速缓存,并检查否正确,正确则转发,错误则丢弃。延迟大,可靠性高,可以支持具有不同速率的端口的交换。
⑵ 网络七层协议具体是什么
OSI是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范。OSI模型有7层结构,每层都可以有几个子层。下面我简单的介绍一下这7层及其功能。
OSI的7层从上到下分别是
7 应用层
6 表示层
5 会话层
4 传输层
3 网络层
2 数据链路层
1 物理层
其中高层,既7、6、5、4层定义了应用程序的功能,下面3层,既3、2、1层主要面向通过网络的端到端的数据流。下面我给大家介绍一下这7层的功能:
(1)应用层:与其他计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。示例:telnet,HTTP,FTP,WWW,NFS,SMTP等。
(2)表示层:这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASII格式,发送方将把文本从发送方的字符集转换成标准的ASII后发送数据。在接收方将标准的ASII转换成接收方计算机的字符集。示例:加密,ASII等。
(3)会话层:他定义了如何开始、控制和结束一个会话,包括对多个双向小时的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。
(4)传输层:这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。
(5)网络层:这层对端到端的包传输进行定义,他定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。示例:IP,IPX等。
(6)数据链路层:他定义了在单个链路上如何传输数据。这些协议与被讨论的歌种介质有关。示例:ATM,FDDI等。
(7)物理层:OSI的物理层规范是有关传输介质的特性标准,这些规范通常也参考了其他组织制定的标准。连接头、针、针的使用、电流、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义。示例:Rj45,802.3等。
OSI分层的优点:
(1)人们可以很容易的讨论和学习协议的规范细节。
(2)层间的标准接口方便了工程模块化。
(3)创建了一个更好的互连环境。
(4)降低了复杂度,使程序更容易修改,产品开发的速度更快。
(5)每层利用紧邻的下层服务,更容易记住个层的功能。
大多数的计算机网络都采用层次式结构,即将一个计算机网络分为若干层次,处在高层次的系统仅是利用较低层次的系统提供的接口和功能,不需了解低层实现该功能所采用的算法和协议;较低层次也仅是使用从高层系统传送来的参数,这就是层次间的无关性。因为有了这种无关性,层次间的每个模块可以用一个新的模块取代,只要新的模块与旧的模块具有相同的功能和接口,即使它们使用的算法和协议都不一样。
网络中的计算机与终端间要想正确的传送信息和数据,必须在数据传输的顺序、数据的格式及内容等方面有一个约定或规则,这种约定或规则称做协议。网络协议主要有三个组成部分:
1、语义:
是对协议元素的含义进行解释,不同类型的协议元素所规定的语义是不同的。例如需要发出何种控制信息、完成何种动作及得到的响应等。
2、语法:
将若干个协议元素和数据组合在一起用来表达一个完整的内容所应遵循的格式,也就是对信息的数据结构做一种规定。例如用户数据与控制信息的结构与格式等。
3、时序:
对事件实现顺序的详细说明。例如在双方进行通信时,发送点发出一个数据报文,如果目标点正确收到,则回答源点接收正确;若接收到错误的信息,则要求源点重发一次。
70年代以来,国外一些主要计算机生产厂家先后推出了各自的网络体系结构,但它们都属于专用的。
为使不同计算机厂家的计算机能够互相通信,以便在更大的范围内建立计算机网络,有必要建立一个国际范围的网络体系结构标准。
国际标准化组织ISO 于1981年正式推荐了一个网络系统结构----七层参考模型,叫做开放系统互连模型(Open System Interconnection,OSI)。由于这个标准模型的建立,使得各种计算机网络向它靠拢, 大大推动了网络通信的发展。
OSI 参考模型将整个网络通信的功能划分为七个层次,见图1。它们由低到高分别是物理层(PH)、链路层(DL)、网络层(N)、传输层(T)、会议层(S)、表示层(P)、应用层(A)。每层完成一定的功能,每层都直接为其上层提供服务,并且所有层次都互相支持。第四层到第七层主要负责互操作性,而一层到三层则用于创造两个网络设备间的物理连接.
1.物理层
物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础。物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境。
1.1媒体和互连设备
物理层的媒体包括架空明线、平衡电缆、光纤、无线信道等。通信用的互连设备指DTE和DCE间的互连设备。DTE既数据终端设备,又称物理设备,如计算机、终端等都包括在内。而DCE则是数据通信设备或电路连接设备,如调制解调器等。数据传输通常是经过DTE——DCE,再经过DCE——DTE的路径。互连设备指将DTE、DCE连接起来的装置,如各种插头、插座。LAN中的各种粗、细同轴电缆、T型接、插头,接收器,发送器,中继器等都属物理层的媒体和连接器。
1.2物理层的主要功能
1.2.1为数据端设备提供传送数据的通路,数据通路可以是一个物理媒体,也可以是多个物理媒体连接而成.一次完整的数据传输,包括激活物理连接,传送数据,终止物理连接.所谓激活,就是不管有多少物理媒体参与,都要在通信的两个数据终端设备间连接起来,形成一条通路.
1.2.2传输数据.物理层要形成适合数据传输需要的实体,为数据传送服务.一是要保证数据能在其上正确通过,二是要提供足够的带宽(带宽是指每秒钟内能通过的比特(BIT)数),以减少信道上的拥塞.传输数据的方式能满足点到点,一点到多点,串行或并行,半双工或全双工,同步或异步传输的需要.
1.3物理层的一些重要标准
物理层的一些标准和协议早在OSI/TC97/C16 分技术委员会成立之前就已制定并在应用了,OSI也制定了一些标准并采用了一些已有的成果.下面将一些重要的标准列出,以便读者查阅.ISO2110:称为"数据通信----25芯DTE/DCE接口连接器和插针分配".它与EIA(美国电子工
业协会)的"RS-232-C"基本兼容。ISO2593:称为"数据通信----34芯DTE/DCE----接口连接器和插针分配"。ISO4092:称为"数据通信----37芯DTE/DEC----接口连接器和插针分配".与EIARS-449兼容。CCITT V.24:称为"数据终端设备(DTE)和数据电路终接设备之间的接口电路定义表".其功能与EIARS-232-C及RS-449兼容于100序列线上.
2.数据链路层
数据链路可以粗略地理解为数据通道。物理层要为终端设备间的数据通信提供传输媒体及其连接.媒体是长期的,连接是有生存期的.在连接生存期内,收发两端可以进行不等的一次或多次数据通信.每次通信都要经过建立通信联络和拆除通信联络两过程.这种建立起来的数据收发关系就叫作数据链路.而在物理媒体上传输的数据难免受到各种不可靠因素的影响而产生差错,为了弥补物理层上的不足,为上层提供无差错的数据传输,就要能对数据进行检错和纠错.数据链路的建立,拆除,对数据的检错,纠错是数据链路层的基本任务。
2.1链路层的主要功能
链路层是为网络层提供数据传送服务的,这种服务要依靠本层具备的功能来实现。链路层应具备如下功能:
2.1.1链路连接的建立,拆除,分离。
2.1.2帧定界和帧同步。链路层的数据传输单元是帧,协议不同,帧的长短和界面也有差别,但无论如何必须对帧进行定界。
2.1.3顺序控制,指对帧的收发顺序的控制。
2.1.4差错检测和恢复。还有链路标识,流量控制等等.差错检测多用方阵码校验和循环码校验来检测信道上数据的误码,而帧丢失等用序号检测.各种错误的恢复则常靠反馈重发技术来完成。
2.2数据链路层的主要协议
数据链路层协议是为发对等实体间保持一致而制定的,也为了顺利完成对网络层的服务。主要协议如下:
2.2.1ISO1745--1975:"数据通信系统的基本型控制规程".这是一种面向字符的标准,利用10个控制字符完成链路的建立,拆除及数据交换.对帧的收发情况及差错恢复也是靠这些字符来完成.ISO1155, ISO1177, ISO2626, ISO2629等标准的配合使用可形成多种链路控制和数据传输方式.
2.2.2ISO3309--1984:称为"HDLC 帧结构".ISO4335--1984:称为"HDLC 规程要素 ".ISO7809--1984:称为"HDLC 规程类型汇编".这3个标准都是为面向比特的数据传输控制而制定的.有人习惯上把这3个标准组合称为高级链路控制规程.
2.2.3ISO7776:称为"DTE数据链路层规程".与CCITT X.25LAB"平衡型链路访问规程"相兼容.
2.3链路层产品
独立的链路产品中最常见的当属网卡,网桥也是链路产品。MODEM的某些功能有人认为属于链路层,对些还有争议.数据链路层将本质上不可靠的传输媒体变成可靠的传输通路提供给网络层。在IEEE802.3情况下,数据链路层分成了两个子层,一个是逻辑链路控制,另一个是媒体访问控制。下图所示为IEEE802.3LAN体系结构。
AUI=连接单元接口 PMA=物理媒体连接
MAU=媒体连接单元 PLS=物理信令
MDI=媒体相关接口
3.网络层
网络层的产生也是网络发展的结果.在联机系统和线路交换的环境中,网络层的功能没有太大意义.当数据终端增多时.它们之间有中继设备相连.此时会出现一台终端要求不只是与唯一的一台而是能和多台终端通信的情况,这就是产生了把任意两台数据终端设备的数据链接起来的问题,也就是路由或者叫寻径.另外,当一条物理信道建立之后,被一对用户使用,往往有许多空闲时间被浪费掉.人们自然会希望让多对用户共用一条链路,为解决这一问题就出现了逻辑信道技术和虚拟电路技术.
3.1网络层主要功能
网络层为建立网络连接和为上层提供服务,应具备以下主要功能:
3.1.1路由选择和中继.
3.1.2激活,终止网络连接.
3.1.3在一条数据链路上复用多条网络连接,多采取分时复用技术 .
3.1.4差错检测与恢复.
3.1.5排序,流量控制.
3.1.6服务选择.
3.1.7网络管理.
3.2网络层标准简介
网络层的一些主要标准如下:
3.2.1 ISO.DIS8208:称为"DTE用的X.25分组级协议"
3.2.2 ISO.DIS8348:称为"CO 网络服务定义"(面向连接)
3.2.3 ISO.DIS8349:称为"CL 网络服务定义"(面向无连接)
3.2.4 ISO.DIS8473:称为"CL 网络协议"
3.2.5 ISO.DIS8348:称为"网络层寻址"
3.2.6 除上述标准外,还有许多标准。这些标准都只是解决网络层的部分功能,所以往往需要在网络层中同时使用几个标准才能完成整个网络层的功能.由于面对的网络不同,网络层将会采用不同的标准组合.
在具有开放特性的网络中的数据终端设备,都要配置网络层的功能.现在市场上销售的网络硬设备主要有网关和路由器.
4.传输层
传输层是两台计算机经过网络进行数据通信时,第一个端到端的层次,具有缓冲作用。当网络层服务质量不能满足要求时,它将服务加以提高,以满足高层的要求;当网络层服务质量较好时,它只用很少的工作。传输层还可进行复用,即在一个网络连接上创建多个逻辑连接。 传输层也称为运输层.传输层只存在于端开放系统中,是介于低3层通信子网系统和高3层之间的一层,但是很重要的一层.因为它是源端到目的端对数据传送进行控制从低到高的最后一层.
有一个既存事实,即世界上各种通信子网在性能上存在着很大差异.例如电话交换网,分组交换网,公用数据交换网,局域网等通信子网都可互连,但它们提供的吞吐量,传输速率,数据延迟通信费用各不相同.对于会话层来说,却要求有一性能恒定的界面.传输层就承担了这一功能.它采用分流/合流,复用/介复用技术来调节上述通信子网的差异,使会话层感受不到.
此外传输层还要具备差错恢复,流量控制等功能,以此对会话层屏蔽通信子网在这些方面的细节与差异.传输层面对的数据对象已不是网络地址和主机地址,而是和会话层的界面端口.上述功能的最终目的是为会话提供可靠的,无误的数据传输.传输层的服务一般要经历传输连接建立阶段,数据传送阶段,传输连接释放阶段3个阶段才算完成一个完整的服务过程.而在数据传送阶段又分为一般数据传送和加速数据传送两种。传输层服务分成5种类型.基本可以满足对传送质量,传送速度,传送费用的各种不同需要.传输层的协议标准有以下几种:
4.1 ISO8072:称为"面向连接的传输服务定义"
4.2 ISO8072:称为"面向连接的传输协议规范"
5.会话层
会话层提供的服务可使应用建立和维持会话,并能使会话获得同步。会话层使用校验点可使通信会话在通信失效时从校验点继续恢复通信。这种能力对于传送大的文件极为重要。会话层,表示层,应用层构成开放系统的高3层,面对应用进程提供分布处理,对话管理,信息表示,恢复最后的差错等.
会话层同样要担负应用进程服务要求,而运输层不能完成的那部分工作,给运输层功能差距以弥补.主要的功能是对话管理,数据流同步和重新同步。要完成这些功能,需要由大量的服务单元功能组合,已经制定的功能单元已有几十种.现将会话层主要功能介绍如下.
5.1为会话实体间建立连接。为给两个对等会话服务用户建立一个会话连接,应该做如下几项工作:
5.1.1将会话地址映射为运输地址
5.1.2选择需要的运输服务质量参数(QOS)
5.1.3对会话参数进行协商
5.1.3识别各个会话连接
5.1.4传送有限的透明用户数据
5.2数据传输阶段
这个阶段是在两个会话用户之间实现有组织的,同步的数据传输.用户数据单元为SSDU,而协议数据单元为SPDU.会话用户之间的数据传送过程是将SSDU转变成SPDU进行的.
5.3连接释放
连接释放是通过"有序释放","废弃","有限量透明用户数据传送"等功能单元来释放会话连接的.会话层标准为了使会话连接建立阶段能进行功能协商,也为了便于其它国际标准参考和引用,定义了12种功能单元.各个系统可根据自身情况和需要,以核心功能服务单元为基础,选配其他功能单元组成合理的会话服务子集.会话层的主要标准有"DIS8236:会话服务定义"和"DIS8237:会话协议规范".
6.表示层
表示层的作用之一是为异种机通信提供一种公共语言,以便能进行互操作。这种类型的服务之所以需要,是因为不同的计算机体系结构使用的数据表示法不同。例如,IBM主机使用EBCDIC编码,而大部分PC机使用的是ASCII码。在这种情况下,便需要会话层来完成这种转换。
通过前面的介绍,我们可以看出,会话层以下5层完成了端到端的数据传送,并且是可靠,无差错的传送.但是数据传送只是手段而不是目的,最终是要实现对数据的使用.由于各种系统对数据的定义并不完全相同,最易明白的例子是键盘,其上的某些键的含义在许多系统中都有差异.这自然给利用其它系统的数据造成了障碍.表示层和应用层就担负了消除这种障碍的任务.
对于用户数据来说,可以从两个侧面来分析,一个是数据含义被称为语义,另一个是数据的表示形式,称做语法.像文字,图形,声音,文种,压缩,加密等都属于语法范畴.表示层设计了3类15种功能单位,其中上下文管理功能单位就是沟通用户间的数据编码规则,以便双方有一致的数据形式,能够互相认识.ISO表示层为服务,协议,文本通信符制定了DP8822,DP8823,DIS6937/2等一系列标准.
7.应用层
应用层向应用程序提供服务,这些服务按其向应用程序提供的特性分成组,并称为服务元素。有些可为多种应用程序共同使用,有些则为较少的一类应用程序使用。应用层是开放系统的最高层,是直接为应用进程提供服务的。其作用是在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务.其服务元素分为两类:公共应用服务元素CASE和特定应用服务元素SASE.CASE提供最基本的服务,它成为应用层中任何用户和任何服务元素的用户,主要为应用进程通信,分布系统实现提供基本的控制机制.特定服务SASE则要满足一些特定服务,如文卷传送,访问管理,作业传送,银行事务,订单输入等.
这些将涉及到虚拟终端,作业传送与操作,文卷传送及访问管理,远程数据库访问,图形核心系统,开放系统互连管理等等.应用层的标准有DP8649"公共应用服务元素",DP8650"公共应用服务元素用协议",文件传送,访问和管理服务及协议.
讨论:OSI七层模型是一个理论模型,实际应用则千变万化,因此更多把它作为分析、评判各种网络技术的依据;对大多数应用来说,只将它的协议族(即协议堆栈)与七层模型作大致的对应,看看实际用到的特定协议是属于七层中某个子层,还是包括了上下多层的功能。
这样分层的好处有:
1.使人们容易探讨和理解协议的许多细节。
2.在各层间标准化接口,允许不同的产品只提供各层功能的一部分,(如路由器在一到三层),或者只提供协议功能的一部分。(如Win95中的Microsoft TCP/IP)
3. 创建更好集成的环境。
4. 减少复杂性,允许更容易编程改变或快速评估。
5. 用各层的headers和trailers排错。
6.较低的层为较高的层提供服务。
7. 把复杂的网络划分成为更容易管理的层。
⑶ 关于网络游戏中的同步机制
当我们在做一些跟网络游戏相关的机器学习任务的时候,有时需要对整个游戏系统的运行机制有所了解才能更好的应对,对于网游而言,首当其冲的机制便是同步了。当然,大部分的机器学习从业者是不会懂游戏开发的,更不会不懂同步机制,此文我将基于我个人的一些研究和理解对网游中的同步机制做一个简单的介绍,以便大家更加顺利的开展游戏相关的机器学习任务。
与单机游戏不同,网络游戏有很多人通过远程的方式参与游戏,不管是服务器还是玩家,用的都是自己独立的设备,也就是说所有的客户端和服务器都是各自独立的游戏世界,要让游戏玩下去就得保证所有的游戏世界都是一致的,于是便有了 同步 。
在理想的情况下,所有人操作的游戏世界,在同一时刻应该是完全步调一致的,但由于网络延迟以及其他不同设备环境的差异,完全一致时不可能的,而 同步 的目的是希望尽可能的一致,而对一致性的要求,不同的游戏类型也会有不同的要求。
通常帧同步和状态同步是这样区分的:
当然这两种方式并非是非此即彼的,在一些复杂的网络游戏中,混用两种方式也是比较常见的。
尽管为了游戏体验,游戏客户端可能会做很多体验上的改进操作,跟我下面讲的并不会完全一致,但归根揭底,帧同步和状态同步必然会遵循上述几点,在设计算法时无需在意那些为了优化体验的细节。
以下是一些具有代表性游戏的同步方式:
帧同步是比较容易理解的,所有的客户端都是一个完整独立的系统,并且我们指导游戏中的随机性均是伪随机,在seed确定的情况下,每个系统的状态的改变只取决于游戏的输入,也就是说我们通过服务器来转发所有玩家的操作输入客户端游戏系统,那么就能保障所有的客户端都是同步的。
比如某个时刻,玩家0做了操作x, 整个同步过程如下:
显而易见的,因为只同步了用户的操作,这个数据传输量其实是很少的,所以很省流量,除非玩家特别多...
对于绝大多数的状态同步游戏,它的逻辑计算完全放在服务器上,因此也十分好理解。客户端只是相当于一个表现层,用来展示服务器发送过来的数据。就像我们打开一个网页,网页上的数据都是从服务器发过来的,因此我们本地是没办法作弊的,除非黑了服务器,因此这种状态同步的游戏基本上是没有外挂的。
但是有一种特殊的情况,就是FPS类型的游戏,如果靠服务器来运算,整个延迟下来就没法正常玩了...因此它的战斗逻辑会在客户端,而只向服务器汇报结果,因此类似吃鸡的这种游戏会有很多的外挂。
对于战斗逻辑在服务器的状态同步游戏,它的安全性是十分高的,因为想作弊就得黑入服务器,这个难度可想而知。但是FPS类型游戏部分战斗逻辑在客户端,这个会好被外挂修改,这也是FPS游戏外挂多难以根治的主要原因。
而帧同步的游戏整个计算逻辑在客户端,因此,开挂者因为可以获得全系统的信息,于是就可以很容易做开图之类的外挂。
⑷ 使用rtcp实现音视频同步
音视频同步是指音视频的rtp时间戳同步. audio/video rtp 时间戳不能自己同步,需要audio/video rtcp同步。
发送端以一定的频率发送RTCP SR(Sender Report)这个包,SR分为视频SR和音频SR,SR包内包含一个RTP时间戳和对应的NTP时间戳,可以用<ntp,rtp>对做音视频同步.(同步过程在后面)
Rtcp sr 格式
例如:一个音频包打包20ms的数据.采样率48k.对应的采样数为 48000 * 20 / 1000 = 960,也就是说每个音频包里携带960个音频采样,因为1个采样对应1个时间戳,那么相邻两个音频RTP包的时间戳之差就是960。
视频采样率是帧率,视频时间戳的单位为1/90k秒.比如: 25帧,每帧40ms.40ms有多少时间戳的基本单位呢? 40除以1/90k等于3600.
扩展内容:
Single Nalu:如果一个视频帧包含1个NALU,可以单独打包成一个RTP包,那么RTP时间戳就对应这个帧的采集时间;
FU-A:如果一个视频帧的NALU过大(超过MTU)需要拆分成多个包,可以使用FU-A方式来拆分并打到不同的RTP包里,那么这几个包的RTP时间戳是一样的;
STAP-A:如果某帧较大不能单独打包,但是该帧内部单独的NALU比较小,可以使用STAP-A方式合并多个NALU打包发送,但是这些NALU的时间戳必须一致,打包后的RTP时间戳也必须一致
NTP时间戳是从1900年1月1日00:00:00以来经过的秒数.
rtp是相对时间,ntp是绝对时间.rtp时间戳和ntp时间戳表示的意义是相同的. 可以互相转换,rtp=f(ntp) 类似中文名张三,英文名zhangjohn.
rtp时间戳如何转换成pts即显示时间的呢? pts= rtp 时间戳 *timebase.
例如:flv封装格式的time_base为{1,1000},ts封装格式的time_base为{1,90000}.
flv: pkt_pts=80,pkt_pts_time=80/1000=0.080000;
pkt_pts=120,pkt_pts_time=0.120000;
pkt_pts=160,pkt_pts_time=0.160000;
pkt_pts=200,pkt_pts_time=0.200000
ts: pkt_pts=7200,pkt_pts_time=7200/90000=0.080000;
pkt_pts=10800,pkt_pts_time=0.120000;
pkt_pts=14400,pkt_pts_time=0.160000;
pkt_pts=18000,pkt_pts_time=0.200000
总结:ntp,rtp,pts表示的是同一帧的时间.ntp是绝对时间,rtp是相对时间,pts是播放时间.rtp是用频率表示,pts是用秒表示.
如果音视频都从0同步开始,rtp等于pts.
如果不是同步开始,pts需要rtp 同步加减一个offer.具体实例看下文. rtp和pts是编解码时间即播放时间,不是传输时间,传输延时与rtp时间戳没关系.
音视频时间戳增长rtp增量是不同的,所以需要换算成ntp时间同步.
音视频同时编码,而且视频播放频率始终不变. 使用rtp时间戳同步就行.
因为音视频被映射到同一个时间轴上了,音频和视频帧间的相对关系很清楚.
同时RTP规范要求时间戳的初始值应该是一个随机值,那么假设音频帧时间戳的初始值是随机值1234,视频帧时间戳的初始值是随机值5678,看起来应该是下面这样
2.1 音视频不是同时产生
RTP规范并没有规定第一个视频帧的时间戳和第一个音频帧的时间戳必须或者应该对应到绝对时间轴的同一个点上 。
也就是说开始的一小段时间内可能只有音频或者视频,比如开始摄像头没有开,只有音频没有视频.也可能的开始网络丢包,同时视频的降低帧率,有可能出现这样的时间戳序列:0,丢包+降帧率,16200,... 第一个视频帧rtp timestamp 是16200,就无法映射到绝对时间轴上.
实际情况如下图:
音视频同步应用分成两种:一种是用于传输,一种是用于播放器.
1 用于传输
传输本来可以不用同步直接转给播放器处理,但是给第三方库的时候需要同步,比如将流转给ffmpeg。ffmpeg 要求转入的流的第一帧,必须audio,video 是同步的. 不能audio从0ms开始,video从1ms开始,那样送流给ffmpeg一定音视频不同步.所以给ffmpeg之前,需要做音视频同步.根据上面的方法就可以实现。
notes: ffmpeg源码要求第一帧同步开始: https://www.jianshu.com/p/67d3e6a1d72e
2 播放器的同步播放
播放器在上面同步的基础上,还需要增加缓存. 缓存设计分成两种情况,视频快于音频和音频快于视频.
i) 视频快于音频那么扩大视频缓冲区,缩短音频缓冲区,让视频帧等一等音频帧。
ii) 音频快于视频那么扩大音频缓冲区,缩短视频缓冲区,让音频帧等一等音频帧
QA1:什么情况会出现不同步,为什么要同步?
比如视频第1ms才有数据,但是在第0ms播放,其他帧都是提前1ms,变成音视频不同步.
QA2:什么时候同步,需要多少次同步?
第一帧开始同步。根据上面的算法,第几个rtcp包都能同步,从哪里开始同步后面就跟着全同步了.
播放当然需要从开始同步哈,所以都是从第一帧同步。
只需要同步一次,后面就是对于基准0的播放时间了。
QA3: 音视频同步与帧率的关系?
动态帧率与时间戳同步没关系,播放器会根据fps读取正确的ts。帧率不同只是视频包多少不同,每个包的time stamp和ntp时间都是一一对应的.
QA4: 传输延时与rtp时间戳有没有关系?
ats:20,40,60,...
vts: 41,82,123....
会不会出现这种时间序列,累计造成时间戳不同步。
这个数列是不对.
40ms肯定能编解码完成,不是编解码要41ms。而是开始第一帧发送的晚造成41ms.
数列应该是41,81,121...
QA5: 两个不同的主播合流,如果有一个主播的时间戳不准确如何同步?
比如:第一个13:00:00: 编码:40ms第一帧
第二个在13:00:00:30ms开始编码,但是它的时间有问题,显示0:0:0:0开始
如何将13:00:00:30ms map 0:0:0:0.
没有实际经验。原理应该和音视频同步类似,同步到其中一个主播时间轴即可。
哪位网友有经验欢迎补充
uint32_t ntp_compact_audio = get_compact_ntp_time( ntp_audio );
uint32_t ntp_compact_video = get_compact_ntp_time( ntp_video );
//v_sr_ts is rtp ts
base_timestamp_video = v_sr_ts - diff_ts
⑸ Tcp和Udp各有什么优缺点MOBA游戏可以用吗
在实时性方面,tcp协议的网络抗性欠佳,对MOBA类或其他实时性要求较高的游戏,一般是不建议使用tcp作为协议载体。事实上,王者荣耀的PVP通信协议也确实是基于udp封装的;同样,最近大家喜闻乐见的《绝地求生》,也是基于udp的。
不同类型的游戏因为玩法、竞技程度不一样,采用的同步算法不一样,对网络延迟的要求也不一样。例如,MOBA类游戏多使用帧同步为主要同步算法,竞技性也较高,无论从流畅性,还是从公平性要求来说,对响应延迟的要求都最高,根据业内经验,当客户端与服务器的网络延迟超过150ms时,会开始出现卡顿,当延迟超过250ms时,会对玩家操作造成较大影响,游戏无法公平进行。类似地,“吃鸡”游戏(如《绝地求生》)玩法对玩家坐标、动作的同步要求极高,延迟稍大导致的数据不一致对体验都会造成较大影响,其实时性要求接近MOBA类游戏。而对于传统mmorpg来说,多采用状态同步算法,以属性养成和装备获取为关注点,也有一定竞技性,出于对游戏流畅性的要求,对延迟也有一定要求,同步算法的优化程度不一样,这一要求也不一样,一般情况下为保证游戏正常进行,需要响应延迟保持在300ms以下。相比之下,对于炉石传说、斗地主、梦幻西游等回合制游戏来说,同时只有一个玩家在操作双方数据,无数据竞争,且时间粒度较粗,甚至可通过特效掩盖延迟,因此对网络延迟的要求不高,即便延迟达到500ms~1000ms,游戏也能正常进行。
不同传输层协议在可靠性、流量控制等方面都有差别,而这些技术细节会对延迟造成影响。tcp追求的是完全可靠性和顺序性,丢包后会持续重传直至该包被确认,否则后续包也不会被上层接收,且重传采用指数避让策略,决定重传时间间隔的RTO(retransmission timeout)不可控制,linux内核实现中最低值为200ms,这样的机制会导致丢包率短暂升高的情况下应用层消息响应延迟急剧提高,并不适合实时性高、网络环境复杂的游戏。
除了这些以外,这里有一位行业资深架构师写了关于这个问题的分析《关于MOBA游戏的tcp协议—实测数据》,推荐给你可以参考下。
⑹ 在脉冲编码调制方法中,如果规定的量化级是64个,则需要使用多少位编码
6位编码。
脉冲编码调制就是数模转换,主要经过3个过程:抽样、量化和编码。抽样过程将连续时间模拟信号变为离散时间、连续幅度的抽样信号,量化过程将抽样信号变为离散时间、离散幅度的数字信号,编码过程将量化后的信号编码成为一个二进制码组输出。
PCM的优点就是音质好,缺点就是体积大。PCM可以提供用户从2M到155M速率的数字数据专线业务,也可以提供话音、图象传送、远程教学等其它业务。PCM有两个标准(表现形式):E1和T1。
脉冲编码调制(Pulse Code Molation)是最常用、最简单的波形编码。它是一种直接、简单地把语音经抽样、A/D转换得到的数字均匀量化后进行编码的方法,是其他编码算法的基础。
(6)帧同步算法扩展阅读:
脉冲编码调制编码原理与规则:PCM数字接口是G.703标准,通过75Ω同轴电缆或120Ω双绞线进行非对称或对称传输,传输码型为含有定时关系的HDB3码,接收端通过译码可以恢复定时,实现时钟同步。
Fb为帧同步信号,C2为时钟信号,速率为2.048Mbps,数据在时钟下降沿有效,E1接口具有PCM帧结构,一个复帧包括16个帧,一个帧为125μs,分为32个时隙,其中偶帧的零时隙传输同步信息码0011011,奇帧的零时隙传输对告码,16时隙传输信令信息,其它各时隙传输数据,每个时隙传输8比特数据。
⑺ IEEE1588V1-V2理解
IEEE 1588 是一个精密时间协议 (PTP),用于同步计算机网络中的时钟。 在局域网中,它能将时钟精确度控制在亚微秒范围内,使其适于测量和控制系统。 IEEE 1588 标准为时钟分配定义了一个主从式架构,由一个或多个网段及一个或多个时钟组成。
TSN 网络中时间同步协议使用 IEEE 802.1AS 协议,它基于 IEEE 1588 协议进行精简和修改,也称为 gPTP 协议。
IEEE 1588 协议简称精确时钟协议 PTP(Precision Timing Protocol),它的全称是“网络测量和控制系统的精密时钟同步协议标准”(IEEE 1588 Precision Clock Synchronization Protocol)。其工作的基本原理,是通过主从节点之间进行同步数据帧的发送,记录数据帧的发送时间和接收时间信息进行,并且将该时间信息添加到该数据帧中。从节点获取这些时间信息,并计算从节点本地时钟与主时钟的时间偏差和网络节点之间的传输延时,对本地时钟进行纠正,使之与主节点时钟同步。一个 PTP 网络只能存在一个主时钟。
PTP 协议主要分为两大部分来实现时钟同步功能:
1、建立同步体系:
协议使用最佳主时钟算法(Best Master Clock Algorithm,BMCA),通过选取主时钟,建立主从拓扑关系,进而在整个 PTP 网络中建立起同步体系。
2、同步本地时钟:
协议使用本地时钟同步算法(Local Clock Synchronization Algorithm,LCS),通过 PTP 数据报文在网络主从节点之间的交换,计算各从节点本地时钟与主时钟间的时间偏差,调整本地时钟,使之与主时钟同步。
整个 PTP 网络内的时钟可按照其上 PTP 通信端口的数目来划分成普通时钟(Ordinary Clock,OC)与边界时钟(Boundary Clock,BC):普通时钟只存在一个,而边界时钟则存在多个。一般在确定性不高的网络节点处使用边界时钟,例如交换机或者路由器一般用作边界时钟,如下图所示。在每个端口上,PTP 通信都是独立进行的。
1、边界时钟:
边界时钟上只允许存在一个从端口,与上级节点的主端口通信,将其本地时钟与级主端口进行同步。其余端口为主端口,与下游节点的从端口进行通信。边界时钟可以连接不同的网络协议。
2、同步体系建立流程:
(1)初始状态,各个节点端口会在指定的时间内侦听网络中的 Sync 数据帧; 若接收到 Sync 数据帧,节点端口将根据最佳主时钟算法决定端口状态。若没有收到 Sync 数据帧,该节点状态变更为 Pre_Master,并将自己假定为主时钟节点。此时节点端口状态表现为主时钟,但是并不发送 Sync 帧。
(2)端口状态在一定时间内保持 Pre_Master:
若在端口指定时间内接收到 Sync 数据帧,则该端口状态由最佳主时钟算法决定。
若判定端口为主时钟,则将周期性地发送 Sync 帧;若判定为从时钟,则接受 Sync 帧,并计算偏差,纠正本地时钟。
若在该时间段内端口没有收到 Sync 数据帧,则将状态变更为主时钟,并且开始定时发送 Sync 数据帧。
(3)主时钟和从时钟的状态随着时钟性能与运行状态的变化而变化。下图展示了 BMCA 中状态转移。
3、时间同步建立流程:
如下图PTP同步原理
如图所示,Master为网路中的同步时钟源,可以认为其与UTC或者GPS时无限接近。Slave为网络中需要被同步设备。假设从Master到Slave的路径符合对称路径,那么路径上的延时我们设Delay,然后设备Master和设备Slave之间待同步的时间差值为Offset,即Slave比Master在同一时刻慢Offset。
可以算出
Slave设备根据算出的Offset即可以进行本地时钟校准。但是1588V1协议依赖于链路的对称性,即Master到Slave与Slave到Master时延一致,这在实际网络状况下很难满足,故需要额外的不对称算法进行链路延时差计算和补偿校准。
IEEE1588V2在IEEE1588V1版本上做了改进和扩展。主要包括:
1.新增点到点路径延时测量的独立消息模式。
端口 A 与端口 B 间的路径延迟时间 Delay 为
在 PTPv1 中,平均路径延迟测量时通过 Sync 帧与 Delay_Req 帧配合使用的,但是在 PTPv2 中却不需要 Sync 帧的参与,仅通过 PDelay_Req 数据帧系列来进行测量。这是一个独立的延迟测量过程,不依赖 Sync 帧和同步体系建立的参与,使得测量精度有所提高,并且可以经过多次测量求得平均值得到更为准确的路径延迟。另一方面,如果网络中的同步体系发生改变,这时不需要重新计算该节点间的路径延迟,直接使用之前已测得的延迟数据,大大增强了协议执行的效率,使得协议更为方便灵活。在PTPv2 中,利用 PDelay_req 数据帧系列已成为主要的测量路径延迟方法。
2、新增透明时钟模型
在 PTPv1 中,网络中间节点均采用边界时钟模型。与网络中唯一的主时钟,即一个普通时钟连接的边界时钟,其上唯一的从端口接收主节点发送的同步数据帧,与主时钟实现同步,其余的主端口和与之相连的其他边界时钟发送同步数据帧,最后同步到网络边缘的普通时钟,这样便实现了整个网络的时间同步。这种方法虽然可行,但是由于这种方式是逐级同步,所以距离主时钟越远的节点,同步精度越低。
当网络中的一些节点不需要进行时钟同步或者不具备同步功能时,便可采用透明时钟模型。透明时钟不像 BC/OC 模式那样,需要每个节点都与主时钟进行同步,它的端口只对协议数据帧进行转发,并将计算出的数据帧滞留时间添加在校正域中。这种方式将 PTP 数据帧的处理变得更为简单,降低了网络中 PTP 协议的实施难度,同时提高了各从节点的同步精度。
透明时钟有模型两种:端对端透明时钟,和点对点透明时钟。
(1)端对端(E2E)透明时钟
E2E 透明时钟对网络中普通数据帧不做任何处理,仅进行转达让其正常通过。但是对于 PTP 事件数据帧,则将他们从接收端口到发送端口间的驻留延迟时间累加到数据帧中的修正域,用以弥补 PTP 数据帧在经过其自身所带来的延迟误差。
(2)点对点(P2P)透明时钟
点对点(P2P)透明时钟只转发特定的 PTP 报文,包括 Sync 帧、Follo_Up 帧和Announce 帧等。并且会采用 Pdelay_Req 数据帧系列计算每个端口与所连接的端口间的路径延迟时间,再与端口间延迟时间合并添加到时间修正域,来补偿数据帧从源端口到点对点透明时钟出端口的时间延迟。
3、增加单步时钟模型
单步时钟模型解决了 Follow_Up 帧与 Sync 帧匹配问题。PTP 协议基本的同步过程采用双步模式,即主时钟节点发送 Sync 帧,和带有 Sync 帧发送时间的Follow_Up帧。这种方式虽然能提高 Sync 帧时间戳标记的精度,提高同步效果,但是在网络负载较大的情况下,数据帧很有可能发生丢失或者阻塞,造成两种数据帧的匹配出现差错。
在 PTP 数据帧中设置一个标志,来使用单步模式,将 Sync 帧的发送时间与数据帧中的时间标签的差值作为传输延迟,并将其累加到修正域中。这样主时钟便通过单独的 Sync 帧而不需要 Follow_Up 进行时间的同步校准工作。
单步模式可以减少网络流量,提高网络负载较大时同步的可靠性。单步模式需要额外的辅助硬件,来帮助计算时间修正值并将其累加到校正域中,这对网络的实时性有比较高的要求。
BMCA,即最佳主时钟算法,它选择网络中性能最佳的时钟作为主时钟,并以
此建立网络拓扑,生成同步体系,进而实现时钟同步功能。
最佳主时钟的选取是通过Announce帧在网络中各节点的传输,比较各个节点上的时钟属性(比如是否将时钟指定为主或者从时钟),用于标识精度的时钟等级,以及用于标识时钟源类型的时钟类型(比如铷钟、铯钟等),还有表示时钟偏移、方差等的时钟特性、时钟地址以及时钟端口号等特征来选择最佳主时钟,当其他时钟特征都一样是,协议会将端口号最小的节点时钟作为主时钟。IEEE 1588协议会以主时钟节点作为根节点形成树形拓扑结构,并且为避免生成回路,那些竞争失败的节点端口,协议将他们定义为被动或者禁用状态。
⑻ 游戏开发好学吗
对于计算机专业的学生来说不难,自学成才就比较困难了。
游戏开发和其他软件开发的基础基本一样,无非是计算机网络、多线程、数据结构和算法、面向对象设计、软件工程、软件测试、几种常用编程语言等等,本科教学都会学到。
游戏程序的逻辑可能比传统软件复杂一些,需要更复杂的算法、更高的性能、更好的面向对象设计、更高效的网络模型 线程模型。
也有一些其他软件很少用到的技术,比如3D游戏渲染用到线性代数,网游的帧同步、状态同步算法,游戏循环,粒子特效,寻路算法,模拟碰撞。
如果你也想开发一款属于自己的游戏或者小程序,可以通过第三方专业开发平台来实现开发需求:厦门在乎科技-专注小程序、app、网站开发
⑼ I帧,P帧,B帧,视频码率,帧率和分辨率 区别和理解
视频压缩中,每帧代表一幅静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。
简单地说, I帧 是关键帧,属于 帧内压缩 。就是和AVI的压缩是一样的。 P是 向前搜索的意思 。B是 双向搜索 。他们都是 基于I帧来压缩数据 。
I帧表示关键帧 ,你可以理解为这一帧画面的完整保留; 解码时只需要本帧数据就可以完成(因为包含完整画面)
P帧 表示的是 这一帧跟之前的一个关键帧(或P帧)的差别 , 解码时 需要用 之前缓存的画面叠加上本帧定义的差别,生成最终画面 。(也就是 差别帧 , P帧没有完整画面数据 ,只有 与前一帧的画面差别的数据 )
B帧是双向差别帧 ,也就是 B帧记录的是本帧与前后帧的差别 (具体比较复杂,有4种情况),换言之, 要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面 ,通过 前后画面的与本帧数据的叠加取得最终的画面 。B帧 压缩率高,但是解码时CPU会比较累 ~。
从上面的解释看,我们知道I和P的解码算法比较简单,资源占用也比较少,I只要自己完成就行了,P呢,也只需要解码器把前一个画面缓存一下,遇到P时就使用之前缓存的画面就好了,如果视频流只有I和P,解码器可以不管后面的数据,边读边解码,线性前进。
但网络上的电影很多都采用了B帧,因为B帧记录的是前后帧的差别 ,比P帧能节约更多的空间,但这样一来,文件小了,解码器就麻烦了,因为在解码时,不仅要用之前缓存的画面,还要知道下一个I或者P的画面(也就是说要预读预解码),而且,B帧不能简单地丢掉, 因为B帧其实也包含了画面信息,如果简单丢掉,并用之前的画面简单重复,就会造成画面卡(其实就是丢帧了) ,并且由于网络上的电影为了节约空间,往往使用相当多的B帧, B帧用的多,对不支持B帧的播放器就造成更大的困扰,画面也就越卡 。
一般平均来说, I的压缩率是7(跟JPG差不多),P是20,B可以达到50 ,可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。
下面举例说明:
在如上图中,GOP (Group of Pictures)长度为13,S0~S7 表示 8个视点,T0~T12 为 GOP的 13个时刻。每个 GOP包含帧数为视点数 GOP 长度的乘积。在该图中一个 GOP 中,包含94 个 B帧。B 帧占一个 GOP 总帧数的 90.38%。GOP 越长,B 帧所占比例更高,编码的率失真性能越高。下图测试序列 Race1 在不同 GOP 下的率失真性能对比。
总结 : I帧,P帧,B帧 理解看粗体字的标记,关键的点都标出了,一定要看重点。
分辨率: 影响图像大小,与图像大小成正比:分辨率越高,图像越大;分辨率越低,图像越小。
视频码率:(1:传输码率;2:编码码率)
码率:影响体积,与体积成正比:码率越大,体积越大;码率越小,体积越小。
传输码率: 码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。也就是取样率(并不等同与采样率,采样率的单位是Hz,表示每秒采样的次数),单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真,围绕这个核心衍生出来cbr(固定码率)与vbr(可变码率), “码率”就是失真度,码率越高越清晰,反之则画面粗糙而多马赛克。
编码码率:单位时间的数据位数,(下面的结论是针对编码码率来说的跟传输码率没啥关系)
1:在码率一定的情况下,分辨率与清晰度成反比关系:分辨率越高,图像越不清晰,分辨率越低,图像越清晰。(一帧图像就那么多数据,分辨率(面积大)越高,码率一定,相对图像越不清晰了)
2:在分辨率一定的情况下,码率与清晰度成正比关系,码率越高,图像越清晰;码率越低,图像越不清晰。
帧率: 影响画面流畅度,与画面流畅度成正比,帧率越大,画面越流畅;帧率越小,画面越有跳动感。如果码率为变量,则帧率也会影响体积,帧率越高,每秒钟经过的画面越多,需要的码率也越高,体积也越大。 帧率: 就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。
1. 音频 码率 计算公式:
音频码率=采样率 x 位深度 x 声道= 44.1Khz x 16位 x 2声道 = 1411.2 Kbps
2.文件大小 = 码率 x 时长(s) = 文件大小 = 码率 x 时长(s) = (Kbps )= (Kbps )/ 1024 Kb = (MB)
2.视频文件大小计算
文件大小 = 码率 x 时长(s)/8 = (Kbps )= (Kbps )/ 1024 Kb = (MB)
问题编解码的音视频同步问题原理
带来一个问题:在视频流中,先到来的 B 帧无法立即解码,需要等待它依赖的后面的 I、P 帧先解码完成,这样一来播放时间与解码时间不一致了,顺序打乱了,那这些帧该如何播放呢?这时就需要我们来了解另外两个概念:DTS 和 PTS。
DTS、PTS 的概念
DTS、PTS 的概念如下所述:
DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
需要注意的是:虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。
当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时,就回到了我们前面说的问题:解码顺序和播放顺序不一致了。
比如一个视频中,帧的显示顺序是:I B B P,现在我们需要在解码 B 帧时知道 P 帧中信息,因此这几帧在视频流中的顺序可能是:I P B B,这时候就体现出每帧都有 DTS 和 PTS 的作用了。DTS 告诉我们该按什么顺序解码这几帧图像,PTS 告诉我们该按什么顺序显示这几帧图像。顺序大概如下:
PTS:1423
DTS:1234
Stream: I P B B
音视频的同步
上面说了视频帧、DTS、PTS 相关的概念。我们都知道在一个媒体流中,除了视频以外,通常还包括音频。音频的播放,也有 DTS、PTS 的概念,但是音频没有类似视频中 B 帧,不需要双向预测,所以音频帧的 DTS、PTS 顺序是一致的。
音频视频混合在一起播放,就呈现了我们常常看到的广义的视频。在音视频一起播放的时候,我们通常需要面临一个问题:怎么去同步它们,以免出现画不对声的情况。
要实现音视频同步,通常需要选择一个参考时钟,参考时钟上的时间是线性递增的,编码音视频流时依据参考时钟上的时间给每帧数据打上时间戳。在播放时,读取数据帧上的时间戳,同时参考当前参考时钟上的时间来安排播放。这里的说的时间戳就是我们前面说的 PTS。实践中,我们可以选择:同步视频到音频、同步音频到视频、同步音频和视频到外部时钟。
⑽ 基于ECS模型的卡牌战斗框架4
卡牌类游戏如果仅仅是单人游戏,那便也没什么技术含量了。从拉用户的角度,如果没有实时多人游戏玩法便也失去了游戏一大块吸引力。
通过这些年对卡牌类游戏的积淀,帧同步是这类游戏最常用的多人游戏同步方案。如果是回合类型游戏,那么状态同步便大概率是首选项了,但它的实现复杂度在这类游戏中却又不及帧同步技术了。所以这一章,就记录我所开发的几个项目所设计的帧同步方案与细节。
我们将项目中所有的浮点数类型全都统一成了定点数,这样就确保我们的逻辑运算不会因平台的不同而导致计算结果的差异。之所以不同平台对浮点数的运算有差异,则是因为各厂商底层硬件对浮点数的运算不一致导致。虽然大家计算结果都差不多,但是到了小数点最后几位总会有所不同。如果采用double进行计算,虽然double精度更高,但依旧免不了会在最后几位出现不一致的情况,只是这时已经是小数点后二三十位的事情了。
正是基于这个原因,我们最开始先使用double作为浮点数据类型,后又使用定点数进行替换。因为我的定点数实现的有效精度只能到小数点后5位,所以即便底层硬件会对浮点数运算产生误差,却依旧会被定点数强制统一而不必担心更小精度运算不一致所导致的问题。
定点数方案在网上可以找到一大堆,而且也对定点数方案的利弊进行过多方分析,此处不作赘述,只是网上多用10000作为定点数的放大倍数,这是我的定点数实现与网上所不同的地方。
在我实现的定点数中,采取了一个特殊的放大倍数,即 2^16 。这样一个放大倍数,最大的好处就是定点数之间的大多数运算,都可以采用位运算的形式进行放大缩小,于性能上更合适一些。此外,2的16次方作为放大倍数,可以使小数的有效位保持到小数点后5位,从计算精度的角度考虑,这样一个范围也是满足我们项目开发需求的。至于不同项目的放大倍数,可以根据需要可以调整为其他的2的n此幂均可。
采用2的整数次幂,会在定点数的乘、除、开方、比较大小运算中提高计算性能,远比乘除10000效率来得高。特别说明的是,这里我们的开方直接调用了C#数学库中的开方操作,不同的是在开方前我们就需要对待开方的数左移16位,这样开方得到的结果才是满足定点数放大倍数的值。
基于以上几点,我们才会使用long作为定点数内部的数据存储类型,而定点数所表示数字的范围,与int类型一致。如果使用定点数存储了一个大于int最大值的数,那么很可能就会在后续的计算中因移位而产生计算错误。
当实现了自己的定点数方案之后,就需要根据它的精度去生成 三角函数查询表 。这里我仅生成了sin查询表,而计算其他三角函数时根据sin值就可求得具体值。
在实现定点数的过程中,还有很多值得参考的内容:
采用帧同步方案后,网络方案就是一个需要关注的议题。
帧同步方案下,客户端和服务器之间无论每帧都同步信息,还是有数据变动时再同步信息,都需要频繁地使用网络进行数据交互。传统TCP方案下,TCP本身发送机制有延时,所以就需要使用KCP来实现高实时性,但是代价(按照官方说法)就是额外消耗10%-20%的带宽。
但是需要说明的是,在丢包率上升的情况下,KCP因其底层数据包的组织与发送形式,会导致流量变大,这种情形下反而不如使用TCP的综合效率。这是选用KCP方案的一个缺陷。
我的项目中,最终设计了两套网络结构,KCP与TCP。这里就需要客户端采集与服务器的网络状态数据(ping值)。当丢包率与延迟不严重时(可根据项目实际情况设定阈值),网络采用KCP;一旦网络状态超过阈值,则将底层网络方案切换为TCP。这种方案的设计目的,主要就是为了解决丢包率上升时KCP流量过大的问题,但是具体情况需要根据项目类型与具体需求而定。
战斗逻辑处,我们已经讲过定帧的概念了,但是那里的定帧主要针对的是逻辑的定帧执行。
帧同步也需要定帧的概念。只有当所有客户端与服务器帧率统一时,大家的行为才能被约束一致。因此,我们就需要将帧同步的定帧与逻辑的定帧加以区分,下面我就用“逻辑帧”指代逻辑的帧,而使用”服务帧“指代帧同步的帧。
最简易的方案,就是设计之初就令逻辑帧与服务帧的帧率统一。这样做的好处,就是免去了两个帧速率不一所导致的匹配问题,服务器每驱动一帧,逻辑帧就运行一帧,实现起来简单方便。
但是,服务帧的设计一般是要从通讯性能出发的,天生帧率会比较低,而逻辑帧因项目需求不同而不稳定,大概率是比较高的帧率。所以,服务帧与逻辑帧的帧率不匹配是常态,这就需要用到一些转接件来实现我们的需求了。
还记得 第一章 我曾提到的接口 ILogicMgr 吗,它的派生类的作用之一,就是提供一个“帧率差速器”,以使得游戏逻辑能够在服务帧与逻辑帧不同的帧率下平稳运行。帧率差速器以帧率最快的一方的速率为基础速率进行心跳,每次心跳时返回本次心跳结果。帧率差速器的心跳结果分为三种:
因为我们的项目是锁帧方案,服务帧先行,所以差速器心跳流程图如下:
差速器是锁帧模式下的一个重点,因为它的存在,才能够让逻辑帧与服务帧按照顺序执行。也因为差速器内部有时间管理,所以才能够实现服务帧的锁帧功能。这部分内容依靠的就是服务器同步的 当前最大帧号 数据,以最大帧号作为限制。如果网络出现波动,那么客户端逻辑就会卡在最大帧号对应的时间点,直到收到了服务器最新的最大帧号数据。
追帧 也是在此处完成,即如果客户端发现落后服务器帧数比较多,就需要在此处设计算法加速逻辑的运行,使得一次心跳执行更多的逻辑帧。但是需要注意不要一次把所有逻辑帧都跑完,这样会造成客户端显示效果上的撕裂感。
上文在讲 帧率差速器 时,已说明了服务帧与逻辑帧的概念,而且我们也明确了差速器是需要用在接口 ILogicMgr 的派生类中的,所以逻辑部分自然也是集成在这里的。
当差速器每次心跳结果是逻辑帧时,就是我们调用逻辑的心跳的时机。以此便完成了帧同步方案下逻辑的集成。也因为逻辑的心跳是在 ILogicMgr 中被驱动的,所以无论追帧或是心跳时间控制,都可以在此处根据需求进行开发。
我在项目中采用的帧同步方案已在上文进行了较为详细的说明。
需要指出的是,在服务帧概念下,我们的方案是以 服务器领先客户端 实现锁帧效果的。这种实现方案最为简单也最为有效。当我们面对的项目是一个对实时性要求不高的项目时,这种锁帧方案可以简单有效地实现我们的需求,也不会对玩家造成太多的感受上的负面影响。
如果项目实时性要求高怎么办?
类似ACT或MOBA类游戏,玩家需要能够及时获得技能释放的反馈,否则延迟的技能释放会撕裂快节奏的游戏体验。这种情况下就需要我们设计全新的思路。而在此之前,我们需要明确快照的概念。
快照,即当前数据的拷贝。我们之所以需要快照,是因为我们后续会需要在某个时间点保存所有的数据,然后在另一个时间点通过保存的数据还原战场的数据。
基于战斗框架,快照我们其实只需要逻辑的数据快照即可,这样即便逻辑通过快照进行了数据回滚,也可以将数据同步给显示层进行还原。ECS架构本身因为对数据与逻辑进行了完整的分离,所以快照与数据回滚的实现方案可以参考 第二章 内容,此处不作赘述。
下文我们将介绍一个可以改进的帧同步策略,就需要用到数据快照与回滚。
还有一种帧同步策略,即在服务帧概念下,客户端时间领先于服务器时间。这种情况下,客户端所有的逻辑可以看做是一种预演,而服务器下发的则是过去某帧的信息。
假设客户端是第 n+2 帧,服务器下发的是第 n 帧。
以上就是客户端优先的帧同步策略,但是这里也需要考虑几个实现的问题:
以上就是我对帧同步相关的记录与思考, 下一篇 便聚焦开发工具进行说明。