数据链路层

本文涉及的产品
访问控制,不限时长
简介: 数据链路层

数据链路层是 OSI 模型中的第二层,负责在直接相连的节点之间传输数据。它将物理层提供的原始比特流转换为逻辑上的帧,并管理节点之间的数据传输。

 

功能

1. **封装成帧**:将网络层传递下来的数据包封装成帧,在帧中添加头部和尾部,用于标识帧的开始和结束。

2. **透明传输**:确保数据在物理介质上传输时不会被改变,保持传输的透明性。

3. **数据帧的定界**:在帧中添加起始和终止符号,用于标识帧的开始和结束。

4. **差错检测**:使用循环冗余检验(Cyclic Redundancy Check,CRC)等技术检测帧中的错误。

5. **流量控制**:控制数据的传输速率,避免发送方发送过多数据导致接收方无法处理。

6. **重发控制**:在出现数据传输错误时,需要重新发送数据帧。

 

以太网

以太网是数据链路层中最常见的协议之一,用于在局域网中传输数据。它定义了数据帧的格式、传输速率和访问控制方法。常见的以太网速率包括 10 Mbps、100 Mbps、1 Gbps 和 10 Gbps。


无线数据链路层

在无线网络中,数据链路层也扮演着重要角色。无线数据链路层与有线数据链路层不同之处在于,它需要处理无线信道的不稳定性和干扰问题。常见的无线数据链路层协议包括 Wi-Fi(IEEE 802.11)和蓝牙(Bluetooth)。


适配器(网卡)

数据链路层的通信是通过适配器(网卡)完成的。适配器负责将数据帧发送到物理介质上,并从物理介质上接收数据帧。适配器还负责帧的组装和解析,并将数据传递给网络层或应用层。

 

点对点协议(PPP)

 

点对点协议是一种数据链路层协议,用于在两个直接相连的节点之间建立点对点连接。它通常用于拨号连接和 DSL 连接等场景。

 

数据链路层是 OSI 模型中非常重要的一层,它负责实现节点之间的直接通信,保证数据的可靠传输。通过数据链路层的工作,我们可以更好地理解网络设备如何进行数据传输和通信。

 

在数据链路层中,还有一个重要的概念是介质访问控制(MAC,Media Access Control)。MAC 地址是数据链路层中使用的硬件地址,用于唯一标识网络设备(如网卡)。在以太网中,每个网络接口都有一个唯一的 MAC 地址,由 48 位二进制数表示。MAC 地址通常以十六进制表示,如 `00:1A:2B:3C:4D:5E`。

 

在以太网中,使用 CSMA/CD(Carrier Sense Multiple Access with Collision Detection,载波监听多点接入/碰撞检测)作为介质访问控制方式。这种方式允许多个设备共享同一物理介质,并在发送数据前检测信道是否空闲,以避免碰撞。

 

除了以太网,还有其他介质访问控制方式,如令牌环(Token Ring)和无线局域网中的 CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance,载波监听多点接入/碰撞避免)。这些方式在不同的网络环境和需求下发挥着重要作用,保证了数据链路层的正常运行。

 

以下是一些数据链路层相关操作的代码示例:

 

基本帧的发送和接收:

```python
import struct
import socket
 
# 定义帧的结构
class Frame:
    def __init__(self, src, dest, data):
        self.src = src
        self.dest = dest
        self.data = data
 
    def to_bytes(self):
        # 将帧转换为字节流
        frame_format = '!64s64s1024s'  # 假设帧结构为64字节的源地址、64字节的目标地址、1024字节的数据
        return struct.pack(frame_format, self.src.encode(), self.dest.encode(), self.data.encode())
 
    @classmethod
    def from_bytes(cls, frame_bytes):
        # 从字节流解析帧
        frame_format = '!64s64s1024s'
        src, dest, data = struct.unpack(frame_format, frame_bytes)
        return cls(src.decode().strip('\x00'), dest.decode().strip('\x00'), data.decode().strip('\x00'))

 模拟发送帧

def send_frame(frame, dest_ip, dest_port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((dest_ip, dest_port))
    sock.sendall(frame.to_bytes())
    sock.close()

 模拟接收帧

def receive_frame(listen_ip, listen_port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((listen_ip, listen_port))
    sock.listen(1)
    conn, addr = sock.accept()
    frame_bytes = conn.recv(1152)  # 假设总长度为1152字节(64+64+1024)
    frame = Frame.from_bytes(frame_bytes)
    print(f"Received frame from {addr}:")
    print(f"Source: {frame.src}")
    print(f"Destination: {frame.dest}")
    print(f"Data: {frame.data}")
    conn.close()
    sock.close()

 测试发送和接收帧

if __name__ == "__main__":
    src_address = "00:11:22:33:44:55"
    dest_address = "aa:bb:cc:dd:ee:ff"
    data_to_send = "This is a test frame data."
    
    frame = Frame(src_address, dest_address, data_to_send)
    send_frame(frame, 'localhost', 8080)
    receive_frame('localhost', 8080)
```

在这个示例中,定义了一个简单的帧结构 `Frame` 类,包含源地址、目标地址和数据字段。通过 `to_bytes()` 方法将帧转换为字节流,在网络中进行传输;通过 `from_bytes()` 方法从接收的字节流中解析出帧。

 

使用Ethernet模块发送和接收数据:

```python
from scapy.all import *
 
# 发送Ethernet帧
def send_ethernet_frame(src_mac, dest_mac, data):
    ether = Ether(src=src_mac, dst=dest_mac)
    packet = ether / data
    sendp(packet, iface="eth0")  # 发送数据包到eth0接口
 
# 接收Ethernet帧
def receive_ethernet_frame():
    sniff(iface="eth0", prn=lambda x: x.summary())

测试发送和接收Ethernet帧

if __name__ == "__main__":
    src_mac = "00:11:22:33:44:55"
    dest_mac = "aa:bb:cc:dd:ee:ff"
    data_to_send = b"Hello, Ethernet!"
 
    send_ethernet_frame(src_mac, dest_mac, data_to_send)
    receive_ethernet_frame()
```


相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
相关文章
|
5月前
|
传感器 数据采集 网络架构
|
6月前
|
网络协议 数据安全/隐私保护 Windows
【计算机网络】数据链路层——以太网
【计算机网络】数据链路层——以太网
|
算法
数据链路层提供的服务
数据链路层提供的服务
103 0
|
数据安全/隐私保护
以太网 (数据链路层协议)
以太网 (数据链路层协议)
139 0
|
缓存 网络协议 网络架构
数据链路层讲解(二)
数据链路层讲解
88 0
|
算法 网络协议 数据安全/隐私保护
数据链路层讲解(一)
数据链路层讲解
128 0
|
存储 缓存 算法
数据链路层
数据链路层
90 0
|
缓存 算法 网络协议
数据链路层(二)
数据链路层(二)
1795 0
|
缓存 算法 数据安全/隐私保护
数据链路层(一)
数据链路层(一)
371 0
|
存储 域名解析 缓存
数据链路层(三)
数据链路层(三)
894 0