【数据链路层】封装成帧和透明传输和差错控制

news2024/10/6 16:19:22

注:最后有面试挑战,看看自己掌握了吗

文章目录

  • 前言
  • 链路层功能
    • 功能
  • 封装成帧和透明传输
    • 组帧的四种方法
    • 透明传输
  • 差错控制
    • 检错编码
    • 差错
    • 链路层的差错控制
      • 检错编码
    • 纠错编码
  • 链路层代码实现

🍃博主昵称:一拳必胜客
🌸博主寄语:欢迎点赞收藏关注哦,一起成为朋友一起成长;
 特别鸣谢:木芯工作室
特别鸣谢:木芯工作室 、Ivan from Russia


前言

  1. 功能+应用

链路层功能

  1. 封装成帧—链路层
  2. 传比特-----物理层
  3. 加头加尾封装----------链路层
  4. 节点—主机、路由器,
  5. 链路–物理通道
  6. 数据链路----逻辑通道
  7. 帧----封装网络数据包—链路层
  8. 可靠的传输到相邻节点
  9. 给网络层提供无差错的服务
  10. 加强物理层传输原始比特流功能

功能

  1. 为网络层提供服务—无确认无连接服务、有确认无连接服务、有确认有链接服务
  2. 链路管理:连接的建立维持释放------有连接服务
  3. 组帧
  4. 流量控制-----限制发送方
  5. 差错控制—帧错/位错

封装成帧和透明传输

  1. 把网络层IP数据报加头加尾形成帧
  2. 帧首部、尾部
  3. 这个作用叫:帧定界服务
  4. 帧同步----接收方可以区分出 头、尾
  5. 最大传送单元MTU

组帧的四种方法

  1. 字符集书法—用帧首部的第一个字节来标明帧内字符数-----痛点:鸡蛋装在一个篮子–一错全错,失去同步
  2. 字符填充法— SOH---------EOT -------1当传送文本字符文件非常好用----透明传输2采用字符填充法,加上转义字符ESC不去管数据当中的数据信息
  3. 零比特填充法------方法:5"1"1"0"-------连续的5个1添0
  4. 违规编码法--------曼彻斯特编码,用高-高,低-低来界定帧的起始终止------局域网IEEE就用这种方法

透明传输

  1. 链路层好像看不到这样的信息
  2. 单纯传送数据到目标

差错控制

检错编码

  1. 插错都是由噪声引起的
  2. 全局性:线路本身电气特性所产生的随机噪声,是信道固有的、随即存在。---------------解决办法:提高信噪比或者避免干扰
  3. 局部性-----外部短暂原因造成的冲击噪声--------是产生差错的主要原因-----------利用编码技术拉解决

差错

  1. 位错—比特位错误
  2. 帧错—帧丢失、帧重复、帧失序
  3. 当通信质量好有线传输链路----------无确认无连接--------传输层来保证可靠传输
  4. 通信质量差的无线传输-----------有确认有链接
  5. ------------------因材施教

链路层的差错控制

检错编码

  1. 奇偶校验码—1的个数的奇偶------检错能力50%
  2. 循环冗余码CRC------数据发送之前,按照某种关系附加一定冗余位
  3. 要传的数据 / 生成多项式= *** ----------PSC帧检测序列/冗余码
  4. 接收端:接收到的数据 / 生成多项式 = *** -----------0
  5. 最终发送的数据: 要发送的数据+帧检验序列FCS
  6. 计算冗余码:1.加0 2.模二除法(异或)
  7. TIP 多项式N位,阶位N-1位
  8. 硬件实现-----迅速
  9. “凡是接收端数据链路层接收的帧均无差错”
  10. 这仍然是不可靠传输 ----有丢弃的帧,没有进行处理
  11. 在这里插入图片描述

