Visual C++ 2017网络编程实战
上QQ阅读APP看书,第一时间看更新

1.6 数据链路层

1.6.1 数据链路层的基本概念

数据链路层最基本的服务是将源计算机网络层来的数据可靠地传输到相邻节点目标计算机的网络层。为达到这一目的,数据链路层主要解决以下3个问题:

(1)如何将数据组合成数据块(在数据链路层中将这种数据块称为帧,帧是数据链路层的传送单位)。

(2)如何控制帧在物理信道上的传输,包括如何处理传输差错,如何调节发送速率以使之与接收方相匹配。

(3)在两个网络实体之间提供数据链路通路的建立、维持和释放管理。

1.6.2 数据链路层的主要功能

数据链路层的主要功能如下:

(1)为网络层提供服务

·无确定的无连接服务,适用于实时通信或者误码率较低的通信信道,如以太网。

·有确定的无连接服务,适用于误码率较高的通信信道,如无线通信。

·有确定的面向连接服务,适用于通信要求比较高的场合。

(2)成帧、帧定界、帧同步、透明传输的功能

为了向网络层提供服务,数据链路层必须使用物理层提供的服务。我们知道,物理层是以比特流进行传输的,这种比特流并不保证在数据传输过程中没有错误,接收到的位数量可能少于、等于或者多于发送的位数量,而且它们还可能有不同的值。这时数据链路层为了能实现数据有效的差错控制,就采用了一种“帧”的数据块进行传输。要采帧格式传输,就必须有相应的帧同步技术,这就是数据链路层的“成帧”(也称为“帧同步”)功能。

成帧:两个工作站之间传输信息时,必须将网络层的分组封装成帧,以帧的形式进行传输。将一段数据的前后分别添加首部和尾部就构成了帧。

·帧定界:首部和尾部中含有很多控制信息,它们的一个重要作用就是确定帧的界限,即帧定界。

·帧同步:接收方应当能从接收的二进制比特流中区分出帧的起始和终止。

·透明传输:不管所传数据是什么样的比特组合都能在链路上传输。

(3)差错控制功能

在数据通信过程中可能会因物理链路性能和网络通信环境等因素出现一些传送错误,为了确保数据通信的准确,就必须使得这些错误发生的概率尽可能低。这一功能也是在数据链路层实现的,就是“差错控制”功能。

(4)流量控制

在双方的数据通信中,如何控制数据通信的流量同样非常重要。它既可以确保数据通信的有序进行,还可以避免通信过程中因为接收方来不及接收而造成的数据丢失。这就是数据链路层的“流量控制”功能。

(5)链路管理

数据链路层的“链路管理”功能包括数据链路的建立、链路的维持和释放三个主要方面。当网络中的两个结点要进行通信时,数据的发送方必须确知接收方是否已处在准备接收的状态。为此,通信双方必须先要交换一些必要的信息,以建立一条基本的数据链路,在传输数据时要维持数据链路,而在通信完毕时释放数据链路。

(6)MAC寻址

这是数据链路层中MAC子层的主要功能。这里所说的“寻址”与“IP地址寻址”是完全不一样的,因为此处所寻找的地址是计算机网卡的MAC地址,也称“物理地址”“硬件地址”“局域网地址(LAN Address)”“以太网地址(Ethernet Address)”,而不是IP地址。在以太网中,采用媒体访问控制(Media Access Control,MAC)地址进行寻址,MAC地址被烧入每个以太网网卡中的。

网络接口层中的数据通常称为MAC帧,帧所用的地址为媒体设备地址,即MAC地址,也就是通常所说的物理地址。每一块网卡都有一个全世界唯一的物理地址,它的长度固定为6字节,比如00-30-C8-01-08-39。我们在Linux操作系统的命令行下用ifconfig -a可以看到系统中所有网卡的信息。

MAC帧的帧头定义如下:

    typedef struct _MAC_FRAME_HEADER  //数据帧头定义
    {
     char  cDstMacAddress[6];    //目的MAC地址
     char  cSrcMacAddress[6];    //源MAC地址
     short m_cType;              //上一层协议类型,如0x0800代表IP协议、0x0806代表ARP
    }MAC_FRAME_HEADER,*PMAC_FRAME_HEADER;