博主智算菩萨,专注于人工智能、Python编程、音视频处理及UI窗体程序设计等方向。致力于以通俗易懂的方式拆解前沿技术,从零基础入门到高阶实战,陪伴开发者共同成长。目前已开设五大技术专栏,累计发布多篇原创技术文章,深受读者好评。

📌 专栏导航

  • 人工智能前沿知识(已更179篇):深度剖析Transformer架构、生成式AI、强化学习、具身智能、神经符号系统、大模型及智能体(Agent)技术,系统性解析AI核心技术体系与前沿趋势。
  • Python基础小白编程(已更232篇):从零开始,以保姆式教程讲解变量、数据类型、流程控制、函数等核心语法,配有大量实战代码与避坑指南,真正做到学以致用。
  • 机器学习与深度学习(125篇):系统化拆解线性模型、决策树、随机森林、梯度提升树、神经网络等算法原理与工程实践,覆盖从公式推导到代码实现的全链路内容。
  • 音频、图像与视频处理理论与实战(81篇):涵盖FFmpeg多媒体处理、audio_shop开源工具、ComfyUI-WanVideoWrapper视频生成等实用技术,从基础操作到高级应用一应俱全。
  • UI窗体程序设计实战(78篇):深入讲解UI设计、动态窗体生成、游戏UI框架设计等实战技巧,提供从配置到编码的完整解决方案。
    智算菩萨,以代码为经,以算法为纬,在人工智能的星辰大海中,做你前行路上最可靠的导航者。本人最常用AI工具为AIGCBAR

考研提示:ARP协议是数据链路层和网络层之间的桥梁,是408考研的常考点。重点掌握ARP的工作原理、ARP缓存表的作用以及ARP报文的格式。ARP和RARP的区别也是常考内容。

1. 为什么需要ARP协议?

1.1 网络通信的现实困境

我们已经知道,数据在网络中传输需要使用IP地址进行逻辑寻址。但是,IP地址是逻辑地址,实际的数据传输是在物理网络中进行的,物理网络使用的是MAC地址(硬件地址)。

类比理解: IP地址就像你家的"门牌号"(如XX市XX区XX路XX号),而MAC地址就像"经纬度坐标"。邮递员送信时用门牌号找到大致区域,但具体到投递,还是要依靠经纬度来定位。ARP就是那个"把门牌号翻译成经纬度"的翻译官。

1.2 ARP协议的使命

ARP(Address Resolution Protocol,地址解析协议)的使命非常简单明确:

已知目标设备的IP地址,获取其对应的MAC地址。

网络层:   我知道目的IP是 192.168.1.5
          ↓ ARP协议转换
数据链路层: 目的MAC是 AA:BB:CC:DD:EE:FF

Mermaid图:ARP在网络协议栈中的位置

TCP/IP协议栈

应用层

传输层

网络层 IP

ARP协议

数据链路层 MAC

物理层

ARP工作在网络层和数据链路层之间,是连接这两个层次的关键协议。它既不是纯粹的网络层协议,也不是纯粹的数据链路层协议,而是一个跨层协议

2. ARP协议的工作原理

2.1 ARP工作流程概述

ARP的工作流程可以分为四个步骤:

Step 1: 检查ARP缓存表
        ↓ 没找到
Step 2: 发送ARP请求广播(目的MAC=FF:FF:FF:FF:FF:FF)
        ↓ 所有主机收到
Step 3: 目标主机发送ARP响应单播
        ↓ 源主机收到
Step 4: 更新ARP缓存表,记录IP→MAC映射

2.2 ARP工作流程详解

场景设定: 主机A(IP: 192.168.1.2, MAC: AA:AA:AA:AA:AA:AA)要和主机B(IP: 192.168.1.5, MAC: BB:BB:BB:BB:BB:BB)通信。

Mermaid时序图:ARP完整工作流程

