卷2 第1章 概述

1.1 引言

本章介绍伯克利联网程序代码的结构和实现概览。

1.2 源代码表示

本书使用15000行源代码,采用统一的文本格式:

  • 每个非空白行都有编号
  • 文件/tcp_subr.c中的函数 tcp_quench
  • 制表符设置为4个栏的界线

代码约定

  • 删去 #ifdef 语句(GATEWAY、MROUTING)
  • 删去 register 说明符
  • 保留注释,修改印刷错误

1.3 历史

BSD版本演进

版本说明
4.1cBSD1982年,第一个联网版本
4.2BSD1983年,广泛发布
4.3BSD1986年
4.3BSD Tahoe1988年
4.3BSD Reno1990年
Net/11989年
Net/21991年
4.4BSD-Lite1994年

1.4 应用编程接口

  • Socket(伯克利插口):广泛使用
  • TLI/XTI(运输层接口):AT&T开发

1.5 程序示例

一个简单的UDP客户端程序:

  1. 创建数据报插口
  2. 设置服务器地址(IP: 140.252.1.32, 端口: 13)
  3. 发送150字节数据报
  4. 读取服务器应答

1.6 系统调用和库函数

  • 系统调用:进入内核的入口点(约135个)
  • 库函数:可能调用系统调用

1.7 网络实现概述

三层结构

  1. 插口层:协议无关接口
  2. 协议层:TCP/IP、XNS、OSI、Unix域
  3. 接口层:设备驱动程序

1.8 描述符

  • 进程表项 → filedesc结构 → file结构 → socket结构
  • 每个socket包含:
    • so_type(SOCK_DGRAM/SOCK_STREAM)
    • so_pcb(协议控制块)
    • 接收/发送缓存

1.9 mbuf与输出处理

mbuf示例

  1. 目标地址存储在mbuf中(MT_SONAME)
  2. 数据存储在多个mbuf中
  3. 添加IP和UDP首部
  4. 以太网输出

输出路径

插口层 → UDP输出 → IP输出 → 以太网输出

1.10 输入处理

  • 异步中断驱动
  • 以太网输入 → IP输入队列 → 协议输入

1.11 中断级别与并发

优先级级别

级别函数说明
spl0-最低
splsoftclocksplsoftclock()软时钟
splnetsplnet()网络协议
splimpsplimp()网络接口
splttyspltty()终端
splclocksplclock()时钟
splstatclocksplstatclock()统计时钟
splhighsplhigh()最高

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网络代码的结构、数据和函数组织。