第5章 接口:SLIP和环回

所属:TCP/IP详解 卷2:实现 来源:TCP/IP详解 卷2:实现

本章描述两种特殊的网络接口:SLIP(串行线路IP)和环回接口。


5.1 引言

本章讨论的接口

本章讨论两种特殊接口:

  1. SLIP接口

    • 串行线路IP
    • 在串口线上传输IP数据报
  2. 环回接口

    • 虚拟接口
    • 本机数据回环

这两种接口都比较简单,但很常用。


5.2 SLIP接口

什么是SLIP

SLIP(Serial Line IP):

  • 在串行线路上传输IP数据报
  • 简单的帧封装协议
  • 用于拨号连接、串口通信
  • RFC 1055定义

SLIP是最早的串行线路IP协议。


SLIP封装规则

SLIP的特殊字符:

字符值说明
END0xc0帧的开始和结束
ESC0xdb转义字符
ESC_END0xdc转义后的END
ESC_ESC0xdd转义后的ESC

封装规则:

  1. 帧的开始和结束都用END字符
  2. 数据中的END字符 → ESC + ESC_END
  3. 数据中的ESC字符 → ESC + ESC_ESC

用END标记帧边界,用ESC转义特殊字符。


SLIP的特点

SLIP的优点:

  • 简单,容易实现
  • 开销小
  • 适用于低速串行线路

SLIP的缺点:

  • 没有校验和(靠上层协议)
  • 没有类型字段(只能传IP)
  • 没有地址(点对点,不需要)
  • 不支持差错检测
  • 不支持多协议

SLIP非常简单,但功能有限。


SLIP接口结构

struct sl_softc {
    struct ifnet sc_if;     /* 通用接口结构 */
    struct tty *sc_tp;      /* 指向tty结构 */
    u_char  *sc_buf;        /* 接收缓冲区 */
    int     sc_state;       /* 接收状态 */
    int     sc_escape;      /* 转义标志 */
    /* ... 其他字段 ... */
};
  • sc_if:通用接口结构
  • sc_tp:关联的tty设备
  • sc_buf:接收缓冲区
  • sc_state:接收状态机状态

SLIP接口挂在tty设备上。


SLIP输入处理

SLIP输入状态机:

初始状态
   |
   v
收到字符
   |
   +---> END字符 → 帧结束,上交IP层
   |
   +---> ESC字符 → 设置转义标志
   |
   +---> 普通字符 → 加入缓冲区

处理步骤:

  1. 从串口接收字符
  2. 遇到END字符:
    • 如果缓冲区有数据,上交IP层
    • 重置缓冲区
  3. 遇到ESC字符:
    • 设置转义标志
  4. 转义状态下的字符:
    • ESC_END → 写入END
    • ESC_ESC → 写入ESC
  5. 普通字符:
    • 加入缓冲区

SLIP输出处理

SLIP输出步骤:

  1. 从IP层接收数据报
  2. 在前面添加END字符
  3. 遍历数据:
    • END → 替换为ESC + ESC_END
    • ESC → 替换为ESC + ESC_ESC
    • 其他 → 直接发送
  4. 在后面添加END字符
  5. 通过串口发送

前后都加END,确保帧边界清晰。


5.3 环回接口

什么是环回接口

环回接口(loopback):

  • 虚拟接口,不对应真实硬件
  • 发送给本机的数据走环回
  • 地址通常是127.0.0.1
  • 接口名通常是lo0

环回接口是虚拟的,但功能完整。


环回接口的特点

特点:

  • 数据不会出现在物理网络上
  • 直接在IP层处理,不经过硬件
  • 效率高,延迟低
  • 始终可用,不需要驱动
  • 走完整的协议栈流程

环回接口的处理完全在软件中完成。


环回的用途

1. 测试网络程序

  • 客户端和服务器都在本机
  • 不需要真实网络
  • 方便调试

2. 本机通信

  • 本机进程之间通过网络通信
  • 方便分布式程序测试
  • 统一编程接口

3. 安全

  • 只监听127.0.0.1的服务
  • 外部无法访问
  • 提高安全性

4. 性能测试

  • 测试协议栈本身的性能
  • 排除网络因素
  • 基准测试

环回接口的处理

输出处理:

int
loopoutput(ifp, m, dst, rt)
    struct ifnet *ifp;
    struct mbuf *m;
    struct sockaddr *dst;
    struct rtentry *rt;
{
    /*
     * 直接把分组放入输入队列
     * 模拟收到一个分组
     */
    (*ifp->if_input)(ifp, m);
    
    /* 更新统计 */
    ifp->if_opackets++;
    ifp->if_obytes += m->m_len;
    
    return 0;
}

输出直接变成输入,不走硬件。

输入处理:

  • 和普通接口一样
  • 调用ether_input或ip_input
  • 走正常的协议栈流程

环回的数据流

应用程序
   |
   v
TCP/UDP
   |
   v
IP层
   |
   v
环回输出
   |
   v
环回输入(直接回环)
   |
   v
IP层
   |
   v
TCP/UDP
   |
   v
应用程序

数据在IP层绕了一圈,没有离开本机。


5.4 小结

SLIP接口

  1. SLIP概述

    • 串行线路IP
    • 简单的帧封装
    • 用于串口和拨号
  2. 封装规则

    • END标记帧边界
    • ESC转义特殊字符
    • 简单高效
  3. 特点

    • 简单,开销小
    • 没有校验和、类型、地址
    • 只能传IP
  4. 输入输出

    • 输入:状态机解析
    • 输出:转义特殊字符

环回接口

  1. 环回概述

    • 虚拟接口
    • 本机数据回环
    • 地址127.0.0.1
  2. 特点

    • 不经过硬件
    • 效率高
    • 走完整协议栈
  3. 用途

    • 测试程序
    • 本机通信
    • 安全
    • 性能测试
  4. 处理方式

    • 输出直接放入输入队列
    • 走正常的输入流程

关键概念

  1. SLIP

    • 串行线路IP
    • END和ESC字符
    • 简单封装
  2. 环回接口

    • 虚拟接口
    • 数据回环
    • 本机通信
  3. 接口的多样性

    • 以太网:硬件接口
    • SLIP:串行接口
    • 环回:虚拟接口
    • 统一的ifnet接口

SLIP 环回