纠错编码

  1. 海明码
    在这里插入图片描述
  2. 码距----海明距离-------一个编码的系统里面任意两个合法编码之间的最小距离
  3. 看码距-----就是直接眼看--------另种方法就是异或
  4. 码距:n--------检错能力:n-1
  5. 所以,码距是3检错能力2
  6. 海明码
  7. 数据m位,校验码r位
  8. 校验码取值有2的r次方种取值
  9. 2的r次方>=m+r+1----------------海明不等式----------确定校验码位数-------直接带入尝试r--------加的1是正确情况
  10. 校验码放在2的n次方位置上------------一个个算1 2 4 8
  11. 通配形式 1 ** ---------负责所有1开头的检测 ------如101
  12. 求出校验码的值:采用偶校验,1号校验码负责1,3,5,7的校验
  13. 2号位负责2 3 6 7
  14. 4号校验码负责:4 5 6 7
  15. 我们把出错的找出来,然后把对的排除出来--------找出那个错的
  16. 纠错方法2:把那些校验码都写出来 x4 x2 x1-------101------第五位出错

链路层代码实现

//Ethernet.h
//这里只为上次的Ethernet.h做一补充


int is_accept_ethernet_packet(u_int8_t *packet_content, int len);

void ethernet_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char *packet_content);
//Ethernet.cpp

#include "Network_IPV4_recv.h"
#include "Network_ARP_recv.h "
//这里需要调用上层提供的接收函数接口交付数据包

int is_accept_ethernet_packet(u_int8_t *packet_content, int len)
{
    struct ethernet_header *ethernet_hdr = (struct ethernet_header *)packet_content;
    int i;
    int flag = 0;

    //检查目的MAC地址是否是广播MAC地址
    for (i = 0; i < 6; i++)
    {
        if (ethernet_hdr->destination_mac[i] != 0xff)break;
    }
    if (i == 6)
    {
        flag = 1;
        printf("It's broadcast packet.\n");
    }

    //检查目的MAC地址是否是本地MAC地址
    for (i = 0; i < 6; i++)
    {
        if (ethernet_hdr->destination_mac[i] != local_mac[i])break;
    }
    if (i == 6)
    {
        flag = 1;
        printf("It's sended to my pc.\n");
    }

    //若上边检查均未通过,返回0表示本数据包不需要接收
    if (!flag)
        return 0;

    //否则检查CRC校验码
    u_int32_t crc = calculate_crc((u_int8_t *)packet_content , len - 4 );
    if (crc != *((u_int32_t *)(packet_content + len - 4)))
    {
        printf("The data has changed.\n");
        return 0;
    }

    //CRC无误则本数据包可以接收,返回1
    return 1;
}

//接收数据帧的回环函数
void ethernet_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char *packet_content)
{
    int len = packet_header->len;
    if (!is_accept_ethernet_packet((u_int8_t *)packet_content, len))
    {
        return;
    }

    struct ethernet_header *ethernet_hdr = (struct ethernet_header *)packet_content;
    u_int16_t ethernet_type = ntohs(ethernet_hdr->ethernet_type);

    //去掉MAC帧首部,将数据部分根据上层协议交付给相应的上层接收函数
    u_int8_t *upper_buffer = (u_int8_t *)(packet_content + sizeof(ethernet_header));
    switch (ethernet_type)
    {
    case 0x0800:
        printf("Upper layer protocol: IPV4\n");
        network_ipv4_recv(upper_buffer);
        break;
    case 0x0806:
        printf("Upper layer protocol: ARP\n");
        dest_mac=network_arp_recv(upper_buffer);
        break;
    case 0x8035:
        printf("Upper layer protocol: RARP\n");
        //network_rarp_recv();
        break;
    case 0x814c:
        printf("Upper layer protocol: SNMP\n");
        //network_snmp_recv();
        break;
    case 0x8137:
        printf("Upper layer protocol: IPX(Internet Packet Exchange)\n");
        //network_ipx_recv();
        break;
    case 0x86DD:
        printf("Upper layer protocol: IPV6\n");
        //network_ipv6_recv();
        break;
    case 0x880B:
        printf("Upper layer protocol: PPP\n");
        //network_ppp_recv();
        break;
    default:break;
    }
    //以上注释掉的协议均未实现,有兴趣的伙伴可以在看完我的协议栈设计的基础上在进行追加
}

到这里我们就算介绍完了数据链路层以太网的数据包发送和接收的过程及实现,我们先在此简单总结一下:
我们的数据发送向上层提供的接口函数是:

 int ethernet_send_packet(u_int8_t *upper_buffer,u_int8_t
 *destination_mac,u_int16_t ethernet_type) 

