• 【数据链路层】循环冗余码CRC、后退N帧协议GBN、选择重传协议SR、CSMA/CA


    循环冗余码CRC

    在这里插入图片描述

    /**
         * 计算CRC16校验码
         *
         * @param bytes
         * @return
         * [1,3,4,1,205,1,18,235,173]
         */
        public static String CRC16(byte[] bytes) {
            int CRC = 0x0000ffff;
            int POLYNOMIAL = 0x0000a001;
            int i, j;
            for (i = 0; i < bytes.length; i++) {
                CRC ^= ((int) bytes[i] & 0x000000ff);
                for (j = 0; j < 8; j++) {
                    if ((CRC & 0x00000001) != 0) {
                        CRC >>= 1;
                        CRC ^= POLYNOMIAL;
                    } else {
                        CRC >>= 1;
                    }
                }
            }
            return Integer.toHexString(CRC);
        }
    
    
         public static void main(String[] args) {
            byte[] s ={1,3,4,1,(byte) 205,1,18,(byte)235,(byte)173};
    
             System.out.printf("1111%s\r\n",CRC16(s));
            if (CRC16(s)!="00"){
                System.out.printf("2222%s\n",CRC16(s));
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    多帧滑动窗口

    连续ARQ协议

    发送窗口的大小<=窗口总数-1

    例如:由3比特来编号,窗口总数为8,编号0到7
    如果把7号也用了,那么当全部发送0-7号的所有帧的时候,发送方看自己设置的超时的记录表,如果显示超时了,那我们重新发0-7号。接收方无法辨别第一次和第二次的帧

    第二种情况,发送方认为自己发送成功,那么继续发送但是编号还是0-7,接收方还是无法区分

    因此留下一个不用来打乱发送顺序,让第一次第二次发的序号有区别,这样就顺序有的变了。重传的还是没变-----------------------------------------------0【我的理解

    后退N帧协议GBN

    后退N帧式ARQ中,发送方不必等到收到上一帧的ACK后才开始发送下一帧。
    而是可以发送连续帧。
    当接收方检测到失序的信息帧后,要求发送方重发最后一个正确接收的信息帧之后的所有未被确认的帧
    或者,在发送方发送了N帧后,发现N个帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判定为出错或者丢失。
    此时发送方不得不重传该出错帧以及随后的N个帧。
    换句话说,接收方只能按顺序接受帧!

    这个协议GBN还可以连续收到很多帧以后再传确认信息
    表示此帧之前所有帧都已经收到!
    必须按顺序接受!
    如果收到后面的帧,就会重复返回刚才正式接受的帧的ack—重复返回
    直到收到正确的

    发送窗口最大值是 2^n-1 ,接收窗口1

    在这里插入图片描述


    选择重传协议SR

    在这里插入图片描述

    CSMA/CA—针对无线局域网

    最小帧长=总线传播时延x数据传输速率x2

    避免碰撞
    802.11标准定义了无线网的CSMA/CA协议。对CSMA/CD进行了修改。
    局域网不使用碰撞检测,一旦开始发送就会完整发送,但是碰撞存在的时候,仍然发送整个数据帧,会严重降低网络的效率,因此要采用碰撞避免技术降低碰撞的可能性。00000000000000000000000000000

    无线信道通信质量不如有线信道。
    802.11使用链路层确认/重传(ARQ)方案。
    站点每通过无线网络发送完一帧,就要等待确认帧后再发下一帧。
    发送之前,完成侦听要有一个时间间隔,IFS帧间间隔。
    InterFrame Space
    任何站要发送数据帧,都要经过一个间隔。而且要进入争用窗口。只有第一个帧发送的时候不使用退避算法,其他情况都会使用

    处理隐蔽站问题RTS,CTS

    假设站A和站B都在AP的覆盖范围内,但是A和B相距较远,彼此都听不到对方的广播,那么在A和B都检测到信道空闲的时候,都向AP发送信息,从而导致碰撞。为了解决该问题,802.11允许发送站对信道进行预约。源站在发送数据帧之前要广播一个很短的请求发送控制帧(RTS)该帧包含有本次通信所需维持的时间,能够被其范围内包括AP在内的站点听到。如果信道空闲,则AP广播一个允许发送CTS帧,它包括这次通信所需的持续时间(从RTS中复制的),该帧也能够被AP范围内包括A和B在内的站点听到。B和其他站带你听到CTS后,会在CTS指明的时间能一直发送。也就是说,CTS有两个作用:1.给请求源明确的发送许可2.告诉其他站在你在预约期内不要发送。

    使用RTS和CTS会导致网络通信效率下降,但是这两种帧都很短,和帧冲突导致的重传相比,他们对网络通信效率的影响微乎其微。


    🌸I could be bounded in a nutshell and count myself a king of infinite space.
     特别鸣谢:木芯工作室
    特别鸣谢:木芯工作室 、Ivan from Russia


  • 相关阅读:
    万字解析设计模式之桥接模式、外观模式
    分享一下怎么做陪诊小程序
    Java - ReentrantLock锁分析
    使用gitlab的cicd自动化部署vue项目shell流程踩坑之路
    鸿蒙 gnss 发起定位流程
    视觉SLAM14讲笔记-第10讲-后端1
    Linux软硬连接与动静态库
    网站收录查询-批量网站收录查询软件
    more than one ‘primary‘ bean found among candidates: xxxTransactionManager
    由spark.sql.shuffle.partitions混洗分区浅谈下spark的分区
  • 原文地址:https://blog.csdn.net/weixin_43796670/article/details/127958427