卷2 第1章 概述
1.1 引言
本章介绍伯克利联网程序代码的结构和实现概览。
1.2 源代码表示
本书使用15000行源代码,采用统一的文本格式:
- 每个非空白行都有编号
- 文件/tcp_subr.c中的函数
tcp_quench - 制表符设置为4个栏的界线
代码约定
- 删去
#ifdef语句(GATEWAY、MROUTING) - 删去
register说明符 - 保留注释,修改印刷错误
1.3 历史
BSD版本演进
| 版本 | 说明 |
|---|---|
| 4.1cBSD | 1982年,第一个联网版本 |
| 4.2BSD | 1983年,广泛发布 |
| 4.3BSD | 1986年 |
| 4.3BSD Tahoe | 1988年 |
| 4.3BSD Reno | 1990年 |
| Net/1 | 1989年 |
| Net/2 | 1991年 |
| 4.4BSD-Lite | 1994年 |
1.4 应用编程接口
- Socket(伯克利插口):广泛使用
- TLI/XTI(运输层接口):AT&T开发
1.5 程序示例
一个简单的UDP客户端程序:
- 创建数据报插口
- 设置服务器地址(IP: 140.252.1.32, 端口: 13)
- 发送150字节数据报
- 读取服务器应答
1.6 系统调用和库函数
- 系统调用:进入内核的入口点(约135个)
- 库函数:可能调用系统调用
1.7 网络实现概述
三层结构
- 插口层:协议无关接口
- 协议层:TCP/IP、XNS、OSI、Unix域
- 接口层:设备驱动程序
1.8 描述符
- 进程表项 → filedesc结构 → file结构 → socket结构
- 每个socket包含:
- so_type(SOCK_DGRAM/SOCK_STREAM)
- so_pcb(协议控制块)
- 接收/发送缓存
1.9 mbuf与输出处理
mbuf示例
- 目标地址存储在mbuf中(MT_SONAME)
- 数据存储在多个mbuf中
- 添加IP和UDP首部
- 以太网输出
输出路径
插口层 → UDP输出 → IP输出 → 以太网输出
1.10 输入处理
- 异步中断驱动
- 以太网输入 → IP输入队列 → 协议输入
1.11 中断级别与并发
优先级级别
| 级别 | 函数 | 说明 |
|---|---|---|
| spl0 | - | 最低 |
| splsoftclock | splsoftclock() | 软时钟 |
| splnet | splnet() | 网络协议 |
| splimp | splimp() | 网络接口 |
| spltty | spltty() | 终端 |
| splclock | splclock() | 时钟 |
| splstatclock | splstatclock() | 统计时钟 |
| splhigh | splhigh() | 最高 |
1.12 源代码组织
/usr/src/sys/ ├── i386/ # 80x86专用 ├── kern/ # 通用内核 ├── net/ # 通用联网 ├── netinet/ # TCP/IP (本书重点) ├── netccitt/ # OSI协议 ├── netiso/ # OSI协议 ├── netns/ # XNS协议 ├── nfs/ # NFS ├── sys/ # 头文件 ├── ufs/ # 文件系统 └── vm/ # 虚拟内存
text
1.13 测试网络
使用140.252.x.x B类网络地址。
1.14 小结
概述了Net/3网络代码的结构、数据和函数组织。