📜  链路访问过程,平衡(LAPB)帧格式(1)

📅  最后修改于: 2023-12-03 15:42:08.039000             🧑  作者: Mango

链路访问过程和平衡帧格式

在数据通信领域中,链路访问过程和平衡(LAPB)帧格式是两个基础概念。本文将介绍这两个概念,并给出相关的代码片段。

链路访问过程

链路访问过程(Link Access Procedure, LAP)是一组用于数据链路层的协议。LAP定义了数据的传输方式、帧格式以及错误检测和纠正等相关内容。

LAP有两种协议: LAPB和LAPD。LAPB是面向字节的协议,用于传输可靠数据。而LAPD则是面向位的协议,用于传输控制消息。

平衡(LAPB)帧格式

在LAPB协议中,数据被分成一系列的帧进行传输。下面是LAPB帧的格式:

+------+------+------+----------+------+------+---------+
| FLAG | ADDR | CTRL | INFORMATION | FCS | FLAG |  FCS    |
+------+------+------+----------+------+------+---------+
  1 byte 1 byte 1 byte   variable   2 bytes 1 byte 2 bytes

帧的各个部分含义如下:

  • FLAG:表示帧的开始和结束,包括7个位元节的值为01111110。
  • ADDR:表示收发双方的地址。对于普通的点对点链路,此字节的被定义为某些位元,例如都为‘0’,来表示地址。
  • CTRL:表示帧控制。这个字节是帧的核心部分。它含有以下信息:
    • S 标志:表示是否开始发送一个帧序列。
    • P/F 标志:表示这个帧是否为最后的帧。
    • N(R)编号:表示确认帧序列的编号。
    • N(S)编号:表示帧序列的编号。
  • INFORMATION:表示数据部分,长度为0-512字节。
  • FCS:帧校验序列,用于差错检测。
  • FLAG:顶部FLAG字节,标识帧的开始和结束。
  • FCS:底部FCS字节,与顶部的FCS字节相同。
代码片段

下面的代码片段展示了如何使用Python解析LAPB帧:

import struct

# 字节序列,包括FLAG、ADDR、CTRL和INFO
frame = b'\x7e\x00\x02\x03\xa1\xa2\x06\xe0\x91\x92\x02\x03\x04\x7e'

flag = 0x7e

# 查找顶部的FLAG字节
start = frame.find(bytes([flag]))

# 查找底部的FLAG字节
end = frame[start+1:].find(bytes([flag])) + start + 1

# 如果找不到开始或结束的标志,表示帧有误
if start == -1 or end == -1:
    print("Invalid frame")
else:
    # 解析ADDR和CTRL字段
    addr_ctrl = frame[start+1:start+3]
    addr, ctrl = struct.unpack('!BB', addr_ctrl)
    s = ctrl & 0x10
    pf = ctrl & 0x01
    nr = (ctrl >> 1) & 0x07
    ns = (ctrl >> 5) & 0x07
    print("Address: 0x{:02x}".format(addr))
    print("S: {}".format(s >> 4))
    print("PF: {}".format(pf))
    print("NR: {}".format(nr))
    print("NS: {}".format(ns))
    
    # 解析INFO字段
    info = frame[start+3:end-2]
    print("Information: ", info)
    
    # 解析FCS字段
    fcs = struct.unpack('!H', frame[end-2:end])[0]
    print("FCS: 0x{:04x}".format(fcs))
结论

本文介绍了链路访问过程和平衡(LAPB)帧格式的基本知识。希望这篇文章能够帮助读者更好地理解数据通信领域中的基础概念。