第5章 接口:SLIP和环回
所属:TCP/IP详解 卷2:实现 来源:TCP/IP详解 卷2:实现
本章描述两种特殊的网络接口:SLIP(串行线路IP)和环回接口。
5.1 引言
本章讨论的接口
本章讨论两种特殊接口:
-
SLIP接口
- 串行线路IP
- 在串口线上传输IP数据报
-
环回接口
- 虚拟接口
- 本机数据回环
这两种接口都比较简单,但很常用。
5.2 SLIP接口
什么是SLIP
SLIP(Serial Line IP):
- 在串行线路上传输IP数据报
- 简单的帧封装协议
- 用于拨号连接、串口通信
- RFC 1055定义
SLIP是最早的串行线路IP协议。
SLIP封装规则
SLIP的特殊字符:
| 字符 | 值 | 说明 |
|---|---|---|
| END | 0xc0 | 帧的开始和结束 |
| ESC | 0xdb | 转义字符 |
| ESC_END | 0xdc | 转义后的END |
| ESC_ESC | 0xdd | 转义后的ESC |
封装规则:
- 帧的开始和结束都用END字符
- 数据中的END字符 → ESC + ESC_END
- 数据中的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字符 → 设置转义标志
|
+---> 普通字符 → 加入缓冲区
处理步骤:
- 从串口接收字符
- 遇到END字符:
- 如果缓冲区有数据,上交IP层
- 重置缓冲区
- 遇到ESC字符:
- 设置转义标志
- 转义状态下的字符:
- ESC_END → 写入END
- ESC_ESC → 写入ESC
- 普通字符:
- 加入缓冲区
SLIP输出处理
SLIP输出步骤:
- 从IP层接收数据报
- 在前面添加END字符
- 遍历数据:
- END → 替换为ESC + ESC_END
- ESC → 替换为ESC + ESC_ESC
- 其他 → 直接发送
- 在后面添加END字符
- 通过串口发送
前后都加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接口
-
SLIP概述
- 串行线路IP
- 简单的帧封装
- 用于串口和拨号
-
封装规则
- END标记帧边界
- ESC转义特殊字符
- 简单高效
-
特点
- 简单,开销小
- 没有校验和、类型、地址
- 只能传IP
-
输入输出
- 输入:状态机解析
- 输出:转义特殊字符
环回接口
-
环回概述
- 虚拟接口
- 本机数据回环
- 地址127.0.0.1
-
特点
- 不经过硬件
- 效率高
- 走完整协议栈
-
用途
- 测试程序
- 本机通信
- 安全
- 性能测试
-
处理方式
- 输出直接放入输入队列
- 走正常的输入流程
关键概念
-
SLIP
- 串行线路IP
- END和ESC字符
- 简单封装
-
环回接口
- 虚拟接口
- 数据回环
- 本机通信
-
接口的多样性
- 以太网:硬件接口
- SLIP:串行接口
- 环回:虚拟接口
- 统一的ifnet接口