上层调用此函数时需要提供的参数有:
1、上层的数据包,即链路层数据帧的数据部分
2、数据包长度,这里我们用全局变量ethernet_upper_len来获取 2、目的MAC地址
3、调用此函数的上层协议
数据接收时,根据上层协议不同提交时上层提供给我们的接口有:

network_arp_recv(upper_buffer);
 network_ipv4_recv(upper_buffer); //这两个我们后边会慢慢给大家展示出来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

27.gateway的限流实战(springcloud)

1 什么是限流 通俗的说&#xff0c;限流就是限制一段时间内&#xff0c;用户访问资源的次数&#xff0c;减轻服务器压力&#xff0c;限流大致分为两种&#xff1a; 1. IP 限流&#xff08;5s 内同一个 ip 访问超过 3 次&#xff0c;则限制不让访问&#xff0c;过一段时间才可继…

E-Prime心理学实验设计软件丨产品简介

拖放设计 通过将对象拖放到时间轴上来构建文本、图像、声音和视频的实验。利用我们的实验库中的免费模板和预建实验。 计时精度 E-Prime 3.0 将计时精度报告到毫秒精度级别。请务必使用我们的测试工具来确认您的计算机硬件能够进行关键计时。将Chronos添加到您的研究设置中&a…

Kubernetes 系统化学习之 资源清单篇(三)

Kubernetes 是一个可移植的、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统。 根据不同的级别&#xff0c;可以将 Kubernetes 中的资源进行多种分类。以下列举的内容都是 K…

轻松学习jQuery控制DOM

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;前端开发者…

ESP8266--Arduino开发(驱动WS2812B)

文章目录一、WS2812彩灯介绍二、安装Adafruit_NeoPixel驱动库三、Adafruit_NeoPixel库常用接口四、使用示例五、网页端控制WS2812B灯带实例一、WS2812彩灯介绍 WS2812是一个集控制电路与发光电路于一体的智能外控LED光源&#xff0c;外型与5050LED灯珠相同&#xff0c;每个灯珠…

Linux修改默认登录端口22

目录 一、编辑sshd配置 二、重启sshd 三、防火墙开放端口 四、重启防火墙 五、测试连接 六、防火墙关闭22端口 前言&#xff1a;ssh登录的默认端口是22&#xff0c;如果不修改默认端口的话&#xff0c;会不安全&#xff0c;默认端口会遭到攻击&#xff0c;为了安全要修…

JavaEE之HTTP协议 Ⅰ

文章目录前言一、协议格式总结二、认识URL三、认识"方法"(method)1.GETGET请求的特点2.POSTPOST 请求的特点总结前言 网络技术中,最核心的概念,就是"协议",HTTP就是应用层典型的协议 应用层,很多时候需要程序员自定义应用层协议,也有一些现成的协议,供我们…

代码随想录算法训练营第57天 | 647. 回文子串 516.最长回文子序列 dp总结

代码随想录系列文章目录 动态规划篇 —— 区间dp 文章目录代码随想录系列文章目录动态规划篇 —— 区间dp647. 回文子串516.最长回文子序列代码随想录中动态规划总结647. 回文子串 题目链接 回文子串还是很难的我觉得&#xff0c;所以应该多做几遍 这道题的dp数组代表就不是问…

Linux之用户操作【用户的增删改查你要的都有】【详细】

目录用户相关介绍添加用户useradd [选项] 用户名passwd 用户名细节说明删除用户userdel 用户名userdel -r 用户名查询用户id 用户名切换用户su 用户名默认输入su切换到管理员目录用户组groupadd 组名userdel 组名补充&#xff1a; useradd -g 用户组 用户名补充&#xff1a;use…

BigLEN(rat)脑内最丰富的多肽之一、LENSSPQAPARRLLPP

BigLEN(rat) TFA 是脑内最丰富的多肽之一&#xff0c;是有效的 GPR171 激动剂&#xff0c;其EC50 值为1.6 nM。 BigLEN(rat) TFA, one of the most abundant peptides in brain, is a potent GPR171 agonist, with an EC50 of 1.6 nM[1][2].编号: 200557 中文名称: BigLEN(rat)…

详解MySQL事务日志——undo log

前言 众所周知&#xff0c;事务的一大特点是原子性&#xff0c;即同一事务的SQL要同时成功或者失败。那大家有没有想过在MySQL的innoDB存储引擎中是如何保证这样的原子性操作的&#xff1f;实际上它是利用事务执行过程中生成的日志undo log来实现的&#xff0c;那么undo log究…

