数据链路
点对点的数据链路层通讯
- 结点A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧。
- 结点A把封装好的帧发送给结点B的数据链路层。
- 结点B的数据链路层收到的帧无差错 结点B的数据链路层收到的帧无差错,则从手到的帧中提取出IP数据报上交给上面的网络层;否则丢弃这个包。
信息是如何交换的
假设A的MAC地址为MA,IP为IPA;B的MAC为MB,IP为IPB。
这就如我们寄信一样,MA为家里地址(网卡出厂时就已经写在ROM中,不能修改),而A的目的MAC地址为邮箱(路由)的MAC地址而不是MB(假设不在同一个内网上);IPA为A的名字,IPB为B的名字;当A发送给B时,把信放进邮箱里,等待邮差员(路由)进行运输就行了,我们可以不用理会他怎么送,等着回信就可以。
IP地址为虚拟地址,MAC地址像身份证,其中最大的好处在于可以屏蔽链路层以下的操作,IP地址尽可能的分类。比如:你家人可以称呼你的小名,很多人家里(内网)都有傻蛋铁头,但是到了外面(外网),A公司的人对外可以统称为工号如A001、A002(唯一),就可以省掉很多名字(链路层)上的细节,并且可以根据新的名字分类,如研发部为A0**。人事部为A1**。
三个基本问题
- 封装成帧
从应用层到数据链路层中,每层都会根据各自的协议对数据进行封装,目的是为了把数据跟指令分开,并执行各自的任务,数据链路层的头部和尾部是为了让对方知道开始和结束。 - 透明传输
如图,头部SOH和尾部EOT,实际都是一个二进制,如EOT为0x04,那么数据部分肯定存在数据0x04,那么接受就会误以为帧结束,所以引入转义字符“ESC”。如图3-7
数据帧中遇到SOH、EOT时,前面加ESC进行字节填充。数据中遇到转义字符时在其前面再加一个转义字符。接收端收到数据后,拆分转义字符,获得原来的数据。这部分在上层看起来是自动执行如透明传输一样。 - 差错检验
一般使用CRC检测,如数据M=101001(k=6)。CRC运算就为数据M后面加上n为冗余码,构成帧。除数P=1101(开始双方规定好P的值,P为4位bit,n=4-1=3)M+000=101001000/P=001(模2运算,加法不进位,如1111+1010=0101), M+001为我们需要发送的数据,接收端收到数据后除于除数P,得到的余数为0表示数据正常,非0表示在运输过程中失真。