数据包在数据链路上传输时,发送端的数据链路层须要给每一个从网络层获得的包加上开始和结束的标记,接收端端根据标记把数据解析成不一样的数据包递交给网络层。数据包通过网络层封装以后称为一个数据帧,结构以下:算法
帧头 | 源物理地址 | 目标物理地址 | 数据包协议类型 | 数据包 | 帧检验序列 | 帧尾 |
上面提到的帧头和帧尾,其实是在网络协议中约定好的一些特殊字节做为标识符(例如01111110)。若是数据包中的数据也包含这与帧头和帧尾相同的字节该如何处理呢?为了解决这些问题,数据层在封装数据包的时候若是发现包中有存在跟帧头帧尾相同的字节,会在这些特殊体特前面再加上一些特殊的填充字节用于提示接收端这并非帧头和帧尾,这很像编程语言中转义字符"\"。接收端在接收的时候会去掉这些"转义字符",把数据包原样递交给上层。这整个过程对于数据链路层之上的数据层是彻底无感知的,因此称为透明传输。编程
假如帧头和帧尾的标识符是01111110,也能够采用0比特填充法,来避免数据中出现标识符。只要数据中有5个连续的1比特,就在后面填充一个0,接收端若是发现有5个连续的1比特,切后面跟着0bit,就把这个0bit去掉,以此来实现透明传输。网络
数据在物理介质上传输的时候收的时候,因为信道噪声的存在,必定会出现错误的比特。传输错误的比特占所传输比特总数的比率称为误码率。检测和纠正传输中的错误比特的功能是在数据链路层来实现的。并发
差错检测和纠正是经过在数据帧中封装上帧检验序列(冗余码)来实现的,冗余码在数据帧中的位置是在数据包以后帧尾以前。通常是使用循环冗余校验CRC。接收端根据检测算法来判断是否有错误的比特。这个算法只能知道是否存在错误的比特,可是没法知道哪个比特出错,发现错误后只能丢弃数据帧,进一步就须要传输层的排序和重传机制来保证传输的可靠性。编程语言
另外,还有一些带有纠错能力的差错检测编码,与上面相似也是在数据帧中附加帧检验序列,这种编码有必定的几率能够检测到具体是哪一个比特在传输中出现了错误,以减小数据链路层对数据帧的丢弃。以太网协议没有实现纠错,由传输层来保证传输的可靠性。优化
因为数据链路层不能保证它上面的协议层的可靠性传输,能够不实现接收确认机制,由高层来实现可靠性传输。例如TCP/IP协议中传输层的可靠性传输服务。编码
广域网采用点到点通讯机制。cdn
用户使用拨号电话线接入因特网(ADSL)时,通常使用PPP协议。PPP协议除了前面介绍的数据链路层功能以外,还包含了链路控制协议(可用于用户身份验证和计费)、网络控制协议(如协商分配IP地址等)等细分的协议层。blog
局域网采用广播机制 - 以太网协议,以太网协议组中主要包含MAC协议,一个数据帧也能够称为一个MAC帧。排序
共享通讯媒体接入:
静态划分网络(通常不采用,加入新的机器须要从新划分资源)
动态接入:
以太网:
优化的以太网:
前面提到多个设备同时发送数据时,信号会在总线上产生碰撞。若是使用交换机组网,交换机能够根据mac地址转发数据,信号不会扩散到网络内的其余设备,因此多个设备能够同时发送数据,并且支持全双工通讯。目前交换机是主流的以太网组网设备。