其他主机 192.168.1.3 主机B 192.168.1.5 MAC: BB:BB:BB:BB:BB:BB 交换机 主机A 192.168.1.2 MAC: AA:AA:AA:AA:AA:AA 其他主机 192.168.1.3 主机B 192.168.1.5 MAC: BB:BB:BB:BB:BB:BB 交换机 主机A 192.168.1.2 MAC: AA:AA:AA:AA:AA:AA 步骤1: 检查ARP缓存表 查找192.168.1.5的MAC 未找到,需要发送ARP请求 目的MAC全1=广播 同一局域网内所有主机都能收到 目标IP不是自己 丢弃该帧 目标IP是自己的IP! 需要回复 单播发送给主机A 步骤4: 更新ARP缓存表 192.168.1.5 → BB:BB:BB:BB:BB:BB 现在可以发送数据了! ARP请求(广播帧) 发送方IP: 192.168.1.2 发送方MAC: AA:AA:AA:AA:AA:AA 目标IP: 192.168.1.5 目标MAC: FF:FF:FF:FF:FF:FF 转发ARP请求广播帧 转发ARP请求广播帧 ARP响应(单播帧) 发送方IP: 192.168.1.5 发送方MAC: BB:BB:BB:BB:BB:BB 目标IP: 192.168.1.2 目标MAC: AA:AA:AA:AA:AA:AA 转发ARP响应 数据帧(单播) 目的MAC: BB:BB:BB:BB:BB:BB 转发数据帧

2.3 ARP请求和响应报文详解

ARP请求报文(广播):

字段 说明
硬件类型 1 以太网
协议类型 0x0800 IP协议
硬件地址长度 6 MAC地址6字节
协议地址长度 4 IP地址4字节
操作码 1 表示ARP请求
发送方MAC AA:AA:AA:AA:AA:AA 主机A的MAC
发送方IP 192.168.1.2 主机A的IP
目标MAC 00:00:00:00:00:00 未知,填0
目标IP 192.168.1.5 要查询的IP

ARP响应报文(单播):

字段 说明
硬件类型 1 以太网
协议类型 0x0800 IP协议
硬件地址长度 6 MAC地址6字节
协议地址长度 4 IP地址4字节
操作码 2 表示ARP响应
发送方MAC BB:BB:BB:BB:BB:BB 主机B的MAC
发送方IP 192.168.1.5 主机B的IP
目标MAC AA:AA:AA:AA:AA:AA 主机A的MAC
目标IP 192.168.1.2 主机A的IP

关键区别: ARP请求是广播(目标MAC=FF:FF:FF:FF:FF:FF),所有主机都能收到;ARP响应是单播(直接发给请求者),只有请求者收到。

3. ARP缓存表

3.1 为什么要缓存?

想象一下,如果每次发送数据都要发一次ARP请求,网络将被大量的ARP广播报文淹没。ARP缓存表就是为了解决这个问题——一旦获取到IP→MAC的映射关系,就将其缓存起来,下次直接使用。

3.2 ARP缓存表的结构

IP地址 MAC地址 类型 超时时间
192.168.1.1 11:22:33:44:55:66 动态 120秒
192.168.1.5 BB:BB:BB:BB:BB:BB 动态 300秒
192.168.1.100 CC:CC:CC:CC:CC:CC 静态 永久

动态条目: 通过ARP协议自动学习获得,有过期时间(通常120~300秒),超时后自动删除。

静态条目: 手动配置,永久有效(直到系统重启或手动删除)。

3.3 ARP缓存的超时机制

为什么动态ARP条目要设置超时时间?

  1. IP地址可能变化: 目标主机可能更换了网卡(MAC变了),或者IP被分配给了其他设备
  2. 减少缓存膨胀: 防止缓存表无限增长
  3. 适应网络拓扑变化: 网络结构变化后,缓存需要更新

超时策略:

  • 大多数操作系统默认超时时间为120秒到300秒
  • 如果在超时前再次通信,会刷新超时时间
  • 可以通过命令查看和修改:arp -a 查看,arp -d 删除

4. 代理ARP

4.1 什么是代理ARP?

代理ARP(Proxy ARP)是指路由器代替其他网络中的主机响应ARP请求的机制。

场景: 当两台主机不在同一个物理网络中,但其中一台误认为它们在同一个网络时,路由器可以"冒充"目标主机响应ARP请求。

Mermaid图:代理ARP工作场景

网络2: 192.168.2.0/24

网络1: 192.168.1.0/24

ARP请求: 谁是192.168.2.5?

代理ARP响应: 我是192.168.2.5

数据发给路由器

转发给主机B

主机A
192.168.1.2/24
MAC: AA:AA...