加速推进企业信息化建设,SRM采购系统赋能建筑工程产业生态链实现数字化转型

建筑工程行业是拉动国民经济发展的重要支柱产业之一。近年来建筑业占国民生产总值的20&#xff05;左右&#xff0c;对国民经济影响很大。随着我国建筑业企业生产和经营规模的不断扩大&#xff0c;建筑业总产值持续增长&#xff0c;传统的管理手段早已无法实现企业的精细化管理…

Fiddler/Charles - 夜神模拟器证书安装App抓包

Fiddler/Charles - 夜神模拟器证书安装App抓包 文章目录Fiddler/Charles - 夜神模拟器证书安装App抓包前言一、软件安装1.Openssl安装1.1下载安装1.2配置环境变量1.3查看openssl版本&#xff0c;输入命令&#xff1a;openssl version2.夜神模拟器安装1.1 下载安装1.2工具准备&a…

三、RTMP协议 视频Chunk和音频Chunk到底长啥样?

重要概念 RTMP Chunk Header RTMP Chunk Header的长度不是固定的&#xff0c;分为: 12 Bytes、8 Bytes、4 Bytes、1 Byte 四种&#xff0c;由RTMP Chunk Header前2位决定。 FLV VideoTagHeader 分析RTMP流时&#xff0c;经常看到与0x17或0x27进行比较的情况&#xff0c;那0x1…

Azide-PEG-acid,N3-PEG-COOH,叠氮-聚乙二醇-羧基多用于点击化学

Azide-PEG-acid&#xff08;N3-PEG-COOH&#xff09;&#xff0c;该化学试剂的中文名为叠氮-聚乙二醇-羧基&#xff0c;它所属分类为Azide PEG Carboxylic acid PEG。 该peg试剂的分子量均可定制&#xff0c;有&#xff1a;1000、2000、3400、20000、10000、5000 。该试剂质量…

k8s部署

kubernetes简要 Kubernetes 是用于自动部署, 扩展和管理容器化应用程序的开源系统. 它将组成应用程序的容器组合成逻辑单元, 以便于管理和服务发现 kubernetes 功能简介 服务发现和负载均衡 存储编排 自动部署和回滚 自动完成装箱计算 自我修复 密钥与配置管理 主机规…

UE5蓝图常用流程节点总结

整理了一下平常做功能开发比较常用的蓝图节点&#xff0c;目录如下&#xff1a; 1. ExecuteConsoleCommand 2. Do N 3. Do Once 4. DoOnceMultiInput 5. Gate 6.MultiGate 7. Branch 8. Sequence 9. FlipFlop 10. Delay 11. Retriggerable Delay 1. ExecuteConsole…

OffiSmart Summit智慧办公及空间管理上海线下峰会精彩亮点抢先看

“聚焦行业生态格局焕新&#xff0c;赋能智慧办公全面落地”——OffiSmart Summit上海国际智慧办公与空间管理峰会即将盛大召开&#xff0c;2022下半年不容错过的智慧办公行业盛会&#xff01;时间&#xff1a;2022年11月22日 9:00 - 16:30 地点&#xff1a;上海市浦东新区卓美…

Python3《机器学习实战》学习笔记(九):ANN人工神经网络基础详解

文章目录一、简介二、ANN算法细节详解2.1 深度学习要解决的问题2.2 深度学习应用领域2.3 计算机视觉任务2.4 视觉任务中遇到的问题2.4.1回顾K近邻算法2.4.2为啥不能用K近邻2.5得分函数2.6损失函数2.7前向传播流程2.8反向传播计算2.9神经网络整体架构2.10神经元个数对结果的影响…

【Linux】Jetson nano 使用记录,安装torch1.8、yolov5 tensorrt加速、java等

Jetson nano一、u盘系统安装1.1 烧录EMMC引导1.2 烧录U盘系统二、启动、环境配置2.1 设置vnc分辨率2.2. 更新软件三、启动、环境配置3.1 安装conda3.2 安装python3.6版本torch1.83.3 配置yolov5 tensorrt加速3.3.1 转换wts和engine3.3.2使用python脚本运行engine其它记录安装ja…