Services Provided to the Network Layer
将物理层传输的比特,组织成数据帧
处理传输中的差错
调整数据帧的流动速度,使慢速的接收方不被快速的发送方所“淹没”
链路(link)是一条无源的点到点的物理线路段,中间没有任何其他的交换结点。一条链路只是一条通路的一个组成部分。 数据链路(data link) 除了物理线路外,还必须有通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。 -现在最常用的方法是使用适配器(即网卡)来实现这些协议的硬件和软件。 -一般的适配器都包括了数据链路层和物理层这两层的功能。
数据链路管理,负责在两个相邻结点间建立、维护和拆除链路,并通过差错控制、流量控制将不太可靠的物理链路改造成无差错的数据链路。提高链路的可靠性,为网络通信提供一条在逻辑上无差错的数据链路。
目的结点不作确认,差错由上层负责;
目的结点对收到的帧要作确认,发送结点可以知道已发出的帧是否安全到达目的结点;误帧重传;
可靠地传送数据的服务,即提供在网络实体间建立、维持和释放数据链路的功能;
源机器向目的机器发送独立的帧,而目的机器对收到的帧不做确认。事先没有建立连接,事后也不存在释放。如果由于线路上的噪声而造成帧丢失,数据链路层不做努力去恢复它,恢复工作留给上层去完成。
源机器向目的机器发送独立的帧,而且目的机器对收到的每一帧进行单独确认。仍然不需要建立连接,事后也不存在释放。以这种方式,发送方就可以知道帧是否安全地到达。如果在某个特定的时间间隔内,帧没有到达,就必须重新发送该帧。
源机器和目的机器在传递任何数据之前,先建立一条连接。在这条连接上所发送的每一帧都被编上号,数据链路层保证所发送的每一帧都确实已收到。而且它保证每帧都收到一次,而且所有的帧都是按正确顺序收到的。 采用无连接服务时,如果确认信息丢失,将会引起一帧多次发送,因此也会收到多次。而面向连接的服务为网络层进程间提供了可靠的传送比特流的服务。
为了解决可靠成帧问题,提出以下4种成帧的办法:
用帧头中一个字符表示帧内的字节数。 算法:在每帧的帧头使用一个字段,用来标明帧内的字节数。 例. 1、2、3、4帧的字节数分别为5、5、8、8。
例. 若第2帧的字符计数值应是5,由于传输差错而被“篡改”为7,致使发送方与接收方不同步,而且无法据此确定下一帧的开始位置。此时,若目的主机已知校验和不正确,但仍无法从出错帧中得知下一帧将从哪里开始。即使向源主机发回“请求重传”的信息也没有用,因为目的主机不知道应该回跳多少字符开始重传。
每个帧用特殊字节作为开始与结束,即标志字节(flag byte)。 当标志字节出现在数据中时,加入转义字节(ESC)(字节填充) 当转义字节出现在数据中时,其前亦加入转义字节(ESC)
允许数据帧中包含任意长度的位。 每一帧是用一个特殊的位模式,即01111110 作为开始和结束的标志字节。当发送方的数据链路层在数据中遇到5个连续的1时,为了区分数据和位模式,则自动在数据后插入一个“0”到输出比特流中。这就是比特填充技术。
-基于反馈的流量控制 -基于速率的流量控制(传输层)
随机信道:错码的出现是随机的,且错码之间是统计独立的。 突发信道:错误成串出现,在一些短促的时间区间内会出现大量错码,而这些短促的时间区间之间却又存在较长的无错码区间。原因:有线信道—脉冲干扰,无线信道—脉冲干扰、衰落。
当n=7, p=10-3时,p7(1)≈710-3,p7(2)≈2.110-5,p7(3)≈3.5*10-8.
一个帧包括m个数据位(信息位),r个校验位(监督位),n = m + r,则此n比特单元称为n位码字。
两个码字之间不同的比特位数目。 例:0000000000 与0000011111的海明距离为5 如果两个码字的海明距离为d,则需要d个单比特错就可以把一个码字转换成另一个码字;
最简单的例子是奇偶校验,在数据后填加一个奇偶位(parity bit) 例:使用偶校验(“1”的个数为偶数) 10110101——>101101011 10110001——>101100010 奇偶校验可以用来检查单个错误。
–码位从左边开始编号,从“1”开始; –位号为2的幂的位是校验位,其余是信息位; –每个校验位使得包括自己在内的一些位的奇偶值为偶数(或奇数)。 –为看清数据位k对哪些校验位有影响,将k写成2的幂的和。 –例:11 = 1 + 2 + 8
M=7→r=? 7+4+1<2^4,而7+3+1>2^3→r=4,n=m+r=11 换句话说,对m=7的分组码而言,为能纠正一位错码,要求r≥4
3 = 1+2 5= 1+4 6= 2+4 7= 1+2+4 9= 1+8 10= 2+8 11 = 1 + 2 + 8
a1=a3+a5+a7+a9+a11 a2=a3+a6+a7+a10+a11 a4=a5+a6+a7 a8=a9+a10+a11
–每个码字到来前,接收方计数器清零; –接收方检查每个校验位k (k = 1, 2, 4 …)的奇偶值是否正确; –若第k 位奇偶值不对,计数器加k; –所有校验位检查完后,若计数器值为0,则码字有效;若计数器值为m,则第m位出错。 –若校验位1、2、8出错,则第11位变反。
将要传输的数据码元分组,每一组数据后面附加一校验位,使得该组数据连同校验位在内的码中“1”的个数为偶数(偶校验)或奇数(奇校验)。在接收端,按同样的规则检查,如不符,则出差错。
1011010发送10110100(偶校验)
1011010发送10110101(奇校验)
先建立应发送的二进制之间的数量关系,即发方对数据帧的二进制数按一定规则运算,产生二进制形式的校验码,随后把这些二进制数一起发送出去,接收方收到後按同样的规则检验这些二进制数之间的关系,从而可判断出传输过程中有无差错发生。
收发双方约定一个生成多项式G(x)(其最高阶和最低阶系数必须为1),发送方在帧的末尾加上校验和,使带校验和的帧的多项式能被G(x)整除;接收方收到后,用G(x)除多项式,若有余数,则传输有错。
在代数编码理论中,为了便于计算,把码组中各码元当作是一个多项式的系数,即把(a(n-1),a(n-2),…,a(1),a(0))(长度为n)的码组表示成:T(x)=a(n-1)x^(n-1)+a(n-2)x^(n-2)+…+a(1)x+a(0) 例: (1100101)的码多项式为x6+x5+x2+1 说明:码多项式中的x仅是码元位的标记,我们并不关心x的取值!
特点:加法无进位、减法无借位,加、减法相同,与异或等价!1+1=0(无进位)、0-1=1(无借位)
(x^2+1)/(x+1)=x+1,余数为0(x^4+x+1)(x+1)=x^5+x^4+x^2+1,而不是x^5+x^4+x^2+2x+1
–G(x)是一个唯一的r阶多项式(r –校验和(checksum)加在帧尾,使带校验和的帧的多项式能被G(x)除尽;收方接收时,用G(x)去除它,若有余数,则传输出错。 –设G(x)为r 阶,在帧的末尾加r 个0,使帧为m + r位,相应多项式为x^rM(x); –按模2除法用对应于G(x)的位串去除对应于x^rM(x)的位串,余式R(x); –按模2减法从对应于x^rM(x)的位串中减去余数(等于或小于r位),结果就是要传送的带校验和的多项式T(x)→编出的码组T(x)=x^rM(x)+R(x)。 –发送:T(x);接收:T(x) + E(x); –余数((T(x) + E(x)) / G(x)) = 0 + 余数(E(x) / G(x)) –若余数(E(x) / G(x)) = 0,则差错不能发现;否则,可以发现。 任意一个二进制分组信息串:b0,b1,……bm,都可用一个m阶多项式表示:M(x) =b(0)x^m+b(1)x^(m-1)+……+b(m);预先选取一个生成多项式G(x)=g(0)x^r+g(1)x^(r-1)+……+1; -发方发送数据前,对数据进行编码:按模2除法用xrM(x) 除以G(x),得商多项式Q(x)和余数多项式R(x); x^r* M(x) = Q(x) * G(x) + R(x);T(x) = x^rM(x) –R(x) -发送方发送编码信息; -收方收到编码后,再表示成T(x); -收方进行校验,如果T(x)/G(x)的余数R(x)不为0,则传输有错,否则传输正确; -取数据信息;把收到的正确编码信息去掉尾部,即数据信息。 CRC-16: X^16+X^15+X^2+1 CRC-CCITT:X^16+X^12+X^5+1 CRC-32: X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+1 A Simplex Stop-and-WaitProtocol for a Error-Free Channel A Simplex Stop-and-WaitProtocol for a Noisy Channel –什么时候重传——定时 –重复帧怎么办——发送帧头中放入序号 –为了使帧头精简,序号取多少位—--1位,模2增1 A positive acknowledgement with retransmission protocol –优点:充分利用信道带宽,减少帧的数目意味着减少“帧到达”中断; –带来的问题:复杂。 例:–卫星信道传输速率50kbps,往返传播延迟500ms,若传1000bit的帧,使用协议4,则传输一个帧所需时间为:发送时间+ 信息信道延迟+ 确认信道延迟(确认帧很短,忽略发送时间)= 1000bit / 50kbps + 250ms + 250ms = 520ms;信道利用率=20/520约等于4% 一般情况:–信道带宽b比特/秒,帧长度L比特,往返传播延迟R秒,则信道利用率为(L/b)/(L/b+R)=L/(L+ Rb) 结论:–传输延迟大,信道带宽高,帧短时,信道利用率低。 –一种成帧方法,面向字符的,采用字符填充技术 –一种链路控制协议LCP(Link Control Protocol),用于启动线路、测试线路、协商参数、关闭线路 –一种协商网络层选项的方式,针对每一种支持的网络层都有相应的网络控制协议NCP(Network Control Protocol), 可支持多种网络层协议。 –当协议字段为0x0021 时,PPP 帧的信息字段就是IP 数据报。 –若为0xC021, 则信息字段是PPP 链路控制数据。 –若为0x8021,则表示这是网络控制数据。
3.3基本的数据链路层协议
Assumptions
Protocol Definitions
/*自己敲了一遍,有可能敲得不准,凑合看:protocol.h*/
/*Some definitions needed in the protocols(protocol.h)*/
#define MAX_PKT 1024 /*determines packet size in bytes*/
typedef enum{false,true}boolean; /*boolean type*/
typedef unsigined int seq_nr; /*sequence or ack numbers*/
typedef struct{unsigined char data[MAX_PKT];}packet; /*packet defintion*/
tyoedef enum{data,ack, nak}frame_kind; /*frame_kind defintion*/
typedef struct { /*frames are transported in this layer*/
frame_kind kind; /*what kind of grame is it?*/
seq_nr seq; /*sequence number*/
seq_nr ack; /*acknowledgement number*/
packet info; /*the network layer packet*/
}frame;
/*wait for an event to happen; return its type in event*/
void wait_for_event(event_type *event);
/*Fetch a packet from the nework layer for transmission on the channel*/
void from_network_layer(packet *p);
/*deliver information from an inbound frame to the network layer*/
void to_network_layer(packte *p);
/*go get an inbound frame from the physica layer and copy it to r*/
void from_physical_layer(frame *r);
/*pass the frame to the physical layer for transmission*/
void to_physical_layer(frame *p);
/*start the clock running and enable the timeout event*/
void start_timer(seq_nr k);
/*stop the clock and disable the timeout event*/
void stop_timer(seq_nr k);
/*start an auxiliary timer and enable the ack_timeout event*/
void start_ack_timer(void);
/*stop the auxiliary timer and disable the ack_timeout event*/
void stop_ack_timer(void);
/*allow the network layer to cause a network_layer_ready event*/
void enable_network_layer(void);
/*forbid the network layer from causing a network_layer_reasy event*/
void disable_network_layer(void);
/*macro inc is expanded in-line: increment k circularly*/
#define inc(k) if(k
3.3.1 一个乌托邦式的单工协议(AUtopianSimplex Protocol)
工作在理想情况(Utopian,不现实,无流量控制、纠错等)
工作过程
乌托邦式的单工协议的实现
/**
* Protocol 1 (Utopia) privides for data transmission in one direction only,
* from sender to receiver. The communication channel is assumed to be error
* free and the receiver is assumed to be able to process all the input
* infinitely quickly. Consequently, the sender just sits in a loop pumping
* data out onto the line ad fast ad it can.
*/
typedef enum{frame_arrival}event_type;
#include "protocol.h"
void sender1(void)
{
frame s; /*buffer for an outbound frame*/
packet buffer; /*buffer for an outbound packet*/
while(true){
from_network_layer(&buffer);/*go get something to send*/
s.info = buffer; /*copy it into s for transmission*/
to_physical_layer(&s); /*tomorrow, and tomorrow, and tomorrow,
creeps in this petty pace from day to day
To the last syllable fo recorded time.
--Macbeth. V. v */
}
}
void receiver1(void)
{
frame r;
event_type event; /*filled in by wait, but not used here*/
while(true)
{
wait_for_event(&event); /*only possibility is frame_arrival*/
from_physical_layer(&r); /*go get the inbound frame*/
to_network_layer(&r.info); /*pass the data to the network layer*/
}
}
无错信道上的单工停等协议
目的:Flow control
无错信道上的单工停等协议(实现)
/**
* protocol 2 (stop-and-wait) also privides for a one-directional
* flow of data from sender to receiver. The communication channel
* is once ageain assumed to be error free, as inprotocol 1.
* However, this time the receiver has only a finite buffer capacity
* and a finite processing speed, so the protocol mast explicitly
* prevent the sender from flooding the receiver with data faster
* than it can be handled.
*/
typedef enum{frame_arrival}event_type;
#include "protocol.h"
void sender2(void)
{
frame s; /*buffer for an outbound frame*/
packet buffer; /*buffer for an outbound packet*/
event_type event; /*frame_arrival is the only possibility*/
while(true){
from_network_layer(&buffer);/*go get something to send*/
s.info = buffer; /*copy it into s for transmission*/
to_physical_layer(&s); /*bye-bye little frame*/
wait_for_event(&event); /*do not proceed until given the go ahead*/
}
}
void receiver2(void)
{
frame r,s; /*buffers for frames*/
event_type event; /*frame_arrival is the only possibility*/
while(true)
{
wait_for_event(&event); /*only possibility is frame_arrival*/
from_physical_layer(&r); /*go get the inbound frame*/
to_network_layer(&r.info); /*pass the data to the network layer*/
to_physical_layer(&s); /*send a dummy frame to awaken sender*/
}
}
3.3.3 有噪声信道的单工停等协议
有噪声信道的单工停等协议
带有重传机制的肯定确认机制
3.4滑动窗口协议Sliding Window Protocol
滑动窗口协议工作原理
大小为1的滑动窗口
一比特滑动窗口协议A One Bit Sliding Window Protocol
A 1-bit sliding windows protocol
一比特滑动窗口协议A One Bit Sliding Window Protocol
3.4.2退后n帧协议A Protocol Using Go-Back-n
为提高传输效率而设计
提高效率方法
退后n协议
选择重传(selective repeat)
3.5数据链路层协议实例
点到点协议PPP ——Point-to-Point Protocol
PPP 协议的帧格式
PPP中的字符填充
用户到ISP 的链路使用PPP 协议
PPP 协议的工作状态