路由器
192.168.1.1/24
192.168.2.1/24
开启代理ARP

主机B
192.168.2.5/24
MAC: BB:BB...

4.2 代理ARP的应用

代理ARP在以下场景中有用:

  • 子网划分后,旧主机还使用原来的网络配置
  • 透明网桥/路由器需要拦截ARP请求
  • 某些VPN场景

注意: 代理ARP可能带来安全风险(ARP欺骗),现代网络中已较少使用。

5. RARP协议——反向地址解析

5.1 RARP的作用

RARP(Reverse Address Resolution Protocol,反向地址解析协议)做与ARP相反的事情:

已知自己的MAC地址,获取IP地址。

5.2 RARP的工作原理

  1. 无盘工作站启动时,知道自己的MAC地址,但没有IP地址
  2. 发送RARP请求广播,携带自己的MAC地址
  3. RARP服务器收到请求后,查找MAC→IP的映射表
  4. 如果找到,发送RARP响应,告知IP地址

5.3 RARP的淘汰

RARP有几个致命缺陷:

  • 需要专门的RARP服务器
  • 无法跨越路由器(依赖广播)
  • 配置繁琐(需要维护MAC→IP映射表)

RARP已被DHCP协议完全取代。 DHCP功能更强大,可以跨子网工作,配置更灵活。

协议 功能 状态
ARP IP地址 → MAC地址 仍在广泛使用
RARP MAC地址 → IP地址 已淘汰,被DHCP取代

6. 实战:Python模拟ARP协议工作流程

import time
import threading
from datetime import datetime


class ARPTable:
    '''ARP缓存表 - 模拟操作系统中的ARP缓存'''
    
    def __init__(self, timeout=300):
        '''初始化ARP缓存表
        
        参数:
            timeout: 动态条目的超时时间(秒),默认300秒
        '''
        self.table = {}  # {ip: (mac, timestamp, is_static)}
        self.timeout = timeout
        print(f"[ARPTable] ARP缓存表已创建,超时时间: {timeout}秒")
    
    def add_entry(self, ip, mac, is_static=False):
        '''添加ARP条目
        
        参数:
            ip: IP地址字符串
            mac: MAC地址字符串
            is_static: 是否为静态条目
        '''
        self.table[ip] = {
            'mac': mac,
            'timestamp': time.time(),
            'is_static': is_static
        }
        entry_type = "静态" if is_static else "动态"
        print(f"[ARPTable] 添加{entry_type}条目: {ip}{mac}")
    
    def lookup(self, ip):
        '''查找MAC地址
        
        参数:
            ip: 要查找的IP地址
            
        返回:
            MAC地址(如果找到且未过期),否则None
        '''
        if ip not in self.table:
            print(f"[ARPTable] {ip} 不在缓存表中")
            return None
        
        entry = self.table[ip]
        
        # 检查动态条目是否过期
        if not entry['is_static']:
            elapsed = time.time() - entry['timestamp']
            if elapsed > self.timeout:
                print(f"[ARPTable] {ip} 的条目已过期(已过去{elapsed:.1f}秒)")
                del self.table[ip]
                return None
        
        print(f"[ARPTable] 命中: {ip}{entry['mac']}")
        return entry['mac']
    
    def remove_entry(self, ip):
        '''删除指定IP的ARP条目'''
        if ip in self.table:
            del self.table[ip]
            print(f"[ARPTable] 删除条目: {ip}")
    
    def show_table(self):
        '''显示ARP缓存表的内容'''
        print(f"\n{'='*55}")
        print(f"{'ARP缓存表':^53}")
        print(f"{'='*55}")
        print(f"{'IP地址':<18} {'MAC地址':<20} {'类型':<8} {'剩余时间':<10}")
        print(f"{'-'*55}")
        
        if not self.table:
            print("  (缓存表为空)")
        
        for ip, entry in self.table.items():
            entry_type = "静态" if entry['is_static'] else "动态"
            if entry['is_static']:
                remaining = "永久"
            else:
                elapsed = time.time() - entry['timestamp']
                remaining = f"{max(0, self.timeout - elapsed):.0f}秒"
            print(f"{ip:<18} {entry['mac']:<20} {entry_type:<8} {remaining:<10}")
        print(f"{'='*55}\n")


class ARPProtocol:
    '''ARP协议模拟器 - 模拟ARP请求和响应的完整流程'''
    
    # 操作码常量
    ARP_REQUEST = 1
    ARP_REPLY = 2
    
    def __init__(self, arp_table, host_ip, host_mac, host_name="主机"):
        '''初始化ARP协议
        
        参数:
            arp_table: ARP缓存表实例
            host_ip: 本机IP地址
            host_mac: 本机MAC地址
            host_name: 主机名称(用于显示)
        '''
        self.arp_table = arp_table
        self.host_ip = host_ip
        self.host_mac = host_mac
        self.host_name = host_name
        print(f"\n[{host_name}] ARP协议初始化完成")
        print(f"  IP: {host_ip}, MAC: {host_mac}")
    
    def create_arp_packet(self, opcode, src_ip, src_mac, target_ip, target_mac=None):
        '''创建ARP报文
        
        ARP报文格式:
        - 硬件类型: 2字节 (1=以太网)
        - 协议类型: 2字节 (0x0800=IP)
        - 硬件地址长度: 1字节 (6)
        - 协议地址长度: 1字节 (4)
        - 操作码: 2字节 (1=请求, 2=响应)
        - 发送方MAC: 6字节
        - 发送方IP: 4字节
        - 目标MAC: 6字节
        - 目标IP: 4字节
        '''
        packet = {
            'hw_type': 1,       # 以太网
            'proto_type': 0x0800,  # IP协议
            'hw_len': 6,        # MAC地址长度
            'proto_len': 4,     # IP地址长度
            'opcode': opcode,   # 操作码
            'src_ip': src_ip,
            'src_mac': src_mac,
            'target_ip': target_ip,
            'target_mac': target_mac if target_mac else '00:00:00:00:00:00'
        }
        return packet
    
    def send_arp_request(self, target_ip):
        '''发送ARP请求广播
        
        流程:
        1. 先检查ARP缓存表
        2. 如果没有,构造ARP请求报文
        3. 以广播方式发送(目标MAC=FF:FF:FF:FF:FF:FF)
        '''
        print(f"\n[{self.host_name}] 要发送数据给 {target_ip}")
        print(f"[{self.host_name}] 步骤1: 检查ARP缓存表...")
        
        # 先查缓存
        cached_mac = self.arp_table.lookup(target_ip)
        if cached_mac:
            print(f"[{self.host_name}] 缓存命中! 直接发送数据")
            return cached_mac
        
        print(f"[{self.host_name}] 步骤2: 缓存未命中,发送ARP请求广播")
        
        # 构造ARP请求报文
        request = self.create_arp_packet(
            opcode=self.ARP_REQUEST,
            src_ip=self.host_ip,
            src_mac=self.host_mac,
            target_ip=target_ip
        )
        
        print(f"[{self.host_name}] ARP请求报文:")
        print(f"  发送方: {request['src_ip']} ({request['src_mac']})")
        print(f"  目标方: {request['target_ip']} (未知)")
        print(f"  操作码: {request['opcode']} (请求)")
        print(f"  发送方式: 广播 (FF:FF:FF:FF:FF:FF)")
        
        return request
    
    def receive_arp_request(self, request, my_ip, my_mac):
        '''接收ARP请求,判断是否需要响应
        
        参数:
            request: 收到的ARP请求报文
            my_ip: 本机IP地址
            my_mac: 本机MAC地址
            
        返回:
            ARP响应报文(如果是请求自己),否则None
        '''
        print(f"\n[{self.host_name}] 收到ARP请求")
        print(f"  请求内容: 谁有IP {request['target_ip']}?")
        
        # 检查是否是请求自己
        if request['target_ip'] == my_ip:
            print(f"  → 是请求我的!准备回复")
            
            # 顺便把请求者的信息加入缓存表
            self.arp_table.add_entry(request['src_ip'], request['src_mac'])
            
            # 构造ARP响应
            reply = self.create_arp_packet(
                opcode=self.ARP_REPLY,
                src_ip=my_ip,
                src_mac=my_mac,
                target_ip=request['src_ip'],
                target_mac=request['src_mac']
            )
            return reply
        else:
            print(f"  → 不是请求我的,丢弃")
            return None
    
    def send_arp_reply(self, reply):
        '''发送ARP响应(单播)'''
        print(f"\n[{self.host_name}] 发送ARP响应(单播)")
        print(f"  发送方: {reply['src_ip']} ({reply['src_mac']})")
        print(f"  目标方: {reply['target_ip']} ({reply['target_mac']})")
        print(f"  操作码: {reply['opcode']} (响应)")
        return reply
    
    def receive_arp_reply(self, reply):
        '''接收ARP响应,更新缓存表'''
        print(f"\n[{self.host_name}] 收到ARP响应")
        print(f"  {reply['src_ip']} 的MAC是 {reply['src_mac']}")
        
        # 更新ARP缓存表
        self.arp_table.add_entry(reply['src_ip'], reply['src_mac'])
        
        print(f"[{self.host_name}] 步骤4: ARP缓存表已更新")
        return reply['src_mac']


# ==================== 主程序: 模拟完整ARP过程 ====================

def simulate_arp():
    '''模拟主机A获取主机B的MAC地址的完整ARP过程'''
    
    print("=" * 70)
    print("ARP协议工作流程模拟")
    print("=" * 70)
    
    # 创建ARP缓存表
    arp_table_a = ARPTable(timeout=300)
    arp_table_b = ARPTable(timeout=300)
    
    # 创建两台主机
    host_a = ARPProtocol(arp_table_a, "192.168.1.2", "AA:AA:AA:AA:AA:AA", "主机A")
    host_b = ARPProtocol(arp_table_b, "192.168.1.5", "BB:BB:BB:BB:BB:BB", "主机B")
    
    print("\n" + "=" * 70)
    print("场景: 主机A (192.168.1.2) 要和 主机B (192.168.1.5) 通信")
    print("=" * 70)
    
    # 显示初始ARP缓存表
    print("\n--- 初始ARP缓存表 ---")
    host_a.arp_table.show_table()
    
    # 主机A发送ARP请求
    print("\n" + "=" * 70)
    print("Step 1: 主机A 发送ARP请求广播")
    print("=" * 70)
    request = host_a.send_arp_request("192.168.1.5")
    
    # 主机B收到ARP请求并响应
    print("\n" + "=" * 70)
    print("Step 2: 主机B 收到ARP请求并处理")
    print("=" * 70)
    reply = host_b.receive_arp_request(request, "192.168.1.5", "BB:BB:BB:BB:BB:BB")
    
    if reply:
        # 主机B发送ARP响应
        print("\n" + "=" * 70)
        print("Step 3: 主机B 发送ARP响应单播")
        print("=" * 70)
        host_b.send_arp_reply(reply)
        
        # 主机A收到ARP响应
        print("\n" + "=" * 70)
        print("Step 4: 主机A 收到ARP响应,更新缓存表")
        print("=" * 70)
        host_a.receive_arp_reply(reply)
    
    # 显示更新后的ARP缓存表
    print("\n--- 最终ARP缓存表 ---")
    print("\n主机A的ARP缓存表:")
    host_a.arp_table.show_table()
    print("\n主机B的ARP缓存表:")
    host_b.arp_table.show_table()
    
    # 再次通信(缓存命中)
    print("\n" + "=" * 70)
    print("验证: 再次通信时应该缓存命中")
    print("=" * 70)
    mac = host_a.send_arp_request("192.168.1.5")
    if isinstance(mac, str):
        print(f"\n主机A可以直接发送数据到MAC: {mac}")
    
    # 添加静态条目示例
    print("\n" + "=" * 70)
    print("添加静态ARP条目示例")
    print("=" * 70)
    host_a.arp_table.add_entry("192.168.1.1", "11:22:33:44:55:66", is_static=True)
    host_a.arp_table.show_table()


if __name__ == "__main__":
    simulate_arp()

运行结果示例:

======================================================================
ARP协议工作流程模拟
======================================================================
[ARPTable] ARP缓存表已创建,超时时间: 300秒

[主机A] ARP协议初始化完成
  IP: 192.168.1.2, MAC: AA:AA:AA:AA:AA:AA

[ARPTable] ARP缓存表已创建,超时时间: 300秒

[主机B] ARP协议初始化完成
  IP: 192.168.1.5, MAC: BB:BB:BB:BB:BB:BB

======================================================================
场景: 主机A (192.168.1.2) 要和 主机B (192.168.1.5) 通信
======================================================================

--- 初始ARP缓存表 ---

=======================================================
                    ARP缓存表                  
=======================================================
IP地址              MAC地址              类型      剩余时间  
-------------------------------------------------------
  (缓存表为空)
=======================================================

======================================================================
Step 1: 主机A 发送ARP请求广播
======================================================================

[主机A] 要发送数据给 192.168.1.5
[主机A] 步骤1: 检查ARP缓存表...
[ARPTable] 192.168.1.5 不在缓存表中
[主机A] 步骤2: 缓存未命中,发送ARP请求广播
[主机A] ARP请求报文:
  发送方: 192.168.1.2 (AA:AA:AA:AA:AA:AA)
  目标方: 192.168.1.5 (未知)
  操作码: 1 (请求)
  发送方式: 广播 (FF:FF:FF:FF:FF:FF)

======================================================================
Step 2: 主机B 收到ARP请求并处理
======================================================================

[主机B] 收到ARP请求
  请求内容: 谁有IP 192.168.1.5?
  → 是请求我的!准备回复
[ARPTable] 添加动态条目: 192.168.1.2 → AA:AA:AA:AA:AA:AA

======================================================================
Step 3: 主机B 发送ARP响应单播
======================================================================

[主机B] 发送ARP响应(单播)
  发送方: 192.168.1.5 (BB:BB:BB:BB:BB:BB)
  目标方: 192.168.1.2 (AA:AA:AA:AA:AA:AA)
  操作码: 2 (响应)

======================================================================
Step 4: 主机A 收到ARP响应,更新缓存表
======================================================================

[主机A] 收到ARP响应
  192.168.1.5 的MAC是 BB:BB:BB:BB:BB:BB
[ARPTable] 添加动态条目: 192.168.1.5 → BB:BB:BB:BB:BB:BB
[主机A] 步骤4: ARP缓存表已更新

--- 最终ARP缓存表 ---

主机A的ARP缓存表:

=======================================================
                    ARP缓存表                  
=======================================================
IP地址              MAC地址              类型      剩余时间  
-------------------------------------------------------
192.168.1.5         BB:BB:BB:BB:BB:BB  动态      300秒   
=======================================================

7. ARP安全问题(拓展)

7.1 ARP欺骗攻击

ARP协议有一个致命弱点:没有身份验证机制。任何主机都可以发送ARP响应,即使没有人请求。

攻击原理:

  1. 攻击者伪造ARP响应报文
  2. 告诉受害者"网关的IP对应的MAC是我"
  3. 告诉网关"受害者的IP对应的MAC是我"
  4. 成为中间人,可以窃听或篡改通信

防护措施:

  • 静态ARP绑定
  • ARP防火墙
  • 使用802.1X认证
  • 动态ARP检测(DAI)

8. 经典例题解析

例题1:ARP基础概念

题目: 下列关于ARP协议的描述中,正确的是( )

A. ARP请求是单播发送的
B. ARP响应是广播发送的
C. ARP协议可以实现IP地址到MAC地址的转换
D. ARP缓存表中的条目永远不会过期

答案: C

解析:

  • A错误:ARP请求是广播发送的,目标MAC=FF:FF:FF:FF:FF:FF
  • B错误:ARP响应是单播发送的,直接发给请求者
  • C正确:这就是ARP的核心功能
  • D错误:动态条目有过期时间(通常120~300秒)

例题2:跨网段通信的ARP

题目: 主机A(IP: 192.168.1.2/24)要和主机B(IP: 10.0.0.5/8)通信,主机A的默认网关是192.168.1.1。请问主机A会发送ARP请求查询哪个IP地址的MAC?

答案: 192.168.1.1(默认网关的IP地址)

解析: 主机A通过子网掩码判断10.0.0.5不在本地网络中,所以数据包需要发给默认网关。主机A会先发送ARP请求查询网关192.168.1.1的MAC地址,而不是查询10.0.0.5的MAC地址。查询到网关的MAC后,将数据包发给网关,由网关负责转发。

P33小结: ARP协议是网络通信中不可或缺的"翻译官",负责将IP地址转换为MAC地址。理解ARP的工作流程(请求-广播、响应-单播)和缓存机制,对于理解网络通信的底层原理至关重要。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