You are on page 1of 237

In t e r n e t 应 用

协议实 例剖 析与服务器 配置

林腾 李国锋 许崇敬 赵勇 编著

人 民 邮 电 出 版 社
图书在版编目(CIP)数据
Internet 应用协议实例剖析与服务器配置/林腾等编著. —北京:人民邮电出版社,2004.5
ISBN 7-115-12207-5

I. I… II. 林… III. ①因特网—通信协议②因特网—网络服务器—配置


IV. ①TN915.04②TP393.4

中国版本图书馆 CIP 数据核字(2004)第 025779 号

内 容 提 要

本书介绍了 Internet 基础协议和常用应用层协议,并以 Linux 环境下的服务器软件为例介绍了各种常用


Internet 服务器的基本配置方法。本书的特点是将实例剖析作为介绍协议的重要辅助手段,对基础协议及典
型应用层协议均辅以完整的实例剖析;在介绍服务器软件的配置时,本书也特别注重服务功能与相应协议的
结合。
本书适合作为计算机相关专业的 Internet 技术课程的教材或参考书,也可作为从事 TCP/IP 应用开发或网
络数据分析的技术人员的参考资料。

I nter net 应用协议实例剖析与服务器配置

 编 著 林 腾 李国锋 许崇敬 赵 勇
责任编辑 徐享华

 人民邮电出版社出版发行 北京市崇文区夕照寺街 14 号

邮编 100061 电子函件 315@ptpress.com.cn

网址 http://www. ptpress.com.cn

读者热线:010-67129258

北京汉魂图文设计有限公司制作
北京顺义振华印刷厂印刷
新华书店总店北京发行所经销

 开本:7871092 1/16

印张:15.25

字数:362 千字 2004 年 5 月第 1 版
印数:1 – 0 000 册 2004 年 5 月北京第 1 次印刷

ISBN 7-115-12207-5/TN·2269

定价: .00 元
本书如有印装质量问题,请与本社联系 电话:(010)67129223
前 言

对 Internet 而言,应用是最终的目的,支撑应用的则是各分层的协议。目前与 Internet 相


关的书籍,多数以纯应用为主,有的则以协议标准和协议理论为主,而将二者融合的书籍则
极少,以致许多学习者认为协议是抽象的、难以实践的东西,尽管他们可能每天都在熟练地
利用 Internet 进行工作、学习和娱乐。
本书在介绍协议标准的同时,辅以常用的网络应用实例,针对每个应用实例,详细剖析
了相关协议在数据接收与发送中的具体体现。例如在介绍 HTTP 协议时,辅以一个“在 A 计
算机上运行浏览器访问运行在 B 计算机上的 WWW 服务器”的实例,并详细分析了二者之间
传输的每一个字节数据的含义,从而可使读者对协议的应用、实现有更为深刻的理解和认识。
本书除了通过应用实例来剖析协议,还介绍了协议细节在服务器配置中的体现,使读者
能利用学到的协议知识来更好地配置相应的服务器。
“利用应用认识协议,利用协议配置应用”是本书将协议与应用融合的方法,也是本书的
主要特色。
因为 Linux 在服务器领域的出色表现,本书的服务器配置部分全部采用 Linux 作为系统
平台,而 Windows 在桌面应用的优势地位则是本书采用 Windows 为客户端系统平台的原因。
本书共分 10 章,每一章的主要内容如下所述。
第 1 章介绍了 Internet 上广泛使用的物理层至传输层的主要协议,重点介绍了以太网技
术和 IP 网络及路由技术,并对 ARP 和 ICMP 进行了实例剖析。
第 2 章通过对应用层协议 RIP 进行实例剖析,讨论了链路层和网络层多播地址的使用。
第 3 章通过对应用层协议 DHCP 进行实例剖析,介绍了 Windows 系统下 DHCP 客户端
的使用方法和 Linux 系统下 DHCP 服务器软件 dhcpd 的配置方法。
第 4 章通过实例剖析应用层协议 DNS,介绍了 Windows 系统下 DNS 客户端的使用方法
和 Linux 系统下 DNS 服务器软件 bind 的配置方法。
第 5 章通过实例剖析应用层协议 TELNET,介绍了 Windows 系统下 TELNET 客户端的
使用方法和 Linux 系统下 TELNET 服务器软件 in.telnetd 的配置方法。
第 6 章通过实例剖析应用层协议 HTTP,介绍了 Windows 系统下 WWW 浏览器的使用方
法和 Linux 系统下 WWW 服务器软件 apache 的配置方法。
第 7 章通过实例剖析应用层协议 FTP,介绍了 Windows 系统下 FTP 客户端的使用方法和
Linux 系统下 FTP 服务器软件 wu-ftpd 的配置方法。
第 8 章通过实例剖析应用层协议 SMTP 和 POP3,介绍了 Windows 系统下邮件收发工具
的使用方法和 Linux 系统下邮件服务器软件 sendmail 的配置方法。
第 9 章通过实例剖析应用层代理的基本原理和工作过程,重点介绍了 HTTP 代理的工作
原理和 squid 代理服务器的配置。
第 10 章介绍常用网络配置和调试工具软件的使用。
·2· Internet 应用协议实例剖析与服务器配置

本书第 1 章、第 2 章、第 9 章、第 10 章由林腾编写,第 3 章、第 4 章由李国锋编写,


第 5 章、第 6 章由许崇敬编写,第 7 章、第 8 章由赵勇编写,全书由林腾统稿。衷心感谢
韩作生老师在百忙中审阅本书并提出了大量宝贵意见,感谢陈燕女士给予的鼓励!
书中不妥和错误之处恳请读者批评指正。
作 者
2004 年 3 月 30 日
目 录

第 1 章 TCP/IP 基础 ·
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
··1
1.1 协议的层次结构··········································································································1
1.1.1 ISO/OSI 协议模型 ·························· 1
1.1.2 Internet 协议模型 ·························· 3
1.2 以太网基础 ·················································································································4
1.2.1 以太网的设备 ··························· 4
1.2.2 以太网地址(MAC 地址) ······················ 5
1.2.3 以太网帧结构 ··························· 7
1.2.4 用集线器(HUB)连接以太网 ···················· 8
1.2.5 载波监听/冲突检测(CSMA/CD) ··················· 9
1.2.6 用交换机连接以太网 ························ 9
1.2.7 冲突域与广播域 ························· 10
1.2.8 虚拟局域网(VLAN) ······················· 12
1.3 IP 地址与掩码···········································································································13
1.3.1 IP 地址的结构与分类 ······················· 13
1.3.2 网络地址 ···························· 14
1.3.3 广播地址 ···························· 15
1.3.4 A 类 IP 地址 ··························· 16
1.3.5 B 类 IP 地址 ··························· 16
1.3.6 C 类 IP 地址 ··························· 17
1.3.7 多播 IP 地址(D 类地址) ····················· 17
1.3.8 其他 IP 地址 ··························· 17
1.3.9 IP 地址与以太局域网 ······················· 18
1.3.10 掩码(mask) ·························· 18
1.3.11 私有地址 ···························· 19
1.4 ARP 基础与实例剖析 ·······························································································20
1.4.1 ARP 协议的作用 ························· 20
1.4.2 ARP 包结构 ··························· 21
1.4.3 在以太网帧中封装 ARP 包 ····················· 21
1.4.4 ARP 协议的工作过程 ······················· 22
1.4.5 静态 ARP 项 ··························· 22
1.4.6 ARP 代理 ···························· 22
·2· Internet 应用协议实例剖析与服务器配置

1.4.7 实例剖析 ···························· 24


1.5 IP 协议与路由···········································································································27
1.5.1 IP 包结构 ···························· 27
1.5.2 在以太网帧中封装 IP 包 ······················ 28
1.5.3 路由器简介 ··························· 29
1.5.4 一台路由器连接多个网络 ····················· 29
1.5.5 一台路由器连接基于不同类型的局域网技术的网络 ·········· 31
1.5.6 多台路由器连接多个网络 ····················· 32
1.5.7 路由协议(Routing Protocol)···················· 35
1.5.8 路由器的广域连接 ························ 35
1.6 ICMP 基础与实例剖析 ······························································································36
1.6.1 ICMP 协议与 IP 协议的关系 ···················· 36
1.6.2 ICMP 回应请求包与 ICMP 回应包格式 ················ 36
1.6.3 其他类型 ICMP 包 ························ 37
1.6.4 在 IP 包中封装 ICMP 包 ······················ 37
1.6.5 实例剖析 ···························· 38
1.6.6 校验和的计算 ·························· 41
1.7 UDP 与 TCP 基础 ·····································································································42
1.7.1 端口号 ····························· 43
1.7.2 UDP 基础 ···························· 44
1.7.3 在 IP 包中封装 UDP 包 ······················ 45
1.7.4 TCP 基础 ···························· 45
1.7.5 在 IP 包中封装 TCP 包 ······················· 47
1.7.6 基于 UDP 和 TCP 的通信过程 ···················· 47

第 2 章 多播在 RIP 协议中的应用 ·


···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
·51
2.1 RIP 协议基础 ············································································································51
2.1.1 RIP 协议的作用 ·························· 51
2.1.2 RIP 包格式 ···························· 51
2.2 与 RIP 协议相关的地址问题 ·····················································································52
2.2.1 用广播方式发送 RIP 包 ······················ 52
2.2.2 用多播方式发送 RIP 包 ······················ 53
2.3 实例剖析 ··················································································································53
2.3.1 环境介绍 ···························· 53
2.3.2 通信过程中的帧 ························· 55
2.3.3 帧剖析 ····························· 55

第 3 章 DHCP 应用 ·
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···59
3.1 DHCP 基础 ···············································································································59
目 录 ·3·

3.1.1 DHCP 简介 ··························· 59


3.1.2 DHCP 包结构 ·························· 59
3.1.3 DHCP 选项 ··························· 62
3.1.4 DHCP 工作过程 ························· 64
3.2 配置 DHCP 客户端 ···································································································65
3.2.1 Windows98 系统的 DHCP 客户端的设置 ··············· 65
3.2.2 Windows2000 系统的 DHCP 客户端的设置 ·············· 67
3.3 配置 DHCP 服务器 ···································································································68
3.3.1 DHCP 服务器软件的安装和启动 ·················· 68
3.3.2 DHCP 服务器的配置 ······················· 68
3.4 实例剖析 ··················································································································69
3.4.1 环境介绍 ···························· 69
3.4.2 通信过程中的以太帧 ······················· 70
3.4.3 帧剖析 ····························· 71

第 4 章 DNS 应用·
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
·81
4.1 DNS 简介··················································································································81
4.2 DNS 包格式 ··············································································································81
4.2.1 DNS 包的基本结构 ························ 81
4.2.2 DNS 头结构 ··························· 82
4.2.3 问题记录的格式 ························· 83
4.2.4 回答记录的格式 ························· 83
4.3 DNS 客户端 ··············································································································84
4.3.1 DNS 客户端实现 ························· 84
4.3.2 DNS 客户端配置 ························· 85
4.4 DNS 服务器 ··············································································································86
4.4.1 DNS 服务器简介 ························· 86
4.4.2 DNS 服务器的分类 ························ 87
4.4.3 DNS 服务器的安装与启动 ····················· 87
4.4.4 DNS 服务器的配置 ························ 87
4.5 DNS 查询方式 ··········································································································94
4.5.1 反复式查询 ··························· 94
4.5.2 递归式查询 ··························· 95
4.6 实例剖析 ··················································································································95
4.6.1 环境介绍 ···························· 95
4.6.2 通信过程中的帧 ························· 96
4.6.3 帧剖析 ····························· 97
4.6.4 校验和的计算 ·························· 100
·4· Internet 应用协议实例剖析与服务器配置

第 5 章 TELNET 应用 ·
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···101
5.1 TELNET 协议基础 ··································································································101
5.2 网络虚拟终端(NVT) ··························································································102
5.2.1 数据传输 ···························· 102
5.2.2 控制功能 ···························· 103
5.2.3 TELNET 同步信号 ························ 103
5.2.4 NVT 打印机和键盘 ························ 104
5.3 TELNET 命令 ·········································································································106
5.4 TELNET 选项 ·········································································································107
5.5 TELNET 客户端 ·····································································································110
5.6 TELNET 服务器端 ··································································································112
5.6.1 in.telnetd 的安装与启动 ······················ 112
5.6.2 in.telnetd 的配置 ························· 112
5.7 实例剖析 ················································································································113
5.7.1 环境介绍 ···························· 113
5.7.2 通信过程中的帧 ························· 114
5.7.3 帧剖析 ····························· 117

第 6 章 WWW 应用 ·
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
··119
6.1 WWW 简介 ············································································································119
6.2 HTTP 协议 ··············································································································119
6.2.1 HTTP 协议概述 ·························· 119
6.2.2 HTTP 包的格式 ·························· 119
6.2.3 HTTP 协议的工作过程 ······················· 121
6.3 WWW 客户端 ·········································································································122
6.4 WWW 服务器 ·········································································································123
6.4.1 Apache 的获取和安装 ······················· 123
6.4.2 Apache 的启动和关闭 ······················· 123
6.4.3 Apache 的基本配置 ························ 123
6.4.4 配置虚拟主机 ·························· 125
6.4.5 管理 log 文件 ··························· 125
6.4.6 用 Apache 建立动态网站 ······················ 126
6.4.7 使用 SSL 建立安全的 Web 站点 ··················· 127
6.5 实例剖析 ················································································································128
6.5.1 环境介绍 ···························· 128
6.5.2 通信过程中的帧 ························· 128
6.5.3 帧剖析 ····························· 131
6.5.4 校验和的计算 ·························· 147
目 录 ·5·

第 7 章 FTP 应用 ·
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
··149
7.1 FTP 协议基础 ·········································································································149
7.1.1 FTP 模型 ···························· 149
7.1.2 FTP 与 TELNET 之间的关系 ···················· 150
7.1.3 数据表示 ···························· 150
7.1.4 数据结构 ···························· 150
7.1.5 FTP 命令 ···························· 151
7.1.6 FTP 应答 ···························· 155
7.1.7 FTP 服务器的最小实现 ······················ 157
7.2 FTP 客户端 ·············································································································157
7.2.1 命令行 FTP ··························· 157
7.2.2 CuteFtp ····························· 160
7.3 FTP 服务器 ·············································································································163
7.3.1 Wu-Ftpd 的获取和安装 ······················· 163
7.3.2 Wu-Ftpd 服务器的配置 ······················· 163
7.3.3 FTP 服务的启动和关闭 ······················ 166
7.3.4 FTP 服务器相关程序 ······················· 166
7.4 实例剖析 ················································································································167
7.4.1 环境介绍 ···························· 167
7.4.2 通信过程中的帧 ························· 168
7.4.3 帧剖析 ····························· 175

第 8 章 MAIL 应用 ·
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
··177
8.1 MAIL 系统的组成···································································································177
8.2 SMTP 协议 ·············································································································177
8.2.1 SMTP 协议简介·························· 177
8.2.2 SMTP 协议模型·························· 177
8.2.3 SMTP 命令 ··························· 178
8.2.4 SMTP 应答 ··························· 179
8.2.5 用 telnet 模拟 SMTP 协议实现过程 ·················· 179
8.3 POP 协议 ················································································································180
8.3.1 POP 协议简介 ·························· 180
8.3.2 POP3 命令 ···························· 180
8.3.3 POP3 应答 ···························· 181
8.3.4 用 telnet 模拟 POP3 协议实现过程 ·················· 181
8.4 MAIL 系统的客户端程序························································································182
8.5 MAIL 服务器 ··········································································································187
8.5.1 sendmail 的安装和启动······················· 187
·6· Internet 应用协议实例剖析与服务器配置

8.5.2 sendmail 的配置·························· 187


8.6 实例剖析 ················································································································190
8.6.1 环境介绍 ···························· 190
8.6.2 通信过程的帧(SMTP) ······················ 191
8.6.3 帧剖析(SMTP) ························· 196
8.6.4 通信过程的帧(POP3) ······················ 197
8.6.5 帧剖析(POP3) ························· 202

第 9 章 PROXY 应用 ·
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
··205
9.1 PROXY 简介 ··········································································································205
9.2 PROXY 的客户端配置 ····························································································205
9.3 PROXY 服务器 ·······································································································206
9.3.1 squid 代理服务器的安装和启动 ··················· 206
9.3.2 squid 代理服务器的配置 ······················ 207
9.4 实例剖析 ················································································································208
9.4.1 环境介绍 ···························· 208
9.4.2 通信过程中的帧 ························· 209
9.4.3 帧剖析 ····························· 214

第 10 章 常用网络调试软件的使用 ·
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
···
·217
10.1 用 tcpdump 进行网络数据的采集和分析 ·······························································217
10.1.1 数据选择和过滤 ························· 217
10.1.2 数据输入和输出 ························· 217
10.2 用 NetXray 进行网络数据的采集和分析 ·······························································219
10.3 用 ifconfig 命令设置和查看网络接口 ····································································221
10.3.1 查看接口信息 ·························· 221
10.3.2 设置接口 ···························· 222
10.4 用 route 命令设置和查看路由信息 ········································································223
10.4.1 查看路由信息 ·························· 224
10.4.2 设置路由 ···························· 224
10.4.3 删除路由 ···························· 225
10.5 用 ping 命令测试网络连通状态 ·············································································225
10.6 用 netstat 命令显示网络状态 ·················································································227
10.7 用 traceroute 命令显示经过的网关 ········································································228
10.8 用 arp 命令操作 ARP 缓存 ····················································································229
第1章 TCP/IP 基础

“TCP/IP”这个名称是由“TCP”和“IP”两个 Internet 关键协议名称构成的,通常并不


只代表这两个协议,而是代表能够配合完成 Internet 通信的一系列协议,因此在许多文档中
又称这一系列协议的集合为“TCP/IP 协议簇” 。本章将介绍 Internet 协议的层次结构和 Internet
物理层至传输层各个层次上的典型协议。

1.1 协议的层次结构

为了使数据在网络上从源到达目的,网络通信的参与方必须遵循相同的规则,这套规则
称为协议(protocol),它最终体现为在网络上传输的数据包的格式。协议往往分成几个层次
进行定义,分层定义是为了使某一层协议的改变不影响其他层次的协议。本节将分别介绍
ISO/OSI 模型和 Internet 协议模型。

1.1.1 ISO/OSI 协议模型

国际标准化组织(ISO)为了规范协议层次的划分制定了开放系
应用层
统互连(OSI,Open Systems Interconnection)模型,即 ISO/OSI 参考
模型。此模型根据网络功能制定出 7 层网络协议结构,由低到高分别 表示层

为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,
会话层
如图 1-1 所示。
在 ISO/OSI 参考模型中,每一层都依赖下层提供的服务,同时对 传输层

自己的高层提供服务。
网络层
下面从低层向高层依次介绍每一层。
(1)物理层(physical layer) 数据链路层

简单地说,物理层协议对与基本物理信号传输有关的机械、电气
物理层
等功能进行描述。若生产相互连接的两个设备的两个厂商都遵循相同
物理层规范,则二者必定能被连接在一起,并能接收到对方发来的电、 图 1-1 ISO/OSI 参考模型
光或其他的物理信号,而且能正确地将这些物理信号理解为二进制的
0 和 1 序列。物理层只负责正确地接收和发送比特,并不关心这些比特的具体含义。在大部
分计算机上都能够见到的异步串行接口所对应的 RS-232 规范就是典型的物理层协议的实例。
(2)数据链路层(data-link layer)
数据链路层简称链路层,它依赖物理层提供的比特传输能力把数据组织成为有边界的传
输单位,称为“帧” 。链路层把来自网络层的数据组织成“帧”,然后再通过物理层向外发送。
当然,链路层也要负责从来自物理层的比特序列(或者字节序列)中区分出一个个的帧,并
·2· Internet 应用协议实例剖析与服务器配置

将帧中的数据传递给网络层。为了将各个帧区分开来,需要在帧的头部和尾部附加一些特定
的信息,这个过程称为“封装” ,其相反的过程称为“解封装”。“封装”的概念不只在链路层
中存在,在更高的各层协议中同样存在。所有层上的“封装”问题的共同特征是把来自高层
的封装单位根据本层的需要附加上特定信息形成本层的封装单位,然后向低层传递,同时把
来自低层的数据解封装后向高层传递。另外,链路层还可以有其他的诸如差错校验、流量控
制等功能,但要理解整个协议体系,则首先应记住它和帧之间的密切关系,因为帧使无头无
尾的比特序列变成容易控制的有界的单位。
(3)网络层(network layer)
网络层解决如何标识通信各方和数据如何从源到达目的这个问题。网络层用特定的网络
层地址来标识整个网络中的一个节点,并负责使来自传输层的应该到达某个网络层地址的数
据能够被送达这个网络层地址所对应的网络节点,这就是本章后面部分将要涉及到的“路由”
问题。网络层的封装单位称为“包” (本书将网络层及网络层以上各层的封装单位都称为“包”,
见本书说明部分) , “包”需要被进一步封装成链路层的帧然后才能通过物理层发送出去,而
在接收方,包在链路层的帧中被解封装出来。最典型的网络层协议就是目前在 Internet 中使
用的 IP 协议,它使用 IP 地址惟一地标识 Internet 中的一台主机,路由设备根据 IP 包中的目
的 IP 地址将一个 IP 包一步步转发至目的主机。
(4)传输层(transport layer)
依赖物理层、数据链路层和网络层,任意一个网络节点都能把任何信息传递到其他任意
节点,而传输层在物理层、数据链路层和网络层提供的节点间的通信能力基础上进一步提供
了面向应用的服务。传输层向上层提供屏蔽了传输细节的数据传输服务,将来自高层的数据
进行分段并将来自低层的数据重组,对数据传输进行差错恢复和流量控制。通过对每个网络
节点的多个进程进行标识,传输层可以实现对网络层的多路复用。
(5)会话层(session layer)
会话层用于建立和管理不同主机的两个进程之间的对话。会话层可以管理对话,可允许
对话在两个方向上同时进行,也可以强制对话同时只在一个方向上进行。在后一种情况下,
会话层可以提供会话令牌来控制某时刻哪一方可以发送数据。会话层还可以提供同步服务,
它可以在数据流中插入同步点,每当因网络出现故障而造成大量数据传输中断时,通过同步点
机制可以使两个进程之间的数据传输不需要从头开始,而是从最后一个同步点开始继续传输。
(6)表示层(presentation layer)
表示层协议规定对来自应用层的数据如何进行表达,例如采用什么样的文字编码、是否
及如何进行压缩、是否及如何加密等。
不同的计算机采用不同的数据编码方法,如 ASCII 与 EBCDIC、反码与补码等,另外例
如表达数字时的字节顺序、表达数据结构时的成员组织方法等在不同的系统环境下都有很大
不同。为了通过网络在不同的计算机之间交换数据,需要制定一种标准的、抽象的编码标准;
数据的发送方将用本机编码方法表示的数据转换成标准标码后才能进行发送,接收方收到数
据后应该将用标准编码表示的数据转换成本地编码。按照 ISO/OSI 模型的要求,上述功能应
该在表示层协议中进行规定。
数据压缩及加密的方法有多种。表示层协议通过规定压缩方法可以缩短数据的传输时
间,通过规定加密方法可以保护所传送的数据的安全。
第1章 TCP/IP 基础 ·3·

(7)应用层(application layer)
应用层是 ISO/OSI 模型中最靠近用户的一层,应用层协议直接面对用户的需求,例如与
发送邮件相关的应用层协议可以规定诸如邮件地址的格式、邮件内容的段落表示、客户与服
务器进行交互的命令串等。
ISO/OSI 协议模型只是一个参考模型,实际的网络不一定要严格地按照这 7 个层次来制
定协议,实际上目前也确实没有一个协议体系完全符合 ISO/OSI 模型,但所有的协议体系都
可以与 ISO/OSI 模型之间建立近似的层次对应关系。

1.1.2 Internet 协议模型

Internet 的协议分层结构如图 1-2 所示。

应用层
Telnet FTP TFTP „„

传输层
TCP UDP „„

网络层
IP&ICMP

ARP

802.3、802.5、x.25 等 通信子网层

图 1-2 Internet 协议结构

从图 1-2 可以看出 Internet 协议体系由四层 ISO/OSI Internet

组成,由低到高分别是通信子网层、网络层、 应用层
传输层和应用层。Internet 是成熟的网络,每一
表示层 应用层
层都存在一些成熟的具体协议,本书后面各章
节将对图 1-2 中的每一个层次分别进行介绍。 会话层
Internet 协议结构和 ISO/OSI 模型的近似
的对应关系如图 1-3 所示。 传输层 传输层

Internet 协议体系的通信子网层功能一般 网络层 网络层


由硬件和相应的驱动软件实现,例如以太网卡
以及相应的网卡驱动程序实现了 802.3 通信子 数据链路层
通信子网层
网规范。 网络层和传输层功能由操作系统实现, 物理层
形形色色的应用层协议则在具体的应用程序中
实现。 图 1-3 Internet 协议结构和 ISO/OSI 模型的对应关系
·4· Internet 应用协议实例剖析与服务器配置

1.2 以太网基础

以太网(IEEE802.3)是目前接入 Internet 最常用的局域网技术,它属于 Internet 协议模


型中的通信子网层。在 IEEE(电气和电子工程师协会)的最初的 IEEE802.3 文档中定义了
10Mbit/s 以太网标准,它采用载波监听和冲突检测(CSMA/CD)机制,以半双工方式运行,
其中 10BaseT 是以 3 类或更高类别的双绞线为介质的以太网,10Base2 和 10Base5 是以同轴
电缆为介质的以太网,10BaseFL 是以光纤为介质的以太网。IEEE802.3u 定义了 100Mbit/s 的
快速以太网标准,它可以用半双工的方式以 CSMA/CD 机制工作,也可以使用全双工的方
式。由于对以太网的后向兼容性,在 20 世纪 90 年代的中后期,快速以太网成为局域网中的
主流技术,其中 100BaseTX 是以 5 类双绞线为介质的快速以太网,100BaseFX 是以光纤为介
质的快速以太网。1998 年 6 月,IEEE 正式发布了吉比特以太网标准 IEEE 802.3z,其中 1000Base
SX 是以多模光纤为介质的吉比特以太网,1000Base-LX 是以单模光纤为介质的吉比特以太
网,1000Base T 是以 5 类双绞线为介质的吉比特以太网。

1.2.1 以太网的设备

以太网设备可以粗略地分成 3 类:传输介质、接口卡和汇接设备。
(1)传输介质
传输介质包括同轴电缆、双绞线、光纤等。随着以太网技术的发展,双绞线和光纤已经
替代了早期的同轴电缆,因此在本书中不讨论以同轴电缆为介质的网络。
关于线缆的分类和工程布线的标准有很多,如 EIA/TIA-568A、EIA/TIA-568B 等。有关
线缆的几何参数、设备级联的最大个数等工程布线的详细参数,请参阅网络布线相关资料,
本书不作详细介绍。
(2)接口卡
接口卡既包括常用的 ISA 或 PCI 以太网插卡或主板集成部件,也包括路由器的以太网接
口卡等部件,在此后的各章节中将它们统称为“以太网卡” 。以太网卡包含了 ISO/OSI 网络层
次模型的物理层和链路层功能,它既能借助相应传输介质进行基本物理信号的发送和接收,
又具有帧处理功能。
通常说一个设备是某某层设备,是指此设备包含了 ISO/OSI 某某层及某某层下面各层的
功能,例如称一种设备是链路层设备就是指此设备包含了 ISO/OSI 链路层和物理层的功能,
比如以太网卡就是一种链路层设备。
(3)汇接设备
汇接设备包括中继器、集线器、网桥、交换机等。
中继器是两端口物理层设备,其基本功能是将从其中一端口收到的信号整形放大后发向
另一端口。
集线器(HUB)是多端口的中继器,它是一种物理层设备,基本功能是将从某一端口收
到的信号整形放大后发送到其他所有端口。
网桥是两端口链路层设备,它除了能够完成物理层的信号收发功能外,还能够根据帧中
第1章 TCP/IP 基础 ·5·

的目的媒体访问控制(MAC,Media Access Control)地址决定是否将帧发向另一端口。


交换机是多端口的网桥,它是链路层设备,可以识别帧并能根据帧中的目的 MAC 地址
将帧发向惟一应该发向的端口,而不是像集线器那样发送至所有端口。目前大多高端以太网
交换机同时具有网络层功能,三层交换机、路由交换机等名称也已经相继出现,但它们的功
能逻辑上是传统交换机和路由器的融合,因此本书后面各部分中出现的“交换机”如不特殊
说明仍表示传统交换机。
目前的网络工程中一般不再使用中继器或网桥,而是大量地使用集线器和交换机,后面
将对此进行详细介绍。

1.2.2 以太网地址(MAC 地址)

以太网地址,通常又被称为硬件地址或物理地址,因其属于局域网技术的 MAC 子层的


范畴,因此又被称为 MAC 地址。
以太网地址长度为 48bit,其构成如图 1-4 所示(按照比特传输顺序排列)。
1bit 23bit 24bit

单播/多播 厂商号 序列号

图 1-4 以太网地址构成

单播/多播位字段的含义如下:0 表示单播地址,1 表示多播地址。


每一个以太网卡中都固化有一个 MAC 地址,以太网卡中所固化的地址都是单播地址,
例如 00:00:b4:91:8c:6a 为某一以太网卡所拥有的单播地址。单播地址用来惟一地标识一个以
太网节点。
多播地址用于标识具有特定特征的多个以太网节点,例如:01-80-C2-00-00-00 用于表示
所有的支持 Spanning tree(生成树)的节点,01-00-5E-**-**-**用于 Internet 多播(需和 IP
多播地址配合使用) ,此处的“*”的取值取决于与之配合使用的 IP 多播地址,关于 IP 多播
详见 1.3 节。
前面提到的地址 01-80-C2-00-00-00 的首字节为 0x01,写成二进制数一般写作 00000001,
但作为以太网地址中的一个字节读者应将其读作 10000000,因为实际在传输媒介中传递以太
网地址时,01-80-C2-00-00-00 将按照“10000000 00000001 01000011 00000000 00000000
00000000”序列从左向右的顺序发送,也就是说在通信过程中,若在传输媒介中发送一个以
太网地址,则“单播/多播”位是整个以太网地址中最先被发送的比特。这样做的优点是:接
收方根据收到的地址中的首位比特值就能够立刻判断出这个地址是单播还是多播地址,并可
以根据地址的这个属性做出相应的反应,例如决定是否接受此帧等。本书在第 2 章“多播在
RIP 中的应用”中将结合实例介绍多播地址的使用。
以太网卡可以设置为接收或不接收某种多播地址,许多功能简单的以太网卡只能设置为
“接收所有的多播帧”或“不接收任何多播帧” 。
以太网地址 0xfffffffffff 被定义为广播地址,用于表示一个以太网广播域内的所有节点。
“以太网广播域”将在本章后面部分介绍。
厂商号部分的长度是 23bit,生产具有以太网地址的以太网设备的厂商(例如生产以太网
·6· Internet 应用协议实例剖析与服务器配置

卡的厂商,或带以太网接口的路由器生产厂商)需要首先申请获得厂商号,并且在自己生产
的设备中使用这个厂商号。下面列出一些以太网厂商号。
厂商号 厂商名
00000C Cisco Systems, Inc.
000142 Cisco Systems, Inc
000143 Cisco Systems, Inc
000163 Cisco Systems, Inc
000164 Cisco Systems, Inc
000196 Cisco Systems, Inc
000197 Cisco Systems, Inc
.. ....
..
0002B3 Intel Corporation
000347 Intel Corporation
000423 Intel Corporation
0007E9 Intel Corporation
000CF1 Intel Corporation
00D0B7 Intel Corporation
.. ....
..
00068C 3com Corporation
000A5E 3com Corporation
00104B 3com Corporation
00105A 3com Corporation
0020AF 3com Corporation
.. ....
..
由上面列出的详细信息可知,同一个厂商可以根据需要获得多个以太网厂商号。
序列号部分的长度为 24bit,它由厂商自行分配,并保证不出现重复。
下面看一个以太网地址实例。某 Linux 主机有一个 PCI 接口的 100Mbit/s 以太网卡,用
ifconfig 命令得到下面的结果:
eth0 Link encap:Ethernet HWaddr 00:00:B4:91:8C:6A
inet addr:202.194.254.138 Bcast:202.194.254.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:230694 errors:2 dropped:0 overruns:0 frame:0
TX packets:179911 errors:0 dropped:0 overruns:0 carrier:0
collisions:182 txqueuelen:100
Interrupt:11 Base address:0x1000
上面结果中的“HWaddr 00:00:B4:91:8C:6A”即表示本主机的以太网卡 0(eth0)的硬件
地址(HWaddr:HardWare address)为 00:00:B4:91:8C:6A,此硬件地址中的厂商号 00:00:B4
为 Realtek 公司厂商号,91:8C:6A 为网卡地址的序列号部分。
使用以太网卡的 Windows 用户可以使用 ipconfig/all 命令来看到相应的 MAC 地址。
第1章 TCP/IP 基础 ·7·

1.2.3 以太网帧结构
7 Byte 前同步码
帧是以太网传输的基本单位,以太网的帧 1 Byte 分界符
结构如图 1-5 所示。 6 Byte 目的以太网地址
在传输介质中发送一个帧时, “前同步码” 6 Byte 源以太网地址
字段是最先被发送的字段。 2 Byte 长度/类型
以太网帧各字段分别描述如下所述。 所携带数据
46~1500 Byte
① 前同步码:此字段的内容按照发送顺 填充字节
序 排 列 为 10101010 10101010 10101010 4 Byte 校验值
10101010 10101010 10101010 10101010,接口
扩展部分
卡将其进行串行发送时的顺序为从左到右。前
同步码的作用是通过连续的“1” “0”序列使接 图 1-5 以太网帧结构
收方达到电路稳定状态。
② 分界符:此字段的内容为 10101011,它的作用是标识帧有效部分的正式开始。
③ 目的以太网地址、源以太网地址:这两个字段分别指定了“接收方”和“发送方”
的 MAC 地址。源以太网地址一般为单播地址,目的以太网地址可以是单播或多播地址或广
播地址。
④ 长度/类型:此字段是一个整数,若此整数的值小于 0x5dc(十进制 1500) ,则用于表
示此帧中所携带的数据的按字节计算的长度,否则表示所携带数据采用的协议类型。在
Internet 通信中,此字段总是作为“类型”使用,常用的字段值及其含义如下:
 0x0800 表示所携带的数据遵循 IP 协议规定的格式,或者说携带的是 IP 包。
 0x0806 表示所携带的数据遵循 ARP 协议规定的格式,或者说携带的是 ARP 包。
⑤ 所携带数据:此字段通常又称为所封装数据,例如可以是一个 IP 包。从协议层次的
角度出发,我们通常将“所携带数据包”称为“高层数据”。
⑥ 填充字节:此字段的作用是使每个帧达到最小的帧长度的要求。
⑦ 校验值:此字段是根据目的以太网地址字段、源以太网地址字段、长度或类型字段、
所携带数据和填充字节字段的内容采用循环冗余校验(CRC 校验)算法得到的结果。在 CRC
算法中使用的多项式如图 1-6 所示,CRC 校验的算法细节请参考相关资料。
G(x)=x32+x26+x 23+x22+x16+x12+x 11+x10+x8+x7+x5 +x4+x 2+x+1
图 1-6 以太帧校验 CRC 多项式

⑧ 扩展部分:此字段仅用于 100Mbit/s 以上速率的半双工网络中,用于延长帧的长度以


满足高速率下的 CSMA/CD 的要求。CSMA/CD 将在 1.2.5 节中进行描述。
以太网网卡通常情况下只接收目的以太网地址与自身地址相同的帧,或目的以太网地址为
广播地址的帧。以太网网卡收到帧后将会把前同步码和分界符以及填充字节和校验字段去掉,
把其他部分交由操作系统处理,因此,在本章后面部分及后面各章的实例中看到的帧实例,都
是由以太网帧组成部分中的目的以太网地址、源以太网地址、长度或类型、所携带数据组成的。
以太网卡可以设置为“全接收模式”,此时任何可以被网卡监听到的帧将全部被交给软
件处理,不管这个帧的目的以太网地址字段与自身的 MAC 地址是否相同,这正是 tcpdump、
·8· Internet 应用协议实例剖析与服务器配置

netxray、sniffer 等网络侦听软件工作的基础,网络中的以太网卡可以侦听到哪些类型的帧与
所使用的汇接设备有关,详见 1.2.4 和 1.2.6 节中关于集线器和交换机的部分。

1.2.4 用集线器(HUB)连接以太网

集线器与具有以太网接口卡的节点相连的方式,如图 1-7 所示。

集线器

A B

MAC:00:00:b4:91:8c:6a MAC:00:d0:b7:37:55:00

图 1-7 用集线器连接以太网

图中 A、B 节点可以是桌面计算机的以太网卡,也可以是路由器的一个以太网接口等。
若 A 与 B 的 MAC 地址分别用 MACA 和 MACB 表示,根据图 1-7,则有:
MACA: 00:00:b4:91:8c:6a
MACB: 00:d0:b7:37:55:00
若 A 节点欲向 B 节点发送一个帧,则 A 节点首先应获得 B 节点的 MAC 地址,本章的
1.4 节“ARP 基础与实例剖析”将通过实例具体介绍利用已知的对方的 IP 地址获得对方 MAC
地址的方法,此处假设 A 节点已经获得 B 节点的 MAC 地址,则 A 节点发向 B 节点的帧结
构如图 1-8 所示。

6 Byte 6 Byte

MACB MACA 其他部分

图 1-8 A 节点发向 B 节点的帧结构

集线器是一个物理层设备,随着此帧中的每个比特通过双绞线向集线器发送,集线器只
是把收到的信号整形放大后从其他端口发出(注意, “从所有端口发出”与“以太网广播”不
是同一个概念) ,连接在集线器上的所有节点的以太网卡同时开始接收该帧每一个比特,当接
收完帧的目的以太网地址字段(此例中为 MACB)后,所有的接收以太网卡都将此 MAC 地
址与自身 MAC 地址进行比较,若不同则将帧丢弃;若相同,则接收整个帧并通过相应机制
(例如中断机制)将帧交由操作系统处理。此例中只有 B 节点的操作系统会收到 A 发送的帧。
从上述过程可以看出,连接在集线器上的各节点同时只能有一对节点进行通信,而且只
能进行半双工通信,即发送和接收不能同时进行。因此对于 10/100Mbit/s 集线器来说是所有
节点分享了 10/100Mbit/s 的速率。
从上述过程还可以看出,若连接在集线器上的某以太网卡被设置为全接收模式(例如使
用 tcpdump、netxray、sniffer 等网络侦听软件)
,则它就可以把连接于同一集线器上的其他计
第1章 TCP/IP 基础 ·9·

算机之间的通信过程全盘窃听,因此,若某计算机的通信过程不希望被他人窃听,哪怕是同
一间办公室的人,则此计算机应该通过 “以太网交换机”与他人连接,而不是通过集线器。

1.2.5 载波监听/冲突检测(CSMA/CD)

集线器连接的各节点同时只能在一对节点之间进行半双工通信,当两个节点同时向外发
送信号时便会发生冲突。当冲突发生时,所有网卡将无法接收到正确的信号,所以必须有一
种方法使通信各方检测到冲突的发生并弥补由于冲突而造成的损失,即发送方应该重新发送
刚刚因为冲突而没有被对方正确接收的帧。CSMA/CD 就是以太网采用的用于解决这种冲突
的一种方法。
CSMA/CD 机制要求每一节点在发送帧之前必须首先判断线路是否空闲;若不空闲,则
等待并不断监测线路状态直至空闲再发送帧。若两节点同时检测到空闲并同时进行帧的发送,
则每一个节点应能够检测到冲突的发生,并进入退避、延迟和重发的步骤。CSMA/CD 机制
的电路实现原理不是本书的内容,详见 IEEE802.3 文档。
实际上,冲突不只发生在两节点同时发送数据帧的情况下。因电信号的传递需要时间,
A 节点开始发送一个帧一段时间后,另外一个距离较远的B节点仍有可能检测到线路空闲并
开始发送自己的帧,这样A和B节点发送的帧仍有可能发生冲突。同样,因为电信号的传递
需要时间,A节点需要在一段时间之后才能检测到冲突的发生,若在这段时间内,A节点已
经发送完帧的最后一个比特,则 A 节点会认为此帧已经正确发送,但实际上因为冲突,接收
方可能没有正确地接收到此帧。因为以上原因,以太网有最小帧长度的规定,以让双方能够
在帧发送完毕之前检测到冲突的存在并进行重发。

1.2.6 用交换机连接以太网

交换机与具有以太网接口卡的节点相连的方式如图 1-9 所示。

交换机

A B C D

MACA:00:00:b4:91:8c:6a

MACB:00:d0:b7:37:55:00

图 1-9 用交换机连接以太网

交换机是链路层设备,它可以通过查看从某一端口发来的帧的源以太网地址字段建立此
MAC 地址与交换机端口之间的对应关系,例如某交换机的 MAC 地址与端口的对应表如下:
Port MACs MAC addresses
Port 1 0 <No MAC addresses are active>
Port 2 0 <No MAC addresses are active>
·10· Internet 应用协议实例剖析与服务器配置

Port 3 0 <No MAC addresses are active>


Port 4 0 <No MAC addresses are active>
Port 5 2 000D87368B9C, 00E04C3000DB
Port 6 2 00030FF8A9F1, 00E04C46FD70
Port 7 1 000D8736DC9F
Port 8 0 <No MAC addresses are active>
Port 9 0 <No MAC addresses are active>
Port 10 0 <No MAC addresses are active>
Port 11 0 <No MAC addresses are active>
Port 12 1 0010DC35FCAA
交换机经过一段时间的学习后,理想情况下可以建立所有可能的 MAC 地址与自身端口
的对应关系。图 1-9 中,若 A 节点发向 B 节点一个帧,则交换机根据自己学习得到的 MAC
地址与端口的关系,只将此帧发往与 B 节点连接的端口,这样,在 A 节点与 B 节点通信的
同时,C 节点与 D 节点之间的通信可以同时进行。
交换机对 MAC 地址与端口的对应关系的保存是有时间限定的,例如 15 分钟,而且这个
时间一般允许用户进行配置。若关系表中某一项在限定时间内没有被来自此端口的帧再次刷
新,该项将被删除。
当交换机收到一个帧,但因为某种原因从 MAC 地址与端口的对应表中找不到此项时,
交换机会将此帧向所有的端口发出(此时其行为与集线器类似)。导致交换机这种行为的原因
很多,例如交换机在运行中会删除那些限定时间已到而未得到刷新的项。
当交换机收到目的 MAC 地址为广播地址 0xffffffffffff 的帧时,交换机将把此帧从每一个
端口发出。
交换机不但允许多对端口同时通信,同时还能够进行端口之间的全双工通信,当然这要
求参与通信的网卡也支持全双工模式。 目前市场上出售的新网卡产品一般都支持全双工模式,
只有生产时间比较早的网络可能仍在使用半双工产品。

1.2.7 冲突域与广播域

由集线器或几个集线器的级联加上传输介质和接口卡构成的以太局域网内,同时只能有
一对节点进行半双工通信,若两节点欲同时发送数据就会产生冲突,因此常把这样的一些设
备的集合称为一个冲突域,如图 1-10 所示。
图 1-10 中任一节点发出的目的地址为某一 MAC 地址的帧都会被其他所有节点侦听和判
断,当然,大部分节点会因为此帧的目的地址与自身 MAC 地址不相符而丢弃此帧,而目的
MAC 地址为广播地址 0xffffffffffff 的帧会被所有节点接收,因此这样一些设备的集合又被称
为一个广播域。
过多的节点属于同一个冲突域将大大降低通信效率,因为节点过多将导致太多冲突,以
至于真正有效的传输时间将大大缩短。
若由交换机或几个交换机的级联加上传输介质和接口卡构成以太局域网,并且每一个接
口卡都支持全双工通信方式,则在带宽足够的情况下,可以认为此局域网内已不存在冲突,
即冲突域已经消除,但仍构成一个广播域,如图 1-11 所示。
第1章 TCP/IP 基础 ·11·

集线器


集线器 集线器

„ „
冲突域
„ „

广播域

图 1-10 用集线器连接的冲突域和广播域

交换机

„„

交换机 交换机

„„ „„

广播域

图 1-11 用交换机连接的广播域

若由交换机与集线器混合级联,则可以构成如图 1-12 所示的冲突域和广播域。

交换机

„„

集线器 集线器

„„ „„

冲突域
广播域

图 1-12 交换机与集线器混合构成的冲突域和广播域
·12· Internet 应用协议实例剖析与服务器配置

交换机通过缩小甚至消除以太网冲突域可以大大提高平均通信速率,由多个汇接设备组
成的以太局域网总是构成一个广播域,这对于后面要介绍的基于以太网的 IP 网络是非常重要
的。在后面各章节中提到的以太局域网,就是指一个以太网广播域(其他类型的局域网不一
定存在广播域的概念),在后面各章中用图 1-13 所示的方法表示一个以太网广播域。

A „„ B

图 1-13 以太网广播域的表示方法

一个以太网广播域内包含过多的节点(例如几百台计算机)时,也会大大降低通信效率,
因为广播域内的每一个接口卡都会将目的地址为广播地址的帧接收下来交给操作系统,在 1.4
节将会讲到,其实有些时候,某个节点发出广播帧的目的并不是希望把数据发给广播域内每
一个节点,而是因为它暂时不知道对方的 MAC 地址,只好采用广播方式,而让接收了此帧
的操作系统去根据高层数据判断自己到底是否应该丢弃此帧。在这种情况下,显然广播域内
的大部分操作系统是在浪费时间,同时交换机的负担也大大加重,因此也应该防止建立过大
的以太网广播域,例如可以通过路由器将大的以太网分成多个广播域,详见 1.5 节“路由器”
相关部分。

1.2.8 虚拟局域网(VLAN)

以太网交换机可以具有虚拟局域网(VLAN,Virtual Local Area Network)的功能,其中


最简单有效的一种 VLAN 划分方法是基于交换机的端口进行划分,它可以将交换机的多个端
口分成多个广播域,各个广播域之间不能直接通信,而要依赖路由器等设备来实现不同广播
域之间的通信,此时一个交换机实际上相当于多个独立交换机的功能。
假设有一个如图 1-14 所示的以某 8 端口的以太网交换机为中心的以太网。交换机的 1 端
口与集线器 1 级联,与集线器 1 相连的计算机供第 1 组学生使用,交换机的 2~7 端口分别
直接连接一台计算机供教师使用,交换机的 8 端口与集线器 2 级联,与集线器 2 相连的计
算机供第 2 组学生使用,为了安全和管理的方便,我们将交换机的 1 端口、2~7 端口、8
端口分别划分至 3 个 VLAN 中,分别命名为 studentgroup1、teachers、studentgroup2 ,如
下所示:
VLAN 名字 端口
teachers 2,3,4,5,6,7
studentgroup1 1
studentgroup2 8
此时相当于同时存在 3 个独立的交换机,它们之间被禁止直接通信,任一 VLAN 内的一
个节点发出的广播帧不会到达另外一个 VLAN,从而实现了 3 组计算机之间的完全隔离;若
VLAN 之间需要通信,则必须借助于另外的路由设备。
VLAN 的具体实现方法与交换机的型号有关,按其用户手册中的说明进行操作即可。
第1章 TCP/IP 基础 ·13·

交换机

„„

集线器 1 Teachers 集线器 2

Studentgroup1

„„ Studentgroup2 „„

图 1-14 基于端口的 VLAN 的划分

另外还有两种常用的划分 VLAN 的方法——基于 MAC 地址的 VLAN 和基于标记的


VLAN(802.1Q),此处不详细讨论。

1.3 IP 地址与掩码

IP(Internet Protocol)协议是被 Internet 使用的网络层协议,IP 地址是 IP 协议的重要组


成部分,它用于在 Internet 上惟一地标识一台主机。需要注意的是,IP 地址是一个软地址而
不是一个硬地址,硬地址是被硬编码于网络接口卡中的地址,它用于在局域网内标识一个节
点,例如在“以太网基础”部分中介绍的以太网地址就称为硬地址;IP 地址不依赖于特定的网
络接口卡类型,即一个 IP 地址可以被分配给使用以太网卡的主机也可以被分配给使用令牌环
网卡的主机,所以它可以用在由不同技术的局域网互连而成的更大的网络(例如 Internet)中。
参与 Internet 通信的主机必须先获得 IP 地址, IANA (Internet Assigned Numbers Authority,
Internet 网 络 号 分 配 机 构 ) 是 负 责 这 项 工 作 的 权 威 机 构 。 关 于 IANA 详 情 请 参 阅
http://www.iana.org/。

1.3.1 IP 地址的结构与分类

IPv4 地址长度为 32bit,或者说由 4Byte 组成,它可以用多种方式表示(通常用点分十进


制表示) 。下面几种方法表达了同一个 IP 地址。
十六进制: ca c2 fe 8a
二进制: 11001010 11000010 11111110 10001010
点分十进制: 202.194.254.138
它惟一地标识 Internet 上的一台主机,实际上就是作者在本书写作过程中经常用以收集
实例数据的一台 Linux 主机。
IP 地址由两部分组成,网络位部分和主机位部 网络位 主机位
分,如图 1-15 所示。
网络位与主机位的长度比例随地址类的变化 图 1-15 IP 地址的结构
·14· Internet 应用协议实例剖析与服务器配置

而有所不同。
以二进制来表示,具有如图 1-16 所示特征的 IP 地址分别称为 A 类地址、B 类地址、C
类地址。

A类 0******* ******** ******** ********

网络位 主机位

B类 10****** ******** ******** ********

网络位 主机位

C类 110***** ******** ******** ********

网络位 主机位

图 1-16 IP 地址的分类

A 类地址的首比特为 0,其他比特上的“*”代表 1 或 0,前 8bit 被定义为网络位,其他


24bit 被定义为主机位。例如,IP 地址 10.0.0.1 展开成二进制数为 00001010 00000000 00000000
00000001,此数字的首比特为 0,所以这是一个 A 类地址。
B 类地址以 10 开始,其他位上的“*”代表 1 或 0,前 16bit 被定义为网络位,其他 16bit
被定义为主机位。例如,IP 地址 130.0.0.1 展开成二进制数为 10000010 00000000 00000000
00000001,此数字的前两个比特为 10,所以这是一个 B 类地址。
C 类地址以 110 开始,其他位上的“*”代表 1 或 0,前 24bit 被定义为网络位,其他 8bit
被定义为主机位。例如,IP 地址 198.0.0.1 展开成二进制数为 11000110 00000000 00000000
00000001,其前 3 个比特为 110,所以这是一个 C 类地址。
实际上还存在一种 D 类地址,用于多播(multicast),只是它不像 A、B、C 类地址那样
被严格区分网络位和主机位,1.3.7 节中将单独对 D 类地址进行介绍。

1.3.2 网络地址

若将一个 A 或 B 或 C 类地址的主机位清零,网络位不变,所得到的新的 32bit 数值称


为此 IP 地址对应的网络地址,例如 IP 地址 202.194.254.138,因十进制数 202 写成二进制
数为 11001010,所以这是一个 C 类地址,将主机位清零后得到的结果 202.194.254.0 即为网
络地址。
网络地址相同的主机构成一个 IP 网络,用一个网络地址惟一地标识该 IP 网络。IP 地址
的分类使得不同类型的网络地址代表规模不同的网络,这是为了适应 Internet 上已经存在和
正在新产生的大小不同的网络。
Internet 数字分配局(IANA,Internet Assigned Numbers Authority)以网络地址为单位向
Internet 用户分配 IP 地址。得到某网络地址的用户可以任意使用此网络地址所代表的 IP 网络
第1章 TCP/IP 基础 ·15·

内的所有 IP 地址。

1.3.3 广播地址

将一个 A 或 B 或 C 类地址的主机位全部置 1,网络位不变,所得到的 32bit 数值称为此 IP


地址对应的广播地址, 例如 IP 地址 202.194.254.138, 因十进制数 202 写成二进制数为 11001010,
所以这是一个 C 类地址,将主机位全部置 1 后得到的结果 202.194.254.255 即为广播地址。
网络地址相同的主机构成一个 IP 网络,此网络内每一个 IP 地址对应的广播地址都相同,
广播地址用于标识一个网络内的所有主机。
我们要注意区分网络地址和广播地址,一个网络地址惟一地标识一个 IP 网络,而一个广
播地址用于标识一个网络内的所有主机,两者的含义是不同的。网络地址通常在路由过程中
被主机或路由器使用,用以判断到达目的应该经过的路径;而广播地址可以用于把同样的数
据发送给某 IP 网络内每一台主机,例如在 IP 地址为 202.194.240.88 的主机上使用命令“ping
202.194.254.255”会看到如下的结果:
PING 202.194.254.255 (202.194.254.255) from 202.194.240.88 : 56(84) bytes of data.
64 bytes from 202.194.254.254: icmp_seq=0 ttl=128 time=917 usec
64 bytes from 202.194.254.211: icmp_seq=0 ttl=254 time=1.198 msec (DUP!)
64 bytes from 202.194.254.138: icmp_seq=0 ttl=254 time=1.410 msec (DUP!)
64 bytes from 202.194.254.253: icmp_seq=0 ttl=254 time=1.930 msec (DUP!)
64 bytes from 202.194.254.252: icmp_seq=0 ttl=254 time=2.139 msec (DUP!)
64 bytes from 202.194.254.248: icmp_seq=0 ttl=254 time=2.400 msec (DUP!)
64 bytes from 202.194.254.243: icmp_seq=0 ttl=254 time=2.704 msec (DUP!)
64 bytes from 202.194.254.250: icmp_seq=0 ttl=254 time=2.855 msec (DUP!)
64 bytes from 202.194.254.247: icmp_seq=0 ttl=254 time=2.998 msec (DUP!)
与这个命令相关的协议细节将在 1.6 节中介绍,这里只需要知道, “ping 202.194.254.255”
命令使用广播地址 202.194.254.255 发出一个应答请求,这个请求将被 202.194.254.0 网络内的
每一台正常工作的主机接收,每一台收到应答请求的主机都会发回一个应答,这就是上面所示
的结果。
另外还有一个特殊的广播地址 255.255.255.255,即由 32 个 1 组成的 IP 地址,它用于标
识本网络内的所有主机。下面的实例说明了这个广播地址的用途。
在 IP 地址为 202.194.240.88 的主机上使用命令“ping –b 255.255.255.255”,会看到如下
的结果:
PING 255.255.255.255 (255.255.255.255) from 202.194.240.88 : 56(84) bytes of data.
64 bytes from 202.194.240.88: icmp_seq=0 ttl=255 time=298 usec
64 bytes from 202.194.240.72: icmp_seq=0 ttl=255 time=679 usec (DUP!)
64 bytes from 202.194.240.68: icmp_seq=0 ttl=128 time=1.192 msec (DUP!)
64 bytes from 202.194.240.105: icmp_seq=0 ttl=64 time=1.732 msec (DUP!)
64 bytes from 202.194.240.69: icmp_seq=0 ttl=128 time=6.868 msec (DUP!)
64 bytes from 202.194.240.65: icmp_seq=0 ttl=64 time=2.322 msec (DUP!)
64 bytes from 202.194.240.70: icmp_seq=0 ttl=64 time=1.618 msec (DUP!)
·16· Internet 应用协议实例剖析与服务器配置

“ping 255.255.255.255”命令使用广播地址 255.255.255.255 发出一个应答请求,这个请


求将被发送者所在的网络即 202.194.240.0 网络内的每一台正常工作的主机接收,每一台收到
应答请求的主机都会发回一个应答,这就是上面所示的结果。实际上,此例中使用“ping –b
255.255.255.255”命令和使用“ping –b 202.194.240.255”命令的结果是相同的。

1.3.4 A 类 IP 地址

按照 A 类地址的定义,A 类 IP 地址的范围为:
0.0.0.0~127.255.255.255
A 类网络地址的范围为:
0.0.0.0~127.0.0.0
在 Internet 实践中,0.0.0.0 网络地址被用于表示默认路由,127.0.0.0 网络地址被用于对
IP 协议进行测试(读者可在自己的计算机上运行 ping 127.0.8.67 体验一下),因此实际可以被
分配使用的 A 类网络地址共有 126(27–2)个:
1.0.0.0~126.0.0.0
每一个 A 类网络内可以容纳的主机数就是一个网络地址所容纳的 IP 地址数,例如网络
地址 1.0.0.0 容纳的 IP 地址范围为:
1.0.0.0~1.255.255.255
其中 1.0.0.0 已用于标识整个网络,而 1.255.255.255 被用于标识本网络所有主机,即它
是本网络的广播地址,因此每一个 A 类网络内可以被主机使用的 IP 地址数为 224-2 个。例如
1.0.0.0 网络内可以被主机使用的 IP 地址的范围为:
1.0.0.1~1.255.255.254
对于 Internet 来说,A 类 IP 地址资源早已被用完,因为它们已被 HP、IBM 等大公司和
美国的一些大学申请并获得。A 类网络的个数只有 126 个,但每一个网络所能容纳的主机数
却可以达到 16777214(224–2)个,已经申请获得 A 类地址的用户一般并不可能拥有如此庞
大的一个 IP 网络,可以使用子网掩码将一个 A 类网络分成多个子网供不同部门使用,详见
1.3.10 节的“掩码”部分。

1.3.5 B 类 IP 地址

按照 B 类地址的定义,B 类地址的范围为:
128.0.0.0~191.255.255.255
B 类网络地址的范围为:
128.0.0.0~191.255.0.0
B 类网络的总个数为 16384(214)个。
每一个 B 类网络内可以容纳的主机数就是一个 B 类网络地址所容纳的 IP 地址数,例如
网络地址 128.8.0.0 容纳的 IP 地址范围为:
128.8.0.0~128.8.255.255
其中 128.8.0.0 已用于标识整个网络,而 128.8.255.255 被用于标识本网络所有主机,即
它是本网络的广播地址,因此每一个 B 类网络内可以被主机使用的 IP 地址数为(216–2)个。
例如 128.8.0.0 网络内可以被主机使用的 IP 地址的范围为:
第1章 TCP/IP 基础 ·17·

128.8.0.1~128.8.255.254
像 A 类地址资源一样,B 类地址资源目前也已经被用完,它们已经被 Microsoft、Cisco
等大公司以及大学机构申请并得到。

1.3.6 C 类 IP 地址

按照 C 类地址的定义,C 类地址的范围为:
192.0.0.0~223.255.255.255
C 类网络地址的范围为:
192.0.0.0~223.255.255.0
C 类网络的总个数为 2097152(221)个。
每一个 C 类网络内可以容纳的主机数就是一个 C 类网络地址所容纳的 IP 地址数,例如
网络地址 192.8.8.0 容纳的 IP 地址范围为:
192.8.8.0~192.8.8.255
其中 192.8.8.0 已用于标识整个网络,而 192.8.8.255 被用于标识本网络所有主机,即本
网络的广播地址,因此每一个 C 类网络内可以被主机使用的 IP 地址数为 254(28~2)个。
例如 192.8.8.0 网络内可以被主机使用的 IP 地址的范围为:
192.8.8.1~192.8.8.254
C 类地址资源是 Internet 新用户可以申请得到的地址资源,但随着 Internet 的迅速膨胀,
C 类地址资源也面临被用完的危险。Ipv6 的出现可以解决目前面临的 IP 地址资源短缺问题,
详见 RFC3513。

1.3.7 多播 IP 地址(D 类地址)

多播地址的结构如下:
1110**** ******** ******** ********
其中“*”代表 0 或 1,所以多播地址的范围为:
224.0.0.0~239.255.255.255
每一个多播地址用于代表一组特定的主机,称为“多播组”。几个常用的永久的多播地
址如下:
224.0.0.2 本网络内的所有路由器
224.0.0.9 支持 RIP2 的路由器
224.0.0.10 支持 IGRP 的路由器
另外,一个多播组也可以根据需要(如视频会议)临时创建;在支持多播的路由器的帮
助下,任何主机都可以随时加入某个多播组。
本书在第 2 章“多播在 RIP 中的应用”中结合实例介绍了多播地址的使用。关于多播的
更详细信息,请参阅 RFC1112。

1.3.8 其他 IP 地址

除了 A、B、C、D 类地址外,240.0.0.0 至 255.255.255.255 之间的地址除了 255.255.255.255


被用作本网广播地址外,其他地址都没有被规定其具体用途,称为“试验地址”。
·18· Internet 应用协议实例剖析与服务器配置

1.3.9 IP 地址与以太局域网

Internet 是由不同类型、不同规模的局域网通过路由设备连接而成的。要想将一个以太局
域网与 Internet 连接起来,此以太局域网内的每一个接口卡都应该被赋予一个惟一的 IP 地址
(在 Windows 系统中,称这个过程为“将某 IP 地址与某网卡绑定”)
,以太局域网内所有接口
卡的 IP 地址应该属于同一个网络,即它们的网络地址应该相同。
实际上,在没有 IP 地址的情况下,以太网节点之间可以通过 MAC 地址互相通信,我们
为每一个以太接口卡再分配一个 IP 地址的作用是为了让这个局域网与 Internet 上各种其他局
域网通过 IP 协议连接起来。
IP 网络之间必须通过路由器互连,通过路由器连通的 IP 网络可以建立在相同或不同的
通信子网技术之上。一个 IP 包穿过路由器到达另一个 IP 网络时,路由器把 IP 包由一种帧封
装转换到另一种帧封装。路由器把局域网连接起来的方法在 1.5 节中进行具体介绍。

1.3.10 掩码(mask)

按照前面所述的 IP 地址分类原则,一个 IP 地址的哪些位是网络位,哪些位是主机位,


可以通过查看其前几个比特来确定,而掩码的引入却可以打破这种确定性。
与 IP 地址相同,子网掩码也是 32bit,左边是网络位,用二进制数字“1”表示;右边是
主机位,用二进制“0”表示。子网掩码不能单独存在,必须与 IP 地址一起使用,它用于表
示一个 IP 地址的哪些比特是网络位,哪些比特为主机位。例如某主机拥有一个 C 类 IP 地址
202.194.254.138,按 C 类地址的规定,该地址的前 24bit 为网络位,最后 8bit 为主机位。则
默认情况下此 IP 地址对应的掩码为 255.255.255.0,即 IP 地址与掩码的按位“与”操作可以
得到网络地址,如下所述:
点分十进制 二进制
IP 地址:202.194.254.138 11001010 11000010 11111110 10001010
掩码:255.255.255.0 11111111 11111111 11111111 00000000
按位相“与” :11001010 11000010 11111110 00000000
十进制:202 194 254 0
如果在 Internet 上严格地把一个 A 或 B 或 C 类 IP 网络地址所容纳的 IP 地址分配给一个
局域网内的主机,并把各个局域网通过路由器连接起来,则掩码的存在是不必要的;但若试
图把某一 IP 网络地址所容纳的 IP 地址分配给多个局域网时 (例如分配给多个以太网广播域),
则需要用掩码将一个标准的 A 或 B 或 C 类网络分成若干子网。例如,C 类网络 192.168.0.0
可以被掩码 255.255.255.192 分成 4 个子网:
网络地址 掩码 广播地址 主机可用 IP 地址范围
192.168.0.0 255.255.255.192 192.168.0.63 192.168.0.1~62
192.168.0.64 255.255.255.192 192.168.0.127 192.168.0.65~126
192.168.0.128 255.255.255.192 192.168.0.191 192.168.0.129~190
192.158.0.192 255.255.255.192 192.168.0.255 192.168.0.193~254
根据以上划分,可以由 4 个局域网分别构成 4 个 IP 子网(子网一般用“子网地址/掩码”
第1章 TCP/IP 基础 ·19·

表示) ,在为每个子网的每一主机以及与本网相连的路由器接口分配 IP 地址时应同时指定子


网掩码。 (关于路由详见 1.5 节) 。
因为 192.168.0.0/255.255.255.192 子网的网络地址与 C 类网络地址 192.168.0.0 相同,所
以 192.168.0.0/255.255.255.192 子网往往并不被使用。
因为 192.168.0.192/255.255.255.192 子网的广播地址与 C 类网络 192.168.0.0 的广播地址
相同,皆为 192.168.0.255,所以 192.168.0.192/255.255.255.192 子网往往也并不被使用。
所以通过子网划分后,可用 IP 地址减少了,但增加了组网的灵活性。
与将一个标准网络划分为多个子网相反,若需要将多个 C 类网络地址所容纳的 IP
地址应用于规模较大(主机数量超过 254)的局域网时,可以利用掩码将多个 C 类网络
合并成一个超网。例如,若某部门局域网的主机数量超过 254(28 -2)台但低于 510(2 9 -2)
台,并且本部门拥有 192.168.0.0 和 192.168.1.0 两个 C 类网络地址,则可以用掩码
255.255.254.0 将两个 C 类网络地址所容纳的 IP 地址应用于同一个局域网,这个网络的
基本特征如下:
网络:192.168.0.0/255.255.254.0
地址范围:192.168.0.0~192.168.1.255
网络地址:192.168.0.0
广播地址:192.168.1.255
引入掩码的概念后,在表达一个 IP 网络或子网(理想情况下,IP 网络与 IP 子网这两个
概念可以不予区分)的时候总是用“网络地址/掩码”的形式,此处的“掩码”既可以写成点
分十进制形式,也可以用此掩码中“1”的位数来表示。下表罗列出几个网络地址/掩码对与
所对应的网络的 IP 地址范围的对应关系:
网络地址/掩码 IP 地址范围
192.168.0.0/255.255.255.0 192.168.0.0~192.168.0.255
(或 192.168.0.0/24)
192.168.0.128/255.255.255.192 192.168.0.128~192.168.0.191
(或 192.168.0.128/26)
192.168.0.192/255.255.255.192 192.168.0.192~192.168.0.255
(或 192.168.0.192/26)
192.168.0.0/255.255.254.0 192.168.0.0~192.168.1.255
(或 192.168.0.0/23)

1.3.11 私有地址

以下地址被定义为私有地址(Private Address) :
A 类网络地址中的 10.0.0.0
B 类网络地址中的 172.16.0.0~172.31.0.0
C 类网络地址中的 192.168.0.0~192.168.255.0
这些私有地址不会被分配给任何加入 Internet 的组织使用,但任何组织可以在组建
Intranet 时使用这些地址。若使用私有地址的网络试图与 Internet 通信,必须使用一种称为
“NAT(网络地址转换) ”的技术,详见 RFC2663。
·20· Internet 应用协议实例剖析与服务器配置

1.4 ARP 基础与实例剖析

1.4.1 ARP 协议的作用

地址解析协议(ARP,Address Resolution Protocol)实际上是一组协议,它们的功能是帮


助主机把网络层地址解析为链路层地址,例如若通过以太网连接到 Internet 的话,则使用 ARP
协议可以将 IP 地址(32bit)解析为以太网地址(48bit)。本节重点讨论与以太网地址和 IP 有
关的 ARP 协议部分。
ARP 协议在 Internet 的通信子网层和网络层之间起到一个桥梁作用,如图 1-17 所示。

Telnet FTP TFTP „„ 应用层

TCP UDP „„ 传输层

IP&ICMP 网络层

ARP

802.3、802.5、x.25 等 通信子网层

图 1-17 Internet 协议结构

一个以太网节点若要向另外一个以太网节点发送数据,则必须构造如图 1-18 所示的帧。

以太网帧头 数据

目的 MAC 地址 源 MAC 地址 长度/类型

6 Byte 6 Byte 2 Byte

图 1-18 以太网帧基本结构

为了构造这样的帧,必须先得到目的 MAC 地址。但是通常情况下,通信的一方只是知


道对方的 IP 地址或名字(名字可以被转换成 IP 地址,关于名字详见第 4 章“DNS 应用”
),
所以现在需要通过 ARP 协议将对方的 IP 地址转换成对方的 MAC 地址。
第1章 TCP/IP 基础 ·21·

对于以太网来说,若不使用 ARP 代理技术,以太网 ARP 协议只能工作在一个以太网广


播域内。

1.4.2 ARP 包结构

按照 ARP 协议组织起来的符合 ARP 协议规 2 Byte 链路地址类型


则的一段数据称为 ARP 包,为了基于以太网执行
2 Byte 网络层地址类型
ARP 协议,必须将 ARP 包封装在以太网帧中传
递。ARP 包结构如图 1-19 所示。 1 Byte 链路地址长度(m)
以 ARP 包各字段分别描述如下所述。
① 链路地址类型:此字段表示此 ARP 包中 1 Byte 网络层地址长度(n)

涉及的链路地址的类型,例如 0x0001 表示链路地 2 Byte 操作码


址类型为以太网地址。
② 网络层地址类型:此字段表示 ARP 包中 m Byte 发送者链路地址

所要被解析的网络层地址的类型,例如 0x0800
n Byte 发送者网络层地址
表示网络层地址类型为 IP 地址。
③ 链路地址长度:此字段是以字节为单位 m Byte 接收者链路地址

的链路地址的长度值,对于以太网来说,这个值
n Byte 接收者网络层地址
总是为 6。
④ 网络层地址长度:此字段是以字节为单
图 1-19 ARP 包的结构
位的网络层地址的长度值,对于 IP 地址来说,这
个值总是为 4。
⑤ 操作码:此字段表示此 ARP 包的作用,0x0001 表示此 ARP 包是一个问询包,0x0002
表示此 ARP 包是一个应答包。
⑥ 发送者链路地址:此字段表示发送此 ARP 包的主机的链路地址。
⑦ 发送者网络层地址:此字段表示发送此 ARP 包的主机的网络层地址。
⑧ 接收者链路地址:此字段表示应接收此 ARP 包的主机的链路地址。
⑨ 接收者网络层地址:此字段表示应接收此 ARP 包的主机的网络层地址。
ARP 协议包结构的更详细信息可参阅 RFC826。

1.4.3 在以太网帧中封装 ARP 包

在以太网中传递 ARP 包,必须用以太网帧封装 ARP 包,封装了 ARP 包的以太网帧如图


1-20 所示。

目的 MAC 地址 源 MAC 地址 0x0806 ARP 包

长度/类型=0x0806

图 1-20 封装了 ARP 包的以太网帧

以太网帧的长度/类型字段的值为 0x0806 时,代表以太网帧的数据部分封装的是一个


·22· Internet 应用协议实例剖析与服务器配置

ARP 包,收到此帧的操作系统会根据长度/类型字段判断出 ARP 包的存在,并启用相应的处


理程序对其进行具体分析。

1.4.4 ARP 协议的工作过程

假设基于一个以太网广播域组建成了一个 IP 网络,即此广播域内每一主机都被赋予了一
个 IP 地址和相应掩码,且所有 IP 地址的网络位都相同。
当一主机试图和网内的另一主机通信时,要使用 ARP 协议惟一地确定对方的 MAC 地
址,即信息发送方应首先发送一个封装了 ARP 问询包(包中含有对方的 IP 地址)的以太
网广播帧(即目的 MAC 地址为 0xffffffffffff 的以太网帧)。从 1.2 节“以太网基础”可以知
道,目的 MAC 地址为广播地址的帧会被同一个广播域内的所有接口卡接收,并通过与计
算机体系结构相关的某种方式(例如中断方式)将帧传递给操作系统。接收方操作系统收
到广播帧后,可以根据以太网帧的类型字段获知这是 ARP 包,然后可以根据 ARP 包的内
容得知这是一个 ARP 问询包, 并且通过进一步阅读 ARP 包的内容可获得被问询的 IP 地址。
所有的接收者都会将这个被问询的 IP 地址与自己的 IP 地址相比较,若被问询的 IP 地址与
自身的 IP 地址不同,则此 ARP 问询包被操作系统丢弃;若被问询的 IP 地址与自身的 IP 地
址恰好相同,则此计算机的操作系统就会向问询者发回一个 ARP 应答包,告知自己的
MAC 地址。问询方得到对方的 MAC 地址后,会在自己的缓存中增加一条记录,这条记
录包含了一个 IP 地址和一个 MAC 地址的对应关系,此后再与同样一个 IP 地址对应的主
机通信时,不再需要发送 ARP 问询来得知对方的 MAC 地址,而只需从缓存中搜索到相
应的记录即可。
一台主机的 ARP 缓存可以用 arp 命令获得,操作系统一般按照一定的时限来维护 ARP
缓存,即若缓存中的某条记录项长时间未被刷新就会被自动删除。

1.4.5 静态 ARP 项

倘若出于某种目的而希望一个 IP 地址与一个 MAC 地址建立永久静态的对应关系,


则可以使用操作系统的相关命令在系统的 ARP 缓存中手工添加一条 ARP 项,这个项称为
静态 ARP 项,它将会被操作系统保持,不会因任何原因自动删除,例如在 Linux 操作系
统下可以用“arp -s 202.194.254.211 0000B491E66A”为 IP 地址 202.194.254.211 和 MAC
地 址 0000B491E66A 建 立 一 个 静 态 对 应 关 系 ( 在 Windows 操 作 系 统 中 使 用 “ arp -s
202.194.254.211 00:00:B4:91:E6:6A”会产生同样的结果),即在 ARP 缓存中建立了一条静
态 ARP 项,这个项为 IP 地址 202.194.254.211 和 MAC 地址 00:00:B4:91:E6:6A 之间建立
了静态的对应关系。
与静态 ARP 项相对应的就是动态 ARP 项,通过 ARP 问询过程得到的 IP 地址与 MAC
地址的对应关系被放入缓存中,就称为动态 ARP 项。

1.4.6 ARP 代理

通常一个 IP 网络是基于一种通信子网技术组建的,例如基于以太网广播域组建一个
IP 网络。在某些特殊情况下,一个 IP 网络可以基于多种通信子网技术,例如图 1-21 所示
的网络。
第1章 TCP/IP 基础 ·23·

IP 地址:192.168.0.100
拨号服务器
掩码: 255.255.255.0
A B „„„„

I S1 S2 Sn

IP 地址:192.168.0.1 IP 地址:192.168.0.2

掩码:255.255.255.0 掩码:255.255.255.0 „„

Modem Modem Modem


码:255.255.255.0
IP 地址:192.168.0.101

掩码: 255.255.255.0

C Modem

电话网

D Modem

IP 地址:192.168.0.102:

掩码:255.255.255.0

图 1-21 ARP 代理

图 1-21 中所示的拨号服务器有一个以太网接口,这个接口被赋予的 IP 地址和掩码为


192.168.0.100/255.255.255.0,令这个接口的名称为 I,从图上可以看出 I 与主机 A、B 共处于
一个以太网广播域。另外拨号服务器还存在 n 个串行接口分别命名为 S1、S2、„、Sn,每个
串行口通过调制解调器(Modem)与电话网连接,远程计算机 C 和 D 也利用自己的串行口通
过 Modem 与电话网相连,计算机 C 和 D 可以通过拨号与拨号服务器的串行口连通。远程客
户与拨号服务器之间一般采用 PPP(Point to Point Protocol)通信,PPP 协议是一个链路层协
议,它适合运行于物理层为串行线路的网络。
A、B、C、D 四台主机的 IP 地址分别为 192.168.0.1、192.168.0.2、192.168.0.101、
192.168.0.102,掩码皆为 255.255.255.0。从 IP 地址的角度看,A、B、C、D 同属于一个 IP
网络 192.168.0.0/24,它们之间不需借助路由器就应该能够互相通信,但从通信子网的角度出
发却存在两种技术: “以太局域网”和“串行口+PPP”。在这种起情况下,若 A 试图通过 IP
地址与 C 通信,则 A 认为 C 与自己同属于 192.168.0.0/24 网络,因此 A 将发送 ARP 问询广
播试图得到 C 的 MAC 地址,但这个广播被拨号服务器隔断了,实际上 C 的串行口也不存在
一个 MAC 地址,因为这种串行口之间的连接是一对一的,不像以太网那样,在一个广播域
中需要借助 MAC 地址互相区分。那么 A 与 C 之间如何通信呢?一般可以令拨号服务器在接
口 I 上执行 ARP 代理功能,每当一个远程客户通过拨号连通拨号服务器之后,拨号服务器通
过 PPP 协议会得知此远程用户的 IP 地址(实际上远程客户的地址一般是由拨号服务器通过
PPP 协议动态分配的,当然也可以是静态分配的 IP 地址) ,此后每当拨号服务器通过接口 I
收到 A 或 B 发出的针对 C 或 D 的 IP 地址的 ARP 问询广播,拨号服务器就会用自己的接口 I
的 MAC 地址作出回答,即代替拨号用户响应 ARP 问询,此过程对 A 是透明的。
当拨号服务器成功地代替拨号用户响应 ARP 问询后,A 或 B 发向 C 的数据将通过接口
I 发到拨号服务器,拨号服务器将从以太网的帧中分离出高层数据,然后封装在 PPP 帧中,
·24· Internet 应用协议实例剖析与服务器配置

通过相应的串行口发向相应的远程客户。

1.4.7 实例剖析

设某局域网的网络结构如图 1-22 所示,下面以其为例来说明 ARP 的具体工作过程。

A „„ B

IP 地址:202.194.254.138 IP 地址:202.194.254.254

掩码:255.255.255.0 掩码:255.255.255.0

以太网地址:00:00:B4:91:8C:6A 以太网地址:00:00:B7:37:55:00

图 1-22 ARP 实例环境

图 1-22 中所示的 A 和 B 计算机都属于同一个以太网广播域,通过二者的 IP 地址与掩码


设置可知它们属于同一个 IP 网络 202.194.254.0/24。 当 A 试图访问 B, 例如 A 的用户使用 ping
202.194.254.254 命令时,A 首先应该获知 B 的以太网地址,以便将相应的数据包封装成以太
网帧。若 A 曾与 B 有过通信,则缓存中可能会有 B 的以太网地址,此时可以用操作系统提
供的 arp 命令观察以太网地址的缓存情况。以下是在 A 机(Linux)用 arp -n (在 Windows
系列操作系统中可以用 arp-a)命令得到的结果:
Address HWtype HWaddress Flags Iface
202.194.254.247 ether 00:90:27:39:FB:68 C eth0
202.194.254.211 ether 00:00:B4:91:E6:6A C eth0
202.194.254.243 ether 00:90:27:39:F6:22 C eth0
202.194.254.253 ether 00:90:27:39:F6:1E C eth0
202.194.254.252 ether 00:90:27:39:F7:BF C eth0
202.194.254.248 ether 00:90:27:39:F7:72 C eth0
202.194.254.250 ether 00:90:27:39:F7:59 C eth0
202.194.254.238 ether 00:A0:C9:55:3C:33 C eth0
以上结果中并没有出现 Address 值为“202.194.254.254”的行,说明此时 A 并不知道 B
的以太网地址,所以 A 在开始发送执行 ping 命令应该发送的包(ICMP 包)之前,会首先向
所在广播域发出封装了 ARP 问询包的以太网广播帧,询问 202.194.254.254 所对应的以太网
地址。若 B 已开机并正常工作,则 B 会对 A 的询问作出应答;A 获知 B 的以太网地址后方
开始发送执行 ping 命令应该发送的 ICMP 包,同时 A 会缓存 B 的 IP 地址与以太网地址的对
应关系。若此后再用 arp -n 命令观察 ARP 缓存会发现以下结果:
Address HWtype HWaddress Flags Iface
202.194.254.247 Ether 00:90:27:39:FB:68 C eth0
202.194.254.211 Ether 00:00:B4:91:E6:6A C eth0
202.194.254.243 Ether 00:90:27:39:F6:22 C eth0
第1章 TCP/IP 基础 ·25·

202.194.254.253 Ether 00:90:27:39:F6:1E C eth0


202.194.254.252 Ether 00:90:27:39:F7:BF C eth0
202.194.254.254 Ether 00:D0:B7:37:55:00 C eth0
202.194.254.248 Ether 00:90:27:39:F7:72 C eth0
202.194.254.250 Ether 00:90:27:39:F7:59 C eth0
202.194.254.238 Ether 00:A0:C9:55:3C:33 C eth0
通过以上结果可以知道 IP 地址为 202.194.254.254 的主机的以太网 MAC 地址为
00:D0:B7:37:55:00。
若此后 A 再与 B 通信,则在一定的时限内无需再发 ARP 问询。
上述的 ARP 问询和应答过程涉及的两个帧如下所述。
① A 发出的 ARP 问询帧
00000000: ffff ffff ffff 0000 b491 8c6a 0806 0001
00000010: 0800 0604 0001 0000 b491 8c6a cac2 fe8a
00000020: 0000 0000 0000 cac2 fefe
② B 发出的 ARP 应答帧
00000000: 0000 b491 8c6a 00d0 b737 5500 0806 0001
00000010: 0800 0604 0002 00d0 b737 5500 cac2 fefe
00000020: 0000 b491 8c6a cac2 fe8a
以上每一行数据最左边为此行首字节在帧中的偏移地址,例如在 A 发出的 ARP 问询帧
的第 2 行,00000010 表示本行数据是整个帧中从第 0x10 Byte 到第 0x1f Byte 的内容。
此例中两个帧的长度相同,结构也相同,可以用图 1-23 粗略描述。

00 0D 0E 29

以太网帧头 ARP 问询或应答

ARP 包

以太网帧

图 1-23 ARP 问询与应答帧的基本结构

下面对这两个帧进行详细剖析。
1. A 发出的 ARP 问询帧
字节偏移 内容 含义
00~05 ffff ffff ffff 目的以太网地址(广播)
06~0b 0000 b491 8c6a 源以太网地址(A 的以太网地址)
0c~0d 0806 所携带数据为 ARP 包
*******************(以下是 ARP 包的内容)*******************************
·26· Internet 应用协议实例剖析与服务器配置

0e~0f 0001 本包使用的链路地址为以太网地址


10~11 0800 本包使用的网络层地址为 IP 地址
12 06 链路地址的长度为 6 Byte
13 04 网络层地址的长度为 4 Byte
14~15 0001 此包为一个 ARP 问询包
16~1b 0000 b491 8c6a 发送者的以太网地址
1c~1f cac2 fe8a 发送者的 IP 地址(202.194.254.138)
20~25 0000 0000 0000 接收者的以太网地址(只在应答包中有效)
26~29 cac2 fefe 接收者的 IP 地址(202.194.254.254)
因为此帧的目的以太网地址为广播地址,所以广播域内的每台主机的网卡都会接收此帧
并交由操作系统处理,操作系统依据此以太网帧的等 0c~0d Byte 得知此帧携带了 ARP 包,
按照 ARP 协议对 ARP 包进行分析,可得知此包的目的是要问询拥有 IP 地址 202.194.254.254
的主机对应的以太网地址。不拥有 202.194.254.254 地址的主机的操作系统会丢弃此帧,只有
B 会发出应答。
2.B 发出的 ARP 应答帧
字节偏移 内容 含义
00~05 0000 b491 8c6a 目的以太网地址
06~0b 00d0 b737 5500 源以太网地址
0c~0d 0806 所携带数据为 ARP 包
*******************(以下是 ARP 包的内容)*******************************
0e~0f 0001 本包使用的链路地址为以太网地址
10~11 0800 本包使用的网络层地址为 IP 地址
12 06 链路地址的长度为 6Byte
13 04 网络层地址的长度为 4Byte
14~15 0002 此包为一个应答包
16~1b 00d0 b737 5500 发送者的以太网地址
1c~1f cac2 fefe 发送者的 IP 地址(202.194.254.254)
20~25 0000 b491 8c6a 接收者的以太网地址
26~29 cac2 fe8a 接收者的 IP 地址(202.194.254.138)
B 发出的应答帧目的以太网地址是 A 的以太网地址,通常情况下只有 A 的网卡接收此帧
并 把 此 帧 交 由 操 作 系 统 处 理 , 操 作 系 统 根 据 此 帧 的 第 16 ~ 1bByte 获 知 IP 地 址 为
202.194.254.254 的主机对应的以太网地址为 00:d0:b7:37:55:00。操作系统把此对应关系放入
ARP 缓存。
若不存在一台活动的主机的 IP 地址与 ARP 问询的目的 IP 地址相同,则上述的应答帧就
不会出现,而 A 经历一段时间的等待后若得不到任何主机的应答,就会重发 ARP 问询。若
几次重发后仍得不到应答,A 会认为目的主机不存在,并把相应信息显示给用户,例如此例
中若占有 IP 地址 202.194.254.254 的节点未正常工作(例如已关机),则“ping 202.194.254.254”
命令会得到下面的结果:
PING 202.194.254.254 (202.194.254.254): 56 data bytes
第1章 TCP/IP 基础 ·27·

Request timed out.


Request timed out.
......

1.5 IP 协议与路由

Internet 是由许多 IP 网络通过路由器互连形成的目前全世界最大的网络,它可以提供各


种各样的应用,例如信息浏览、文件下载、聊天、游戏、饲养宠物等等。所有这些功能背后
有一个基础,那就是参与 Internet 通信的每一个主机都必须获得一个 IP 地址,任一次 Internet
通信都至少涉及两个 IP 地址,另外,参与 Internet 通信的 IP 地址还必须和一个具体的通信子
网接口设备关联。若某主机有一个以太网接口卡,同时被分配一个 IP 地址与此接口卡关联,
则通常称之为将某 IP 地址绑定在某网卡上。

1.5.1 IP 包结构

按照 IP 协议组织起来的符合 IP 协议规则的一段数据称为 IP 包。
IPv4 协议的包结构如图 1-24 所示。
                                                                                                             

版本号 头长 服务类型 包总长度

标识符 标志 偏移

生存时间 协议 头校验和

源 IP 地址

目的 IP 地址

可选项 填充字节

所携带的数据

图 1-24 IPv4 包结构

各字段的含义如下。
① 版本号:此字段表示本包所遵循的 IP 协议版本。本书只讨论目前占主导地位的 IPv4,
因此此字段的 4 个比特的值总是 0100。
② 头长:此字段表示从版本号开始到填充字节结束的所有 IP 头字段以 4 Byte 为单位的
长度。若某个 IP 包中不包含可选项,则头长字段的 4 个比特总是 0101,表示头长为 5  4=20
Byte。后面将要介绍的填充字节将用来保证 IP 头长为 4 的整数倍。
③ 服务类型:此字段用于表达此数据包在被转发的过程中希望得到怎样的服务。这 8
个比特历经几次重新定义目前仍未得到很好的利用,本书后面各章所使用的实例中此字段全
·28· Internet 应用协议实例剖析与服务器配置

部为零。欲了解其完整定义及其历经的变化请参阅 RFC791、RFC1122 和 RFC1349。


④ 包总长度:此字段表示整个 IP 包的总长度(包括 IP 协议头长和数据的长度) 。
⑤ 包标识符、标志、偏移:此 3 个字段与 IP 包被传递过程中的分段有关。一个 IP 包从
源到达目的的过程中可能要穿过多个路由器,每穿过一个路由器就要进行一次把 IP 包从原来
的帧中分离出来,并封装在另外一个帧中被继续传递的过程。若 IP 包的长度超过了后者帧
最大长度的限制,则路由器就会将此 IP 包所携带的数据分成若干个段,每一段配以完整的
IP 头信息组成多个包,用若干帧分成多次发送。由一个 IP 包分成的多个子包的标识符字段
相同,每个子包的偏移字段指示此子包中所携带数据分段在未分段以前的数据中的以 8
Byte 为单位的偏移量。标志字段的 3 个比特从左到右依次命名为 b2、b1、b0,各个比特作
用如下:
b2——目前尚未使用,通常为 0。
b1——禁止分段标志。若 b1=0 表示此 IP 包可以被分段,b1=1 表示包不能被分段。被禁
止分段的 IP 包若因帧长度无法满足要求而无法穿过某路由器时,路由器将丢弃此包,并返回
一个出错信息。
b0——最后分段标志,有多个子包时最后一个的 b0 才能为 0。
包标识符字段、标志字段、偏移字段 3 个字段共同完成 IP 包的拆分和重组,一般拆分发
生在路由器上,重组发生在目的主机。
⑥ 生存时间:此字段规定了此 IP 包在到达目的以前在网络中的最长停留时间,在
RFC791 中最初规定停留时间以 s 为单位。包被发出时由发送者根据需要设定初始值,途中
经过的每个路由器负责将此字段的值根据已消耗的时间适当减小;若某路由器将此值减为 0,
则此路由器应返回一个“超时”错误,但一个整数一次至少要被减 1,因此目前生存时间字
段的含义实际上已经变成了所允许穿过的路由器的最大个数。IPv6 将此字段的含义明确地改
变成了所允许穿过的路由器的最大个数。
⑦ 协议:此字段指示了本包所携带的数据部分采用的协议。常用的字段值与协议的对
应关系如下:
协议字段的值 对应的协议
0x1 ICMP
0x6 TCP
0x11 UDP
⑧ 头校验和:此字段存放 IP 头的校验结果,具体计算方法在 1.6 节“ICMP 基础与实例
剖析”中给出。
⑨ 源 IP 地址、目的 IP 地址:这两个字段分别表示发送方和接收方的 IP 地址,它们是
路由器工作的根本依据。
⑩ 可选项:此字段是为测试目的而设置的。任一个 IP 包可以包含 0 个、1 个或多个可
选项,选项的格式和每一个选项的含义可参阅 RFC791。

1.5.2 在以太网帧中封装 IP 包

IP 包必须封装在通信子网链路层的帧中才能被一步步传递。封装了 IP 包的以太网帧如
图 1-25 所示。
第1章 TCP/IP 基础 ·29·

目的 MAC 地址 源 MAC 地址 0x0800 IP 包

长度/类型=0x0800

图 1-25 封装了 IP 包的以太网帧

以太网帧的“长度/类型”字段的值为 0x0800,代表以太网帧的数据部分封装的是一个
IP 包,收到此帧的操作系统会根据长度/类型字段判断出 IP 包的存在,并启用相应的处理程
序对 IP 包进行具体分析。

1.5.3 路由器简介

路由器是网络层设备,也是一台计算机,它既可以是为路由选择功能而专门设计的硬件
与相应软件的结合(例如运行 Cisco IOS 操作系统的 Cisco2621 路由器)
,也可以是一台拥有
多个网络接口的普通的台式微机。 路由器可以将多个相同技术或不同技术的局域网连接起来,
在它们之间进行基于 IP 的路由选择,使整个大网络内的任意两个节点之间都可以互相通信。

1.5.4 一台路由器连接多个网络

图 1-26 是路由器的一种简单应用。

I1 I2

路由器

IP 地址:192.168.0.254 IP 地址:192.168.1.254
掩码:255.255.255.0 掩码:255.255.255.0

网络地址:192.168.0.0
网络地址:192.168.1.0

A1 A2 „„ A253 B1 B2 „„ B253

图 1-26 路由器的简单应用

此路由器有两个以太网接口,可以用于连接两个基于以太网的 IP 网络,图中的 I1、I2


即分别代表路由器的两个以太网接口,实际上路由器的每一个以太网接口和桌面计算机的以
太网卡的功能完全相同(当然也有自己的 MAC 地址),因此上图所示的路由器完全可以由
一台普通计算机加两个以太网接口卡和相应的路由软件(例如 Linux 内核中就内嵌有路由
功能)构成,当然上图也可以是配有 Cisco IOS 操作系统的具有两个以太网接口的 Cisco 2621
路由器。
·30· Internet 应用协议实例剖析与服务器配置

在图 1-26 中,A1~A253 分别代表 IP 地址为 192.168.0.1 至 192.168.0.253 的主机,B1~


B253 分 别 代 表 IP 地 址 为 192.168.1.1 至 192.168.1.253 的 主 机 , 它 们 的 掩 码 都 设 为
255.255.255.0,并将 A1~A253 主机的默认网关都设置为 192.168.0.254,将 B1~B253 主机
的默认网关都设置为 192.168.1.254。
对 A1~A253 主机和 B1~B253 主机进行正确配置后,再对路由器的 I1 和 I2 接口进行图
1-26 所示的对 IP 地址和掩码的配置并启用路由器的路由功能,则这两个 IP 网络内的主机就
可以互相通信了。关于如何配置路由器的接口,以及如何启用路由功能等路由器配置功能这
里不作详细讨论,读者必须根据具体设备的配置手册来配置路由器。例如,若此例中的路由
器为 Cisco 2621,则下面的配置过程可以实现上述功能(斜体部分为用户输入信息) ,不熟悉
路由配置的读者可以略过此段。
Router#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#interface FastEthernet 0/0
Router(config-if)#ip address 192.168.0.254 255.255.255.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#interface FastEthernet 0/1
Router(config-if)#ip address 192.168.1.254 255.255.255.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#ip routing
路由器的 I1 接口与 A1~A253 共处于一个以太网广播域,并形成一个 IP 网络
192.168.0.0/24。路由器的 I2 接口与 B1~B253 共处于一个以太网广播域,并形成一个 IP
网络 192.168.1.0/24。路由器正是依赖有多个可以与不同网络相连的接口才能够实现路由
功能。
若同一个 IP 网络内的主机之间利用 IP 地址通信,例如 A1 与 A2 通信,则二者分别向对
方发送一次数据会经历如图 1-27 所示的帧发送过程。

A1→A2 MACA2 MACA1 0x0800 IP 包(目的 IP 地址=IPA2,源 IP 地址=IPA1)

A2→A1 MACA1 MACA2 0x0800 IP 包(目的 IP 地址=IPA1,源 IP 地址=IPA2)

图 1-27 同一网络内通信帧格式

其中 MACA1 和 MACA2 分别表示 A1 主机和 A2 主机的 MAC 地址,IPA1 和 IPA2 则分


别表示 A1 主机和 A2 主机的 IP 地址。
若不同 IP 网络内的主机之间利用 IP 地址通信,例如 A1 与 B1 通信,则二者必须通过路
由器传递 IP 包,一次相互通信过程可以经历如图 1-28 所示的帧。
其中 MACI1 和 MACI2 分别表示路由器 I1 接口和 I2 接口的 MAC 地址。
第1章 TCP/IP 基础 ·31·

A1→I1 MACI1 MACA1 0x0800 IP 包(目的 IP 地址=IPB1,源 IP 地址=IPA1)

A1→B1 I1→I2 IP 包(目的 IP 地址=IPB1,源 IP 地址=IPA1)

I2→B1 MACB1 MACI2 0x0800 IP 包(目的 IP 地址=IPB1,源 IP 地址=IPA1)

B1→I2 MACI2 MACB1 0x0800 IP 包(目的 IP 地址=IPA1,源 IP 地址=IPB1)

B1→A1 I2→I1 IP 包(目的 IP 地址=IPA1,源 IP 地址=IPB1)

I1→A1 MACA1 MACI1 0x0800 IP 包(目的 IP 地址=IPA1,源 IP 地址=IPB1)

图 1-28 不同网络之间通信帧格式

通过以上过程,可以看出主机设置的默认网关实际上是路由器的一个接口,当主机经过
IP 地址与掩码的计算得知对方主机与自身不属于同一个 IP 网络时,便会利用默认网关向外
转发 IP 包。
A1 首先判断目的地址 IPB1 与自己的 IP 地址 IPA1 不属于同一个 IP 网络,因此 A1 组建
一个目的 MAC 地址为 MACI1,源 MAC 地址为 MACA1 的以太网帧,但此帧所封装的 IP 包
的目的 IP 地址却为 IPB1。因为此帧的目的 MAC 地址是 I1 的 MAC 地址,因此 I1 会接收此
帧并交给路由器的操作系统,操作系统将此帧的帧头去掉剥离出 IP 包,根据目的 IP 信息和
路由器自身配置信息,路由器得出“此 IP 包应该从 I2 接口发出”的结论,然后路由器组建
新的帧把 IP 包重新封装并从 I2 接口发出,这个新的帧的源和目的 MAC 地址分别是 MACI2
和 MACB1,但源和目的 IP 地址仍然分别是 IPA1 和 IPB1,这个新的帧会被 B1 的网卡接收
并交由 B1 的操作系统处理,B1 的相应软件会对 IP 包所封装的数据进行分析,并可能随后向
对方发送数据。同样来自 B1 的 IP 包亦会按照与上述类似的步骤传至 A1。
此处 I1→I2 或 I2→I1 的过程是由路由器的操作系统和路由软件完成的,它并不指 IP 包
从一个接口发送到另一个接口,而是指 IP 包从一个缓冲区转移到另一个缓冲区。
这里假设同一个广播域内各主机(包括路由器的各接口)都已经缓存有其他主机的 MAC
地址,否则通信过程中可以根据对方的 IP 地址通过 ARP 协议得到对方的 MAC 地址(详见
1.4 节) 。

1.5.5 一台路由器连接基于不同类型的局域网技术的网络

图 1-26 中所示的两个 IP 网络中若有一个不是基于以太网技术,例如若 192.168.1.0/24 网


络是基于 IBM 令牌环网技术的网络,则除了 B1~B253 主机的局域网接口卡换成令牌环网卡
外,路由器的 I2 接口也要换成令牌环网接口,另外,路由器在转发过程中要实现帧格式的转
换。例如若 A1 与 B1 之间利用 IP 地址进行通信,则二者分别向对方发送一次数据会经历如
图 1-29 所示的帧转换过程。
·32· Internet 应用协议实例剖析与服务器配置

A1→I1 以太网帧头 IP 包(目的 IP 地址=IPB1,源 IP 地址=IPA1)

I1→I2 IP 包(目的 IP 地址=IPB1,源 IP 地址=IPA1)

I2→B1 令牌环网帧头 IP 包(目的 IP 地址=IPB1,源 IP 地址=IPA1)

B1→I2 令牌环网帧头 IP 包(目的 IP 地址=IPA1,源 IP 地址=IPB1)

I2→I1 IP 包(目的 IP 地址=IPA1,源 IP 地址=IPB1)

I1→A1 以太网帧头 IP 包(目的 IP 地址=IPA1,源 IP 地址=IPB1)

图 1-29 不同类型局域网间的 IP 通信

1.5.6 多台路由器连接多个网络

下面仍只以以太网为例,假设所有的路由器接口和主机接口都是以太网接口,如图 1-30
所示。
图 1-30 中有 3 台路由器 R1、R2、R3 并且每台路由器有两个以太网接口(路由器可以有
超过 2 个接口,为了简化问题,这里只使用了两接口路由器) ,整个大网络(这个大网络可以
称之为 Intranet)共由 4 个 IP 网络通过路由器互连而成,每一个 IP 网络都构建在一个以太网
广播域之上,这 4 个 IP 网络分别是 192.168.0.0/24 网络、192.168.1.0/24 网络、192.168.2.0/24
网络和 192.168.3.0/24 网络,其中 192.168.0.0/24 网络节点包括主机 A1~A253 和路由器 R1
的 I1 接口;192.168.1.0/24 网络是一个特殊的网络,它的节点只包括 R1 的 I2 接口和 R2 的 I3
接口,它的作用只是为了连接两个路由器,192.168.1.0/24 网络中的其他 252 个地址被浪费掉
了(其实这种浪费可以通过创建子网来消除,但此处只是为了描述清楚路由的过程,就不再
细分子网) ;192.168.2.0/24 网络的节点包括主机 B1~B252 和路由器 R2 的 I4 接口及路由器
R3 的 I6 接口;192.168.3.0/24 网络的节点包括主机 C1~C253 和路由器 R3 的 I5 接口。设主
机 A1~A253 分别占用 IP 地址 192.168.0.1~192.168.0.253,主机 B1~B252 分别占用 IP 地址
192.168.2.1~192.168.2.252,主机 C1~C253 分别占用 IP 地址 192.168.3.1~192.168.3.253,每
一主机的掩码都设置为 255.255.255.0,A1~A253 主机的默认网关设置为 192.168.0.254,B1~
B252 主 机 的 默 认 网 关 都 设 置 为 192.168.2.254 , C1 ~ C253 主 机 的 默 认 网 关 都 设 置 为
192.168.3.254(通过后面的分析将会看到,B1~B252 主机的默认网关设置为 192.168.2.253
也是可以的) 。
图 1-30 中各个 IP 网络内部的通信因不需路由,在此不再赘述,关于与同一个路由器直
接相连的多个网络的主机之间的通信亦完全可以参考 1.5.4 节所描述的步骤,例如主机 C1 与
B1 之间的通信与 1.5.4 节描述的 A1 与 B1 的通信过程完全相同。
若仍像 1.5.4 节那样只对各个路由器的各个接口地址和掩码进行配置并启用每个路由器
的路由功能,然后来观察一下 A1 与 C1 之间的通信,在 A1 上用“ping 192.168.3.1”命令,
第1章 TCP/IP 基础 ·33·

就会得到一个错误提示“destination unreachable”
,为什么会得到这样的结果呢?

IP 地址:192.168.0.254 IP 地址:192.168.1.254

掩码:255.255.255.0 掩码:255.255.255.0

R1
I1 I2
网 络 地 址 192.168.0.0

网 络 地 址 192.168.1.0

IP 地址:192.168.1.253

掩码:255.255.255.0
网 络 地 址 192.168.2.0
I3 R2 I4
A1 A2 „„ A253
IP 地址:192.168.2.253

掩码:255.255.255.0

IP 地址:192.168.3.254

掩码:255.255.255.0
B1 B2 „„ B252

网 络 地 址 192.168.3.0

I5 R3 I6

IP 地址:192.168.2.254

掩码:255.255.255.0
C1 C2 „„ C253

图 1-30 多台路由器连接多个网络

首先考查将一个 IP 包由 A1 发向 C1 的过程。A1 通过对目的 IP 地址与自己的 IP 地址的


比较得知目的 IP 地址属于另外一个 IP 网络,因此 IP 包首先会被通过默认网关(I1 接口)传
给路由器 R1。在路由器 R1 的命令行管理界面下用“show ip route”命令可以看到以下结果:
192.168.0.0/255.255.255.0 is directly connected, Ethernet0
192.168.1.0/255.255.255.0 is directly connected, Ethernet1
以上结果说明目前 R1 只知道 192.168.0.0/24 网络和 192.168.1.0/24 网络与自己直接相连,而
目的地址 192.168.3.1 并不属于这两个网络,因此 R1 利用 ICMP 协议反向告诉 A1“目的不可达” 。
为 了 解 决 上 述 问 题 可 以 在 R1 的 命 令 行 管 理 界 面 下 使 用 “ ip route 192.168.3.0
255.255.255.0 192.168.1.253”命令,此命令的目的是告诉 R1 若要到达目的网络 192.168.3.0
下一步应当到达 192.168.1.253,而 192.168.1.253 是与 R1 直接相连的网络内的地址,可以从
R1 直接到达,运行此命令后,再次用“show ip route”看一下 R1 的路由表,内容变为:
192.168.0.0/255.255.255.0 is directly connected, Ethernet0
192.168.1.0/255.255.255.0 is directly connected, Ethernet1
·34· Internet 应用协议实例剖析与服务器配置

192.168.3.0/255.255.255.0 via 192.168.1.253, Ethernet1


此结果说明路由表中加了一条关于 192.168.3.0/24 网络如何到达的路由信息,即若要到
达目的网络 192.168.3.0/24 下一步应当到达 192.168.1.253。
同样,为了让从 A1 出发目的为 C1 的 IP 包最终到达 C1,还应该在 R2 上运行“ip route
192.168.3.0 255.255.255.0 192.168.2.254” ,为了让从 C1 发出的目的为 A1 的 IP 包能够到达 A1,
还应该在 R3 上运行“ip route 192.168.0.0 255.255.255.0 192.168.2.253”、在 R2 上运行“ip route
192.168.0.0 255.255.255.0 192.168.2.254” 。
为了使 A1 与 C1 之间的双向通信畅通,最后应该使 R1、R2、R3 的路由表分别为以下内容:
(1)R1 的路由表
192.168.0.0/255.255.255.0 is directly connected, Ethernet0
192.168.1.0/255.255.255.0 is directly connected, Ethernet1
192.168.3.0/255.255.255.0 via 192.168.1.253, Ethernet1
(2)R2 的路由表
192.168.1.0/255.255.255.0 is directly connected, Ethernet0
192.168.2.0/255.255.255.0 is directly connected, Ethernet1
192.168.0.0/255.255.255.0 via 192.168.1.254, Ethernet0
192.168.3.0/255.255.255.0 via 192.168.2.254, Ethernet1
(3)R3 的路由表
192.168.2.0/255.255.255.0 is directly connected, Ethernet1
192.168.3.0/255.255.255.0 is directly connected, Ethernet0
192.168.0.0/255.255.255.0 via 192.168.2.253, Ethernet1
路由畅通后, A1 与 C1 之间各向对方发送一次数据将经历如图 1-31 所示的帧的传递过程。

A1→I1 MACI1 MACA1 IP 包(目的 IP 地址 =IPC1,源 IP 地址=IPA1)

I1→I2 IP 包(目的 IP 地址 =IPC1,源 IP 地址=IPA1)

I2→I3 MACI3 MACI2 IP 包(目的 IP 地址 =IPC1,源 IP 地址=IPA1)

A1→C1 I3→I4 IP 包(目的 IP 地址 =IPC1,源 IP 地址=IPA1)

I4→I6 MACI6 MACI4 IP 包(目的 IP 地址 =IPC1,源 IP 地址=IPA1)

I6→I5 IP 包(目的 IP 地址 =IPC1,源 IP 地址=IPA1)

I5→C1 MACC1 MACI5 IP 包(目的 IP 地址 =IPC1,源 IP 地址=IPA1)

C1→I5 MACI5 MACC1 IP 包(目的 IP 地址 =IPA1,源 IP 地址 =IPC1)

I5→I6 IP 包(目的 IP 地址 =IPA1,源 IP 地址 =IPC1)

I6→I4 MACI4 MACI6 IP 包(目的 IP 地址 =IPA1,源 IP 地址 =IPC1 )

C1→A1 I4→I3 IP 包(目的 IP 地址 =IPA1,源 IP 地址 =IPC1)

I3→I2 MACI2 MACI3 IP 包(目的 IP 地址 =IPA1,源 IP 地址 =IPC1)

I2→I1 IP 包(目的 IP 地址 =IPA1,源 IP 地址 =IPC1)

I1→A1 MACA1 MACI1 IP 包(目的 IP 地址 =IPA1,源 IP 地址 =IPC1)

图 1-31 跨多个路由器的通信
第1章 TCP/IP 基础 ·35·

从上述过程可以进一步看出,尽管一个 IP 包每穿过一个路由器便会被从一个帧中剥离出
来,然后封装在另外一个帧中传递,但 IP 包中的源和目的 IP 地址始终保持不变,不变的目
的 IP 地址正是路由器一步步转发 IP 包的依据。
若网络是由更多的路由器连接而成的,那么对每一个路由器进行路由配置将是一项艰难
的工作,这时最好使用路由协议让各个路由器自动更新路由表。

1.5.7 路由协议(Routing Protocol)

路由协议可以使路由器之间通过单播、广播或多播互相通告自己的路由信息,并学习其
他路由器的路由信息以达到自动维护路由表的功能。常用的路由协议有 RIP(Routing
、IGRP(InterGateway Routing Protocol)
Information Protocol) 、OSPF(Open Shortest Path First)、
BGP(Border Gateway Protocol)等,它们都是应用层协议,在本书的第 2 章“多播在 RIP 中
的应用”中将介绍一个 RIP 实例。适当地使用了路由协议后,前面手工配置路由表的过程就
可以省略掉了,路由协议的具体配置方法请参阅相关资料,本书不再赘述。

1.5.8 路由器的广域连接

若将图 1-30 中 I2 与 I3 接口改为串行口,并通过另外一个独立于 Internet 的 DDN 网络将


I2 与 I3 连接起来,如图 1-32 所示,那么 I2 与 I3 之间的距离就可以达到几百甚至上千公里。

I1 I2

基带 Modem

DDN

基带 Modem

I4 I3

图 1-32 路由器的广域连接

为了在此线路上传递 IP 包,其基本配置和基于以太网的连接类似,只是需要与以太网不
同的链路层封装,例如若通过 DDN 将两路由器的串行接口连接起来(如图 1-32 所示) ,除了
要为两个串行接口配置 IP 地址、为路由器配置路由等信息外,还要指定链路封装协议为高级
数据链路控制规程(HDLC,High level Data Link Control)或点对点协议(PPP,Point to Point
Protocol)等,这是因为串行口只是物理层的设备,不具有对帧的处理能力,不像以太网卡那
样包含了物理层和链路层的功能,因此必须在连接的两端规定相同的帧封装协议才能依赖它
·36· Internet 应用协议实例剖析与服务器配置

转发 IP 包。其他广域连接手段还包括 X.25、帧中继等技术,这里的“串行口+HDLC”或“串
行口+PPP”组成了与“以太网”并列的一种 Internet 通信子网技术。

1.6 ICMP 基础与实例剖析

本节将介绍 IP 的辅助协议——Internet 控制信息协议(ICMP,Internet Control Message


Protocol)的作用和包格式,并通过实例剖析 ICMP 的工作细节。

1.6.1 ICMP 协议与 IP 协议的关系

从封装过程中所处的位置来看,ICMP 协议似乎是比 IP 协议更高层的协议,但实际上从


功能角度出发,它只是 IP 协议的一个补充或辅助协议。ICMP 包必须封装在 IP 包中进行传递。
ICMP 包可用于对 IP 协议进行测试,或用于 IP 通信过程中的差错报告。例如当用 ping
命令测试对方主机是否可达时利用的就是 ICMP 协议的测试功能。当试图访问某地址,而最
终得到“目的不可达”的报告时,往往是途经的某路由器用 ICMP 差错报告包返回的结果。
因为 ICMP 协议可以表达的信息种类很多,因此它有多种不同类型但结构类似的包结构。

1.6.2 ICMP 回应请求包与 ICMP 回应包格式

当用 ping 命令测试对方是否可连通时使
用的就是如图 1-33 所示的这种包格式。 1Byte 类型
图 1-33 中各字段含义如下所述。
1Byte 编号(0)
① 类型:此字段表明包的类型,值为 8
2Byte 校验和
表示是回应请求包,值为 0 表示是回应包。
② 编号:此字段的值目前必须为 0。 2Byte 标识符

③ 校验和:此字段是在校验和字段为 0 2Byte 序列号

时对整个 ICMP 包校验产生的结果,具体计算


过程请参阅本节实例剖析部分。 nByte 数据

④ 标识符:此字段用于帮助软件区分多
次的回应请求与回应,回应包中的标识符必须 图 1-33 ICMP 回应请求与 ICMP 回应包格式

与相应的回应请求中的标识符相同。
⑤ 序列号:此字段与标识符字段的作用相同,可以与之配合使用,创造出特定软件需
要的标识。
⑥ 数据:此字段是不定长的一段任意数据,由回应请求的发送者决定其内容,回应包
的数据字段必须与所对应的回应请求的数据字段内容完全相同。
当一主机试图测试与另一主机是否可以通过 IP 协议通信时,就可以通过 ping 命令向对
方发送 ICMP 回应请求包,对方操作系统若能够正确接收到 ICMP 回应请求包并且未受防火
墙阻拦的话就会反向发回一个 ICMP 回应包,此回应包的标识符字段、序列号字段和数据字
段的内容应该与 ICMP 回应请求包相应字段的内容相同。若测试方能够正确收到此回应包,
就可以认为它与被测试方之间的基于 IP 协议的通信是畅通的。
第1章 TCP/IP 基础 ·37·

大多数系统的 ping 命令都是连续向被测试方发送多个 ICMP 回应请求包,并且利用不同


的标识符字段和序列号字段对它们进行区分,通过计算未收到回应的请求的次数以及发送请
求和收到回应之间的时间间隔来让用户粗略估计双方之间的通信质量。另外,ping 命令所发
送的 ICMP 包的数据字段的长度一般也是可以由用户通过参数指定的。

1.6.3 其他类型 ICMP 包

表 1-1 按照 ICMP 包的类型字段值列出了几种常用的 ICMP 包。

表 1-1 几种常用的 ICMP 包与类型字段值的对应关系


类型字段值 代表 ICMP 包类型

3 目的不可达差错报告

5 网关重定向报告

11 超时差错报告

若路由器从一个接口收到一个需要被转发的 IP 包,但查询路由表后却没有找到到达目的
的路径,便会向此 IP 包的发送者发送类型为“目的不可达差错报告”的 ICMP 包,实际上“目
的不可达”又被细分为由多种原因引起,针对每一种原因都有相应的 ICMP 包子格式,此处
不再一一列举。
在连接了多台路由器的 IP 网络中,当一台主机将 IP 包经由自己的默认网关向外发送时,
有时路由器会通过类型为“网关重定向报告”的 ICMP 包告诉此主机“有一个更好的路径可
供你选择” ,大部分系统会根据此 ICMP 包修改自己的默认网关配置。
一个 IP 包在被路由器转发的过程中,如果生存时间字段的值被减为 0,则将这个字段的
值减为 0 的路由器应该向此 IP 包中的源 IP 地址发送类型为“超时差错报告”的 ICMP 包,
封装这个 ICMP 包的 IP 头的源 IP 地址字段的值为此路由器收到出错 IP 包的接口的 IP 地址。
UNIX 系统的 traceroute 命令(Windows 系统的 tracert 命令)正是利用此功能工作的,traceroute
程序依次向某个 IP 地址发出生存时间字段分别为 1、2„„的 IP 包,根据途径的路由器发回
的超时差错报告便可以得知到达最终目的需要经过的路由器的接口地址,这对于调试网络是
非常重要的。
ICMP 包还有其他许多类型,都是针对 IP 协议的差错报告或路由优化的,此处不再一一
描述。ICMP 的更详细信息可参阅 RFC792、RFC1122 和 RFC1812。

1.6.4 在 IP 包中封装 ICMP 包

在 IP 包中,用协议字段的值来区分 IP 包所封装数据的类型,若协议字段的值为 0x1 则


表示所封装数据为一个 ICMP 包。
一个封装了 ICMP 包的 IP 包经路由器多次转发后到达目的,
目的主机根据 IP 包的头信息中的协议字段判断出 IP 包中所封装的数据为一个 ICMP 包,然
后根据 ICMP 包中的类型字段进一步判断此 ICMP 包的内容的含义。
ICMP 协议规定,若路由器在转发一个封装有 ICMP 差错报告包的 IP 包时出错,则不再
向发出此 ICMP 差错报告包的主机发送报告此次错误的 ICMP 差错报告包,以防止进入差错
报告的无限往复。
·38· Internet 应用协议实例剖析与服务器配置

1.6.5 实例剖析

下面通过对 ping 命令一次执行所产生的帧的剖析详细分析 ICMP 协议的细节。此例使用


的网络结构如图 1-34 所示。

路由器(有两个以太网接口)

接口 1 接口 2

IP 地址:202.194.254.254 IP 地址:202.194.240.254

掩码:255.255.255.0 掩码:255.255.255.0

以太网地址:00:D0:B7:37:55:00 以太网地址:00:C0:32:32:17:6B

A „„ „„ B

IP 地址:202.194.254.138 IP 地址:202.194.240.88

掩码:255.255.255.0 掩码:255.255.255.0

网关:202.194.254.254 网关:202.194.240.254

以太网地址:00:00:B4:91:8C:6A 以太网地址:00:C0:53:42:C3:00

图 1-34 ICMP 实例环境

网络 202.194.254.0/24 通过路由器的以太网接口 1 与路由器相连,路由器的接口 1 所设


置的 IP 地址 202.194.254.254 被设定为 202.194.254.0/24 网络内每一主机的默认网关。
网络 202.194.240.0/24 通过路由器的以太网接口 2 与路由器相连,路由器的接口 2 所设
定的 IP 地址 202.194.240.254 被设定为 202.194.240.0 网络内每一主机的默认网关。
在 A 计算机上执行 ping 202.194.240.88 命令。A 根据自己的 IP 地址与掩码相与运算的结
果得出自己所在的网络为 202.194.254.0/24,与 202.194.240.88 这个目的地址不在同一个 IP
网络内,因此 A 必须通过网关将封装有 ICMP 包的 IP 包转发,在发送 ICMP 包前 A 必须先
获得网关(路由器的以太网接口 1)的以太网地址。在执行 ping 命令前 arp -n 命令的结果为:
Address HWtype HWaddress Flags Iface
202.194.254.211 ether 00:60:94:8A:73:C9 C eth0
202.194.254.254 ether 00:D0:B7:37:55:00 C eth0
通过以上信息可以知道 A 的默认网关(202.194.254.254)所对应的以太网地址已经存在
于 A 的 ARP 缓存中,因此 A 不必先发 ARP 问询,而是直接发出封装了 ICMP 包的 IP 包,
此包应由路由器收到后继续向路由器所连接的另一个 IP 网络(202.194.240.0)转发,并最终
送达 B 计算机。
上述实例中,A 计算机执行 ping 命令时发出和收到的帧的内容如下:
(1)A 发出的 ICMP 回应请求帧
第1章 TCP/IP 基础 ·39·

00000000: 00d0 b737 5500 0000 b491 8c6a 0800 4500


00000010: 0054 a63c 0000 4001 5004 cac2 fe8a cac2
00000020: f058 0800 a8f5 5b03 0000 e255 f914 1f99
00000030: 0e00 0809 0a0b 0c0d 0e0f 1011 1213 1415
00000040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425
00000050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435
00000060: 3637
(2)从路由器发来的来自 B 计算机的 ICMP 回应帧
00000000: 0000 b491 8c6a 00d0 b737 5500 0800 4500
00000010: 0054 de4e 0000 7f01 d8f1 cac2 f058 cac2
00000020: fe8a 0000 b0f5 5b03 0000 e255 f914 1f99
00000030: 0e00 0809 0a0b 0c0d 0e0f 1011 1213 1415
00000040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425
00000050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435
00000060: 3637
以上每一行数据最左边为此行在帧中的偏移地址,例如在 ICMP 回应请求帧的第 2 行,
00000010 表示本行数据是整个帧中从第 0x10 Byte 到第 0x1f Byte 的内容。
A 发出的 ICMP 回应请求帧和从路由器发来的来自 B 计算机的回应帧的基本结构相同,
如图 1-35 所示。
00 0D 0E 21 22 29 2A 61

以太网帧头 IP 头 ICMP 头 ICMP 数据

ICMP 包

IP 包

以太网帧
图 1-35 ICMP 回应请求与回应帧的基本结构

下面分别对这两个帧进行具体的剖析。
1.A 发出的 ICMP 回应请求帧
字节偏移 内容 含义
00~05 00d0 b737 5500 目的以太网地址(网关的以太网地址)
06~0b 0000 b491 8c6a 源以太网地址(A 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
****************(以下是 IP 包的内容)**********************************
0e~0f 0100010100000000 (展开成二进制,十六进制为 4500)
0100 IPv4(IP 版本)
·40· Internet 应用协议实例剖析与服务器配置

0101 IP 包的头长为 5  4=20 Byte


00000000 未指定服务类型
10~11 0054 IP 包总长度
12~13 a63c 标识符
14~15 0000000000000000 (展开成二进制,十六进制为 0000)
000 此包可以被分段,并且这就是最后一段(即未分段)
000000000000 此段的偏移
16 40 生存时间
17 01 此 IP 包所携带数据为 ICMP 包
18~19 5004 头部校验和(详见 1.6.6)
1A~1D cac2 fe8a 源 IP 地址为 202.194.254.138
1e~21 cac2 f058 目的 IP 地址为 202.194.240.88
****************(以下是 ICMP 包的内容)********************************
22 08 此包为 ICMP 回应请求包
23 00 目前必须为 0
24~25 a8f5 校验和(详见 1.6.6)
26~27 5b03 标识符
28~29 0000 序列号
2a~61 ...... 由发送者产生的任意数据
此帧的目的以太网地址是指向自己的默认网关(路由器的接口 1)的,而目的 IP 地址指
向欲到达的 B 计算机。因为此帧目的以太网地址与路由器的接口 1 的以太网地址相同,因此
路由器接收此帧并由路由器的操作系统处理,操作系统根据第 0c~0dByte 得知此帧封装了 IP
包,根据 IP 协议的包格式找到 IP 包中的目的 IP 地址字段,然后路由器根据自己的路由表决
定下一步应如何转发此 IP 包。
尽管在 A 计算机上并不能侦听到路由器把 IP 包重新封装后继续发送的过程,但路由器
必须把此 IP 包的 TTL 做减 1 操作,即 TTL 变为 3f,然后重新计算此 IP 包的头部校验和。
被修改之后的 IP 包被封装在一个新的以太网帧中,这个帧的目的以太网地址为 B 的以太网
地址,源以太网地址为路由器的接口 2 的以太网地址。
B 计算机收到路由器通过接口 2 发来的帧中携带的 IP 包后,根据第 0x17 Byte 得知此 IP 包
携带了 ICMP 包,根据第 0x22 Byte 得知这是一次 ICMP 回应请求。此时 B 计算机会组建出一个
ICMP 回应包,其标识符与序列号与收到的 ICMP 回应请求包的标识符与序列号相同,并把 ICMP
回应请求包中的数据拷贝至回应包中,然后把此 ICMP 包加上相应的 IP 头组成一个 IP 包,再把
IP 包封装成帧发向路由器的接口 2。经过路由器的转发,A 计算机就会收到来自 B 的应答。
2.从路由器发来的来自 B 计算机的 ICMP 回应帧
字节偏移 内容 含义
00~05 0000 b491 8c6a 目的以太网地址(A 的以太网地址)
06~0b 00d0 b737 5500 源以太网地址(网关的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
****************(以下是 IP 包的内容)**********************************
第1章 TCP/IP 基础 ·41·

0e~0f 0100010100000000 (展开成二进制,十六进制为 4500)


0100 IPv4(IP 版本)
0101 IP 包头长为 5  4=20Byte
00000000 未指定服务类型
10~11 0054 IP 包总长度
12~13 de4e 标识符
14~15 0000000000000000 (展开成二进制,十六进制为 0000)
000 此包可以被分段,并且这就是最后一段(即未分段)
000000000000 此段的偏移
16 7f 生存时间
17 01 此 IP 包所携带数据为 ICMP 包
18~19 d8f1 头部校验和(详见 1.6.6)
1A~1D cac2 f058 源 IP 地址为 202.194.240.88
1e~21 cac2 fe8a 目的 IP 地址为 202.194.254.138
****************(以下是 ICMP 包的内容)********************************
22 00 此包为 ICMP 回应包
23 00 目前必须为 0
24~25 b0f5 校验和(详见 1.6.6)
26~27 5b03 标识符
28~29 0000 序列号
2a~61 ...... A 产生的任意数据的拷贝
A 收到从路由器发来的来自 B 计算机的 ICMP 回应后,首先将 IP 包从以太网帧中剥离出
来,根据 IP 包的协议字段判断出此 IP 包所封装的数据是一个 ICMP 包,并从 IP 包中剥离出
ICMP 包,然后根据 ICMP 包中的类型字段判断出此包是一个 ICMP 回应包,再根据对方的
IP 地址以及 ICMP 包的标识符和序列号字段的值,操作系统就可以判断出此 ICMP 包是哪一
个 ICMP 回应请求包的回应,并决定下一步的动作。
此帧所封装的 IP 包的头信息中的生存时间字段的值为 0x7f,显然 B 将这个 IP 包发向 B
的网关时,此字段的值应该是 0x80,是路由器将此 IP 包继续通过以太网接口 1 向外转发之
前对它进行了减一操作,即 0x80–1=0x7f。
另外也可看到 ICMP 回应请求包的初始生存时间与 ICMP 回应包的初始生存时间是不同
的,它们分别是 0x40 和 0x80,也就是说这个字段的初始值完全由此包的发送者根据需要确定。

1.6.6 校验和的计算

TCP/IP 协议中常用的校验和的计算方法是先将校验和字段清零,然后把被校验的所有字
节排列起来, 若总字节数为奇数则用值为 0 的字节补成偶数字节,然后每两字节作为一个 16bit
整数,所有字节组成一个整数序列 n1、n2、n3.....,然后让这个序列依次累加,每一次累加若
产生了向第 17bit 的进位,则把此进位作为整数 1 累加到剩余 16bit 组成的整数,最后得到的
结果按位取反即为校验和。
下面分别计算 1.6.5 节中 IP 头校验和与 ICMP 校验和。
·42· Internet 应用协议实例剖析与服务器配置

1.IP 头校验和的计算
按照上述算法来计算 A 发向 B 的 IP 头校验和,依次执行以下步骤:
(1)确定要被校验的字段,组成一个字节序列,按照 IP 协议的要求,被校验字段是所有
的 IP 头字段(计算前先把校验和字段清零) ,如下所示。
4500 0054 a63c 0000 4001 0000 cac2 fe8a cac2 f058
(2)确定要被校验的字节数,此例中被校验的是第 0e~21 Byte,共 20(十进制)Byte,
总字节数为偶数,不需补零。
(3)累加所有整数,为了计算方便,先把所有整数累加后,再将所有进位一次截取加到
剩余 16 位整数上。
4500+0054+a63c+0000+4001+0000+cac2+fe8a+cac2+f058=4aff7
aff7+4=affb
(4)将结果取反: ~affb=5004。
(5)将结果 5004 填写到校验和字段。
最后得到的结果 5004 与我们实际看到的由 A 发出的 ICMP 回应请求帧的 18~19 字节吻合。
2.ICMP 包校验和的计算
以 A 发向 B 的 ICMP 包为例看一下 ICMP 校验和的计算,依次执行以下步骤:
(1)确定要被校验的字段,组成一个字节序列,按照 ICMP 协议的要求被校验字段是所
有的 ICMP 包字段(计算前先把校验和字段清零) ,如下所示。
0800 0000 5b03 0000 e255 f914 1f99 0e00
0809 0a0b 0c0d 0e0f 1011 1213 1415 1617
1819 1a1b 1c1d 1e1f 2021 2223 2425 2627
2829 2a2b 2c2d 2e2f 3031 3233 3435 3637
(2)确定要被校验的字节数,此例中被校验的是第 0x22~0x61 Byte,共 64(十进制)
Byte,总字节数为偶数,不需补零。
(3)累加所有整数,为了计算方便,先把所有整数累加后,再将所有进位一次截取到剩
余 16 位整数上。
0800+0000+5b03+0000+e255+f914+1f99+0e00
+0809+0a0b+0c0d+0e0f+1011+1213+1415+1617
+1819+1a1b+1c1d+1e1f+2021+2223+2425+2627
+2829+2a2b+2c2d+2e2f+3031+3233+3435+3637=55705
5705+5=570a
(4)将结果取反: ~5709=a8f5。
(5)将结果 a8f5 填写到校验和字段。
最后得到的结果 a8f5 与实际看到的由 A 发出的 ICMP 回应请求帧的第 24~25 Byte 吻合。

1.7 UDP 与 TCP 基础

用户数据报协议(UDP,User Datagram Protocol)与传输控制协议(TCP,Transmission


第1章 TCP/IP 基础 ·43·

Control Protocol)是重要的 Internet 传输层协议,TCP 是面向连接的传输层协议,而 UDP 是


非面向连接的传输层协议。
UDP 和 TCP 可以实现对 IP 协议的多路复用,它为参与通信的双方进程提供基本的数据
传输控制。

1.7.1 端口号

端口号是在传输层实现对网络层 IP 协议多路复用的重要机制,通过前面内容可以知道,
一个 IP 包可以携带任意的数据从 Internet 任一节点出发,穿过若干路由器到达目的(这里的
“目的”是由 IP 包中的“目的 IP 地址”字段指定的) 。一个 IP 包所携带的数据可以是一个 ICMP
包或 TCP 包或 UDP 包。目前 Internet 上已经存在大量的应用层协议和相应的遵循这些应用层
协议的应用程序,大多应用层协议是依赖 UDP 或 TCP 的。在一台主机上可能同时有多个进
程运行于 TCP 或 UDP 之上,这些进程都与一个惟一的 TCP 或 UDP 端口号相对应。
端口号是 16bit 的数字资源,一个参与 Internet 通信的基于 UDP 或 TCP 的应用进程在与
对方进程通信之前实际上都会首先向主机的操作系统申请获得一个 TCP 或 UDP 端口号,这
个端口号在本主机中必须是惟一的(数值相同的 TCP 端口号和 UDP 端口号是两个不同的端
口号) ,一个应用进程根据自己是依赖 TCP 还是依赖 UDP 来决定是向操作系统申请 TCP 端
口号还是申请 UDP 端口号。当通信双方的进程都获得了自己的端口号之后,就可以组建 UDP
或 TCP 包来封装自己的数据,并用 IP 封装 TCP 包或 UDP 包后发向目的主机,并在所组建
的 UDP 或 TCP 包中包含有目的端口号和源端口号以区分主机上的进程。IP 地址惟一确定了
一台主机,而端口号惟一确定了一台主机上的一个进程。
使用 UDP 或 TCP 通信时,双方进程中至少应该有一方事先获得对方进程的端口号,并
主动向对方发起通信,依赖 UDP 或 TCP 包中所包含的源端口号信息让对方获知自己的端口
号,Internet 上主动发起通信的一方称为“客户方” ,而被动等待的另一方称为“服务器方”。
大部分情况下客户方与服务器方应用程序并不是由同一个公司开发,例如 WWW 服务器程序
和 WWW 浏览器程序往往由许多软件开发公司分别开发,为了让这些应用标准化,除了制定
相应的应用层协议外,Internet 协会还为不同的协议指定了固定的端口号,这些端口号大多是
为服务器方指定的,也有某些特殊协议的客户端也被指定了固定端口号。常用的指定端口号
见表 1-2。

表 1-2 常用的指定端口号
协 议 名 称 端 口 号

FTP-data TCP 20

FTP-control TCP 21

TELNET TCP 23

SMTP TCP 25

DNS TCP/UDP 53

DHCP-SERVER TCP/UDP 67
·44· Internet 应用协议实例剖析与服务器配置

续表
协 议 名 称 端 口 号

DHCP-CLIENT TCP/UDP 68

HTTP TCP 80

RIP UDP 520

POP3 TCP/UDP 110

上述端口号中,DHCP 协议的服务器方和客户方都被指定了端口号,分别为 67 和 68。


另外 RIP 协议的客户方和服务器方都使用端口号 520。上表所列的其他端口号都仅用于服务
器方,其中 FTP 协议服务器方占用了两个端口号,分别用于数据通道和控制通道。
所有数值小于 1024 的端口号被保留下来用于分配指定端口号,任一个被指定了端口号
的进程在进行网络通信前都应该向操作系统申请获得此端口号,若此端口号已被其他进程占
用,例如被执行同一种服务的另外一个服务进程占据,则此进程会因无法获得指定的端口号
而运行失败。一般的客户方进程并不要求操作系统分配某个指定的端口号,而是希望获得任
意一个惟一的端口号, 操作系统一般会从大于或等于 1024 的端口资源中随机为这样的进程分
配端口号。

1.7.2 UDP 基础

UDP 是非面向连接的 Internet 传输层协议,像 DNS、DHCP、RIP 等应用层协议一般都


借助于 UDP 协议进行通信。
UDP 包的格式非常简单,如图 1-36 所示。

0 15 16 31

源端口号 目的端口号
源端口号
包长度 校验和

数据

图 1-36 UDP 包格式

图 1-36 中各字段的含义如下:
① 源端口号,此字段的长度为 2Byte,它表示发送此 UDP 包的进程占用的本地 UDP 端
口号。
② 目的端口号,此字段的长度为 2Byte,它表示目的主机上接收此 UDP 包的进程的 UDP
端口号。
③ 包长度,此字段占 2Byte,它表示整个 UDP 包的以字节为单位的长度。
④ 校验和,此字段占 2Byte,它是根据一个 UDP 伪头和将校验和字段清零后的 UDP 包
计算得到的,详细计算方法与 1.6.6 一节描述的计算方法完全相同,这里用到的伪 UDP 头是
第1章 TCP/IP 基础 ·45·

根据封装本 UDP 包的 IP 包的头信息构建的,如图 1-37 所示。

0 15 16 31

源 IP 地址

目的 IP 地址

0 0x11 UDP 包长度

图 1-37 UDP 伪头

在第 4 章“DNS 应用”中将通过一个实例完整计算一个 UDP 包的校验和。


⑤ 数据字段,此字段的长度随包长度字段的变化而变化。
UDP 的详细信息请参阅 RFC768。

1.7.3 在 IP 包中封装 UDP 包

在 IP 包中用协议字段的值来区分 IP 包所封装数据的类型,若协议字段的值为 0x11 则表


示所封装数据为一个 UDP 包。一个封装有 UDP 包的 IP 包经路由器多次转发后到达目的,目
的主机根据 IP 包头信息中的协议字段判断出 IP 包所封装的数据为一个 UDP 包,然后根据
UDP 包中的目的 UDP 端口号进一步判断此 UDP 包应该让哪一个进程处理,进程根据相应的
应用层协议去分析 UDP 包中所封装的数据。

1.7.4 TCP 基础

TCP 是面向连接的 Internet 传输层协议,像 FTP、HTTP、SMTP、POP3、TELNET 等应


用层协议一般都借助于 TCP 进行通信。TCP 包结构如图 1-38 所示。
0 15 16 31
源端口号 目的端口号

序列号

确认号

数据偏移 保留位 控制位 窗口大小

校验和 紧急指针

选项 填充

数据

图 1-38 TCP 包格式

TCP 包各字段含义如下:
① 源端口号、目的端口号,这两个字段的长度都为 2Byte,分别表示发送和接收此 TCP
包的进程占用的 TCP 端口号。
·46· Internet 应用协议实例剖析与服务器配置

② 序列号,此字段长度为 4Byte,用于表示此 TCP 包中所携带的数据在本次连接中发送


方所发送的所有数据中的顺序编号。
③ 确认号,此字段长度为 4Byte,用于表示要求对方下次发送的数据在本次连接中的编
号,同时也表示对此编号之前的数据的确认。
④ 数据偏移,此字段的长度为 4bit,表示 TCP 头的以 4Byte 为单位的长度,实际上也
是数据字段在整个 TCP 包中的偏移地址。
⑤ 保留位,此字段长度为 6bit,被保留用于将来的扩展,目前,它的每个比特的值必须
为 0。
⑥ 控制位,此字段长度为 6bit,从左到右每个 bit 分别被命名为紧急指针位(URG,Urgent
Pointer field significant:用于表示“紧急指针”字段是否有效,0 表示无效,1 表示有效) 、确
认位(ACK,Acknowledgment field significant:用于表示“确认号”字段是否有效,0 表示
无效,1 表示有效) 、推送位(PSH,Push Function:若推送位为 1,则表示需要接收方的操
作系统把此 TCP 包所携带的数据立刻交给相应的应用程序处理,而不是先缓存至一定数量字
节后一并交给应用程序处理) 、复位位(RST,Reset the connection:复位位为 1 表示发送方
要求此次连接复位) 、同步位(SYN,Synchronize sequence numbers:双方进程建立连接时,
一方向另一方发送的第一个 TCP 包的同步位为 1,表示此 TCP 包用于初始化序列号字段)、
结束位(FIN,No more data from sender:结束位为 1 表示发送者要求结束本次连接) 。
⑦ 窗口大小,此字段的长度为 2Byte,由此 2Byte 构成一个整数,这个整数用于通知对
方,在两次确认之间最多连续发送数据的字节数,这是 TCP 的一种重要的流量控制功能。
⑧ 校验和,此字段是根据一个 TCP 伪头和将校验和字段清零后的 TCP 包计算得到的,
这里用到的伪 TCP 头是根据封装本 TCP 包的 IP 包的头信息构建的,如图 1-39 所示。

0 15 16 31

源 IP 地址

目的 IP 地址

0 0x6 TCP 包长度

图 1-39 TCP 伪头

⑨ 紧急指针,当紧急指针位为 1 时,紧急指针字段用于指向 TCP 包中包含的紧急数据,


紧急指针指向紧急数据的下一个字节。
⑩ 选项,此字段是由 0 个、1 个或多个选项构成,每一个选项可以仅由一个表示选项类
型的字节组成,也可以由“一个字节的选项类型一个字节的选项长度其他字节”组成,这
里的“选项长度”的值包括“选项类型”和“选项长度”占据的两个字节。常用的几个 TCP
选项见表 1-3。
“空选项”一般用于两个非“空选项”之间以实现各个选项的字对齐。
“TCP 包最大长度”选项只用于同步包中,用以通知对方自己支持的最大 TCP 包大小。
“窗口大小度量”选项用于通知对方 TCP 包中的“窗口大小”字段的值是将原值右移若
干位形成的,接收方应将其左移后方可得到正确的“窗口大小”字段值,这样做的目的是充
第1章 TCP/IP 基础 ·47·

分利用两字节的“窗口大小”字段表达任意大小的“窗口大小”值,具体的移动位数由选项
的“其他字节”指定。

表 1-3 常用的 TCP 选项


选 项 类 型 名 称

1 空选项

2 TCP 包最大长度选项(RFC793)

3 窗口大小度量选项(RFC1323)

4 发送方支持“选择性确认”选项(RFC1072)

8 时间标签选项(RFC1323)

“发送方支持选择性确认”选项的作用是通知对方自己支持“选择性确认”机制。当使
用 TCP 传输大批量数据时,若中间出现丢包现象,“选择性确认机制”可以允许接收方具体
指定哪一部分需要重传,而不是要求对方把丢失的部分及其之后的所有字节全部重传。在不
支持“选择性确认机制”的情况下,采用简单的“确认号”机制来要求对方从某字节开始重
传,会造成大量不必要的重传。
“时间标签”选项的目的是在 TCP 包中携带一个发送方的时间标记,同时,在 TCP 包中
“确认号”有效的情况下,时间标签也用于反馈对方与被确认数据相关的时间标记。
上述选项的使用细节请读者直接参阅本书第 6 章“WWW 应用”。TCP 的详细信息请参
阅 RFC793。

1.7.5 在 IP 包中封装 TCP 包

在 IP 包中,
“协议”字段的值来区分 IP 包所封装数据的类型,若协议字段的值为 0x6 则
表示所封装数据为一个 TCP 包。一个封装了 TCP 包的 IP 包经路由器多次转发后到达目的,
目的主机根据 IP 包头信息中的“协议”字段的值判断出所封装的数据为一个 TCP 包,然后
根据 TCP 包中的目的 TCP 端口号进一步判断此 TCP 包应该让哪一个进程处理,并由进程根
据相应的应用层协议去分析 TCP 包中所封装的数据。

1.7.6 基于 UDP 和 TCP 的通信过程

UDP 是非面向连接的传输层协议,它不提供以让双方的数据传输实现顺序性的相应机制
(即不保证发送的顺序与接收的顺序相同) ,也不保证数据传输的正确性(即不能自动进行丢
包检测),应用程序只能在应用层实现这些功能。此外,UDP 也不提供流量控制功能。
TCP 是面向连接的传输层协议,基于 TCP 的通信过程涉及 3 个基本步骤:建立连接、数
据传输、结束连接。其具体过程是:在正式传输应用层数据之前先要在通信双方进程之间建
立连接,协商双方的起始序列号,然后开始传输应用层数据。每一个 TCP 包都依赖“序列号”
字段来为它所携带的数据的每一个字节编号以实现接收方的正确排序,另外每一个 TCP 包都
可以通过“确认号”字段对已经正确接收了的数据予以确认,若一方在接收数据过程中根据
序列号检测到数据包的丢失,则自动通过确认号要求对方重发丢失的数据,这个重发操作对
·48· Internet 应用协议实例剖析与服务器配置

应用程序是透明的,另外通过改变窗口大小,TCP 协议可以进行数据传输过程中的流量控制。
当数据传输完毕,任一方都可以主动发送连接结束请求使整个通信过程进入结束连接步骤。
1.TCP 连接的建立
TCP 连接的建立过程一般被称为“三次握手” ,即双方之间需要用 3 个特定格式的 TCP
包协商连接初始参数。这 3 个步骤具体如下所述。
(1)客户方向服务器方发送同步包。所谓同步包即“同步位”为 1 的 TCP 包,客户方向
服务器方发送的同步包中的序列号称为客户方的初始序列号。为了防止特殊情况下的序列号
冲突,初始序列号一般不是从 0 开始,而是由操作系统的协议代码按照一定的规律产生,详
细讨论请参阅 RFC793 中的“3.3 Sequence Numbers”这一节,这里假设这个初始序列号的
值为 SYN_CLIENT;客户方向服务器方发送的同步包中的“确认号”总是无效,即确认位总
为 0。客户方向服务器方发送同步包尽管不携带正式数据,但是按照 TCP 的要求应该把被置
位的同步位当成一个字节进行计算。
(2)服务器方向客户方发送同步包。服务器方收到客户发来的同步包后,若系统允许建
立连接则应该向客户方发送同步包。这个包中的同步位也应为 1,序列号字段的值称为服务
器方的初始序列号,这里假设它的值为 SYN_SERVER。服务器方向客户方发送的同步包中的
确认位为 1,表明确认号有效,而且确认号的值总是 SYN_CLIENT+1,这个值是对客户方发
来的初始序列号的一个确认,实际上是把同步位当成一个字节的数据予以确认,它告诉对方,
当正式开始传输数据时请从 SYN_CLIENT+1 开始编号。服务器方向客户方发送的同步包中
不携带正式数据,但它的被置位了的同步位将被当成一个字节予以确认。
(3)客户方向服务器方发送确认包。当客户方收到服务器方发来的同步包后,会发送确
认包对服务器方的初始序列号予以确认。这个 TCP 包的同步位为 0,序列号的值为
SYN_CLIENT+1 , 表 明 若 本 TCP 包 中 携 带 有 数 据 的 话 , 则 数 据 的 首 字 节 编 号 为
SYN_CLIENT+1,其他字节类推(实际上在大多操作系统的协议实现中,这个包是不携带数
据的) ;这个包的确认位应该为 1,且确认号为 SYN_SERVER+1,这个值是对服务器方发来
的初始序列号的一个确认,实际上是对同步位所代表的一个字节的确认,它告诉对方,当正
式开始传输数据时请从 SYN_SERVER+1 开始编号。
对于依赖操作系统的 TCP 功能的应用程序来说,建立连接的过程只是一个调用以对方的
IP 地址和 TCP 端口号等为参数的函数的过程而已,实际上是操作系统完成了上述的连接建立
的步骤。
2.TCP 数据传输
TCP 连接建立后,客户方和服务器方从 TCP 角度看实际上已经处于平等地位,任一方都
可以在任意时刻向对方发送数据,当然这些数据都封装在 TCP 包中,并且 TCP 包是被封装
在 IP 包中的。假设客户方自连接建立完毕后先后向服务器方发送了多个 TCP 包,这些包中
所 封 装 的 数 据 字 节 数 分 别 是 n1 、 n2 、 n3 „ , 则 这 些 TCP 包 中 的 序 列 号 值 应 分 别 为
SYN_CLIENT+1、SYN_CLIENT+1+n1、SYN_CLIENT+1+n1+n2„,服务器方根据序列号值
将数据排序。实际上这个排序过程是由操作系统完成的,应用程序通过操作系统的接收函数
所接收到的数据是已经排序了的数据,若客户发向服务器的某个 TCP 包丢失,则服务器会通
过序列号的不连续觉察出数据包的丢失。当然,序列号的暂时不连续并不代表 TCP 包一定已
经丢失,因为携带 TCP 包的 IP 包的接收顺序和发送者的发送顺序不一定是相同的,这种不
第1章 TCP/IP 基础 ·49·

相同往往是因为不同的 IP 包经过的路径不同造成的,所以操作系统一般都是在等待足够长时
间后才认为数据已丢失。
对于客户方发向服务器方的数据,服务器应该利用确认号予以确认,而且这种确认也是
操作系统完成的。对于前面假设的客户向服务器发送的分别携带了 n1、n2、n3„个字节数据
的 TCP 包,服务器方可以分别予以确认,每一个确认包的确认号字段的值将分别是
SYN_CLIENT+1+n1、SYN_CLIENT+1+n1+n2、SYN_CLIENT+1+n1+n2+n3„,若中间出现
了丢包现象,则服务器方的确认值可能会出现重复。确认号用于表示此编号之前的数据已经
正确接收,同时也表示要求对方下次发送的数据的编号,若客户方收到一个确认号的值小于
客户方已经发出的所有字节中最后一个字节的编号,就会将其理解为对方没有收到确认号所
代表的字节之后的字节,之后将等待确认或重新发送这些字节。实际上服务器发向客户的确
认包中可以同时携带有服务器发向客户的数据,只要用正确的序列号标识这些数据即可。另
外若服务器在接收客户发来的数据的同时并没有向客户发送数据的需要,则不一定要对客户
发来的每一个包予以确认,因为这样的确认包纯粹是为了确认,不携带任何数据。服务器方
完全可以连续收到多个数据包后对所有收到的字节进行一次确认,而客户方在未得到服务器
方的确认之前最多可以连续发送多少字节取决于服务器发向客户的 TCP 包中窗口大小字段
的值。
前面描述的是客户方发送数据而服务器方接收数据的情况下发送和确认的过程,实际上
TCP 连接建立完毕后,客户方与服务器方的地位是平等的,双方数据的发送和确认是同时进
行的,至于什么时候哪一方发送数据,完全取决于应用程序的需要。
操作系统根据 TCP 协议为应用程序构造出一条面向字节流的通道,应用程序只需源源不
断地调用操作系统的发送函数将要发送的字节流交给操作系统,由操作系统对这些字节编号、
发送,并由操作系统应对方的要求重发某一段数据,即操作系统会一直缓存应用程序交付的
尚未得到对方确认的数据。而对于数据接收方的应用程序来说,它只需不断地调用操作系统
的接收函数获得对方发来的数据,而且应用程序接收到的数据的排列顺序必定和发送者的发
送顺序相同,当然,大多应用程序既是数据发送方也是数据接收方。
3.TCP 连接的结束
TCP 连接的任一方的操作系统都可以随时根据应用程序的要求向对方发出结束位被置位
的 TCP 包,以要求与对方断开连接。对方收到结束位被置位的 TCP 包后,会把被置位的结
束位当成一个字节予以确认,并且在将缓存中的字节流发送完毕后也向对方发出结束位被置
位的 TCP 包,这个 TCP 包同样也要得到确认,这时 TCP 连接就彻底结束了。
本书第 6 章“WWW 应用”中包含对使用 TCP 协议通信的过程进行帧剖析的一个实例。
第2章 多播在 RIP 协议中的应用

2.1 RIP 协议基础

路由信息协议(RIP,Routing Information Protocol)是一种路由协议,它是 Internet 应用


层协议,一般基于传输层的 UDP 协议进行通信,其服务器方和客户方都使用 UDP 端口号 520
(十进制) 。本章将以 RIPv2 为例介绍 RIP 协议的基本内容,并介绍了如何利用多播技术将
RIP 信息的接收范围限定为特定网络内所有支持 RIP 协议的路由设备。
RIP 对于大部分网络用户来说都不是一个经常直接使用的协议,本章之所以介绍 RIP 协议
并进行实例分析,一个重要原因在于 RIPv2 需要利用链路层和网络层的多播(multicast)功能,
为了让读者更清楚的认识“多播”这一重要的网络功能,就以 RIP 协议为例组织了本章。

2.1.1 RIP 协议的作用

在第 1 章中已经介绍了路由器与路由的基本概念,Internet 路由器依照路由表对来自某
接口的 IP 包进行转发。路由表可以手工建立,此时称为“静态路由”。但是,当网络达到
一定规模后,在每一路由设备上分别设置静态路由将是一件非常复杂的任务,而适当地使
用路由协议,例如 RIP 协议,则可以解决这个问题。路由协议可以使路由器之间通过单播、
广播或多播互相通告自己的路由信息,并学习其他路由器的路由信息以达到自动维护路由
表的目的。
当一台路由器刚刚启动时,路由器的路由表项中只有静态项和直接相连的 IP 网络信息,
若路由器被配置为在某接口上执行 RIP 协议,则本路由器的路由表会被定期地(默认为 30s)
从这个接口发出,并且从这个接口收到的来自其他路由器的路由表信息会被路由器分析和利
用以更新自己的路由表。另外路由器也可以主动地向另外的路由器发出 RIP 请求,要求得到
对方的路由信息,本章不讨论这种情况,请读者参阅 RFC1058。

2.1.2 RIP 包格式

RIPv2 数据包格式如图 2-1 所示,其中命令字段、版本字段和未用字段组成了 RIP 包的


头部,其他部分是由一条或多条路由信息组成的,每一条路由信息都由地址类别标识、路由
标识、IP 地址、掩码、下一跳地址和跳数(Metric)字段组成。各字段的含义如下所述。
① 命令字段:该字段的长度为 1Byte,其值为 1 时表示本 RIP 包是一个请求包,其值为
2 时,表示本 RIP 包是一个应答包(包括路由器定期主动发出的 RIP 包)。
② 版本字段:版本字段的长度为 1Byte,RIPv2 包的此字段的值总是 2。
③ 未用字段:该字段的长度为 2Byte,它的值总是零。
·52· Internet 应用协议实例剖析与服务器配置

   
     
                                     

命令  版本 未用字段

地址类别标识 路由标记

IP 地址 一

掩码 路


下一跳地址 息

跳数

N 条路由信息

图 2-1 RIPv2 数据包格式

④ 地址类别标识字段:该字段的长度为 2Byte,目前只有一个有效值 2,表示地址类别


为 IP 地址。
⑤ 路由标记字段:该字段的长度为 2Byte,当本 RIP 包中所携带的路由信息是发送此包
的路由器通过另外的路由协议习得的(例如通过 BGP 协议获得的),则此字段应带有与协议
(例如 BGP 协议)相关的标记,若互相传递路由信息的路由器都只执行 RIPv2,则此字段的
值总为 0。
⑥ IP 地址字段:该字段的长度为 4Byte,它表示本条路由信息中的目的 IP 地址信息,
既可以是一个主机地址也可以是一个网络地址。
⑦ 掩码字段:该字段的长度为 4Byte,与 IP 地址结合起来以完整地表达一个主机地址
或一个 IP 网络。
⑧ 下一跳地址字段:该字段的长度为 4Byte,它的值是一个 IP 地址,它表示从接收此
RIP 包的路由器出发,若要到达由 IP 地址字段和掩码字段所表达的主机或网络,下一步可以
把 IP 包转发至哪一个地址。若此字段的值为零,表示下一跳 IP 地址为携带本 RIP 信息的 IP
包的源 IP 地址。
⑨ 跳数字段:该字段的长度为 4Byte,其值为发送此 RIP 包的路由器与用 IP 地址与掩
码字段所表达的 IP 网络之间的以跳数为单位的距离。若某 IP 网络直接与发送此 RIP 包的路
由器相连,则发送此 RIP 包的路由器到达此网络的跳数定义为 1,若路由器到达某 IP 网络需
穿过另外一个路由器,则路由器与此网络的步数为 2,其他跳数值的含义依此类推。RIP 协
议用大于或等于 16 的跳数值表示“目的不可达” ,即 RIP 工作范围内的任一路由器到达其他
IP 网络的跳数不能超过 16,因此 RIP 不能用于大型网络。

2.2 与 RIP 协议相关的地址问题

2.2.1 用广播方式发送 RIP 包

假设基于以太网的一个 IP 网络内有多个支持 RIP 协议的路由器,RIP 协议并不要求这些


第2章 多播在 RIP 协议中的应用 ·53·

路由器事先相互知道其他路由器的存在,当向其他路由器传播自己的路由信息时,路由器要
组建相应的封装了 RIP 信息的 UDP 包,而 UDP 信息又需要被封装在包含目的 IP 地址的 IP
包中,为了使这个 IP 包能被本 IP 网络内的所有路由器接收,路由器可以把这个 IP 包的目的
IP 地址设置为 255.255.255.255,用以表示本 IP 网络内的所有主机,同时在用以太网帧封装
IP 包时,令以太网帧的目的以太网地址为广播地址 FF:FF:FF:FF:FF:FF,这样的一个帧从路由
器的一个接口发出后,被以太网广播域内的所有网卡接收并交给操作系统处理,操作系统读
取 IP 包中的“目的 IP 地址”字段后得知这是一个要求所有主机接收的 IP 广播包,于是读取
UDP 包的“目的端口号”字段,当然这个字段的值应该是十进制数 520。对于普通主机来说,
因为并没有一个进程向操作系统申请 520 号端口,所以操作系统最终会将其丢弃,而对于本
IP 网络内运行 RIP 协议的路由器来说,UDP 包所携带的 RIP 信息将被交给 RIP 进程处理,
RIP 进程会根据 RIP 包中的路由信息更新自己的路由表,当接收 RIP 包的路由器下一次向外
发布自己的路由信息时,被发布的就是已经被更新的路由表。
用广播方式发送 RIP 包最终能够使本 IP 网络内的所有路由器收到 RIP 信息,但所有的普
通主机也被迫接收并丢弃 RIP 包,因此,为了使 RIP 协议的运行更合理,可以使用多播地址
发送 RIP 信息。

2.2.2 用多播方式发送 RIP 包

假设基于以太网的一个 IP 网络内有多个支持 RIP 协议的路由器,为了使某路由器发出的


RIP 包仅被本网内的 RIP 路由设备接收,路由器可以同时使用以太网多播地址和 IP 多播地址
来发送 RIP 信息。在 1.3.7 节中曾经提到多播地址 224.0.0.9 表示支持 RIPv2 的路由器,即所
有的支持 RIPv2 的路由器应该接收目的 IP 地址为 224.0.0.9 的 IP 包,这样,路由器在向外发
布自己的路由信息时就可以把相应的 UDP 包封装在目的 IP 地址为 224.0.0.9 的 IP 包中。若
把此 IP 包封装在一个以太网广播帧中,则可以达到使所有路由器接收的目的,但同样存在使
所有其他普通主机的操作系统接收然后丢弃的问题,为了解决这个问题,可以使用以太网多
播地址。在 1.2.2 节中提到,形式如“01-00-5E-**-**-**”的以太网多播地址用于配合 IP 多
播使用,此处的“*”的取值取决于与之配合使用的 IP 多播地址,即用 IP 多播地址的后 3Byte
构成以太网地址的后 3Byte。例如当把目的 IP 地址为 224.0.0.9 的 IP 包封装在以太网帧中时,
就可以令以太网帧的目的以太网地址字段为“01-00-5E-00-00-09”,若某普通主机的以太网卡
设置为不接收“01-00-5E-00-00-09”这个目的以太网地址,或者设置为不接收任何以太网多
播地址,则网卡便不会把相应的包含 RIP 信息的帧交给操作系统处理,当然,支持 RIPv2 协
议的路由器的接口卡必须设置为接收这样的目的以太网地址。关于以太网多播地址和 IP 多播
地址的配合使用的其他细节请参阅 RFC1112。

2.3 实 例 剖 析

2.3.1 环境介绍

假设某网络通过多台路由器连接组成,且每台路由器有多个以太网接口,如图 2-2 所示。


·54· Internet 应用协议实例剖析与服务器配置

202.194.240.18 202.194.251.253 202.194.252.253


R1 255.255.255.240 255.255.255.0 255.255.255.0

I1 I2 I3 I4 I5 I6

202.194.253.253 202.194.240.67 202.194.254.254

255.255.255.0 255.255.255.192 255.255.255.0

202.194.240.70 202.194.240.72

R2 R4 255.255.255.192
255.255.255.192

I7 I8 I11 I12
202.194.240.71
202.194.240.129 R3 202.194.245.253
255.255.255.192
255.255.255.192 255.255.255.0
I9 I10

202.194.240.33

255.255.255.224

图 2-2 RIP 实例

由图 2-2 知路由器 R1 与多个 IP 网络直接连接,它们的地址以及相对应的 R1 的接口信


息如下:
R1 的接口地址 所直接连接的网络(网络地址/掩码)
I3(202.194.240.67) 202.194.240.64/255.255.255.192
I2(202.194.240.18) 202.194.240.16/255.255.255.240
I4(202.194.251.253) 202.194.251.0/255.255.255.0
I6(202.194.252.253) 202.194.252.0/255.255.255.0
I1(202.194.253.253) 202.194.253.0/255.255.255.0
I5(202.194.254.254) 202.194.254.0/255.255.255.0
在 RIP 中,上述 IP 网络与路由器 R1 之间的距离为 1,与路由器 R1 的距离为 2 的网络
有 3 个,这 3 个网络的地址以及 R1 到达这 3 个网络需经的下一跳 IP 地址如下:
下一跳 IP 地址 网络
I8(202.194.240.70) 202.194.240.128/255.255.255.192
I9(202.194.240.71) 202.194.240.32/255.255.255.224
I11(202.194.240.72) 202.194.245.0/255.255.255.0
若 202.194.251.0/255.255.255.0 网络内某主机欲向 202.194.245.0/255.255.255.0 网络内某
第2章 多播在 RIP 协议中的应用 ·55·

主机发送 IP 包,则此 IP 包应该依次穿过 I4、I11、I12 接口方能到达目的主机。在 R1、R2


和 R3 上均没有设置静态路由,而在 R1、R2 和 R3 的每一个接口上都启用了 RIPv2 协议,则
通过三者之间的互相学习之后它们的路由表都会达到一个稳定状态,称为“路由收敛” ,此时
R1 的路由表将如下:
目的网络 下一跳地址 跳数
202.194.240.64/255.255.255.192 直接相连 1
202.194.240.16/255.255.255.240 直接相连 1
202.194.251.0/255.255.255.0 直接相连 1
202.194.252.0/255.255.255.0 直接相连 1
202.194.253.0/255.255.255.0 直接相连 1
202.194.254.0/255.255.255.0 直接相连 1
202.194.240.128/255.255.255.192 202.194.240.70 2
202.194.240.32/255.255.255.224 202.194.240.71 2
202.194.245.0/255.255.255.0 202.194.240.72 2
路由器的路由表达到收敛状态之后,路由器仍然会每隔固定时间向外发送一次自己的路
由表,例如路由器 R1 在达到收敛状态之后,每隔 30s 就会通过 I5 接口向外发送的 RIP 包。
下面将利用这一点来认识 RIP 协议及其所依赖的多播技术。

2.3.2 通信过程中的帧

本实例只涉及一个帧,这个帧由路由器 R1 通过 I5 接口每隔 30s 向外发送一次,其内容


如下:
0000000: 0100 5e00 0009 00d0 b737 5500 0800 4500
0000010: 00d4 c3f4 0000 0111 4b5a cac2 fefe e000
0000020: 0009 0208 0208 00c0 8b39 0202 0000 0002
0000030: 0000 cac2 f040 ffff ffc0 0000 0000 0000
0000040: 0001 0002 0000 cac2 f080 ffff ffc0 0000
0000050: 0000 0000 0002 0002 0000 cac2 f020 ffff
0000060: ffe0 0000 0000 0000 0002 0002 0000 cac2
0000070: f010 ffff fff0 0000 0000 0000 0001 0002
0000080: 0000 cac2 f500 ffff ff00 0000 0000 0000
0000090: 0002 0002 0000 cac2 fb00 ffff ff00 0000
00000a0: 0000 0000 0001 0002 0000 cac2 fc00 ffff
00000b0: ff00 0000 0000 0000 0001 0002 0000 cac2
00000c0: fd00 ffff ff00 0000 0000 0000 0001 0002
00000d0: 0000 cac2 fe00 ffff ff00 0000 0000 0000
00000e0: 0010

2.3.3 帧剖析

上述帧中各字节的含义如下:
·56· Internet 应用协议实例剖析与服务器配置

字节偏移 内容 含义
00~05 0100 5e00 0009 目的以太网多播地址(和 224.0.0.9 配合使用)
06~0b 00d0 b737 5500 源以太网地址
0c~0d 0800 表明所携带数据为 IP 包
*******************(以下是 IP 包的内容)********************************
0e~0f 0100010100000000 (展开成二进制,十六进制为 4500)
0100 IPv4 (IP 版本)
0101 IP 包头长为 5×4=20Byte
00000000 未指定服务类型
10~11 00d4 IP 包总长度
12~13 c3f4 标识符
14~15 0000000000000000 (展开成二进制,十六进制为 0000)
000 此包可以被分段,且这是最后一段(即未分段)
000000000000 此段的偏移
16 01 生存时间
17 11 此 IP 包所携带数据为 UDP 包
18~19 4b5a 头部校验和
1A~1D cac2 fefe 源 IP 地址为 202.194.254.254
1e~21 e000 0009 目的 IP 多播地址为 224.0.0.9
********************(以下是 UDP 包的内容)********************************
22~23 0208 源 UDP 端口号(十进制 520)
24~25 0208 目的 UDP 端口号(十进制 520)
26~27 00c0 UDP 包的长度
28~29 8b39 校验和
********************(以下是 RIP 包的内容)*******************************
2a 02 本 RIP 包是一个应答包
2b 02 RIP 版本 2
2c~2d 0000 未用
********************(以下是用横线分开的多个路由项)********************
2e~2f 0002 地址类别为 IP 地址
30~31 0000 路由标记
32~35 cac2 f040 网络地址 202.194.240.64
36~39 ffff ffc0 掩码 255.255.255.192
3a~3d 0000 0000 下一跳地址为 202.194.254.254
3e~41 0000 0001 跳数为 1
---------------------------------------------------------------------------------------
42~43 0002 地址类别为 IP 地址
44~45 0000 路由标记
46~49 cac2 f080 网络地址 202.194.240.128
第2章 多播在 RIP 协议中的应用 ·57·

4a~4d ffff ffc0 掩码 255.255.255.192


4e~51 0000 0000 下一跳地址为 202.194.254.254
52~55 0000 0002 跳数为 2
---------------------------------------------------------------------------------------
56~57 0002 地址类别为 IP 地址
58~59 0000 路由标记
5a~5d cac2 f020 网络地址 202.194.240.32
5e~61 ffff ffe0 掩码 255.255.255.224
62~65 0000 0000 下一跳地址为 202.194.254.254
66~69 0000 0002 跳数为 2
---------------------------------------------------------------------------------------
6a~6b 0002 地址类别为 IP 地址
6c~6d 0000 路由标记
6e~71 cac2 f010 网络地址 202.194.240.16
72~75 ffff fff0 掩码 255.255.255.240
76~79 0000 0000 下一跳地址为 202.194.254.254
7a~7d 0000 0001 跳数为 1
---------------------------------------------------------------------------------------
7e~7f 0002 地址类别为 IP 地址
80~81 0000 路由标记
82~85 cac2 f500 网络地址 202.194.245.0
86~89 ffff ff00 掩码 255.255.255.0
8a~8d 0000 0000 下一跳地址为 202.194.254.254
8e~91 0000 0002 跳数为 2
---------------------------------------------------------------------------------------
92~93 0002 地址类别为 IP 地址
94~95 0000 路由标记
96~99 cac2 fb00 网络地址 202.194.251.0
9a~9d ffff ff00 掩码 255.255.255.0
9e~a1 0000 0000 下一跳地址为 202.194.254.254
a2~a5 0000 0001 跳数为 1
---------------------------------------------------------------------------------------
a6~a7 0002 地址类别为 IP 地址
a8~a9 0000 路由标记
aa~ad cac2 fc00 网络地址 202.194.252.0
ae~b1 ffff ff00 掩码 255.255.255.0
b2~b5 0000 0000 下一跳地址为 202.194.254.254
b6~b9 0000 0001 跳数为 1
---------------------------------------------------------------------------------------
·58· Internet 应用协议实例剖析与服务器配置

ba~bb 0002 地址类别为 IP 地址


bc~bd 0000 路由标记
be~c1 cac2 fd00 网络地址 202.194.253.0
c2~c5 ffff ff00 掩码 255.255.255.0
c6~c9 0000 0000 下一跳地址为 202.194.254.254
ca~cd 0000 0001 跳数为 1
---------------------------------------------------------------------------------------
ce~cf 0002 地址类别为 IP 地址
d0~d1 0000 路由标记
d2~d5 cac2 fe00 网络地址 202.194.254.0
d6~d9 ffff ff00 掩码 255.255.255.0
da~dd 0000 0000 下一跳地址为 202.194.254.254
de~f1 0000 0010 跳数为 16(不可达)
此例中,IP 包的生存时间字段的值为 1,目的是使此 IP 包只限于发送至本 IP 网络内所
有路由器接口。RIP 包中的最后一个路由项表达了关于 202.194.254.0/255.255.255.0 网络的路
由信息,即对于路由器 R1 来说,到达网络 202.194.254.0/255.255.255.0 的跳数为 16,也就是
说此网络不可达,但是我们知道 202.194.254.0/255.255.255.0 网络实际上是和路由器 R1 直接
相连的,为什么路由器 R1 却要宣称此网络不可达呢?这样做的目的是要解决一种路由环路
问题,RIP 协议采用一种称为“poisoned reverse”的技术解决路由环路问题。这种技术规定,
当路由器通过自己的某接口向外发布自己的路由表时,对于那些本来就是从本接口学习得到
的路由项,应该把它们的跳数设置为 16,比如此例中的 RIP 包的最后一个路由项。关于
“poisoned reverse”技术的详细讨论请读者阅读 RFC1058 中的“2.2.1. Split horizon”一节。
第3章 DHCP 应用

在一个使用 IP 协议的网络中,每一台计算机都必须配置 IP 地址、子网掩码、默认网关、


DNS 等信息,才能与其他计算机通过 IP 通信。对于一个稍大规模的网络而言,IP 信息的手
动配置任务是相当繁重的,一台计算机从一个子网转移到另一个子网,或整个网络结构发生
变化,就要重新对系统进行配置,这种手动配置还可能因为种种原因产生冲突,从而造成网
络故障。因此,需要有一种机制来让 TCP/IP 的配置和管理从用户端转移到网络管理端,实现
IP 的集中式管理。动态主机配置协议(DHCP,Dynamic Host Configure Protocol)就是解决
此问题的最佳方案,它的主要目的就是为了减轻 TCP/IP 网络的规划、管理和维护的负担,实
现对网络中的客户机 IP 地址的有效管理,而不需要逐个手动配置 IP 信息。此外,DHCP 还
具有远程启动功能。

3.1 DHCP 基础

3.1.1 DHCP 简介

DHCP 是基于 BOOTP(Bootstrap Protocol)可以在 IP 网络上实现主机动态配置的协议,


它比 BOOTP 增加了可重用网络地址的自动分配功能,另外比 BOOTP 增加了更多的可选项。
DHCP 客户同时可以作为 BOOTP 的客户进行工作。和 BOOTP 一样,DHCP 服务器和客户端
分别使用 UDP 端口 67 和 68,是典型的客户端/服务器模式。
在 IP 地址分配方面,DHCP 有如下 3 种分配机制。
(1)自动分配(automatic allocation)。在这种机制下,DHCP 服务器为客户分配一个永
久 IP 地址。
(2)动态分配(dynamic allocation)。在这种机制下,DHCP 服务器为客户端分配一个 IP
地址,同时规定一个时限,超过这个时限,此 IP 地址将被收回。动态分配有利于将已经不被
使用的地址及时收回以便重新使用,因此动态分配对于主机临时加入某网络的情况特别有效,
对于 IP 地址匮乏的网络,使用动态分配可以充分利用地址资源。
(3)手工分配(manual allocation)。在这种机制下由管理员根据客户的某些特征,例如
链路层地址,为特定的客户指定特定的 IP 地址,DHCP 服务器的任务只是在客户提出申请时
将这个既定的地址告诉客户。
上述 3 种机制也可以混合使用,这取决于管理员的意图。

3.1.2 DHCP 包结构

DHCP 包结构如图 3-1 所示。


·60· Internet 应用协议实例剖析与服务器配置

   
    
                                       

操作码  硬件类型 硬件地址长度 步数

序号

秒数 标志

客户 IP 地址(ciaddr)

分配给客户的 IP 地址(yiaddr)

服务器 IP 地址(siaddr)

中继 IP 地址(giaddr)
客户硬件地址(16Byte)(chaddr)

服务器名(64Byte)(sname)

启动文件名(128Byte)
客户硬件地址(16 (file)
字节)

选项(字节数不定)
客户硬件地址(16 字节)

客户硬件地址(16 字节)
图 3-1 DHCP 包结构 )
DHCP 包中各个字段的含义如下所述。
① 操作码:该字段用以表明此 DHCP 包的基本类型,值为 1 表示由客户发向服务器的
包,值为 2 表示由服务器发向客户的包。
② 硬件类型:该字段代表了特定的通信子网类型,目前可用的硬件类型及其编号如下:
编号 硬件类型
1 Ethernet (10Mbit/s)
2 Experimental Ethernet (3Mbit/s)
3 Amateur Radio AX.25
4 Proteon ProNET Token Ring
5 Chaos
6 IEEE 802 Networks
7 ARCNET
8 Hyperchannel
9 Lanstar
10 Autonet Short Address
11 LocalTalk
12 LocalNet (IBM PCNet or SYTEK LocalNET)
13 Ultra link
14 SMDS
15 Frame Relay
16 Asynchronous Transmission Mode (ATM)
17 HDLC
18 Fibre Channel
19 Asynchronous Transmission Mode (ATM)
第3章 DHCP 应用 ·61·

20 Serial Line
21 Asynchronous Transmission Mode (ATM)
22 MIL-STD-188-220
23 Metricom
24 IEEE 1394.1995
25 MAPOS
26 Twinaxial
27 EUI-64
28 HIPARP
29 IP and ARP over ISO 7816-3
30 ARPSec
31 IPsec tunnel
32 InfiniBand (TM)
③ 硬件地址长度:该字段是以字节为单位的硬件地址长度,例如以太网地址的长度为 6。
④ 步数:客户方总是将本字段的值赋零,DHCP 中继可以用它表示距离。
⑤ 序号:由客户方产生的随机数,用以匹配请求和应答。
⑥ 秒数:此字段由客户填充,用以表示从开始请求起经过的时间。
⑦ 标志:标志所占用的 16bit 被分成两部分,如图 3-2 所示。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

后 15bit 必须为 0

图 3-2 DHCP 标志

DHCP 标志被分成两部分,后 15bit 目前尚未定义,其值必须为 0,当客户方目前尚不能


接收 IP 单播地址时, 在发出 DHCP 包时应将最左比特置为 1,用以告诉 DHCP 服务器或 DHCP
中继用广播的方式向客户方发送信息;若客户方在发送 DHCP 包时能够接收 IP 单播地址,
则将此比特置零。
⑧ 客户 IP 地址:若客户方在发出 DHCP 包时拥有某 IP 地址(例如在续租 IP 过程中) ,
则客户方应将 IP 地址写在此字段中。
⑨ 分配给客户的 IP 地址:当服务器欲向客户方提供某 IP 地址时,应将地址放在此
字段中。
⑩ 服务器 IP 地址:DHCP 服务器的 IP 地址。
 中继 IP 地址:DHCP 中继在继续转发 DHCP 请求之前应将自己的 IP 地址写入此
字段。
 客户硬件地址:例如可以是客户的以太网地址。
 服务器名:以 0 值结束的服务器名字串。
 启动文件名:以 0 值结束的启动文件名,用于远程启动。
 选项:此字段由多个连续的选项组成,RFC2132 专门用于描述 DHCP 选项。为了与
BOOTP 兼容,启动文件与第一个选项之间应插入 4 个字节的幻数(magic cookie),其内容为
0x63825363,这个幻数值表明其后开始的是 DHCP 选项。
·62· Internet 应用协议实例剖析与服务器配置

3.1.3 DHCP 选项

所有的 DHCP 选项以 1Byte 的选项代码开始,选项代码代表了这个 DHCP 选项的作用,


定长选项仅由 1Byte 的选项代码构成,只有选项代码为 0 和 255 的选项是定长选项,其他选
项都是变长选项,变长选项的选项代码后面是 1Byte 的选项长度,选项长度的后面是字节数
与选项长度值相等的选项数据,选项数据的具体含义取决于选项代码的值,一个变长选项的
结构如图 3-3 所示。

代码 长度 数据

图 3-3 变长选项的结构

下面介绍几个常用的 DHCP 选项。


① 填充选项:该选项仅由值为 0 的一个选项代码字节构成,其作用是使邻接字段实现字
对齐。
② 子网掩码选项:该选项可以用于为客户指定子网掩码,这个选项由 6Byte 构成,
如图 3-4 所示。子网掩码选项选项代码为 1,选项长度为 4,m1、m2、m3、m4 构成一个
子网掩码值。

1 4 m1 m2 m3 m4

图 3-4 子网掩码选项

③ 路由器选项:该选项用于为客户指定网关信息,选项构成如图 3-5 所示,选项代码为


3,选项长度取决于网关信息的个数,每一组 a1、a2、a3、a4 表示一个网关地址。

3 n a1 a2 a3 a4 a1 .
a2...
1 4 m1 m2 m3 1 m4 4 m1 m2 m3 1 m4 4 m1 m2 m3 m4

图 3-4 子网掩码选项 图 3-4 子网 掩码选项 图 3-4 子网掩码 选项

图 3-5 路由器选项

④ 域名服务器选项:该选项用于为客户方指定域名服务器信息,选项构成如图 3-6 所示。


选项代码为 6,选项长度取决于域名服务器信息的个数,每一组 a1、a2、a3、a4 表示一个域
名服务器地址。

6 n a1 a2 a3 a4 a1 .
a2...
1 4 m1 m2 m3 1 m4 4 m1 m2 m3 1 m4 4 m1 m2 m3 m4

图 3-4 子网掩码选项 图 3-4 子网掩码选项 图 3-4 子网掩码选项

图 3-6 域名服务器选项

⑤ 客户名称选项:该选项用于指定客户方主机的名字,选项构成如图 3-7 所示。该选项


的选项代码为 12,选项长度取决于客户主机的名字的长度,其中 h1、h2、h3.
..为主机的名
字字节。

12 n h1 h2 h3 h4 h5 .
h6...
1 4 m1 m2 m3 1 m4 4 m1 m2 m3 1 m4 4 m1 m2 m3 m4

图 3-4 子网掩码选项 图 3-4 子网掩码选项 图 3-4 子网掩码选项

图 3-7 客户名称选项

⑥ 域选项:该选项用于为客户指定默认域,选项构成如图 3-8 所示。该选项的选项代码


第3章 DHCP 应用 ·63·

为 15,选项长度取决于域名字的长度,d1、d2、d3.
..为域的名字字节。

15 n d1 d2 d3 d4 d5 .
d6...
1 4 m1 m2 m3 1 m4 4 m1 m2 m3 1 m4 4 m1 m2 m3 m4

图 3-4 子网掩码选项 图 3-4 子网掩码选项 图 3-4 子网掩码选项

图 3-8 域选项

⑦ 指定 IP 地址选项:该选项可以用于客户方发出 DHCPDISCOVER 时指定一个确定


的 IP 地址,并希望 DHCP 服务器能够将这个地址分配给请求者,其结构如图 3-9 所示。该
选项的选项代码为 50,选项长度为 4,a1、a2、a3、a4 这 4 个字节分别是一个 IP 地址的 4
个字节。

50 4 a1 a2 a3 a4

图 3-9 指定 IP 地址选项

⑧ 租期选项:该选项可以用于客户方发出 DHCPDISCOVER 或 DHCPREQUEST 时表达


自己希望的租期,也可以用于服务器向客户方发送 DHCPOFFER 时表达为客户方规定的租
期,其结构如图 3-10 所示。该选项的选项代码为 51,选项长度为 4,t1、t2、t3、t4 这 4 个
字节组成一个无符号整数,代表以 s 为单位的租期。

51 4 t1 t2 t3 t4

图 3-10 租期选项

⑨ DHCP 信息类型选项:该选项可以用于指定 DHCP 包的具体类型,由 3 个字节构成,


如图 3-11 所示。信息类型选项的选项代码为 53,选项长度的值为 1 表明只有一个字节选项
数据选项数据的取值为 1~9,分别代表不同的 DHCP 包具体类型,如下:
选项数据值 信息类型 发送方向
1 (地址租用申请)DHCPDISCOVER 客户→服务器
2 (地址租用提供)DHCPOFFER 服务器→客户
3 (地址租用选择)DHCPREQUEST 客户→服务器
4 (地址租用拒绝)DHCPDECLINE 客户→服务器
5 (地址租用确认)DHCPACK 服务器→客户
6 (地址租用否定)DHCPNAK 服务器→客户
7 (地址租用释放)DHCPRELEASE 客户→服务器
8 (地址租用通知)DHCPINFORM 客户→服务器

53 1 1~9

图 3-11 信息类型选项

其中,DHCPDISCOVER 是客户发出的广播包,携带有请求信息,用以发现可用的 DHCP


服 务 器 ; DHCPOFFER 是 服 务 器 发 向 客 户 的 , 携 带 有 DHCP 提 供 的 配 置 信 息 , 是 对
DHCPDISCOVER 的回应;DHCPREQUEST 可以是客户对选中的 DHCPOFFER 信息的回应,
表示愿意采用相应的 DHCPOFFER 信息所指定的配置,也可以是系统重新启动等情况下对已
经得到的地址的确认,还可以用于租期将要到时向服务器发出延展租期请求;DHCPDECLINE
·64· Internet 应用协议实例剖析与服务器配置

是当客户通过某种方式检测到服务器分配来的地址与其他主机冲突时,向服务器发出的拒绝
接受信息;DHCPACK 用于对客户发来的 DHCPREQUEST 进行确认;DHCPNAK 用于对客
户 发 来 的 DHCPREQUEST 进 行 否 认 ; DHCPRELEASE 用 于 释 放 已 经 获 得 的 地 址 ;
DHCPINFORM 用于客户在已经通过某种方式获得了地址(例如手工配置)的情况下,向服
务器申请其他配置信息。
⑩ 服务器标识选项:该选项用于表示服务器的 IP 地址信息,这个选项由 6Byte 构成,
如图 3-12 所示。选项代码为 54,选项长度为 4,a1、a2、a3、a4 为服务器 IP 地址。

54 4 a1 a2 a3 a4

图 3-12 服务器标识选项

 请求列表选项:该选项用于客户方向服务器表达所请求的选项,选项结构如图 3-13
所示。该选项的选项代码为 55,选项长度取决于所请求选项的个数,c1、c2 等分别是一个选
项的代码。

55 n c1 c2 c3 .
c4..

图 3-13 请求列表选项

 客户提供商标识选项:该选项的结构如图 3-14 所示。该选项的选项代码为 60,选项


长度取决于提供商标识的长度,i1、i2 等组成提供商标识,详见实例剖析部分。

60 n i1 i2 i3 i4...

图 3-14 客户提供商标识选项

 客户标识选项:该选项用于惟一地标识客户身份,例如可以用客户的硬件地址作为标
识,选项结构如图 3-15 所示。该选项的选项代码为 61,选项长度取决于客户标识的长度,t1
为标识类型,i1、i2 等组成相应类型的标识。

61 n t1 i1 i2 .
i3..

图 3-15 客户标识选项

 结束选项:该选项仅由一个值为 255(0xff)的选项代码构成,用以表示选项的结束。
其他选项请读者参阅 RFC2132。

3.1.4 DHCP 工作过程

DHCP 基本工作过程可以用一个 DHCP 客户首次申请 IP 配置信息为例来加以说明。


DHCP 客户机初始化 TCP/IP,在本地子网上广播一个 DHCPDISCOVER 消息,以发现 DHCP
服务器。如果 DHCP 服务器和客户机不在同一个子网上,DHCP 中继代理将转发这个消息给
DHCP 服务器。由于网络上可能不止一个 DHCP 服务器,所有具有有效 IP 地址信息的 DHCP
服务器都会向客户机发出一个 DHCPOFFER 消息。客户机从接收到的所有 DHCPOFFER 消
息选中一个,并向相应的服务器发送一条租用地址的请求 DHCPREQUEST。发出相应
DHCPOFFER 消息的 DHCP 服务器响应该请求,向该客户机发送一个 DHCPACK 确认消息,
第3章 DHCP 应用 ·65·

客户机收到确认消息后即完成 TCP/IP 协议的进一步初始化和绑定。配置完成后,客户机就可


以使用已经获得的地址信息。

3.2 配置 DHCP 客户端

下面以 Windows98/2000 为例来说明配置 DHCP 客户端的过程。

3.2.1 Windows98 系统的 DHCP 客户端的设置

在 Windows98 系统中,选择“控制面板”中的“网络”项或用鼠标右击桌面上的“网上
邻居”,选择“属性” ,即出现如图 3-16 所示的“网络”属性设置的界面。
双击“TCP/IP”选项或选择“TCP/IP”选项后单击右下角的“属性”按钮(如果系统有
多个适配器的话会出现多个 TCP/IP 相关选项, 这时要注意选择正确的选项),
会出现如图 3-17
所示的“TCP/IP 属性”设置界面,选择“自动获取 IP 地址”即可使用 DHCP 分配地址信息。
若使用 DHCP 服务器提供 DNS 服务器信息,则需选择“DNS 配置”中的“禁用 DNS”
选项,如图 3-18 所示。

图 3-16 Windows98 的网络设置 图 3-17 TCP/IP 属性

图 3-18 TCP/IP 属性中的 DNS 设置


·66· Internet 应用协议实例剖析与服务器配置

网关信息也可由 DHCP 服务器分配,若想使用 DHCP 服务器分配网关信息,则将“网关”


选项卡中的“网关”选项设置为空即可,如图 3-19 所示。
设置完成后单击“确定”按钮,根据系统提示重新启动计算机而完成客户端的 DHCP 配
置。为了验证重启的系统是否成功地租用了 IP 地址等信息,可以在 Windows 的 MS-Dos 方
式下运行“winipcfg”命令,系统将出现如图 3-20 所示界面。

图 3-19 TCP/IP 属性中的网关设置 图 3-20 winipcfg 的显示界面

单击“详细信息”按钮,可以看到更多信息,如果安装了拨号适配器,默认显示的将是
拨号适配器项,此时可从下拉列表框中选择相应的网卡项,如图 3-21 所示。

图 3-21 网卡的 winipcfg 信息

在图 3-21 中可以看到 DHCP 服务器分配的 IP 地址、子网掩码、默认网关、DNS 服务器


等信息以及适配器的物理地址、DHCP 服务器的地址以及租期等信息,并可选择底部的几个
按钮进行释放、更新、全部释放和全部更新等操作。
第3章 DHCP 应用 ·67·

3.2.2 Windows2000 系统的 DHCP 客户端的设置

在 Windows2000 系统中,选择“控制面板”中的 “网络和拨号连接”选项或用鼠标右


击桌面上的 “网上邻居” ,选择“属性”,再双击“本地连接”或用鼠标右击“本地连接”选
择 “属性”选项,则出现如图 3-22 所示的网络设置界面。
单击“属性”按钮,将出现图 3-23 所示的“本地连接 属性”设置界面。

图 3-22 Windows2000 的网络设置 图 3-23 本地连接 属性

选中“Internet 协议(TCP/IP) ”,单击“属性”按钮,系统出现如图 3-24 所示的界面。


要想使用 DHCP 分配地址信息,需选择“自动获得 IP 地址”和“自动获得 DNS 服务器
地址” ,然后点击“确定”按钮。
在命令提示符下运行 ipconfig/all 命令,会出现如图 3-25 所示信息。
在这里可以看到 DHCP 服务器分配的 IP 地址、子网掩码、默认网关、DNS 服务器等信
息 , 以 及 适 配 器 的 物 理 地 址 、 DHCP 服 务 器 的 地 址 以 及 租 期 等 信 息 , 并 可 分 别 用
ipconfig/release、ipconfig/renew 进行地址信息释放、更新等操作。

图 3-24 Internet 协议(TCR/IP)属性


·68· Internet 应用协议实例剖析与服务器配置

图 3-25 ipconfig/all 显示信息

3.3 配置 DHCP 服务器

下面以 RedHat Linux 8.0 下的 DHCP 服务器为例介绍 DHCP 服务器的配置。

3.3.1 DHCP 服务器软件的安装和启动

在 Linux 安装光盘中找到 dhcp 服务器的 rpm 包 dhcpd-1.3.17pl5-i386.rpm ,只要简单地


用下面的命令就可以安装 DHCP 服务器软件:
# rpm -i dhcpd-1.3.17pl5-i386.rpm
然后可直接使用 Linux 默认的启动脚本启动 DHCP 服务器:
#/etc/rc.d/init.d/dhcpd start

3.3.2 DHCP 服务器的配置

DHCP 的默认配置文件是/etc/dhcpd.conf,这个文件在默认情况下是不存在的,可以按照
下列格式手工建立 dhcpd.conf 文件或在/usr/share/doc/dhcp-3.0pl1 目录下拷贝一个样本文件
dhcpd.conf.sample 进行修改。
下面是一个 dhcpd.conf 实例:
subnet 192.168.1.0 netmask 255.255.255.0{
#指定子网的网络地址和子网的掩码
range 192.168.1.10 192.168.1.100;
range 192.168.1.150 192.168.1.200;
#指定可分配地址范围
default-lease-time 28800;
# 默认租借时间,以 s 为单位
max-lease-time 43200;
第3章 DHCP 应用 ·69·

#最大租借时间
option subnet-mask 255.255.255.0;
# 定义被分配的子网掩码,如果不定义该选项,则使用 subnet 行中的子网掩码
option routers 192.168.1.1;
#定义被分配的默认网关地址
option domain-name-servers 192.168.1.2;
# 定义被分配的域名服务器地址
option domain-name "sdie.edu.cn";
#定义被分配的默认域名
}
此配置文件定义了该 DHCP 服务器可以分配给客户端的地址范围是:从 192.168.1.10~
192.168.1.100 和从 192.168.1.150~192.168.1.200,同时服务器发送以下参数给客户端。
子网掩码:255.255.255.0
默认网关:192.168.1.1
域名服务器的地址:192.168.1.2
默认域名:sdie.edu.cn
在/var/lib/dhcp/目录下有一个文件 dhcpd.leases (DHCP 客户租约的数据库文件),此文
件包含租约声明,每次一个租约被获取、更新或释放,它的新值就被追加到该文件。dhcpd
记录这个文件的格式是:
lease ip-address { statements... }
每个记录包含一个提供给客户方的 IP 地址,在括号里的语句包含一些租期信息,具体的
租期信息会因客户方发出不同的 DHCP 请求而稍有差别。

3.4 实 例 剖 析

3.4.1 环境介绍

本例中将使用基于以太网的同一个 IP 网络内的两台计算机,分别命名为 A 和 B,基本


配置信息如下:
计算机 IP 地址 掩码
A 待分配 待分配
B 202.194.254.211 255.255.255.0
A 计算机运行 Windows98 系统,并设置为通过 DHCP 获得所有 IP 配置信息;B 计算机
运行 Linux 系统,并运行 DHCP 服务器 dhcpd。 当 A 计算机启动时,A 发出 DHCPDISCOVER
广播以查找 DHCP 服务器,B 收到 DHCPDISCOVER 后向 A 发出 DHCPOFFER,若 A 接受
DHCPOFFER 中的配置信息就向 B 发送 DHCPREQUEST,B 用 DHCPACK 向 A 确认。下面
对上述过程进行详细分析。
·70· Internet 应用协议实例剖析与服务器配置

3.4.2 通信过程中的以太帧

此例中的整个分配过程共涉及 4 个以太帧(在 B 计算机上用 TCPDUMP 工具获得) ,在


下面的显示中,帧中的大量值为 0 的字节被省略并用“„„”代替。
(1)A 发出的 DHCPDISCOVER 广播帧
0000000: ffff ffff ffff 0010 5a5e 7d10 0800 4500
0000010: 0148 5500 0000 8011 e4a5 0000 0000 ffff
0000020: ffff 0044 0043 0134 8794 0101 0600 c770
0000030: e71b 0000 0000 0000 0000 0000 0000 0000
0000040: 0000 0000 0000 0010 5a5e 7d10 0000 0000
„„
0000110: 0000 0000 0000 6382 5363 3501 013d 0701
0000120: 0010 5a5e 7d10 3204 cac2 fe0d 0c07 6d79
0000130: 6e61 6d65 003c 074d 5346 5420 3938 3709
0000140: 010f 0306 2c2e 2f2b 4dff 0000 0000 0000
0000150: 0000 0000 0000
(2)B 发向 A 的 DHCPOFFER 帧
0000000: ffff ffff ffff 0000 b491 e66a 0800 4500
0000010: 0148 8a9a 0000 4011 2575 cac2 fed3 ffff
0000020: ffff 0043 0044 0134 b42d 0201 0600 c770
0000030: e71b 0000 0000 0000 0000 cac2 fe0d cac2
0000040: fed3 0000 0000 0010 5a5e 7d10 0000 0000
„„
0000110: 0000 0000 0000 6382 5363 3501 0236 04ca
0000120: c2fe d333 0400 00a8 c03a 0400 0054 603b
0000130: 0400 0093 a801 04ff ffff 0003 04ca c2fe
0000140: fe06 04ca c2f0 580f 0c73 6469 652e 6564
0000150: 752e 636e 00ff
(3)A 发向 B 的 DHCPREQUEST 帧
0000000: ffff ffff ffff 0010 5a5e 7d10 0800 4500
0000010: 014e 5800 0000 8011 e19f 0000 0000 ffff
0000020: ffff 0044 0043 013a 325c 0101 0600 c770
0000030: e71b 0000 0000 0000 0000 0000 0000 0000
0000040: 0000 0000 0000 0010 5a5e 7d10 0000 0000
„„
0000110: 0000 0000 0000 6382 5363 3501 033d 0701
0000120: 0010 5a5e 7d10 3204 cac2 fe0d 3604 cac2
0000130: fed3 0c07 6d79 6e61 6d65 0051 0a00 0000
0000140: 6d79 6e61 6d65 003c 074d 5346 5420 3938
第3章 DHCP 应用 ·71·

0000150: 3709 010f 0306 2c2e 2f2b 4dff


(4)B 发向 A 的 DHCPACK 帧
0000000: ffff ffff ffff 0000 b491 e66a 0800 4500
0000010: 0148 8a9b 0000 4011 2574 cac2 fed3 ffff
0000020: ffff 0043 0044 0134 b12d 0201 0600 c770
0000030: e71b 0000 0000 0000 0000 cac2 fe0d cac2
0000040: fed3 0000 0000 0010 5a5e 7d10 0000 0000
„„
0000110: 0000 0000 0000 6382 5363 3501 0536 04ca
0000120: c2fe d333 0400 00a8 c03a 0400 0054 603b
0000130: 0400 0093 a801 04ff ffff 0003 04ca c2fe
0000140: fe06 04ca c2f0 580f 0c73 6469 652e 6564
0000150: 752e 636e 00ff

3.4.3 帧剖析

(1)A 发出的 DHCPDISCOVER 广播帧


字节偏移 内容 含义
00~05 ff:ff:ff:ff:ff:ff 目的以太网地址(以太网广播地址)
06~0b 00:10:5a:5e:7d:10 源以太网地址(DHCP 客户 A 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
************************(以下为 IP 包的内容)***********************
0e~0f 0100010100000000 (展开成二进制,十六进制为 4500)
0100 IPv4(IP 版本)
0101 IP 包头长为 5×4=20Byte
00000000 未指定服务类型
10~11 0148 IP 包总长度
12~13 5500 标识符
14~15 0000000000000000 (展开成二进制,十六进制为 0000)
000 此包可以被分段,并且这就是最后一段(即未分段)
000000000000 此段的偏移
16 80 生存时间
17 11 此 IP 包所携带数据为 UDP 包
18~19 e4a5 头部校验和
1A~1D 0000 0000 源 IP 地址未知
1e~21 ffff ffff 目的 IP 地址为 IP 广播地址
************************(以下为 UDP 包的内容)**********************
22~23 0044 源 UDP 端口号
24~25 0043 目的 UDP 端口号(DHCP 服务器的周知端口号 67)
26~27 0134 UDP 包的长度
·72· Internet 应用协议实例剖析与服务器配置

28~29 8794 校验和


***********************(以下为 DHCP 包的内容)**********************
2a 01 操作码 01 表示由客户发向服务器的信息
2b 01 硬件类型 01 表示硬件类型为以太网
2c 06 硬件地址长度(6Byte)
2d 00 步数 0(未经过 DHCP 中继)
2e~31 c770 e71b 序号
32~33 0000 从开始请求起经过的时间为 0s
34~35 0000 标志字段的首比特为 0 表示客户可以接收 IP 单播
地址
36~39 0000 0000 客户 IP 地址未知
3a~3d 0000 0000 分配给客户的 IP 地址
3e~41 0000 0000 服务器 IP 地址
42~45 0000 0000 中继 IP 地址
46~55 0010 5a5e 7d10 0000 „.0000 客户硬件地址(以太网地址)
56~95 0000 „. 0000 DHCP 服务器的名字
96~115 0000 „. 0000 启动文件名
116~119 6382 5363 幻数,表明后面跟有 DHCP 选项
********************(以下是用横线分开的 DHCP 选项)*****************
11a 35 信息类型选项代码
11b 01 选项长度为 1Byte
11c 01 信息类型为地址租用申请(DHCPDISCOVER)
---------------------------------------------------------------------------------------
11d 3d 客户标识选项代码
11e 07 选项长度 7Byte
11f 01 客户标识将是客户的以太网地址
120~126 0010 5a5e 7d10 客户的以太网地址
---------------------------------------------------------------------------------------
127 32 指定 IP 地址选项代码
128 04 选项长度 4Byte
128~12b cac2 fe0d 指定 IP 地址为 202.194.254.13
---------------------------------------------------------------------------------------
12c 0c 客户主机名选项代码
12d 07 选项长度 7Byte
12e~134 6d79 6e61 6d65 00 客户主机名为“myname”
---------------------------------------------------------------------------------------
135 3c DHCP 客户提供商标识选项代码
136 07 选项长度 7Byte
137-13d 4d 5346 5420 3938 DHCP 客户提供商标识为“MSFT 98” (Microsoft 98)
第3章 DHCP 应用 ·73·

---------------------------------------------------------------------------------------
13e 37 请求列表选项代码
13f 09 选项长度 9Byte
140 01 子网掩码选项代码
141 0f 域名选项代码
142 03 路由选项代码
143 06 域名服务器选项代码
144 2c netbios 名称服务器选项代码
145 2e netbios 节点类型选项代码
146 2f netbios scope 选项代码
147 2b 提供商指定信息选项代码
148 4d 用户类型选项代码(RFC3004)
---------------------------------------------------------------------------------------
149 ff 结束选项代码
---------------------------------------------------------------------------------------
150~155 0000 0000 0000 空选项
---------------------------------------------------------------------------------------
通过上面的指定 IP 地址选项可以看出,A 计算机要求获得地址 202.194.254.13。
(2)B 发向 A 的 DHCPOFFER 帧
字节偏移 内容 含义
00~05 ff:ff:ff:ff:ff:ff 目的以太网地址(以太网广播地址)
06~0b 0000 b491 e66a 源以太网地址(DHCP 服务器的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
************************(以下为 IP 包的内容)***********************
0e~0f 0100010100000000 (展开成二进制,十六进制为 4500)
0100 IPv4(P 版本)
0101 IP 包头长为 5×=20Byte
00000000 未指定服务类型
10~11 0148 IP 包总长度
12~13 8a9a 标识符
14~15 0000000000000000 (展开成二进制,十六进制为 0000)
000 此包可以被分段,并且这就是最后一段(即未分段)
000000000000 此段的偏移
16 40 生存时间
17 11 此 IP 包所携带数据为 UDP 包
18~19 2575 头部校验和
1A~1D cac2 fed3 源 IP 地址 202.194.254.211
1e~21 ffff ffff 目的 IP 地址为 IP 广播地址
************************(以下为 UDP 包的内容)***********************
·74· Internet 应用协议实例剖析与服务器配置

22~23 0043 源 UDP 端口号(DHCP 服务器的周知端口号 67)


24~25 0044 目的 UDP 端口号
26~27 0134 UDP 包的长度
28~29 b42d 校验和
************************以下为 DHCP 包的内容*********************
2a 02 操作码 02 表示由服务器发向客户
2b 01 硬件类型 01 表示硬件类型为以太网
2c 06 硬件地址长度(6Byte)
2d 00 步数 0(未经过 DHCP 中继)
2e~31 c770 e71b 序号(与 DHCPREQUEST 信息的序号相同)
32~33 0000 从开始请求起经过的时间为 0s
34~35 0000 标志字段的首比特为 0 表示客户可以接收 IP 单播
地址
36~39 0000 0000 客户 IP 地址未知
3a~3d cac2 fe0d 分配给客户的 IP 地址 202.194.254.13
3e~41 cac2 fed3 服务器 IP 地址 202.194.254.211
42~45 0000 0000 中继 IP 地址
46~55 0010 5a5e 7d10 0000 „.0000 客户硬件地址
56~95 0000 „. 0000 DHCP 服务器的名字
96~115 0000 „. 0000 启动文件名
116~119 6382 5363 幻数,表明后面跟有 DHCP 选项
********************(以下是用横线分开的 DHCP 选项)*****************
11a 35 信息类型选项代码
11b 01 选项长度为 1Byte
11c 02 信息类型为地址租用提供(DHCPOFFER)
---------------------------------------------------------------------------------------
11d 36 服务器标识选项代码
11e 04 选项长度为 4Byte
11f~122 ca c2fe d3 服务器标识为“202.194.254.211”
---------------------------------------------------------------------------------------
123 33 租期选项代码
124 04 选项长度为 4Byte
125~128 00 00a8 c0 租期为 0xa8c0(43200)s
---------------------------------------------------------------------------------------
129 3a T1 选项代码
12a 04 选项长度为 4Byte
12b~12e 00 0054 60 T1 为 0x5460(21600)s
---------------------------------------------------------------------------------------
12f 3b T2 选项代码
第3章 DHCP 应用 ·75·

130 04 选项长度为 4Byte


131~134 00 0093 a8 T2 为 0x93a8(37800)s
---------------------------------------------------------------------------------------
135 01 子网掩码选项代码
136 04 选项长度为 4Byte
137~13a ff ffff 00 子网掩码为 255.255.255.0
---------------------------------------------------------------------------------------
13b 03 路由选项代码
13c 04 选项长度为 4Byte
13d~140 ca c2fe fe 默认路由为 202.194.254.254
---------------------------------------------------------------------------------------
141 06 域名服务器选项代码
142 04 选项长度为 4Byte
143~146 ca c2f0 58 域名服务器为 202.194.240.88
---------------------------------------------------------------------------------------
147 0f 域名选项代码
148 0c 选项长度为 12Byte
149~154 73 6469 652e 6564 752e 636e 00 域名为“sdie.edu.cn”
---------------------------------------------------------------------------------------
155 ff 结束选项代码
---------------------------------------------------------------------------------------
在 DHCP 选项中,T1 选项用来说明从客户获得配置信息至客户用单播方式再次发送
DHCPREQUEST 以延展租期的时间,T2 选项用来说明从客户获得配置信息至客户用广播方
式再次发送 DHCPREQUEST 以延展租期的时间。
(3)A 发向 B 的 DHCPREQUEST
字节偏移 内容 含义
00~05 ff:ff:ff:ff:ff:ff 目的以太网地址(以太网广播地址)
06~0b 00:10:5a:5e:7d:10 源以太网地址(DHCP 客户 A 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
************************(以下为 IP 包的内容)***********************
0e~0f 0100010100000000 (展开成二进制,十六进制为 4500)
0100 IPv4(IP 版本)
0101 IP 包头长为 5×4=20Byte
00000000 未指定服务类型
10~11 014e IP 包总长度
12~13 5800 标识符
14~15 0000000000000000 (展开成二进制,十六进制为 0000)
000 此包可以被分段,并且这就是最后一段(即未分段)
000000000000 此段的偏移
·76· Internet 应用协议实例剖析与服务器配置

16 80 生存时间
17 11 此 IP 包所携带数据为 UDP 包
18~19 e19f 头部校验和
1A~1D 0000 0000 源 IP 地址未知
1e~21 ffff ffff 目的 IP 地址为 IP 广播地址
************************(以下为 UDP 包的内容)***********************
22~23 0044 源 UDP 端口号
24~25 0043 目的 UDP 端口号(DHCP 服务器的周知端口号 67)
26~27 013a UDP 包的长度
28~29 325c 校验和
************************(以下为 DHCP 包的内容)*********************
2a 01 操作码 01 表示由客户发向服务器
2b 01 硬件类型 01 表示硬件类型为以太网
2c 06 硬件地址长度(6Byte)
2d 00 步数 0(未经过 DHCP 中继)
2e~31 c770 e71b 序号
32~33 0000 从开始请求起经过的时间为 0s
34~35 0000 标志字段的首比特为 0 表示客户可以接收 IP 单播
地址
36~39 0000 0000 客户 IP 地址未知
3a~3d 0000 0000 分配给客户的 IP 地址
3e~41 0000 0000 服务器 IP 地址
42~45 0000 0000 中继 IP 地址
46~55 0010 5a5e 7d10 0000 „.0000 客户硬件地址
56~95 0000 „. 0000 DHCP 服务器的名字
96~115 0000 „. 0000 启动文件名
116~119 6382 5363 幻数,表明后面跟有 DHCP 选项
*************(以下是用横线分开的 DHCP 选项)**********************
11a 35 信息类型选项代码
11b 01 选项长度为 1Byte
11c 03 信息类型为地址租用选择(DHCPREQUEST)
---------------------------------------------------------------------------------------
11d 3d 客户标识选项代码
11e 07 选项长度为 7Byte
11f 01 客户标识将是客户的以太网地址
120~126 0010 5a5e 7d10 客户的以太网地址
---------------------------------------------------------------------------------------
127 32 指定 IP 地址选项代码
128 04 选项长度为 4Byte
第3章 DHCP 应用 ·77·

128~12b cac2 fe0d 指定 IP 地址为 202.194.254.13


---------------------------------------------------------------------------------------
12c 36 服务器标识选项代码
12d 04 选项长度为 4Byte
12e~131 ca c2fe d3 服务器标识为“202.194.254.211”
---------------------------------------------------------------------------------------
132 0c 客户主机名选项代码
133 07 选项长度为 7Byte
134~13a 6d79 6e61 6d65 00 客户主机名为“myname”
---------------------------------------------------------------------------------------
13b 51 FQDN 选项代码(Fully Qualified Domain Name)
13c 0a 选项长度为 10Byte
13d 00 0 表示客户不需要服务器维护客户 IP 与域
名对应关系
13e~13f 0000 仅用于服务器向客户返回应答
140~146 6d79 6e61 6d65 00 客户名字为“myname”
---------------------------------------------------------------------------------------
147 3c DHCP 客户提供商标识选项代码
148 07 选项长度为 7Byte
149~14f 4d 5346 5420 3938 DHCP 客户提供商标识为“MSFT 98” (Microsoft 98)
---------------------------------------------------------------------------------------
150 37 请求列表选项代码
151 09 选项长度为 9Byte
152 01 子网掩码选项代码
153 0f 域名选项代码
154 03 路由选项代码
155 06 域名服务器选项代码
156 2c netbios 名称服务器选项代码
157 2e netbios 节点类型选项代码
158 2f netbios scope 选项代码
159 2b 提供商指定信息选项代码
15a 4d 用户类型选项代码(RFC3004)
---------------------------------------------------------------------------------------
15b ff 结束选项代码
---------------------------------------------------------------------------------------
(4)B 发向 A 的 DHCPACK 帧
字节偏移 内容 含义
00~05 ff:ff:ff:ff:ff:ff 目的以太网地址(以太网广播地址)
06~0b 0000 b491 e66a 源以太网地址(DHCP 服务器 B 的以太网地址)
·78· Internet 应用协议实例剖析与服务器配置

0c~0d 0800 表明所携带数据为 IP 包


************************(以下为 IP 包的内容)***********************
0e~0f 0100010100000000 (展开成二进制,十六进制为 0045)
0100 IPv4(IP 版本)
0101 IP 包头长为 5×4=20Byte
00000000 未指定服务类型
10~11 0148 IP 包总长度
12~13 8a9b 标识符
14~15 0000000000000000 (展开成二进制,十六进制为 0000)
000 此包可以被分段,并且这就是最后一段(即未分段)
000000000000 此段的偏移
16 40 生存时间
17 11 此 IP 包所携带数据为 UDP 包
18~19 2574 头部校验和
1A~1D cac2 fed3 源 IP 地址 202.194.254.211
1e~21 ffff ffff 目的 IP 地址为 IP 广播地址
************************(以下为 UDP 包的内容)***********************
22~23 0043 源 UDP 端口号(DHCP 服务器的周知端口号 67)
24~25 0044 目的 UDP 端口号
26~27 0134 UDP 包的长度
28~29 b12d 校验和
************************(以下为 DHCP 包的内容)*********************
2a 02 操作码 02 表示由服务器发向客户
2b 01 硬件类型 01 表示硬件类型为以太网
2c 06 硬件地址长度(6Byte)
2d 00 步数 0(未经过 DHCP 中继)
2e~31 c770 e71b 序号
32~33 0000 从开始请求起经过的时间为 0s
34~35 0000 标志字段的首比特为 0 表示客户可以接收 IP 单播
地址
36~39 0000 0000 客户 IP 地址未知
3a~3d cac2 fe0d 分配给客户的 IP 地址 202.194.254.13
3e~41 cac2 fed3 服务器 IP 地址 202.194.254.211
42~45 0000 0000 中继 IP 地址
46~55 0010 5a5e 7d10 0000 „.0000 客户硬件地址
56~95 0000 „. 0000 DHCP 服务器的名字
96~115 0000 „. 0000 启动文件名
116~119 6382 5363 幻数,表明后面跟有 DHCP 选项
*************(以下是用横线分开的 DHCP 选项)******************
第3章 DHCP 应用 ·79·

11a 35 信息类型选项代码
11b 01 选项长度为 1Byte
11c 05 信息类型为地址租用确认(DHCPACK)
---------------------------------------------------------------------------------------
11d 36 服务器标识选项代码
11e 04 选项长度为 4Byte
11f~122 ca c2fe d3 服务器标识为“202.194.254.211”
---------------------------------------------------------------------------------------
123 33 租期选项代码
124 04 选项长度为 4Byte
125~128 00 00a8 c0 租期为 0xa8c0(43200)s
---------------------------------------------------------------------------------------
129 3a T1 选项代码
12a 04 选项长度为 4Byte
12b~12e 00 0054 60 T1 为 0x5460(21600)s
---------------------------------------------------------------------------------------
12f 3b T2 选项代码
130 04 选项长度为 4Byte
131~134 00 0093 a8 T2 为 0x93a8(37800)s
---------------------------------------------------------------------------------------
135 01 子网掩码选项代码
136 04 选项长度为 4Byte
137~13a ff ffff 00 子网掩码为 255.255.255.0
---------------------------------------------------------------------------------------
13b 03 路由选项代码
13c 04 选项长度为 4Byte
13d~140 ca c2fe fe 默认路由为 202.194.254.254
---------------------------------------------------------------------------------------
141 06 域名服务器选项代码
142 04 选项长度为 4Byte
143~146 ca c2f0 58 域名服务器为 202.194.240.88
---------------------------------------------------------------------------------------
147 0f 域名选项代码
148 0c 选项长度为 12Byte
149~154 73 6469 652e 6564 752e 636e 00 域名为“sdie.edu.cn”
---------------------------------------------------------------------------------------
155 ff 结束选项代码
---------------------------------------------------------------------------------------
UDP 校验和的计算见第 4 章“DNS 应用”的实例剖析部分。
第4章 DNS 应用

4.1 DNS 简介

在 IP 包中,IP 地址用来惟一地标识一台主机。在 Internet 上,当一主机与其他主机通信


时,必须使用 IP 地址,但通常访问 Internet 服务时最常使用的还是与 IP 地址相对应的更易于
记忆的名字,例如使用名字“www.faqs.org”而不是 IP 地址“207.44.135.116”来访问这个提
供了大量 RFC 资料的网站。实际上二者是具有直接对应关系的,名字最终还是需要被解析为
IP 地址,这样才能进行基于 IP 的通信。
最早的名字系统就是每一台 UNIX 主机上的 hosts 文件,hosts 文件记录着经常被使用的
计算机名字与 IP 地址的对应关系,而且这个文件必须存在于所有需要使用名字工作的主机
上。随着 Internet 规模的扩张,虽然仍然可以通过 hosts 文件来设置 IP 地址和名字之间的对
应关系,但已经不可能在每台计算机上进行这样的设置,于是就产生了域名系统(DNS,
Domain Name System)。
DNS 协议是 Internet 应用层协议,RFC1034 和 RFC1035 详细描述了 DNS 的细节。
域名系统是由域名客户端和域名服务器组成的。Internet 任意一台可以利用名字对其
他主机进行访问的主机都执行域名客户端的任务,即在需要的时候向某些域名服务器发出
名字解析的请求,并接收和解释域名服务器发回的应答。域名服务器是被动接收客户端发
来的域名请求并从自己的数据库中或从其他域名服务器中为客户查找答案的主机。域名服
务器进程使用 TCP 的 53 号端口和 UDP 的 53 号端口,其中 TCP 的 53 号端口一般用于两
域名服务器之间的备份,而 UDP 的 53 号端口一般用于普通客户端与服务器端的域名请求
与应答通信。

4.2 DNS 包格式

4.2.1 DNS 包的基本结构

一个 DNS 包可以分成 5 大部分,如图 4-1 所示。


各个部分的功能如下所述。
① DNS 头:这一部分的各个字段值具体规定了 DNS 包的基本属性和其余部分的使
用情况。
② 问题记录区:这一部分记录客户方向服务器所提出的问题。
·82· Internet 应用协议实例剖析与服务器配置

③ 回答记录区:这一部分记录服务器对客户
方问题作出的回答。 DNS 头
④ 权威记录区:服务器利用此区域指引客户
问题记录区
方查找权威的域名服务器。
⑤ 附加记录区:这一部分用于记录与本次问 回答记录区
询过程非直接相关的记录。
权威记录区
4.2.2 DNS 头结构
附加记录区

DNS 头的基本结构如图 4-2 所示,其中各字段


图 4-1 DNS 包的基本结构
的含义如下所述。
① 标识号字段:这是由客户端产生
的一个 16bit 的数,用于标识本次问询, 0 15
服务器方回答问题时应在应答包中包含相
标识号
同的标识号。
属性
② 属性字段:该属性字段的长度为
16bit,按照从左到右的顺序依次将每一 问题记录的个数
个比特编号为 0~15,则它们的具体含义
回答记录的个数
如下:
权威记录的个数
位编号 含义
0 问询/回答 附加记录的个数
0:此包用于问询
图 4-2 DNS 头结构
1:此包用于应答
1~4 操作码
0000:标准查询
0001:反向查询
0010:服务器状态请求
其他:未用
5 权威性
0:非权威回答
1:权威回答
6 截尾位
0:未被截尾
1:因长度过大,已被截尾发送
7 要求递归
0:客户要求服务器按照反复式方法查找并回答
1:客户要求服务器按照递归式方法查找并回答
8 支持递归
0:服务器不支持递归式查找
第4章 DNS 应用 ·83·

1:服务器支持递归式查找
9~11 保留位
12~15 应答码
0000:没有错误发生
0001:服务器无法理解查询包
0010:因服务器失败而无法正确回答
0011:无法找到被问询的名字
0100:服务器不支持此类型的查询
0101:服务器拒绝服务
其他:未用
③ 问题记录的个数字段:该字段的长度为 16bit,表示问题记录区包含的记录个数。
④ 回答记录的个数字段:该字段的长度为 16bit,表示回答记录区包含的记录个数。
⑤ 权威记录的个数字段:该字段的长度为 16bit,表示权威记录区包含的记录个数。
⑥ 附加记录的个数字段:该字段的长度为 16bit,表示附加记录区包含的记录个数。

4.2.3 问题记录的格式

问题记录区是由 0 个、1 个或多个问题记录组成,实际个数取决于 DNS 头中的问题


记录个数字段的值,每一个问题记录的格式如图 4-3 所示, 其中各个字段的含义如下
所述。
① 名字字段:名字由一系列的字符串组
0 15 成,例如“www.sdie.edu.cn”是由“www”、
名字 “sdie”、“edu”、“cn”4 个字符串组成的,名
字字段用一个长度字节加上相应个数的字符
查询类型 来表示一个字符串,把多个字符串连续存放
地址类别
组成名字字段,并且以 0 长度的字符串表示
整个名字串的结束。名字字段的长度随名字
图 4-3 问题记录的格式 的不同而不同。
② 查询类型字段:该字段的长度为 16bit,
说明要根据名字字段的值查询什么样的结果,不同的字段值的含义举例如下:
字段值 含义
1 主机地址(A)
2 域名服务器地址(NS)
15 邮件交换服务器地址(MX)
③ 地址类别字段:该字段的长度为 16bit,字段值为 1 时表示 Internet 地址类别,即 IP
地址。

4.2.4 回答记录的格式

回答记录区是由 0 个、1 个或多个回答记录组成,实际个数取决于 DNS 头中的回答记录


·84· Internet 应用协议实例剖析与服务器配置

个数字段,每一个回答记录的格式如图 4-4 所示。


图 4-4 中各个字段的含义如下所述。
0 15
① 名字字段:此字段与问题记录的名字字段含义
名字
相同。
② 类型字段:此字段与问题记录的查询类型字段含 类型
义相同。
地址类别
③ 地址类别字段:此字段与问题记录的地址类别字
段含义相同。 生存时间

④ 生存时间字段:此字段长度为 32bit,它是允许客
数据长度
户缓存此记录的以 s 为单位的最长时间。
⑤ 数据长度字段:当数据字段是一个 IP 地址时,此 数据

字段的值总为 4。
图 4-4 回答记录的格式
⑥ 数据字段:长度与数据长度字段值相同的数据。

4.3 DNS 客户端

4.3.1 DNS 客户端实现

一般每个主机都会有许多客户端应用程序需要利用名字来工作,多数操作系统提供了系
统函数 gethostbyname(),应用程序需要对名字进行解析时可以直接调用这个函数,而
gethostbyname()的功能就是根据本机的配置信息向相应的域名服务器查询应用程序通过参
数传递来的名字,并把服务器发来的结果通过返回值传递给应用程序。
另外应用程序 nslookup 也是一个完整的 DNS 客户端的实现,可以用它来学习或调试域
名服务器的配置。nslookup 可以根据用户需要组建相应的查询包并发向用户指定的域名服
务器,然后把得到的结果显示给用户。下面是一段用 nslookup 程序查询一个域名服务器的
实例。
1 [nothing@IBMServer /nothing]$ nslookup - 202.194.254.210
2 Default Server: dns.clab.sdie.edu.cn
3 Address: 202.194.254.210
4 > set type=A
5 > www.sdie.edu.cn
6 Server: dns.clab.sdie.edu.cn
7 Address: 202.194.254.210
8 Name: www.sdie.edu.cn
9 Address: 202.194.240.88
10 > set type=MX
11 > sdie.edu.cn
第4章 DNS 应用 ·85·

12 Server: dns.clab.sdie.edu.cn
13 Address: 202.194.254.210
14 sdie.edu.cn preference = 10, mail exchanger = mail.sdie.edu.cn
15 mail.sdie.edu.cn internet address = 218.98.166.6
16 > set type=NS
17 > clab.sdie.edu.cn
18 Server: dns.clab.sdie.edu.cn
19 Address: 202.194.254.210
20 clab.sdie.edu.cn nameserver = dns.clab.sdie.edu.cn
21 dns.clab.sdie.edu.cn internet address = 202.194.254.210
上例中,斜体部分是用户输入信息,其他部分为 nslookup 程序显示的信息。第 4~9
行实现了查询出“www.sdie.edu.cn”这个名字对应的 IP 地址为“202.194.240.88”的功能;
第 10~15 行实现了查出“sdie.edu.cn”所对应的邮件交换器地址为“218.98.166.6”的功能;
第 6~21 行实现了查出“clab.sdie.edu.cn”域的域名服务器的 IP 地址为“202.194.254.210”
的功能。

4.3.2 DNS 客户端配置

在配置一台参与 Internet 通信的计算机时,除了配置 IP 地址、掩码、默认网关等信息外,


如果需要利用名字访问其他主机,还需要配置“DNS 服务器”项,即本计算机将利用哪个域
名服务器来查询名字信息。Linux 主机的/etc/resolv.conf 文件用于配置域名服务器信息,如某
Linux 主机的/etc/resolv.conf 文件中包含一行信息“nameserver 202.194.254.210”
,则表明本机
将利用 IP 地址为 202.194.254.210 的域名服务器来查询名字信息。例如某 Windows 系统的域
名 服 务 器 配 置 界 面 如 图 4-5 所 示 , 则 表 明 计 算 机 利 用 IP 地 址 为 202.194.240.88 和
202.102.128.68 的域名服务器来查询名字。

图 4-5 windows 域名服务器配置


·86· Internet 应用协议实例剖析与服务器配置

4.4 DNS 服务器

4.4.1 DNS 服务器简介

域名服务器既可以帮助客户端根据名字查询 IP 地址或另一个名字,也可以根据 IP 地址
查询名字,前者是大部分 Internet 用户最经常使用的功能,也是本章后面各部分主要介绍内
容。Internet 域名系统中的域名服务器按照其所服务的域组成一个树型结构,如图 4-6 所示。

.(192.58.128.30)

„„
com cn edu

(192.5.6.30) (61.145.114.118) (192.58.128.30)

com gov edu „„

(202.112.0.34) (61.145.114.119) (202.112.0.33)

cisco yahoo „„ tsinghua sdie sdu „„

(202.106.124.194) (66.218.71.63) (166.111.8.30) (202.194.240.88) (202.194.192.66)

clab cc „„

(202.194.254.210) (202.194.253.246)

图 4-6 域名服务器组成的树

图中的根节点(.)是 IP 地址为 192.58.128.30 的主机,称为根域的域名服务器,根节点的


子节点被分别称为 com 域域名服务器、cn 域域名服务器、edu 域域名服务器等。其中 cn 域
域名服务器的几个子节点被分别称为 com.cn 域域名服务器、gov.cn 域域名服务器、edu.cn 域
域名服务器等。依此类推,sdie.edu.cn 域的域名服务器为 202.194.240.88。图 4-6 中每一个域
名服务器都具有与本域相关的数据库(详见 4.4.4 节) 。
实际上,域名服务器树中的每一个节点都可以有多个备份,图 4-6 中所显示的每一个节
点对应的 IP 地址只是选择了其中一个而已。例如根域的域名服务器就有多个,以下这些 IP
地址对应的主机都执行根域的域名服务器功能:
198.41.0.4 198.32.64.12 128.9.0.107 192.33.4.12
128.8.10.90 192.203.230.10 192.5.5.241 192.112.36.4
128.63.2.53 192.36.148.17 198.41.0.10 193.0.14.129
202.12.27.33
第4章 DNS 应用 ·87·

另外多个域的域名服务也可以合并到一个域名服务器上,这完全取决于管理者的策略,
但逻辑上的树结构并没有改变。
任何一个节点增加一个子域名服务器或备份域名服务器,都必须在父节点的数据库中增
加一条指向子节点的记录。

4.4.2 DNS 服务器的分类

DNS 服务器按照其用途可以分为 3 种类型:纯缓存型服务器、主域名服务器和备份域名


服务器。
纯缓存服务器的数据库中只保存根域名服务器的信息,而不保存其他某个特定域的名字
信息,即它不属于图 4-6 中由域名服务器组成的树中的一个节点,这样的域名服务器对客户
发来的每一个问询都需要沿着由根域名服务器开始的路径去查找结果,并把结果转交给客户,
同时在自己的缓存中保存结果。在 Linux 中默认安装并启动 DNS 服务器 BIND 后,就启动了
一个纯缓存型域名服务器。
主域名服务器属于由域名服务器组成的树中的一个节点。相对于缓存型域名服务器,
Internet 域名服务器树中的每一个域名服务器称为其所对应域的权威域名服务器,由权威域名
服务器对关于本域的名字问询所作的回答称为权威回答。它需要上级域名服务器(父节点域
名服务器)的授权。
每一个备份域名服务器也是由域名服务器组成的树中的一个节点,它与主域名服务器的
区别在于:备份域名服务器从主域名服务器中下载服务器数据库文件。备份域名服务器会定
期查询主域名服务器以保证得到最新的数据,也能以权威的方式回答域名查询。
主域名服务器和备份域名服务器的具体配置方法见 4.4.4 节。

4.4.3 DNS 服务器的安装与启动

BIND 是一个可以运行在 Linux 系统上的 DNS 服务器软件,下面以 RedHat Linux 8.0 系


统为例介绍 BIND 的安装。
在 Linux 安装光盘中找到(或从 Linux 发行商的相应站点免费下载)bind-*.*-*.rpm
(“*.*-*”
代表版本号) ,然后运行 rpm 命令即可安装 BIND。
启动 BIND 可以使用 Linux 的默认启动脚本:
#/etc/rc.d/init.d/named start

4.4.4 DNS 服务器的配置

BIND 的配置需要多个配置文件,其中大致分为全局配置文件(/etc/named.conf)和数据
库文件(默认在/var/named 目录下)两类。
1.全局配置文件/etc/named.conf
该配置文件主要定义数据库文件的位置信息和区(zone)声明等全局参数。
一个区对应一个用于存储名字信息的数据文件, DNS 服务器是以区为单位来管理域名
空间的。一个 DNS 服务器可以管理一个或多个区。
每个区声明中主要包括本区对应的域、服务器的类型和对应的数据库文件 3 项。各种类
型服务器的 named.conf 配置文件实例分别如下所述。
·88· Internet 应用协议实例剖析与服务器配置

(1)纯缓存服务器
假设某 DNS 服务器为纯缓存型服务器,则其默认 named.conf 文件如下。
options {
directory "/var/named";
};
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
include "/etc/rndc.key";
在这个配置文件中,options 配置项指定了数据库文件的存放目录是/var/named/,controls
和 include 与用 rndc(name server control utility)工具来管理域名服务器有关,此处不详述,
下面主要对有关的区声明进行说明。
① zone "." IN 配置项:该配置项定义了一个与 Internet 类型的根域相关的区,这个区对
应的数据库文件为/var/named/named.ca,记录的是所有的 Internet 根域名服务器的信息。这个
区的类型为 hint,表示 named.ca 中的内容只是提示性的,而不是由本服务器定义的。
② zone "localhost" IN 配置项: 该配置项定义了一个与 localhost 域相关的 zone,这个 zone
对应的数据库文件为/var/named/localhost.zone。localhost.zone 只是将名字 localhost 转换为本
地回送地址(127.0.0.1)。这个 zone 的类型为 master,即管理员可以根据需要任意修改名字
localhost 与 IP 地址的对应关系。
③ zone"0.0.127.in-addr.arpa"IN 配置项:该配置项定义了一个与 0.0.127.in-addr. arpa 域相
关的区,这个区对应的数据库文件为/var/named/named.local。named.local 中只是将本地回送
地址(127.0.0.1)反向转换为名字 localhost。这里的域的名字“0.0.127.in-addr.arpa”比较特殊,
它是为了反向域名解析而制定的一种固定写法,由“0.0.127”和“in-addr.arpa”组成,其中
后者是固定的,前者根据要反向解析的地址范围而定,例如本例中的“0.0.127”代表的地址
范围是 127.0.0.*。
第4章 DNS 应用 ·89·

(2)主域名服务器
IP 地址为 202.194.254.210 的主域名服务器能够对类似于“*.clab.sdie.edu.cn”的名字进
行解析,其 named.conf 配置如下。
options {
directory "/var/named";
};
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
zone "clab.sdie.edu.cn"{
type master;
file "named.host";
};
include "/etc/rndc.key";
此文件比纯缓存型域名服务的 named.conf 文件增加了一个区声明: “clab.sdie.edu.cn”

它所对应的 named.host 数据库文件建立了“clab.sdie.edu.cn”域中的名字信息,详见本节对
named.host 的分析部分。
(3)备份域名服务器
“clab.sdie.edu.cn”域的某备份域名服务器需定期从 IP 地址为 202.194.254.210 的主域名
服务器上更新数据库,其 named.conf 如下。
options {
directory "/var/named";
};
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
·90· Internet 应用协议实例剖析与服务器配置

};
zone "." IN {
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
zone "clab.sdie.edu.cn"{
type slave;
file "named.host";
masters{202.194.254.210};
};
include "/etc/rndc.key";
此文件与主域名服务器的 named.conf 的区别如下:
① “clab.sdie.edu.cn”区声明中的类型由 master 变成了 slave,表示这个区的数据库文件
将从其他主域名服务器上获得。
② 上述的区声明中增加了“masters{202.194.254.210}”配置行,用于指定主域名服务器。
备份域名服务器一般通过 TCP 的 53 号端口从主域名服务器定期下载数据库文件。
2./var/named 下的数据库文件
数据库文件都是以资源记录(resource record)的形式存储数据的。每个资源记录都遵循
如下的基本格式:
<name> [<ttl>] [<class>] <type> <data>
每个字段之间由空格或制表符分隔。常用字段的含义见表 4-1。

表 4-1 名字段的含义
字 段 取 值 说 明

. 根域

@ 默认域,也可使用$ORIGN domain 说明默认域


name
名字 以“.”结束的全名,或是一个相对名字

空值 使用于最后一个带有名字的资源记录的名字信息
第4章 DNS 应用 ·91·

续表
字 段 取 值 说 明

ttl (time to live)生命时间,定义信息在缓存中的时限,以秒为单位。其值为空时表示采用 SOA 记录中最小的 TTL 值

class IN 表示该记录是地址类型是 Internet 类

A(Address) 后面数据为网络层地址

CNAME(Canonical Name) 后面数据为主机别名

MX(Mail Exchanger) 后面数据为邮件交换器信息


type
NS(Name Server) 后面数据为域名服务器信息

PTR(Pointer) 后面数据为对地址反向解析的信息

SOA(Start of Authorith) 后面数据为此配置文件的全局信息

type
与相应的 type 值对应的 data 字段的含义:
取值:

A IP 地址

CNAME 别名

MX 邮件交换器名字或地址

NS 域名服务器名字或地址

PTR 名字

data Origin 本机名字

person 管理员的邮件地址,注意邮件格式需要用“.”代替“@”

本文件的版本号,文件修改后要增加其值。备份服务器向该服务器索取数据时会根据
serial
此值决定是否更新
SOA
refresh 备份服务器向该服务器索取数据的时间间隔

retry 备份服务器更新数据失败时再次尝试的时间间隔

expire 备份服务器无法更新数据时原有数据多长时间失效

minimum 此区中所有资源记录允许的最小 ttl 值(RFC1035)

(1)named.ca
Internet 中的每个根域名服务器都在该文件中有一个登记项。当 DNS 服务器启动时,根
据此文件里的每个根域名服务器的登记项初始化 DNS 服务器的高速缓存。本文件一般不需要
管理员进行配置,采用系统提供的配置即可,但由于根域名服务器可以发生变化,因此系统
管理员需要定期更新该文件,该文件可以从 ftp://rs.internic.net/domain/named.ca 获得。去掉注
释后的文件实例如下所述。
. 3600000 IN NS A.ROOT-SERVERS.NET.
·92· Internet 应用协议实例剖析与服务器配置

A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4


. 3600000 NS B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET. 3600000 A 128.9.0.107
. 3600000 NS C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12
. 3600000 NS D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90
. 3600000 NS E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10
. 3600000 NS F.ROOT-SERVERS.NET.
F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241
. 3600000 NS G.ROOT-SERVERS.NET.
G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4
. 3600000 NS H.ROOT-SERVERS.NET.
H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53
. 3600000 NS I.ROOT-SERVERS.NET.
I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17
. 3600000 NS J.ROOT-SERVERS.NET.
J.ROOT-SERVERS.NET. 3600000 A 198.41.0.10
. 3600000 NS K.ROOT-SERVERS.NET.
K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129
. 3600000 NS L.ROOT-SERVERS.NET.
L.ROOT-SERVERS.NET. 3600000 A 198.32.64.12
. 3600000 NS M.ROOT-SERVERS.NET.
M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33
(2)localhost.zone
此文件用于将名字 localhost 转换为本地回送地址(127.0.0.1)。一般情况下,该文件不需
要重新配置。文件实例如下所述。
$TTL 86400
$ORIGIN localhost.
@ 1D IN SOA @ root (
42 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum

1D IN NS @
1D IN A 127.0.0.1
第4章 DNS 应用 ·93·

(3)named.local
此文件用于将本地回送地址(127.0.0.1) 转换为名字 localhost。一般情况下,该文件不需
要重新配置。文件实例如下所述。
$TTL 86400
@ IN SOA localhost. root.localhost. (
1997022700 ; serial
28800 ; refresh
14400 ; retry
3600000 ; expire
86400 ) ; minimum
IN NS localhost.

1 IN PTR localhost.
(4)named.host
此文件是主域名服务器中最重要的记录文件,文件实例如下所述。
@ IN SOA clab.sdie.edu.cn. webmaster.clab.sdie.edu.cn. (
2000083103 ; serial
900 ; refresh
300 ; retry
604800 ; expire
36000 ; minimum
)
@ IN MX mail.clab.sdie.edu.cn.
mail IN A 202.194.254.72
www IN A 202.194.254.89
ftp IN A 202.194.254.89
cc IN NS 202.194.254.246
此数据库文件中每一行的含义如下所述。
① “@ IN SOA clab.sdie.edu.cn. webmaster.clab.sdie.edu.cn.”表示本机的名字为
clab.sdie.edu.cn,管理员的邮件地址是 webmaster@clab.sdie.edu.cn。
② “2000083103 ; serial”表示本文件的版本号是 2000083103(一般用日期和时间表示)。
行中的分号后面部分是注释,下同。
③ “900 ; refresh” 表示备份服务器向该服务器索取数据的时间间隔为 900s。
④ “300 ; retry” 表示备份服务器更新数据失败时再次尝试的时间间隔为 300s。
⑤ “604800 ; expire”表示经过 604800s(7 天)若备份服务器仍无法更新数据时原有数
据失效。
⑥ “36000 ; minimum”表示最小生存时间(TTL)值为 36000s。
⑦ “@ IN MX mail.clab.sdie.edu.cn.”表示“clab.sdie.edu.cn”对应的 Internet 邮
件交换服务器是“mail.clab.sdie.edu.cn”,即若要向 XXX@sdie.edu.cn(此处的 XXX 代表
·94· Internet 应用协议实例剖析与服务器配置

任何有效的账号名,例如“zhansan”)发送邮件,则邮件的发送者应该利用 SMTP 协议将


此邮件发送至 mail.clab.sdie.edu.cn 主机,由 mail.clab.sdie.edu.cn 主机利用特定的方式最终
将邮件送达客户。
⑧ “mail IN A 202.194.254.72”表 示名字 为“ mail.clab.sdie.edu.cn ”的 主机的
Internet 地址(IP 地址)是“202.194.254.72” 。
⑨ “www IN A 202.194.254.89”表示名字为“www.clab.sdie.edu.cn”的主机的 Internet
地址(IP 地址)是“202.194.254.89” 。
⑩ “ftp IN A 202.194.254.89” 表示名字为“ftp.clab.sdie.edu.cn”的主机的 Internet
地址(IP 地址)是“202.194.254.89” 。
由第 9 行和第 10 行可知名字“www.clab.sdie.edu.cn”和“ftp.clab.sdie.edu.cn”所对应的
是同一个 IP 地址“202.194.254.89” ,这在域名系统中是经常使用的,另外一个名字对应多个
IP 地址也是可以的,例如若某 WWW 服务器有多个备份,则多个服务器一般共用一个名字但
使用不同的 IP 地址,例如名字“www.yahoo.com”对应多个 IP 地址:66.218.70.49、
66.218.70.50、66.218.71.84、66.218.71.86、66.218.71.89...。
“cc IN NS 202.194.254.246”表示“cc.clab.sdie.edu.cn”域的名字解析工作由 IP
地址为“202.194.254.246”的域名服务器负责,即“cc.sdie.edu.cn”域的域名服务器的 IP 地
址是“202.194.254.246” 。
从上述各行可以看出,一个域名服务器既存有一系列的名字与 IP 的对应关系,又记录了
与本域相关的邮件服务信息,另外还有下级域名服务器的信息,每当要为某域增加一个子域
时,就需要在此域的域名服务器中增加一条 NS 记录指向自己的子域域名服务器。

4.5 DNS 查询方式

域名客户端查询域名服务器的基本方式有两种:反复式查询和递归式查询。

4.5.1 反复式查询

反复式查询的基本过程是:首先客户端向服务器发出查询,并在 DNS 包中指明这是


一次反复查询以及要查询的信息;服务器收到查询请求后,首先判断被查询信息是否就在
自己的数据库记录中,若在则直接组建 DNS 包回答客户端,否则通知客户端下一步应如
何继续问询。例如,若某客户机指定 202.194.240.88 为自己的域名查询服务器,则 DNS
查询过程如下所述。
(1)若客户端以反复方式向服务器查询名字 www.sdie.edu.cn 对应的 IP 地址,服务器应
直接从自己的 A 记录中查到结果并通过发送 DNS 包告诉对方“名字 www.sdie.edu.cn 对应的
IP 地址是 202.194.240.88”

(2)若客户端以反复方式向服务器查询名字 www. clab.sdie.edu.cn 对应的 IP 地址,服务
器应根据自己的 NS 记录告诉客户“请你向 202.194.254.210(clab.sdie.edu.cn 域的域名服务器)
查询” 。客户收到服务器的回答后会再向 202.194.254.210 发出同样的问询,而 202.194.254.210
则会直接给出结果。
第4章 DNS 应用 ·95·

(3)若客户端以反复方式向服务器查询名字 www.yahoo.com.cn 对应的 IP 地址,因为此


名字信息既不在自身的数据库中也不在自己的某个子节点的数据库中,因此服务器会告诉客
户“请你向 192.58.128.30(根域名服务器)查询” ,于是客户端又依次向 192.58.128.30(根域
名服务器) 、61.145.114.118(cn 域的域名服务器)
、202.112.0.34(com.cn 域的域名服务器)

66.218.71.63(yahoo.com.cn 域的域名服务器查询,最终 yahoo.com.cn 域的域名服务器会给客
户找到答案,即 www.yahoo.com.cn 对应的 IP 地址是 202.3.77.36。

4.5.2 递归式查询

递归式查询的基本过程是:客户端向服务器发出查询,并在 DNS 包中指明这是一次递


归查询及要查询的信息;服务器收到查询请求后,首先判断被查询信息是否就在自己的数据
库记录中,若在则直接组建 DNS 包回答客户端,否则,此服务器应当转而充当客户端的角色
替原客户端查找答案后再把结果转送给用户,此服务器替客户端向其他服务器查询时可以使
用反复方式也可以使用递归方式。在 Internet 域名服务器组成的树中,靠近根的域名服务器
大多设置成“不支持递归式查询”以减轻自身工作量,在这种情况下,即使客户端向它发出
递归式问询,它也会按照反复式方式给出应答,并在应答包中指明自己不支持递归式查询,
这时客户端可能要继续向其他域名服务器发出问询。 支持递归式查询的 DNS 服务器一般同时
具有缓存功能,即把替客户端查询到的结果暂存起来,当另外一个客户端查询同一个问题时,
就可以直接从缓存中找到结果而不必去问询其他服务器。当然对一个结果的暂存是有时间限
定的,任一个包含查询结果的 DNS 包中同时包含有此结果可以被缓存的最长时间。当一个域
名服务器把自己缓存中的数据作为查询结果向客户端发送应答时,必须在 DNS 包中指明这个
回答是否为权威的。

4.6 实 例 剖 析

4.6.1 环境介绍

此例使用的网络结构如图 4-7 所示。


网络 202.194.254.0/24 通过路由器的以太网接口 1 与路由器相连,路由器的接口 1 被设
定为 202.194.254.0/24 网络内每一主机的网关,在 A 计算机设定 202.194.254.210(即主机 C)
为自己的域名查询服务器,而且 C 为纯缓存型域名服务器。DNS 客户机与 DNS 服务器不一
定要处于同一个 IP 网络内,此例只是恰好如此而已。
网络 202.194.240.0/24 通过路由器的以太网接口 2 与路由器相连,路由器的接口 2 被设
定为 202.194.240.0/24 网络内每一主机的网关,主机 B 的 IP 地址为 202.194.240.88,并且拥
有名字 www.sdie.edu.cn。
在 A 计 算 机 上 执 行 “ ping www.sdie.edu.cn ” 命 令 , ping 程 序 会 调 用 操 作 系 统 的
gethostbyname()函数要求将“www.sdie.edu.cn”转换成 IP 地址,gethostbyname()函数会
根据本机的域名服务器配置信息向域名服务器(IP 地址为 202.194.254.210)发出问询,表达
了问询信息的 DNS 包被封装在目的端口号为 53 的 UDP 包中,此 UDP 包又被封装在目的 IP
·96· Internet 应用协议实例剖析与服务器配置

地址为 202.194.254.210 的 IP 包中。此例中,因为 DNS 客户端和服务器处于同一个 IP 网络,


若目的以太网地址已经存在于 ARP 缓存中,则 IP 包被封装在目的 MAC 地址为 C 的 MAC
地址的以太网帧中发出,C 计算机会直接收到此帧;若 C 的 MAC 地址不在 ARP 缓存中,则
先要经历一次 ARP 过程,然后才能组帧。C 计算机收到此帧后,从帧中解封装出 IP 包,继
而解封装出 UDP 包,根据目的 UDP 端口号将 DNS 包交由域名服务器进程,域名服务器进程
分析 DNS 包中的问询内容,得知客户方要查询“名字 www.sdie.edu.cn 所对应的 IP 地址” 。
此例中,C 计算机或者从自己的缓存中直接找到结果然后传送给客户端,或者搜索域名服务
器树并将结果传送给客户端。客户端收到域名服务器的正确回答后才会真正利用 ICMP 协议
向 B 计算机发出回应请求。

路由器(有两个以太网接口)

接口 1 接口 2

IP 地址:202.194.254.254 IP 地址:202.194.240.254

掩码:255.255.255.0 掩码:255.255.255.0

以太网地址:00:D0:B7:37:55:00 以太网地址:00:C0:32:32:17:6B

A „„ C „„ B

IP 地址:202.194.254.138 IP 地址:202.194.254.210 IP 地址:202.194.240.88


掩码:255.255.255.0 掩码:255.255.255.0 掩码:255.255.255.0
网关:202.194.254.254 网关:202.194.254.254 网关:202.194.240.254

MAC:00:00:B4:91:8C:6A MAC:00:A0:C9:66:98:33 MAC:00:C0:53:42:C3:00

DNS:202.194.254.210

图 4-7 DNS 实例环境

4.6.2 通信过程中的帧

在 A 计算机上利用 TCPDUMP 工具可获得由 A 发向 C 计算机的包含了 DNS 问询信息的


以太网帧和由 C 发向 A 的包含了 DNS 回答信息的以太网帧(由 C 向其他域名服务器发出的
数据没有包含在此例中) ,这两个帧的内容如下所述。
(1)A 发出的 DNS 问询帧
00000000: 00a0 c966 9833 0000 b491 8c6a 0800 4500
00000010: 003d b4e2 0000 4011 32eb cac2 fe8a cac2
00000020: fed2 0401 0035 0029 65b8 7926 0100 0001
00000030: 0000 0000 0000 0377 7777 0473 6469 6503
00000040: 6564 7502 636e 0000 0100 01
第4章 DNS 应用 ·97·

(2)C 发出的 DNS 回答帧


00000000: 0000 b491 8c6a 00a0 c966 9833 0800 4500
00000010: 004d c300 0000 8011 e4bc cac2 fed2 cac2
00000020: fe8a 0035 0401 0039 f08d 7926 8180 0001
00000030: 0001 0000 0000 0377 7777 0473 6469 6503
00000040: 6564 7502 636e 0000 0100 01c0 0c00 0100
00000050: 0100 000d c600 04ca c2f0 58

4.6.3 帧剖析

1.A 发出的 DNS 问询帧


字节偏移 内容 含义
00~05 00a0 c966 9833 目的以太网地址(C 的以太网地址)
06~0b 0000 b491 8c6a 源以太网地址(A 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
*****************(以下为 IP 包的内容)**********************************
0e~0f 0100010100000000(展开成二进制)
0100 IPv4(IP 版本)
0101 IP 包头长为 5  4=20Byte
00000000 未指定服务类型
10~11 003d IP 包总长度
12~13 b4e2 标识符
14~15 0000000000000000(展开成二进制,十六进制为 0000)
000 此包可以被分段,并且这就是最后一段(即未分段)
000000000000 此段的偏移
16 40 生存时间
17 11 此 IP 包所携带数据为 UDP 包
18~19 32eb 头部校验和
1A~1D cac2 fe8a 源 IP 地址为 202.194.254.138
1e~21 cac2 fed2 目的 IP 地址为 202.194.254.210
****************(以下为 UDP 包的内容)*******************************
22~23 0401 源 UDP 端口号
24~25 0035 目的 UDP 端口号(DNS 服务器的周知端口号 53)
26~27 0029 UDP 包的长度
28~29 65b8 校验和
****************(以下为 DNS 包的内容)******************************
2a~2b 7926 标识号
2c~2d 0000000100000000(展开成二进制)
0 此 DNS 包为一个问询包
0000 标准查询
·98· Internet 应用协议实例剖析与服务器配置

0 (只在应答包中有效,此处无效)
0 此包没有被截尾
1 要求服务器按照递归方式回答
0 (只在应答包中有效,此处无效)
000 保留未用,此处必须为 0
0000 (只在应答包中有效,此处无效)
2e~2f 0001 问题记录区中有 1 个记录
30~31 0000 回答记录区中有 0 个记录
32~33 0000 权威记录区中有 0 个记录
34~35 0000 附加记录区中有 0 个记录
36~46 0377 7777 0473
6469 6503 6564
7502 636e 00 名字“www.sdie.edu.cn”
47~48 0001 查询类型为 A
49~4a 0001 地址类别为“Internet 地址”
总结以上各个字段的含义,可知此帧中所包含的 DNS 包是向 DNS 服务器发出一个问询
“名字为 www.sdie.edu.cn 的主机的 IP 地址是什么?”
2.C 发出的 DNS 回答帧
字节偏移 内容 含义
00~05 0000 b491 8c6a 目的以太网地址(A 的以太网地址)
06~0b 00a0 c966 9833 源以太网地址(C 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
****************(以下为 IP 包的内容)******************************
0e~0f 0100010100000000(展开成二进制,十六进制为 4500)
0100 IPv4(IP 版本)
0101 IP 包头长为 5  4=20Byte
00000000 未指定服务类型
10~11 004d IP 包总长度
12~13 c300 标识符
14~15 0000000000000000(展开成二进制,十六进制为 0000)
000 此包可以被分段,并且这就是最后一段(即未分段)
000000000000 此段的偏移
16 80 生存时间
17 11 此 IP 包所携带数据为 UDP 包
18~19 e4bc 头部校验和
1A~1D cac2 fed2 源 IP 地址为 202.194.254.210
1e~21 cac2 fe8a 目的 IP 地址为 202.194.254.138
****************(以下为 UDP 包的内容)***************************
22~23 0035 源 UDP 端口号(DNS 服务器的周知端口号)
第4章 DNS 应用 ·99·

24~25 0401 目的 UDP 端口号


26~27 0039 UDP 包的长度
28~29 f08d 校验和
****************(以下为 DNS 包的内容)***********************
2a~2b 7926 标识号
2c~2d 1000000110000000(展开成二进制,十六进制为 8180)
1 此 DNS 包为一个回答包
0000 标准查询
0 非权威回答
0 此包没有被截尾
1 要求按照递归方式回答
1 服务器支持按照递归方式回答
000 保留未用,此处必须为 0
0000 没有错误发生
2e~2f 0001 问题记录区中有 1 个记录
30~31 0001 回答记录区中有 1 个记录
32~33 0000 权威记录区中有 0 个记录
34~35 0000 附加记录区中有 0 个记录
36~46 0377 7777 0473
6469 6503 6564
7502 636e 00 名字“www.sdie.edu.cn”
47~48 0001 查询类型为 A
49~4a 0001 地址类别为“Internet 地址”
4b~4c 1100000000001100(展开成二进制,十六进制为 c00c)
11 压缩方式
00000000001100 指向字符串“www.sdie.edu.cn”的指针
4d~4e 0001 查询类型为 A
4f~50 0001 地址类别为“Internet 地址”
51~54 00000dc6 生存时间为 0xdc6s
55~56 0004 数据长度,即 IP 地址长度
57~5a ca c2f0 58 IP 地址 202.194.240.88
总结以上各字段的含义可知,此帧中所包含的 DNS 包是由 DNS 服务器发向客户方的,
并且告知客户, “www.sdie.edu.cn 所对应的 IP 地址是 202.194.240.88” 。
此帧中,第 36~4a 字节是客户发来的问题记录,第 4b~5ap 字节为回答记录,在回答记
录中使用了“压缩方式” ,所谓“压缩方式”即当一个字符串的长度字节的高 2bit 为“11”
时,后续 14bit 是指向一个字符串的指针,而不是字符串本身,本例中后续的 14bit 是
"00000000001100",其值写成十进制是 12,所以此指针是指向 DNS 数据包的第 12Byte 开始
的字符串即“www.sdie.edu.cn” 。DNS 包中回答记录的生存时间 0xdc6,即十进制数 3526,
即此回答记录的有效时间是大约 1 小时,任何得到此记录的主机最多将其缓存 1 小时。
·100· Internet 应用协议实例剖析与服务器配置

4.6.4 校验和的计算

IP 头的校验值的计算已经在 1.6.6 节做过详细介绍,本节只对 UDP 包校验和进行详细计算。


我们以 A 发向 C 的 UDP 包为例看一下 UDP 校验和的计算,依次执行以下步骤。
(1)组建 UDP 伪头。UDP 伪头的格式已经在 1.7 节介绍过,对 A 发向 C 的 UDP 包组建
出来的伪头如图 4-8 所示。

0 15 16 31

源 IP 地址(202.194.254.138)

目的 IP 地址(202.194.254.210)

0 0x11 UDP 包长度(0x29)

图 4-8 UDP 伪头结构

(2)确定要被校验的字段。令所有要被校验的字段组成一个字节序列,按照 UDP 协议
要求,这个字节序列是根据一个 UDP 伪头和将校验和字段清零后的 UDP 包组合得到的,因
此可把 UDP 伪头的各个字节和整个 UDP 包(校验和字段清零)的各个字节排列如下:
cac2 fe8a cac2 fed2 0011 0029 0401 0035
0029 0000 7926 0100 0001 0000 0000 0000
0377 7777 0473 6469 6503 6564 7502 636e
0000 0100 01
(3)确定要被校验的字节数。此例中被校验的是 45(十进制)个字节,总字节数为奇数,
需补零,补零后形成的字节序列为:
cac2 fe8a cac2 fed2 0011 0029 0401 0035
0029 0000 7926 0100 0001 0000 0000 0000
0377 7777 0473 6469 6503 6564 7502 636e
0000 0100 0100
(4)累加所有 16bit 整数。为了计算方便,可先把所有整数累加后,再将所有进位一次
截取加到剩余 16bit 整数上。
cac2+fe8a+cac2+fed2+0011+0029+0401+0035
+0029+0000+7926+0100+0001+0000+0000+0000
+0377+7777+0473+6469+6503+6564+7502+636e
+0000+0100+0100=69a41
9a41+6=9a47
(5)将结果取反: ~9a47=65b8。
(6)将结果 65b8 填写到校验和字段。
最后得到的结果 65b8 与我们实际看到的由 A 发出的 UDP 包的第 28~29 字节吻合。
第5章 TELNET 应用

5.1 TELNET 协议基础

TELNET 协议是 Internet 应用层协议,默认情况下,服务器端基于 TCP 23 号端口工作。


TELNET 协议的目的是提供一种通用的、双向的、面向 8bit 字节的通信机制,这种机制既有
利于终端设备和面向终端的进程之间的通信,同时也可用于进程与进程或终端与终端之间的
通信。 (在 Internet 应用中,主要是两个进程之间的通信。 )
TELNET 协议建立在以下 3 个主要的原则之上:
(1)虚拟终端;
(2)选项协商方法;
(3)通信双方地位对等。
在基于 TELNET 的 Internet 通信中,当双方进程建立 TCP 连接之后,每一方都把对方看
成一个网络虚拟终端(NVT,Network Virtual Terminal)。NVT 是一个假想的设备,它提供一
种标准的、适用于网络范围的字符终端的中间表示,这就使得通信双方不必事先知道并记住
对方的终端特征和约定,任一方都假设对方为 NVT,并把自己的终端特征和约定与 NVT 进
行对应。目前,Internet 上存在各种不同的终端类型和字符集,在制订 NVT 标准时,如果只
尽量地考虑已经存在终端的共性,则容易使 NVT 标准过于严格(可能会使某些类型的终端
无法将自己支持的字符集完全映射为 NVT 字符集) ,若使 NVT 标准适应目前存在的所有的
终端类型,则会使 NVT 标准过于庞大,因此现在的 NVT 标准是二者之间的折衷。
通信的任一方都有可能希望在 NVT 标准基础上添加自己的扩充功能,因此 TELNET 协
议引入了选项协商方法来适应这种需要。使用 TELNET 协议的选项协商方法可以在通信双方
之间协商非标准 NVT 的特殊约定,例如改变字符集、改变响应模式等。在协商选项时,双
方使用“DO、DON'T、WILL、WON'T”结构。这里的“DO” 、
“DON'T”、
“WILL”、
“WON'T”
只是 TELNET 命令的名称,在数据传输中使用的是与它们相对应的命令代码,二者之间的具
体对应关系见 5.3 节。
“WILL XXX”由一方发送出去,表示该方(WILL 的发送者)希望开始执行选项 XXX,
“DO XXX”和“DON'T XXX”可以分别是对方的肯定和否定回应;类似地,DO XXX 指示
希望对方(也即 DO 的接收者)开始执行选项 XXX、 “WILL XXX”和“WON'T XXX”分别
是对方的肯定和否定回应。由于在没有使用任何选项的情况下,双方都处于标准 NVT 状态,
所以可以通过使用“DON'T”和“WON'T”回应来保证双方都处于可以处理的状态中。因此,
所有主机都应该这样实现它们的 TELNET 进程:在完全不知道一个选项的情况下,只需要简
单地拒绝该选项请求。
·102· Internet 应用协议实例剖析与服务器配置

选项协商的基本策略是一方向另一方发出要求对方接受某选项的请求,若对方接受此选
项,则发回相应的接受回答,此选项将在双方同时生效;若对方不接受此选项,则发回不接
受选项的回答,双方都禁用此选项,继续使用标准 NVT 作为默认约定。通信一方可以拒绝
对方发来的所有的要求启用某选项的请求,但不能拒绝对方发来的禁用某选项的请求,因为
双方必须都支持 NVT。
TELNET 协商方法规定,若双方同时向对方发出启用同一个选项的请求,则对方发来的
请求被自动当作对本方发出的相应请求的接受回答。
通信双方在已经建立 TCP 连接的基础上,任一方都可以在任意时刻向对方发送选项请求
或发送数据,二者地位对等。从前面的介绍可以看到,选项协商语法是对称的,选项协商语
法的对称性可能会导致无穷尽的应答循环:每一方都把对方发送过来的命令当作必须回答的
请求而不是对方的应答。为防止这种循环,可以应用下面这些规则。
① 一方只能请求改变选项的状态,也就是说一方不能发送对它正在使用的选项的肯定
请求。
② 如果一方所接收到的请求是要求它进入当前它所在的状态,那么该请求将不会被应
答,这种不应答对防止无穷尽的循环是非常重要的。对于那些改变模式的请求,都需要一个
应答,尽管该模式不一定改变。
③ 无论何时,只要一方向第二方发送一个选项命令(不管该命令是请求还是应答) ,而
且使用该选项将会对从第一方发送到第二方的数据进行处理时产生影响,那么必须把该命令
插到数据流中它希望开始起作用的点上。需要注意的是,传送请求和接收到可能是否定的应
答的过程需要一些时间,因此,一台主机在发出对一个选项的请求后可能需要缓冲后面要发
送的数据,直到它知道该请求是被接受还是被拒绝。
选项请求在 TELENT 连接刚刚建立的时候要在连接的两端往返传送许多次,每一方都试
图从对方获取尽可能好的服务。
如果一个进程在收到一个拒绝回应后,仅仅是重新请求该选项,那么由一个进程发起的
请求将会导致不停的请求循环。为了防止出现这样的循环,不能重复发送被拒绝的请求,除
非某些东西改变了(例如该进程运行了一个不同的程序,或者用户已经发出了另外的命令,
或者出现了其他所有可以影响一个进程及其选项的上下文的东西)。根据经验,重新请求只能
是在一个连接的另外一端后来又提交了某些信息,或者本地用户的有人工干预的情况下进行。

5.2 网络虚拟终端(NVT)

NVT 是双向字符设备,它具有打印机和键盘,打印机处理对方发来的数据,键盘可以产
生数据并通过已经建立的连接发向对方,若需要“本地响应” ,打印机也要处理本地键盘产生
的数据。
NVT 字符集是 8bit USASCII 码,任何字符转换都是本地问题,它并不影响 NVT。

5.2.1 数据传输

尽管 TELNET 连接是全双工模式,但 NVT 应被看成一个半双工设备,因为它工作于线


第5章 TELNET 应用 ·103·

性缓存模式(line-buffered mode),也就是说,除非使用选项协商功能改变了工作模式,否则
必须遵守下面的数据传输规则。
(1)在本地缓存允许的情况下,发送方应该收集一行数据后将整行数据一起发出,或使
用本地特定的某个信号来决定数据发送的时刻,这个特殊信号可以由一个进程产生或人为产
生。制订这个规则的原因是:若每产生一个字符就向对方发送一次,则对方将因频繁的网络
中断而消耗大量系统时间。
(2)当一个进程已经向打印机发送完数据,但暂时还没有来自键盘的数据需要处理时,
此进程必须发送一个名称为“TELNET Go Ahead(GA)”的命令,这是为了使像 IBM 2741
这样的半双工终端正常工作。

5.2.2 控制功能

TELENT 协议的主要目标是在通过网络连接的终端设备和面向终端的进程之间提供一个
标准的接口。早期具有这种互联性质的实验表明,大部分的服务器都实现了某些功能,但调
用这些功能的方式却差别很大。对于一个要与多个服务器系统交互的用户来说,这些差别是
一个非常大的障碍。因此,TELNET 协议定义了这些功能中的 5 种标准表示。NVT 定义的 5
种常用的控制功能表述如下。
① 中断进程(IP,Interrupt Process)。大多系统需要对进程实行挂起、中断、结束
等功能,例如当用户怀疑进程陷入死循环的时候。在 NVT 中用命令名“IP”代表此项
功能。
② 放弃输出(AO,Abort Output) 。当一个进程在源源不断地产生输出时,可能需要中
途停止这种输出。在 NVT 中用命令名“AO”代表此项功能。
③ 查询对方的存在(AYT,Are You There) 。当对方长时间沉默时,可以使用这种功能
向对方发出问询,若对方支持的话,则会回应一串可显示字符以表达对方目前的状态。在 NVT
中用命令名“AYT”代表此项功能。
④ 删除字符(EC,Erase Character)。当需要删除刚刚错误输入的字符时使用此项功能。
在 NVT 中用命令名“EC”代表此项功能。
⑤ 删除行(EL,Erase Line)。此功能可以将当前行的数据全部删除。在 NVT 中用字符
串“EL”代表此项功能。

5.2.3 TELNET 同步信号

许多系统提供有一个终端的用户对一个“失控”的进程重新获得控制权的机制。5.2.2 节
描述的 IP 和 AO 功能就是这种机制的例子。在本地使用终端时,系统可以对用户发出的所有
信号进行及时响应,不管这些信号是一些普通字符还是电传打字机中的“BREAK”键或 IBM
2741 中的“ATTN”键发送的“带外”信号。然而当通过网络把系统连接起来时,情况就可
能有所不同,网络的流量控制机制可能导致这些信号被缓存到用户的计算机中而没有得到系
统的及时响应。
为了解决这个问题,TELNET 中提出了“同步” (SYNCH)机制。一个同步信号包含一
个同 TELNET 命令“DATA MARK”结合在一起的 TCP 紧急数据。该紧急数据不受制于 TCP
连接中的流量控制,接收它的进程会据此来启动对数据流的特殊处理过程。在这种模式中,
·104· Internet 应用协议实例剖析与服务器配置

接收方立即对数据流进行扫描,查找一些“特殊”的信号,而把其他的数据丢弃,这些“特
殊”的信号包括 TELNET 中的 IP、AO 和 AYT(没有 EC 或 EL)的标准表示,与这些标准
表示类似的本地表示(如果有的话) ,所有的其他 TELNET 命令,其他不延迟数据流的扫描
并且能够起作用的自定义信号。
TELNET 命令“DATA MARK(DM)”是数据流中的同步标记,表示所有特殊的信号都
已经产生,接受者可以继续对数据流进行一般的处理。
同步信号通过 TCP 的发送操作发送,在发送过程中需要把紧急标志设为“真” ,并且把
DM 作为最后(或者惟一的)一个字节。
当许多同步信号快速地连续不断地发送时,紧急通知可能被淹没。系统不可能去计算紧
急通知的次数,因为接收到的紧急通知的次数可能等于或者少于发送次数。在普通模式中,
一个 DM 是没有任何操作的,但在紧急模式中,它表示紧急处理过程的结束。
如果在发现 DM 之前,TCP 已经指示紧急数据的结束,TELNET 应该继续对数据流
进行特殊的处理,直到发现 DM。如果在发现 DM 之后,TCP 指示有更多的紧急数据,那
它只能是另外的同步信号。TELNET 应该继续对数据流进行特殊的处理,直到发现另外一
个 DM。
由于 SYNCH 机制的一个影响是丢弃本来在发送者和接收者之间要传输的所有字符(除
了 TELNET 命令) ,所以如果需要,这个机制可以作为清除数据路径的一种标准方式。例如,
若一个终端用户需要传输一个 AO,接收到该 AO 的服务器应该给该用户返回一个同步信号
(如果它提供该功能的话) 。
就像在 TELNET 中需要把一个 TCP 紧急通知当作一个带外信号一样,其他使用 TELNET
的协议可能需要另外的可以当作带外信号的命令。按照传统, “IP,Synch”可以作为这样的信
号。例如,假设有一个使用 TELNET 协议的其他协议定义了一个类似于 TELNET 命令 AO
的命令 STOP,使用该协议的用户希望服务器处理 STOP 字符串,但由于服务器在处理其他
的命令,导致连接被阻塞,此时该用户应该这样操作他的系统:
(1)发送出 TELNET IP 字符;
(2)发送出 TELNET SYNC 系列,即在一个紧急模式的 TCP 发送操作中把“Data Mark
(DM)作为惟一的字符发送出去。
(3)发送出字符串 STOP。
(4)如果有的话,把其他协议中类似于 TELNET DM 的命令发送出去。
用户(或者代表该用户的进程)必须传输上面步骤 2 中的 TELNET SYNCH 系列,以确
保 TELNET IP 已经到达服务器的 TELNET 解释器。紧急通知将激活 TELNET 进程,而 IP
将激活随后级别较高的进程。

5.2.4 NVT 打印机和键盘

NVT 打印机有一个没有指定宽度的走纸器,并且不指定每一页的长度。NVT 打印机可


以产生所有 95 个 USASCII 编码(从 32~126 的编码)的图形表示。在 33 个 USASCII 编码
(0~31 及 127)和未包含的其他 128 个编码(128~255)中,下面列出对 NVT 打印机有确
定意义的几个编码:
第5章 TELNET 应用 ·105·

名称 编码 意义
NULL (NUL) 0 没有操作
Line Feed (LF) 10 打印头移到下一个打印行,但不改变打印
头的垂直位置。
Carriage Return (CR) 13 把打印头移到当前行的左边。
BELL (BEL) 7 产生一个可以看到或可以听到的信号(而
不移动打印头。)
Back Space (BS) 8 向左移动打印头一个字符位置。
Horizontal Tab (HT) 9 把打印头移到下一个水平制表符停止的位
置。它没有指定每一方如何检测或者设定
制表符的停止位置。
Vertical Tab (VT) 11 把打印头移到下一个垂直制表符停止的位
置。它仍然没有指定每一方如何检测或者
设定制表符的停止位置。
Form Feed (FF) 12 把打印头移到下一页的顶部,保持打印头
在相同的水平位置上。
其中编码 7~9 和 11~12 是不必要在 NVT 打印机上定义的。未列出的其他编码都不会
导致 NVT 打印机实施任何动作。
在上述定义中,系列“CR LF”将导致 NVT 打印头移动到下一行的左边(与系列 “LF CR”
的效果是一样的) 。然而,许多系统和终端并不独立处理 CR 和 LF,为了模拟它们的效果,需
要进行一些处理(比如,许多终端没有独立于 LF 的 CR,但是在这样的终端上可以用退格键来
模拟一个 CR) 。在需要把它们结合在一起使用的时候,必须把系列“CR LF”当作一个单独的
“新行”字符看待。在只需要一个单独的回车键时必须使用系列“CR NUL” ;在其他的情况下
必须避免使用 CR 字符。这个规则可以确保系统在发现一个 TELNET 流中有一个字符的后面跟
有 CR 的情况下,可以作出合理的选择:是进行“换行”功能还是进行多次的退格操作。
NVT 键盘由键、键的组合或者键系列来产生所有 128 个 USAASCII 编码。尽管一些编码
在 NVT 打印机上没有什么用处,NVT 键盘还是可以生成它们。
除了这些编码,NVT 键盘还可以生成下面这些附加的编码。
(1)Synch
这个键允许一个用户清空到另一方的数据通道。激活该键将导致发送一个伴随 TCP 紧急
通知的 DM。
(2)Break(BRK)
之所以提供这个编码,是因为在当前的许多系统中,它是 USASCII 集合之外的一个信号,
但是具有本地意义,可以用它来表示 Break 键或 Attention 键已被按下。但是,需要注意的是,
它的目的是给需要它的系统提供第 129 个编码,而不等同于 IP 的标准表示。
(3)Interrupt Process(IP)
是挂起、中断、终止一个 NVT 连接的进程,另外,也是那些使用 TELNET 的其他协议
的带外信号的一部分。
(4)Abort Output(AO)
·106· Internet 应用协议实例剖析与服务器配置

允许当前的进程继续运行直到结束,并且把一个同步信号发送给用户,但不给用户发送
它的输出信息。
(5)Are You There(AYT)
对方应发送回一些可见的(也就是可打印的)信息以表明已经收到 AYT。
(6)Erase Character(EC)
接收者将删除数据流中最后一个未被删除的前导字符或者“打印位置” 。
(7)Erase Line(EL)
接收方将删除由 TELNET 连接发送的数据流中最后一个“CR LF”系列(但不包括该系
列)后面的全部内容。

5.3 TELNET 命令

在普通数据的数据流中,任何地方都可以插入 TELNET 命令,所有的 TELNET 命令至


少包含两个字节:IAC(Interpret as Command)转义字符字节和命令代码字节(选项协商命
令由 3Byte 构成,第 3 个字节是选项编码) ,其中的转义字符用于把命令和普通数据区分开,
IAC 用值为 255 的一个字节表示。
下面是所有已定义的 TELNET 命令。需要注意的是,这里的“含义”是指在代码前面加
有一个 IAC 时的含义。
名称 代码 含义
SE 240 子协商参数的结束
NOP 241 空操作
Data Mark 242 一个同步信号的数据部分,该命令通常伴随着一个 TCP
紧急通知
Break 243 NVT 的 BRK 字符
Interrupt Process 244 IP 功能
Abort Output 245 AO 功能
Are You There 246 AYT 功能
Erase Character 247 EC 功能
Erase Line 248 EL 功能
Go Ahead 249 GA 信号
SB 250 表示后面所跟的是对需要的选项的子协商
WILL (option code) 251 表示希望开始使用指定的选项
WON'T (option code) 252 表示拒绝使用指定的选项
DO (option code) 253 表示一方要求另一方使用指定的选项
DON'T (option code) 254 表示一方要求另一方停止使用指定的选项
IAC 255 数据字节 255
其中, “IAC”加上“WILL” 、
“WON'T”、“DO”、“DON'T”时引导选项命令,加上“SE”
时引导子选项命令。
第5章 TELNET 应用 ·107·

5.4 TELNET 选项

下面是常用的 TELNET 选项。


(1)ECHO 选项(选项代码为 1,RFC857)
包含此选项的各种命令及含义如下:
命令 含义
IAC WILL ECHO 发送者希望将从对方收到的字符回送对方
IAC WON'T ECHO 发送者希望停止将从对方收到的字符回送对方
IAC DO ECHO 发送者要求接收方回送收到的字符
IAC DON'T ECHO 发送者要求接收方不回送收到的字符
默认值:WON'T ECHO
DON'T ECHO
(2)SUPPRESS-GO-AHEAD 选项(选项代码为 3,RFC858)
包含此选项的各种命令及含义如下:
命令 含义
IAC WILL SUPPRESS-GO-AHEAD 发送者希望发送数据时,忽略 TELNET GO
AHEAD(GA)字符
IAC WON'T SUPPRESS-GO-AHEAD 发送者希望发送数据时,继续使用 TELNET GO
AHEAD(GA)字符
IAC DO SUPPRESS-GO-AHEAD 发送者希望对方发送数据时,忽略 TELNET GO
AHEAD(GA)字符
IAC DON'T SUPPRESSS-GO-AHEAD 发送者希望对方发送数据时,继续使用 TELNET
GO AHEAD(GA)字符
默认值:WON'T SUPPRESS-GO-AHEAD
DON'T SUPPRESS-GO-AHEAD
(3)STATUS 选项(选项代码为 5,RFC859)
包含此选项的各种命令及含义如下:
命令 含义
IAC WILL STATUS 发送者希望讨论目前的选项状态
IAC WON'T STATUS 发送者拒绝讨论目前的选项状态
IAC DO STATUS 发送者希望讨论目前的选项状态
IAC DON'T STATUS 发送者拒绝讨论目前的选项状态
IAC SB STATUS SEND IAC SE 发送者要求接收者发送选项状态,此处的
“SEND”编码为 0x01
IAC SB STATUS IS „ IAC SE 发送者发送自己的选项状态,此处的“IS”编
码为 0x00,
“„”由不加 IAC 的选项表构成,
·108· Internet 应用协议实例剖析与服务器配置

例如“DO SUPPRESS-GO-AHEAD WILL


ECHO”
默认值:IAC DON'T STATUS
IAC WON'T STATUS
(4)TERMINAL-TYPE 选项(选项代码为 24,RFC1091)
包含此选项的各种命令及含义如下:
命令 含义
IAC WILL TERMINAL-TYPE 表示发送者希望通过一个子选项发送自己的终
端类型
IAC WON'T TERMINAL-TYPE 表示发送者拒绝发送终端类型
IAC DO TERMINAL-TYPE 表示发送者要求对方通过一个子选项发送自己的
终端类型
IAC DON'T TERMINAL-TYPE 表示发送者拒绝对方发送终端类型
IAC SB TERMINAL-TYPE SEND IAC SE 服务器用这个子选项命令要求客户发送它支持
的下一个终端类型,并转入此种终端方式,此处
的“SEND”在数据流中用 0x01 表示
IAC SB TERMINAL-TYPE IS„IAC SE 客户用这个子选项命令发送它支持的终端类
型,此处的“IS”在数据流中用 0x00 表示,
“„”
代表终端类型名,如“VT100”等
默认值:WON'T TERMINAL-TYPE
DON'T TERMINAL-TYPE
(5)NAWS(Negotiate About Window Size)选项(选项代码为 31,RFC1073)
包含此选项的各种命令及含义如下:
命令 含义
IAC WILL NAWS 客户端用这个命令向服务器请求协商窗口大小
IAC WON'T NAWS 客户端用这个命令拒绝向服务器协商窗口大小
IAC DO NAWS 服务器用这个命令要求客户协商窗口大小
IAC DON'T NAWS 服务器用这个命令拒绝客户协商窗口大小
IAC SB NAWS <16-bit value> <16-bit value> IAC SE
客户端用这个命令向服务器发送窗口大小,其中两个<16-bit
value>分别代表窗口宽度和高度
默认值:WON'T NAWS
DON'T NAWS
(6)TERMINAL-SPEED 选项(选项代码为 32,RFC1079)
许多操作系统需要知道与之相连的终端或 Modem 的比特率,据以进行某些与时间有关
的处理。
包含此选项的各种命令及含义如下:
命令 含义
IAC WILL TERMINAL-SPEED 表示发送者希望通过一个子选项发送自己
第5章 TELNET 应用 ·109·

的终端速率
IAC WON'T TERMINAL-SPEED 表示发送者拒绝发送自己的终端速率
IAC DO TERMINAL-SPEED 表示发送者希望对方发送终端速率
IAC DON'T TERMINAL-SPEED 表示发送者拒绝对方发送终端速率
IAC SB TERMINAL-SPEED SEND IAC SE 发送者用这个子选项命令要求对方发送终
端速率,此处的“SEND”编码为 0x01
IAC SB TERMINAL-SPEED IS „ IAC SE 发送者用这个子选项命令发送终端速率,
其中的“IS”编码为 0x00,
“...”是用 ASCII
码表示并以“, ”隔开的两个数字,例如
“1200,1200”,两个数字分别发送和接收
速率
默认值:WON'T TERMINAL-SPEED
DON'T TERMINAL-SPEED
(7)TOGGLE-FLOW-CONTROL 选项(选项代码为 33,RFC1372)
包含此选项的各种命令及含义如下:
命令 含义
IAC WILL TOGGLE-FLOW-CONTROL 发送者希望改变流量控制状态
IAC WON'T TOGGLE-FLOW-CONTROL 发送者不希望改变流量控制状态
IAC DO TOGGLE-FLOW-CONTROL 发送者希望对方能够改变流量控制状

IAC DON'T TOGGLE-FLOW-CONTROL 发送者不要求对方能够改变流量控制
状态
IAC SB TOGGLE-FLOW-CONTROL OFF IAC SE 发送者要求对方关闭流量控制功能,
此处的“OFF”编码为 0x00
IAC SB TOGGLE-FLOW-CONTROL ON IAC SE 发送者要求对方开启流量控制功能,
此处的“ON”编码为 0x01
默认值:WON'T TOGGLE-FLOW-CONTROL
DON'T TOGGLE-FLOW-CONTROL
(8)LINEMODE 选项(选项代码为 34,RFC1184)
包含此选项的各种命令及含义如下:
命令 含义
IAC WILL LINEMODE 发送者用这个命令请求协商行模式
IAC WON'T LINEMODE 发送者用这个命令禁止协商行模式
IAC DO LINEMODE 发送者用这个命令要求对方主动开始协商行模式
IAC DON'T LINEMODE 发送者用这个命令禁止对方主动开始协商行模式
默认值:WON'T LINEMODE
DON'T LINEMODE
(9)X-DISPLAY-LOCATION 选项(选项代码为 35,RFC1096)
包含此选项的各种命令及含义如下:
·110· Internet 应用协议实例剖析与服务器配置

命令 含义
IAC WILL X-DISPLAY-LOCATION 发送者希望通过子选项发送 X 显示的位置
IAC WON'T X-DISPLAY-LOCATION 发送者拒绝发送 X 显示的位置
IAC DO X-DISPLAY-LOCATION 发送者要求对方通过子选项发送 X 显示的位置
IAC DON'T X-DISPLAY-LOCATION 发送者禁止对方发送 X 显示的位置
默认值:WON'T X-DISPLAY-LOCATION
DON'T X-DISPLAY-LOCATION
(10)NEW-ENVIRON 选项(选项代码为 39,RFC1572)
这个选项可以帮助实现客户方与服务器方的环境变量传递。
包含此选项的各种命令及含义如下:
命令 含义
IAC WILL NEW-ENVIRON 发送者希望用子选项向对方发送环境变量
IAC WON'T NEW-ENVIRON 发送者拒绝向对方发送环境变量
IAC DO NEW-ENVIRON 发送者能够接收接收者发来的环境变量
IAC DON'T NEW-ENVIRON 发送者拒绝接收接收者发来的环境变量
默认值:WON'T NEW-ENVIRON
DON'T NEW-ENVIRON

5.5 TELNET 客户端

TELNET 客户端程序可用于远程登录 UNIX 主机、访问 BBS 等。在目前流行的 UNIX 类


操作系统和 Windows 类操作系统中都包含一个 TELNET 客户端程序 telnet,下面就以 telnet
程序进行远程登录为例介绍 TELNET 客户端的使用。
telnet 命令的基本用法为:telnet [host [port]],其中参数 host 表示对方主机的名字或 IP 地
址,参数 port 表示对方服务器的 TCP 端口号。此处的“端口号”可以省略以表示使用默认值
(对方端口号的默认值为 23) 。例如用 telnet 登录某 Linux 主机的过程如下:
telnet 10.0.2.250
Red Hat Linux release 8.0 (Psyche)
Kernel 2.4.18-14 on an i686
login:zhansan
Password:
Last login:Sun Mar 9 11:14:35 from 10.0.2.250
[zhansan@localhost zhansan]$
其中斜体部分为用户输入的信息。在用户输入完命令行“telnet 10.0.2.250”和提示行“Red Hat
Linux release 8.0 (Psyche)”出现之前实际上已经执行了两个 TELNET 步骤:
(1)建立 TCP 连接;
(2)协商 TELNET 选项。
TCP 连接的建立实际上就是通常所说的 3 次握手:
第5章 TELNET 应用 ·111·

(1)客户方向服务器方发送同步包;
(2)服务器方向客户方发送同步包;
(3)客户方向服务器方发送确认包。
协商 TELNET 选项的具体步骤根据客户端和服务器端使用的软件的不同而不同,下面是
在“telnet 10.0.2.250”命令发出后,利用启动了 debug 功能的服务器端观察到的客户方与服
务器方用“DO,DON'T,WILL,WON'T”协商的过程:
td: send do TERMINAL TYPE
td: send do TSPEED
td: send do XDISPLOC
td: send do NEW-ENVIRON
td: recv do ENCRYPT
td: send wont ENCRYPT
td: recv will ENCRYPT
td: send dont ENCRYPT
td: recv do SUPPRESS GO AHEAD
td: send will SUPPRESS GO AHEAD
td: recv will TERMINAL TYPE
td: recv will NAWS
td: send do NAWS
td: recv will TSPEED
td: recv will LFLOW
td: send do LFLOW
td: recv will LINEMODE
td: send dont LINEMODE
td: recv will NEW-ENVIRON
td: recv do STATUS
td: send will STATUS
td: recv wont XDISPLOC
td: recv suboption NAWS 0 80 (80) 0 25 (25)
td: recv suboption TERMINAL-SPEED IS 38400,38400
td: recv suboption ENVIRON IS
td: recv suboption TERMINAL-TYPE IS "LINUX"
td: send do ECHO
td: recv wont ECHO
td: send will ECHO
td: recv do ECHO
经过上述步骤之后,TELNET 客户方与服务器方开始按照协商后的约定互相发送数据,
用户在任何时候都可以使用“Ctrl+]”组合键进入 TELNET 命令状态,通过输入相应的命令
来手工改变 TELNET 选项的协商结果。
·112· Internet 应用协议实例剖析与服务器配置

5.6 TELNET 服务器端

下面以 RedHat Linux 8.0 的远程登录服务器 in.telnetd 为例介绍 TELNET 服务器的工作过


程和配置。

5.6.1 in.telnetd 的安装与启动

在 RedHat Linux 安装光盘中找到或从 Linux 发行商的相应站点免费下载 telnet-server-*.*-*.rpm


(其中“*.*-*”代表版本号) ,然后运行 rpm 命令即可进行安装。
in.telnetd 一般通过 xinetd 启动,首先修改 xinetd 的配置文件/etc/xinetd.d/telnet,令文件内
容如下:
# default: on
# description: The telnet server serves telnet se
# unencrypted username/password pairs for a
service telnet
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}
此配置文件中的“disable = no” 表示令 xinetd 启用 TELNET 服务; “server= /usr/sbin/in.telnetd”
表示 TELNET 服务器程序为/usr/sbin/in.telnetd。
配置完 xinetd 之后执行“/etc/rc.d/init.d/xinet restart”即可启动远程登录服务。
另外,in.telnetd 也可以在 debug 方式下独立启动,例如“/usr/sbin/in.telnetd –debug –D
options”命令即可独立启动 in.telnetd,其中“-debug”表示进入 debug 状态, “-D options”表
示要求服务器程序显示 TELNET 选项协商的过程。

5.6.2 in.telnetd 的配置

TELNET 选项协商的过程一般不需要用户设置,对 in.telnetd 的配置的主要任务是对访问


进行控制。当用户登录进 Linux 系统后,用户的权限取决于其所使用的帐号,所以对 in.telnetd
的配置主要是对登录过程进行配置。in.telnetd 的登录过程使用的是/bin/login 程序,此程序借
助于 Linux-PAM(Pluggable Authentication Modules)进行安全控制,下面以 Linux-PAM 中对
login 的配置信息为例进行具体说明。
Linux-PAM 中对 login 的配置的主控文件是/etc/pam.d/login,例如下面是这个文件的一个
第5章 TELNET 应用 ·113·

实例:
#%PAM-1.0
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_stack.so service=system-auth
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_access.so
account required /lib/security/pam_stack.so service=system-auth
password required /lib/security/pam_stack.so service=system-auth
session required /lib/security/pam_stack.so service=system-auth
session optional /lib/security/pam_console.so
除了第 1 行外,每一行都指定了一个 Linux-PAM 安全模块,当 login 运行时,此处指定
的每一个模块都将得到执行,每一个模块都会根据自己的配置文件对登录过程进行审查和限
制。例如 pam_securetty.so 模块的配置文件为/etc/securetty,此文件中规定了超级管理员(root)
可以登录的终端,此文件实例如下:
tty1
tty2
tty3
tty4
tty5
tty6
此配置文件表明,超级管理员只允许从本地虚拟控制台 tty1-tty6 上登录。
再例如 pam_access.so 模块,它使用配置文件/etc/security/access.conf,下面是此文件的一
个实例:
+: zhangsan: ALL
+: ppp: ttyS0
+: root: tty1 tty2 tty3 tty4 tty5 tty6
-: ALL: ALL
此实例表明,zhangsan 用户可以从任何终端登录本机,ppp 用户只能从 ttyS0 登录本机,
root 可以从 tty1-tty6 登录本机,而其他人不能从任何终端登录本机。

5.7 实 例 剖 析

5.7.1 环境介绍

本例中将使用基于以太网的同一个 IP 网络内的两台计算机,将这两台计算机分别命名为
A 和 B,其基本配置信息如下:
计算机 IP 地址 掩码
A 202.194.254.213 255.255.255.0
·114· Internet 应用协议实例剖析与服务器配置

B 202.194.254.211 255.255.255.0
两计算机均运行 Linux 系统,并在 A 计算机上运行 telnet 程序远程登录 B 计算机。
在 A 计算机上用 TCPDUMP 工具可获得相关的帧,因为此例的目的是剖析 TELNET 选
项协商的过程,因此截获帧的过程只持续到客户端看到服务器端发来的登录提示为止。

5.7.2 通信过程中的帧

(1)A 发向 B 的 TCP 同步帧(202.194.254.213.1081 → 202.194.254.211.23)


0000000: 0000 b491 e66a 0000 b491 e64d 0800 4500
0000010: 003c 6f2c 4000 4006 3861 cac2 fed5 cac2
0000020: fed3 0439 0017 a8ad 7d95 0000 0000 a002
0000030: 7d78 260f 0000 0204 05b4 0402 080a 060e
0000040: e0af 0000 0000 0103 0300
(2)B 发向 A 的 TCP 同步帧(202.194.254.211.23 → 202.194.254.213.1081)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4500
0000010: 003c fc4e 4000 4006 ab3e cac2 fed3 cac2
0000020: fed5 0017 0439 f511 b48e a8ad 7d96 a012
0000030: 7d78 5521 0000 0204 05b4 0402 080a 05ba
0000040: 2182 060e e0af 0103 0300
(3)A 发向 B 的 TCP 确认帧(202.194.254.213.1081 → 202.194.254.211.23)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4500
0000010: 0034 6f2d 4000 4006 3868 cac2 fed5 cac2
0000020: fed3 0439 0017 a8ad 7d96 f511 b48f 8010
0000030: 7d78 83e6 0000 0101 080a 060e e0af 05ba
0000040: 2182
(4)A 发向 B 的 TELNET 命令组(202.194.254.213.1081 → 202.194.254.211.23)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4500
0000010: 004c 6f2e 4000 4006 384f cac2 fed5 cac2
0000020: fed3 0439 0017 a8ad 7d96 f511 b48f 8018
0000030: 7d78 2774 0000 0101 080a 060e e0b0 05ba
0000040: 2182 fffd 03ff fb18 fffb 1fff fb20 fffb
0000050: 21ff fb22 fffb 27ff fd05
(5)B 发向 A 的 TCP 确认(202.194.254.211.23 → 202.194.254.213.1081)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4500
0000010: 0034 fc4f 4000 4006 ab45 cac2 fed3 cac2
0000020: fed5 0017 0439 f511 b48f a8ad 7dae 8010
0000030: 7d78 83cc 0000 0101 080a 05ba 2183 060e
0000040: e0b0
(6)B 发向 A 的 TELNET 命令组(202.194.254.211.23 → 202.194.254.213.1081)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4500
第5章 TELNET 应用 ·115·

0000010: 0040 fc51 4000 4006 ab37 cac2 fed3 cac2


0000020: fed5 0017 0439 f511 b48f a8ad 7dae 8018
0000030: 7d78 4c72 0000 0101 080a 05ba 2186 060e
0000040: e0b0 fffd 18ff fd20 fffd 23ff fd27
(7)A 发向 B 的 TELNET 命令组(202.194.254.213.1081 → 202.194.254.211.23)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4500
0000010: 0034 6f2f 4000 4006 3866 cac2 fed5 cac2
0000020: fed3 0439 0017 a8ad 7dae f511 b49b 8010
0000030: 7d78 83ba 0000 0101 080a 060e e0b3 05ba
0000040: 2186
(8)B 发向 A 的 TELNET 命令组(202.194.254.211.23 → 202.194.254.213.1081)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4500
0000010: 0043 fc52 4000 4006 ab33 cac2 fed3 cac2
0000020: fed5 0017 0439 f511 b49b a8ad 7dae 8018
0000030: 7d78 5d6c 0000 0101 080a 05ba 2186 060e
0000040: e0b3 fffb 03ff fd1f fffd 21ff fe22 fffb
0000050: 05
(9)A 发向 B 的 TELNET 命令组(202.194.254.213.1081 → 202.194.254.211.23)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4500
0000010: 0040 6f30 4000 4006 3859 cac2 fed5 cac2
0000020: fed3 0439 0017 a8ad 7dae f511 b4aa 8018
0000030: 7d78 6521 0000 0101 080a 060e e0b3 05ba
0000040: 2186 fffc 23ff fa1f 0050 0019 fff0
(10)B 发向 A 的 TELNET 命令组(202.194.254.211.23 → 202.194.254.213.1081)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4500
0000010: 0046 fc53 4000 4006 ab2f cac2 fed3 cac2
0000020: fed5 0017 0439 f511 b4aa a8ad 7dba 8018
0000030: 7d78 24be 0000 0101 080a 05ba 2186 060e
0000040: e0b3 fffa 2001 fff0 fffa 2701 fff0 fffa
0000050: 1801 fff0
(11)A 发向 B 的 TCP 确认(202.194.254.213.1081 → 202.194.254.211.23)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4500
0000010: 0034 6f31 4000 4006 3864 cac2 fed5 cac2
0000020: fed3 0439 0017 a8ad 7dba f511 b4bc 8010
0000030: 7d78 838c 0000 0101 080a 060e e0b4 05ba
0000040: 2186
(12)A 发向 B 的 TELNET 命令组(202.194.254.213.1081 → 202.194.254.211.23)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4500
0000010: 0056 6f32 4000 4006 3841 cac2 fed5 cac2
·116· Internet 应用协议实例剖析与服务器配置

0000020: fed3 0439 0017 a8ad 7dba f511 b4bc 8018


0000030: 7d78 bd47 0000 0101 080a 060e e0b4 05ba
0000040: 2186 fffa 2000 3338 3430 302c 3338 3430
0000050: 30ff f0ff fa27 00ff f0ff fa18 004c 494e
0000060: 5558 fff0
(13)B 发向 A 的 TELNET 命令组(202.194.254.211.23 → 202.194.254.213.1081)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4500
0000010: 0037 fc54 4000 4006 ab3d cac2 fed3 cac2
0000020: fed5 0017 0439 f511 b4bc a8ad 7ddc 8018
0000030: 7d78 8260 0000 0101 080a 05ba 2187 060e
0000040: e0b4 fffd 01
(14)A 发向 B 的 TELNET 命令组(202.194.254.213.1081 → 202.194.254.211.23)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4500
0000010: 0037 6f33 4000 4006 385f cac2 fed5 cac2
0000020: fed3 0439 0017 a8ad 7ddc f511 b4bf 8018
0000030: 7d78 825e 0000 0101 080a 060e e0b4 05ba
0000040: 2187 fffc 01
(15)B 发向 A 的 TCP 确认(202.194.254.211.23 → 202.194.254.213.1081)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4500
0000010: 0034 fc55 4000 4006 ab3f cac2 fed3 cac2
0000020: fed5 0017 0439 f511 b4bf a8ad 7ddf 8010
0000030: 7d78 8361 0000 0101 080a 05ba 2189 060e
0000040: e0b4
(16)B 发向 A 的 TELNET 命令组和系统信息
(202.194.254.211.23 → 202.194.254.213.1081)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4500
0000010: 0079 fc56 4000 4006 aaf9 cac2 fed3 cac2
0000020: fed5 0017 0439 f511 b4bf a8ad 7ddf 8018
0000030: 7d78 e930 0000 0101 080a 05ba 218a 060e
0000040: e0b4 fffb 010d 0a52 6564 2048 6174 204c
0000050: 696e 7578 2072 656c 6561 7365 2036 2e30
0000060: 2028 4865 6477 6967 290d 0a4b 6572 6e65
0000070: 6c20 322e 322e 352d 3135 206f 6e20 616e
0000080: 2069 3638 360d 0a
(17)A 发向 B 的 TELNET 命令组(202.194.254.213.1081 → 202.194.254.211.23)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4500
0000010: 0037 6f34 4000 4006 385e cac2 fed5 cac2
0000020: fed3 0439 0017 a8ad 7ddf f511 b504 8018
0000030: 7d78 820f 0000 0101 080a 060e e0b7 05ba
第5章 TELNET 应用 ·117·

0000040: 218a fffd 01


(18)B 发向 A 的 login 提示(202.194.254.211.23 → 202.194.254.213.1081)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4500
0000010: 003b fc57 4000 4006 ab36 cac2 fed3 cac2
0000020: fed5 0017 0439 f511 b504 a8ad 7de2 8018
0000030: 7d78 20f2 0000 0101 080a 05ba 218b 060e
0000040: e0b7 6c6f 6769 6e3a 20
(19)A 发向 B 的 TCP 确认(202.194.254.213.1081 → 202.194.254.211.23)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4500
0000010: 0034 6f35 4000 4006 3860 cac2 fed5 cac2
0000020: fed3 0439 0017 a8ad 7de2 f511 b50b 8010
0000030: 7d78 830b 0000 0101 080a 060e e0b9 05ba
0000040: 218b
....................

5.7.3 帧剖析

上例中前 3 个帧完成了 A 主动发起的与 B 的 TCP 连接,客户端口号为 TCP 1081,服务


器端口号为 23。
第 4 帧的第 42~58Byte 为 A 发向 B 的 TELNET 命令组:
字节偏移 内容 含义
42~44 fffd 03 DO SUPPRESS-GO-AHEAD
45~47 ff fb18 WILL TERMINAL-TYPE
48~4a fffb 1f WILL NAWS
4b~4d ff fb20 WILL TERMINAL-SPEED
4e~50 fffb 21 WILL TOGGLE-FLOW-CONTROL
51~53 ff fb22 WILL LINEMODE
54~56 fffb 27 WILL NEW-ENVIRON
56~58 ff fd05 DO STATUS
第 6 帧的第 42~4dByte 为 B 发向 A 的 TELNET 命令组:
字节偏移 内容 含义
42~44 fffd 18 DO TERMINAL-TYPE
45~47 ff fd20 DO TERMINAL-SPEED
48~4a fffd 23 DO X-DISPLAY-LOCATION
4b~4d ff fd27 DO NEW-ENVIRON
第 8 帧的第 42~50Byte 为 B 发向 A 的 TELNET 命令组:
字节偏移 内容 含义
42~44 fffb 03 WILL SUPPRESS-GO-AHEAD
45~47 ff fd1f DO NAWS
48~4a fffd 21 DO TOGGLE-FLOW-CONTROL
·118· Internet 应用协议实例剖析与服务器配置

4b~4d ff fe22 DON'T LINEMODE


4e~50 fffb 05 WILL STATUS
第 9 帧的第 42~4bByte 为 A 发向 B 的 TELNET 命令组:
字节偏移 内容 含义
42~44 fffc 23 WON'T X-DISPLAY-LOCATION
45~4b ff fa1f 0050 0019 fff0 suboption NAWS 0 80 0 25
第 10 帧的第 42~53Byte 为 B 发向 A 的 TELNET 命令组:
字节偏移 内容 含义
42~47 fffa 2001 fff0 suboption TERMINAL-SPEED SEND
48~4d fffa 2701 fff0 suboption NEW-ENVIRON SEND
4e~53 fffa 1801 fff0 suboption TERMINAL-TYPE SEND
第 12 帧的第 42~63Byte 为 A 发向 B 的 TELNET 命令组:
字节偏移 内容 含义
42~52 fffa 2000 3338
3430 302c 3338
3430 30ff f0 suboption TERMINAL-SPEED 38400,38400
53~58 ff fa27 00ff f0 suboption NEW-ENVIRON IS
59~63 ff fa18 004c 494e
5558 fff0 suboption TERMINAL-TYPE "LINUX"
第 13 帧的第 42~44Byte 为 B 发向 A 的 TELNET 命令组:
字节偏移 内容 含义
42~44 fffd 01 DO ECHO
第 14 帧的第 42~44Byte 为 A 发向 B 的 TELNET 命令组:
字节偏移 内容 含义
42~44 fffc 01 WON'T ECHO
第 16 帧的第 42~44Byte 为 B 发向 A 的 TELNET 命令组:
45~86 字节为 B 发向 A 的系统信息:
字节偏移 内容 含义
42~44 fffb 01 WILL ECHO
45~86 Red Hat Linux release 6.0 (Hedwig)
Kernel 2.2.5-15 on an i686
第 17 帧的第 42~44Byte 为 A 发向 B 的 TELNET 命令组:
字节偏移 内容 含义
42~44 fffd 01 DO ECHO
第 18 帧的第 42~48Byte 为 B 发向 A 的 login 提示:
字节偏移 内容 含义
42~48 6c6f 6769 6e3a 20 login
第6章 WWW 应用

6.1 WWW 简介

万维网(WWW,World Wide Web)服务是目前 Internet 上最热门的服务之一,它通过网


页将文字、图形、声音以及视频等各种媒体高度结合在一起,成为功能最为强劲的传播媒体
之一,也成为很多人在网上查找、浏览和发布信息的重要手段。
WWW 系统是由客户端浏览器和 WWW 服务器组成的,Internet 上众多的网站所依托的
就是 WWW 服务器(Web Server)。目前应用最多而且可以免费得到的 Apache 无论在功能、
效率还是在速度方面都处于绝对领先地位,因此本书也选择了 Apache 作为 Web Server 实例。
多数 Linux 发行版都自带了 Apache 服务器。

6.2 HTTP 协议

6.2.1 HTTP 协议概述

超文本传输协议(HTTP,HyperText Transfer Protocol)是 Internet 上目前使用最广泛的


应用层协议,它基于传输层的 TCP 协议进行通信,服务器端的端口号是 80(十进制)。
HTTP 协议用于在服务器与客户机之间传输超文本文件,超文本文件所遵循的规范称为
超文本标记语言(HTML,HyperText Markup Language)。实际上 HTTP 协议完全可以用来传
输任意类型的文件,只是在专门的文件传输功能方面不如 FTP 协议灵活。
Internet 上所有执行 HTTP 协议的主机所构成的逻辑网络称为 WWW(World-Wide Web) ,
执行 HTTP 客户端功能的应用程序称为 WWW 浏览器,执行 HTTP 服务器端功能的应用程序
称为 WWW 服务器。常用的 WWW 浏览器有 Netscape Nevigator 和 Internet Exploror 等,常用
的 WWW 服务器有 Apache 和 IIS 等。

6.2.2 HTTP 包的格式

目前被广泛支持的 HTTP 协议版本有 HTTP1.0 和 HTTP1.1,本书介绍的 HTTP 包格式参


考的是 HTTP1.1 标准(RFC2068)。
HTTP 包被分成 HTTP 请求包和 HTTP 应答包两种,HTTP 请求包是 WWW 浏览器向
WWW 服务器发送请求时使用的包,而 HTTP 应答包是 WWW 服务器向 WWW 浏览器发送
应答时使用的包。
·120· Internet 应用协议实例剖析与服务器配置

HTTP 请求包的构成如图 6-1 所示。


请求行
HTTP 请求包的第一行为请求行,请求行由“请求方法+空格+
被请求的资源标识+空格+HTTP 版本号+回车换行”构成。例如“GET 头项表

/index.html HTTP/1.1”就是一个请求行,这里的“GET”是请求方 空行
法, “/index.html”是被请求的资源标识,即 WWW 服务器根目录下
信息体
的 index.html 文件, “HTTP/1.1”表明本 HTTP 包遵循 HTTP1.1 规
图 6-1 HTTP 请求包的格式
范。除了 GET 方法以外, “POST” 、
“OPTIONS”、
“HEAD”等也是
请求方法中的一种,关于各种请求方法的区别请参阅 RFC2068。
头项表由多个头项行构成,这些头项用来辅助请求行向 WWW 服务器发送附加信息,例
如 以 “ Accept ” 为 关 键 字 的 头 项 行 向 服 务 器 描 述 自 己 可 以 接 受 哪 些 类 型 的 文 件 、 以
“Accept-Language”为关键字的头项行向服务器描述自己可以接受哪种语言等,下面是几种
常用的请求头项的关键字及其作用:
请求头项关键字 描述
Host 向服务器传递用户在地址栏中输入的地址
Accept 向服务器声明浏览器支持哪些类型的资源
Accept-Encoding 向服务器声明浏览器支持哪些编码方法
Accept-Language 向服务器声明浏览器支持哪些语言
User-Agent 向服务器传递浏览器的名称和版本信息
Connection 向接收方表达本次连接的属性
If-Modified-Since 向服务器表达有条件请求,若资源在指定时间点后有过修改,则
条件为真
If-Match 向服务器表达有条件请求,若指定的标记匹配,则条件为真(见
应答头项 Etag)
If-None-Match 向服务器表达有条件请求,若指定的标记不匹配,则条件为真(见
应答头项 Etag)
HTTP 应答包的构成如图 6-2 所示。
状态行由“HTTP 版本号+空格+状态码+空格+状态信息+回 状 态 行

车换行”构成。状态码用于告知 WWW 浏览器的请求被满足的情 头 项 表


况,状态信息是状态码的扩充,或者说是对状态码的解释,例如 空 行
“HTTP/1.1 404 Not Found”是经常被使用的状态行, “HTTP/1.1”
信 息 体
表明服务器发来的 HTTP 包遵循 HTTP1.1 规范,状态码为“404”
表示服务器没有找到客户所请求的文件,而“Not Found”正是对 图 6-2 HTTP 应答包的格式
“404”这个状态码的解释,浏览器可以直接将这个字符串作为错误报告信息显示给用户。常
用的状态码及其含义如下:
状态码 含义
200 一切正常
304 资源未改变
400 错误的请求
401 客户未经授权
第6章 WWW 应用 ·121·

403 禁止访问
404 文件未找到
405 不支持客户使用的请求方法
500 服务器内部错误
503 服务不可用
505 不支持客户使用的 HTTP 版本
完整的状态码定义请阅读 RFC2068。
HTTP 应答包的头项表用于表达无法在状态行中表达的附加信息,例如当状态行中的状
态码为“401”时,头项表中往往包含一个以关键字“WWW-Authenticate”引导的头项,用
于告诉客户端目前服务器方支持的客户验证方法。常用的应答头项的关键字和作用如下:
应答头项关键字 作用
Date 显示 WWW 服务器端当前时间
Server 向浏览器传递服务器的名称和版本信息
Last-Modified 服务器端资源的最后被修改时间
Etag 与信息体中的资源相对应的标记
Accept-Ranges 表明服务器是否支持浏览器请求资源的一部分
Content-Length 表达信息体的长度
Connection 向接收方表达本次连接的属性
Content-Type 表达信息体的类型

6.2.3 HTTP 协议的工作过程

WWW 浏览器与 WWW 服务器之间的通信遵循下面的几个步骤:


(1)WWW 服务器进程等待于 TCP 80 号端口
因为 HTTP 协议基于传输层的 TCP 协议进行通信,所以 WWW 服务器进程首先运行
起来,并向操作系统申请占据 TCP 80 号端口,若申请成功,WWW 服务器进程就进入等
待状态。
(2)WWW 浏览器进程与 WWW 服务器进程建立 TCP 连接
WWW 浏览器进程首先申请本地 TCP 端口号,然后根据用户输入或选择的地址,与相应
的 WWW 服务器建立 TCP 连接。
(3)WWW 浏览器进程发出 HTTP 请求
WWW 浏览器进程根据用户输入或选择的资源名构建 HTTP 请求,并通过已经建立的
TCP 连接发向服务器进程。
(4)WWW 服务器进程发出 HTTP 应答
WWW 服务器进程分析 WWW 浏览器发来的请求,若能够理解此请求则从相应的存储设
备中查找被请求的资源,若找到则组建包含被请求的资源的 HTTP 应答包,否则,WWW 服
务器进程就组建包含出错信息的 HTTP 应答包,然后将其通过已经建立的 TCP 连接发向浏览
器进程。
(5)若在 HTTP 的头项 Connection 中有过特别注明,则步骤(3)和(4)可以通过同一
个连接被多次执行。
·122· Internet 应用协议实例剖析与服务器配置

(6)WWW 浏览器进程与 WWW 服务器进程断开 TCP 连接。

6.3 WWW 客户端

下面以 IE 浏览器为例介绍 WWW 客户端的使用。


双击 Windows 桌面上的“Internet Explorer”图标,即可打开 IE 浏览器(也可以通过菜
单“开始”→“程序”→“Internet Explorer”打开) ,如图 6-3 所示。

标题栏

菜单栏

工具栏

地址栏

主窗口

状态栏

图 6-3 Internet Explorer 窗口

在图 6-3 中,地址栏用于输入或显示 URL,例如 HTTP://www.sdie.edu.cn, 主窗口部分


用于显示信息体的内容。
工具栏的完整内容如图 6-4 所示。

图 6-4 IE5.0 的工具栏

工具栏中各个工具的作用如下:
① 后退,回到以前访问过的页面;
② 前进,功能与“后退”相反;
③ 停止,停止传输当前页内容;
④ 刷新,重新传输当前页;
⑤ 主页,回到默认的起始页;
⑥ 搜索,连接用户设置的默认搜索引擎;
⑦ 收藏,在显示区的左边显示出收藏夹的内容,把自己喜欢的站点添加进收藏夹,或对
它们进一步分类;
⑧ 历史,在显示区的左边显示曾经访问过的链接列表;
⑨ 邮件,打开一个有关邮件和新闻的下拉菜单,通过这个菜单可以进入阅读邮件和阅读
第6章 WWW 应用 ·123·

新闻的界面;
⑩ 编辑,用来设置字体的大小和所有内码,单击这个按钮会出现一个下拉式菜单;
 打印,打印当前页。
除图 6-4 所示的工具栏样式外,通过配置还可以自定义自己喜爱的工具栏样式,具体操
作可以通过选择菜单“查看”→“工具栏”→“自定义”实现。
IE 浏览器的其他功能及详细用法可以从“帮助”菜单中获得。

6.4 WWW 服务器

本节以 RedHat Linux 8.0 中提供的 Apache2.0 为例具体介绍 WWW 服务器。

6.4.1 Apache 的获取和安装

Apache 有多种分发方式,源程序分发版本可以在 Apache 的官方网站 http://www.apache.org 上


找到,RPM 格式的分发版本可以从 RedHat 网站上下载或在 Linux 安装盘中找到。 找到相应的 rpm
包后直接运行如下命令即可进行安装:
#rpm -i apache-2.0cle.i386.rpm

6.4.2 Apache 的启动和关闭

运行/etc/rc.d/init.d/httpd start 命令即可启动 Apache。


关闭 Apache 时执行/etc/rc.d/init.d/httpd
stop 即可。

6.4.3 Apache 的基本配置

在 RedHat Linux 8.0 中,Apache 将基本配置文件 httpd.conf 放在/etc/httpd/conf/目录下,


将高级配置文件(php、perl、ssl 等)放在/etc/httpd/conf.d 目录下,将日志文件放在/var/log/httpd
目录下。Apache 默认将资源文件放在/var/www 目录中,其中在 html 子目录下存放 html 文件,
在 cgi-bin 子目录下存放 CGI 程序,icons 子目录下存放其自带的图标资源,在 error 子目录下
存放多语言的错误信息,在 manual 子目录中存放用户手册信息。
httpd.conf 是主要的 Apache 配置文件,下面是其常用的配置项,其中以“#”号开始的部
分是对该设置的说明。
ServerRoot "/etc/httpd"
#放置服务器的配置、错误及日志文件的根目录位置。
#/etc/httpd 目录下的 log 目录实际上链接了/var/log/httpd 目录。
#注意:不要在目录名称的最后加上“/”号。
Timeout 300
#一次连接的最长持续时间。若客户端的请求超过此秒数,服务端将终止这次服务。#如
果网络速度较慢的话,建议在此设置较大的值,以便给客户端更多的机会。
Listen 80
#默认情况下 httpd 服务在所有接口地址上侦听 TCP 80 号端口。
·124· Internet 应用协议实例剖析与服务器配置

#Listen 选项可以让用户自行指定 Apache 服务器侦听的 IP 地址和端口。


User apache
Group apache
#运行 httpd 时默认的用户与组。出于安全性的考虑,默认用户和组皆为“apache” 。
ServerAdmin root@localhost
#设置 Web 管理员的 E-mail 地址。Web Server 出错时会将情况及时通知到该地址。
DocumentRoot "/var/www/html"
#用来指定文档的根目录。默认值为/var/www/html。
<Directory "/var/www/html">
#为目录"/var/www/html"定义访问控制。
Options Indexes FollowSymLinks
#Indexes 指明该目录可以为客户提供找不到资源时的索引服务。
#FollowSymLinks 表明在此目录下可以用链接文件指向其他目录的的文件。
AllowOverride None
#在每一个目录中都可以有.htaccess 文件用以设置对该目录访问控制。
#AllowOverride 用于决定可以将哪些控制项可以放在.htaccess 文件中。
#此例中的配置行将禁用.htaccess 文件。
Order allow,deny
#设置读取 allow 及 deny 配置行的顺序。
Allow from all
#此例配置行将允许从任何地址访问本目录。
</Directory>
#为目录"/var/www/html"定义的访问控制结束。
UserDir public_html
#用来指定个人主页的位置。
#若用户 test 的默认目录是/home/test,当客户端访问 http://yourdomainname/~test/时,
#系统就会到对应的目录/home/test/public_html 中去查找资源文件。
DirectoryIndex index.html index.html.var
#声明每个目录下的默认资源文件名称,一般为 index.html 或 index.htm。
ErrorLog logs/error_log
#指定错误日志的文件名称和路径(详见 6.4.5 节)。
CustomLog logs/access_log combined
#用来指定普通访问日志文件名称和路径以及记录方式(详见 6.4.5 节)。
Alias /icons/ "/var/www/icons/"
#为目录设置别名。设置别名后可以用简单的名称代替比较长的 URL 路径。
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#为脚本程序目录设置别名。
AddHandler cgi-script .cgi
#定义*.cgi 文件为 cgi 脚本程序文件。
第6章 WWW 应用 ·125·

6.4.4 配置虚拟主机

为 apache 设置虚拟主机服务通常可以采用两种方案:基于 IP 地址的虚拟主机和基于名


字的虚拟主机。下面仅以最常用的基于名字的虚拟主机的配置方法为例介绍虚拟主机配置
方法:
假设为 www.company1.com 和 www.company2.com 提供虚拟主机服务,其配置步骤如下。
(1)在相应的域名服务器上设置 A 记录(WWW 服务器地址为 202.194.253.245)
www.company1.com A 202.194.253.245
www.company2.com A 202.194.253.245
(2)编辑/etc/httpd/conf/httpd.conf
NameVirtualHost 202.194.253.245
<VirtualHost 202.194.253.245>
ServerAdmin webmaster@company1.com
DocumentRoot /var/www/company1
ScriptAlias /cgi-bin/ /var/www/company1/cgi-bin/
ServerName www.company1.com
ErrorLog /var/httpd/logs/company1/error_log
TransferLog /var/httpd/logs/company1/access_log
</VirtualHost>
#以上是 company1 的配置部分。
<VirtualHost 202.194.253.245>
ServerAdmin webmaster@company2.com
DocumentRoot /var/www/company2
ScriptAlias /cgi-bin/ /var/www/company2/cgi-bin/
ServerName www.company2.com
ErrorLog /var/httpd/logs/company2/error_log
TransferLog /var/httpd/logs/company2/access_log
</VirtualHost>
#以上是 company2 的配置部分。
(3)建立相应的目录
mkdir /var/www/company1
mkdir /var/httpd/logs/company1
mkdir /var/www/company2
mkdir /var/httpd/logs/company2
(4)将相应的资源文件存放到相应的目录
必须重新启动 Web 服务进程,才能使更改后的配置文件生效。

6.4.5 管理 log 文件

Apache 的主要日志文件是访问日志文件和错误日志文件,下面分别来分析这两个文件。
·126· Internet 应用协议实例剖析与服务器配置

1.访问日志文件 Access_log
该文件主要记录客户端的主机地址、访问的时间、客户端的请求和服务器的响应状态等
信息。默认情况下,Apache 采用通用日志格式 CLF 规范来写日志文件,CLF 日志文件内对
每个请求均有一个单独记录行,形式如下:
host ident anthuser date request status bytes url sign
若某部分没有有效内容,则以“-”代替。行中各部分内容的含义如下:
① host,客户端主机的名字或 IP 地址;
② ident,通过 identd 服务获得的客户标识;
③ anthuser,基于用户名认证时,此值为用户名;
④ date,请求的日期与时间;
⑤ request,客户端的请求行;
⑥ status,返回到客户端的 3 位数字的 HTTP 状态码;
⑦ bytes,除去 HTTP 头外,返回给客户端的字节数;
⑧ url,客户端在浏览器地址栏里面输入的 URL;
⑨ sign,客户端浏览器发送来的标识信息。
以下是该记录文件的一行范例:
10.0.0.5 - - [02/Mar/2003:08:43:41 +0800] "GET /icons/apache_pb.gif HTTP/1.1"
3042898 "http://test.sdie.edu.cn/" "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)"
2.错误日志文件 Error_log
该文件主要记录 apache 关闭与启动的时间,以及存取文件发生错误的状况。每一个记录
行由时间、错误类型和错误信息组成,例如:
[Sun Mar 02 09:54:23 2003] [warn] child process 1616 still did not exit, sending a SIGTERM
[Sun Mar 02 09:57:31 2003] [error] [client 10.0.0.5] File does not exist: /var/www/html/a
[Sun Mar 02 09:54:23 2003] [notice] caught SIGTERM, shutting down

6.4.6 用 Apache 建立动态网站

大部分网站采用动态的形式与客户进行交互,其中很多网站采用了 php、perl 等语言进


行服务器端编程,在 RedHat linux 8.0 中包括了 php4 和 perl 模块,供 apache 服务载入使用。
在 RedHat linux 8.0 中,php 和 perl 的配置文件在/etc/httpd/conf.d 目录下,其中 php.conf
是关于 php 的配置文件,perl.conf 是关于 perl 的配置文件,分别举例如下:
(1)php.conf
LoadModule php4_module modules/libphp4.so
#加载的 php4 的模块。
<Files *.php>
SetOutputFilter PHP
SetInputFilter PHP
LimitRequestBody 524288
</Files>
#定义 php 解释器解释以 php 为扩展名的文件。
第6章 WWW 应用 ·127·

DirectoryIndex index.php
#令 index.php 为所在目录的默认资源。
(2)Perl.conf
LoadModule perl_module modules/mod_perl.so
#加载的 perl 的模块。
Alias /perl /var/www/perl
#定义 perl 目录别名。

6.4.7 使用 SSL 建立安全的 Web 站点

目前,Internet 上有多种安全协议,网络模型的每一层都已提出了相应的协议,例如应用
层有安全电子交易(SET,Secure Electronic Transaction)协议、会话层有安全套接层(SSL,
Secure Socket Layer)协议等。
若要使用 SSL 来加强站点的安全性应采用以下几个步骤来设置 Apache。
(1)申请或生成证书。这里假设已经通过证书颁发机构获得了证书,它将包含一个证书
文件和一个密钥文件,假设它们的名字分别是 server.crt 和 server.key。欲了解证书的详细信
息,读者可以在 Linux 下使用 OpenSSL 软件组建一个自己的认证中心,了解证书生成的过程。
(2)将证书文件拷贝至 Apache 相应目录下
cp server.crt /etc/httpd/conf/ssl.crt/
cp server.key /etc/httpd/conf/ssl.key/
(3)修改 Apache 配置文件
在/etc/httpd/conf.d/ssl.conf 文件中应该有下面两行信息:
SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
另外,在相应的虚拟主机的配置区中应该用下面的语句开启 SSL 功能:
SSLEngine on
在上述配置基础上运行 Apache, 则默认情况下基于 SSL 的 WWW 服务就已经运行于 TCP
443 端口了,此时用“https://”访问此主机,可以看到如下图所示的状态栏上带有上锁标记
的结果,双击锁标记可以看到证书的信息,如图 6-5 所示。

图 6-5 浏览基于 SSL 的 WWW 服务器


·128· Internet 应用协议实例剖析与服务器配置

6.5 实 例 剖 析

6.5.1 环境介绍

本例中将使用基于以太网的同一个 IP 网络内的两台计算机,将这两台计算机分别命名为
A 和 B,A 和 B 的基本配置信息如下:
计算机 IP 地址 掩码
A 202.194.254.138 255.255.255.0
B 202.194.254.211 255.255.255.0
在 A 计算机上运行 WWW 浏览器软件访问 B 计算机上的 WWW 服务器进程,WWW 浏
览器软件是 Linux 操作系统下的 Lynx2.8.1,WWW 服务器软件是 Linux 操作系统下的
Apache1.3.6,为了使实验数据尽可能简短,在 WWW 服务器的虚拟根目录下创建了一个最简
单的默认静态网页 index.html,其内容如下:
<html>
hello!
</html>
当用户只给出 WWW 服务器的 IP 地址并令 WWW 浏览器向对方发送 HTTP 请求时,
WWW 服务器会把上面的文件回复给浏览器,此例将详细描述 WWW 浏览器与 WWW 服务
器之间建立 TCP 连接、发送 HTTP 请求、发送 HTTP 应答、结束 TCP 连接的完整过程。

6.5.2 通信过程中的帧

首先在 A 计算机上利用 TCPDUMP 工具获得由 A 与 B 之间所有的帧,这些帧的作用和


内容如下所述。
(1)A 发向 B 的 TCP 同步帧
0000000: 0060 948a 73c9 0000 b491 8c6a 0800 4500
0000010: 003c 1944 4000 4006 8e94 cac2 fe8a cac2
0000020: fed3 0413 0050 927a 4ac8 0000 0000 a002
0000030: 7d78 2829 0000 0204 05b4 0402 080a 0005
0000040: 2dd7 0000 0000 0103 0300
(2)B 发向 A 的 TCP 同步帧
0000000: 0000 b491 8c6a 0060 948a 73c9 0800 4500
0000010: 003c d2bf 4000 4006 d518 cac2 fed3 cac2
0000020: fe8a 0050 0413 0563 0071 927a 4ac9 a012
0000030: 7d78 369d 0000 0204 05b4 0402 080a 0719
0000040: e48d 0005 2dd7 0103 0300
(3)A 发向 B 的 TCP 确认帧
0000000: 0060 948a 73c9 0000 b491 8c6a 0800 4500
第6章 WWW 应用 ·129·

0000010: 0034 1945 4000 4006 8e9b cac2 fe8a cac2


0000020: fed3 0413 0050 927a 4ac9 0563 0072 8010
0000030: 7d78 6562 0000 0101 080a 0005 2dd7 0719
0000040: e48d
(4)A 发向 B 的 HTTP 请求帧
0000000: 0060 948a 73c9 0000 b491 8c6a 0800 4500
0000010: 0266 1946 4000 4006 8c68 cac2 fe8a cac2
0000020: fed3 0413 0050 927a 4ac9 0563 0072 8018
0000030: 7d78 fda8 0000 0101 080a 0005 2dd8 0719
0000040: e48d 4745 5420 2f20 4854 5450 2f31 2e30
0000050: 0d0a 486f 7374 3a20 3230 322e 3139 342e
0000060: 3235 342e 3231 310d 0a41 6363 6570 743a
0000070: 2074 6578 742f 6874 6d6c 2c20 7465 7874
0000080: 2f70 6c61 696e 2c20 6170 706c 6963 6174
0000090: 696f 6e2f 6170 706c 6566 696c 652c 2061
00000a0: 7070 6c69 6361 7469 6f6e 2f78 2d6d 6574
00000b0: 616d 6169 6c2d 7061 7463 682c 2073 756e
00000c0: 2d64 6573 6b73 6574 2d6d 6573 7361 6765
00000d0: 2c20 6d61 696c 2d66 696c 652c 2064 6566
00000e0: 6175 6c74 2c20 706f 7374 7363 7269 7074
00000f0: 2d66 696c 652c 2061 7564 696f 2d66 696c
0000100: 652c 2078 2d73 756e 2d61 7474 6163 686d
0000110: 656e 742c 2074 6578 742f 656e 7269 6368
0000120: 6564 2c20 7465 7874 2f72 6963 6874 6578
0000130: 742c 2061 7070 6c69 6361 7469 6f6e 2f61
0000140: 6e64 7265 772d 696e 7365 742c 2078 2d62
0000150: 6532 0d0a 4163 6365 7074 3a20 6170 706c
0000160: 6963 6174 696f 6e2f 706f 7374 7363 7269
0000170: 7074 2c20 6d65 7373 6167 652f 6578 7465
0000180: 726e 616c 2d62 6f64 792c 206d 6573 7361
0000190: 6765 2f70 6172 7469 616c 2c20 6170 706c
00001a0: 6963 6174 696f 6e2f 7067 702c 2061 7070
00001b0: 6c69 6361 7469 6f6e 2f70 6770 2c20 7669
00001c0: 6465 6f2f 6d70 6567 2c20 7669 6465 6f2f
00001d0: 2a2c 2069 6d61 6765 2f2a 2c20 6175 6469
00001e0: 6f2f 6d6f 642c 2074 6578 742f 7367 6d6c
00001f0: 2c20 2a2f 2a3b 713d 302e 3031 0d0a 4163
0000200: 6365 7074 2d45 6e63 6f64 696e 673a 2067
0000210: 7a69 702c 2063 6f6d 7072 6573 730d 0a41
·130· Internet 应用协议实例剖析与服务器配置

0000220: 6363 6570 742d 4c61 6e67 7561 6765 3a20


0000230: 656e 0d0a 4e65 676f 7469 6174 653a 2074
0000240: 7261 6e73 0d0a 5573 6572 2d41 6765 6e74
0000250: 3a20 4c79 6e78 2f32 2e38 2e31 7265 6c2e
0000260: 3220 6c69 6277 7777 2d46 4d2f 322e 3134
0000270: 0d0a 0d0a
(5)B 发向 A 的 TCP 确认帧
0000000: 0000 b491 8c6a 0060 948a 73c9 0800 4500
0000010: 0034 d2c0 4000 4006 d51f cac2 fed3 cac2
0000020: fe8a 0050 0413 0563 0072 927a 4cfb 8010
0000030: 7c70 6436 0000 0101 080a 0719 e48e 0005
0000040: 2dd8
(6)B 发向 A 的 HTTP 应答帧
0000000: 0000 b491 8c6a 0060 948a 73c9 0800 4500
0000010: 014f d2c1 4000 4006 d403 cac2 fed3 cac2
0000020: fe8a 0050 0413 0563 0072 927a 4cfb 8018
0000030: 7c70 6e3d 0000 0101 080a 0719 e48e 0005
0000040: 2dd8 4854 5450 2f31 2e31 2032 3030 204f
0000050: 4b0d 0a44 6174 653a 2057 6564 2c20 3230
0000060: 204d 6172 2032 3030 3220 3135 3a33 313a
0000070: 3239 2047 4d54 0d0a 5365 7276 6572 3a20
0000080: 4170 6163 6865 2f31 2e33 2e36 2028 556e
0000090: 6978 2920 2028 5265 6420 4861 742f 4c69
00000a0: 6e75 7829 0d0a 4c61 7374 2d4d 6f64 6966
00000b0: 6965 643a 2057 6564 2c20 3230 204d 6172
00000c0: 2032 3030 3220 3135 3a32 393a 3038 2047
00000d0: 4d54 0d0a 4554 6167 3a20 2264 6438 3033
00000e0: 2d31 362d 3363 3938 6161 6334 220d 0a41
00000f0: 6363 6570 742d 5261 6e67 6573 3a20 6279
0000100: 7465 730d 0a43 6f6e 7465 6e74 2d4c 656e
0000110: 6774 683a 2032 320d 0a43 6f6e 6e65 6374
0000120: 696f 6e3a 2063 6c6f 7365 0d0a 436f 6e74
0000130: 656e 742d 5479 7065 3a20 7465 7874 2f68
0000140: 746d 6c0d 0a0d 0a3c 6874 6d6c 3e0a 6865
0000150: 6c6c 6f21 0a3c 2f68 746d 6c3e 0a
(7)A 发向 B 的 TCP 确认帧
0000000: 0060 948a 73c9 0000 b491 8c6a 0800 4500
0000010: 0034 1947 4000 4006 8e99 cac2 fe8a cac2
0000020: fed3 0413 0050 927a 4cfb 0563 018d 8010
第6章 WWW 应用 ·131·

0000030: 7d78 6213 0000 0101 080a 0005 2dd8 0719


0000040: e48e
(8)B 发向 A 的 TCP 连接结束帧
0000000: 0000 b491 8c6a 0060 948a 73c9 0800 4500
0000010: 0034 d2c2 4000 4006 d51d cac2 fed3 cac2
0000020: fe8a 0050 0413 0563 018d 927a 4cfb 8011
0000030: 7c70 631a 0000 0101 080a 0719 e48e 0005
0000040: 2dd8
(9)A 发向 B 的 TCP 确认帧
0000000: 0060 948a 73c9 0000 b491 8c6a 0800 4500
0000010: 0034 1948 4000 4006 8e98 cac2 fe8a cac2
0000020: fed3 0413 0050 927a 4cfb 0563 018e 8010
0000030: 7d78 6212 0000 0101 080a 0005 2dd8 0719
0000040: e48e
(10)A 发向 B 的 TCP 连接结束帧
0000000: 0060 948a 73c9 0000 b491 8c6a 0800 4500
0000010: 0034 1949 4000 4006 8e97 cac2 fe8a cac2
0000020: fed3 0413 0050 927a 4cfb 0563 018e 8011
0000030: 7d78 6210 0000 0101 080a 0005 2dd9 0719
0000040: e48e
(11)B 发向 A 的 TCP 确认帧
0000000: 0000 b491 8c6a 0060 948a 73c9 0800 4500
0000010: 0034 d2c3 4000 4006 d51c cac2 fed3 cac2
0000020: fe8a 0050 0413 0563 018e 927a 4cfc 8010
0000030: 7c70 6317 0000 0101 080a 0719 e48f 0005
0000040: 2dd9

6.5.3 帧剖析

(1)A 发向 B 的 TCP 同步帧


字节偏移 内容 含义
00~05 0060 948a 73c9 目的以太网地址(B 的以太网地址)
06~0b 0000 b491 8c6a 源以太网地址(A 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
********************(以下为 IP 包的内容)******************************
0e~0f 0100010100000000(展开为二进制,十六进制为 4500)
0100 IPv4 (IP 版本)
0101 IP 包头长为 5  4=20Byte
00000000 未指定服务类型
10~11 003c IP 包总长度
·132· Internet 应用协议实例剖析与服务器配置

12~13 1944 标识符


14~15 0100000000000000(展开为二进制,十六进制为 4000)
010 此包禁止被分段
000000000000 无效
16 40 生存时间
17 06 此 IP 包所携带数据为 TCP 包
18~19 8e94 头部校验和
1A~1D cac2 fe8a 源 IP 地址为 202.194.254.138
1e~21 cac2 fed3 目的 IP 地址为 202.194.254.211
**********************(以下为 TCP 包的内容)***************************
22~23 0413 源 TCP 端口号
24~25 0050 目的 TCP 端口号(WWW 服务器的周知端口号)
26~29 927a 4ac8 序列号
2a~2d 0000 0000 确认号
2e~2f 1010000000000010(展开为二进制,十六进制为 a002)
1010 TCP 头的长度为 0xa  4Byte
000000 保留字段
0 “紧急指针”字段无效
0 “确认号”字段无效
0 不要求接收方执行推送功能
0 发送方不要求此次连接复位
1 表示此 TCP 包用于初始化序列号字段
0 结束位为 0 表示发送者不要求结束本次连接
30~31 7d78 窗口大小为 32120(十进制)Byte
32~33 2829 TCP 校验和
34~35 0000 紧急指针
****************(以下为用横线隔开的多个 TCP 选项)****************
36 02 TCP 包最大长度选项
37 04 选项的长度为 4Byte
38~39 05b4 TCP 包的最大长度为 1460Byte
--------------------------------------------------------------------------------------
3a 04 发送方支持选择性确认
3b 02 选项的长度为 2Byte
---------------------------------------------------------------------------------------
3c 08 时间标签选项
3d 0a 选项长度为 10(十进制)Byte
3e~41 00052dd7 发送方的时间标签值
42~45 00000000 不包含接收方的时间标签值
---------------------------------------------------------------------------------------
第6章 WWW 应用 ·133·

46 01 空选项
---------------------------------------------------------------------------------------
47 03 窗口大小度量选项
48 03 选项长度为 3Byte
49 00 窗口大小字段没有经过右移位
---------------------------------------------------------------------------------------
(2)B 发向 A 的 TCP 同步帧
字节偏移 内容 含义
00~05 0000 b491 8c6a 目的以太网地址(A 的以太网地址)
06~0b 0060 948a 73c9 源以太网地址(B 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
*******************(以下为 IP 包的内容)*******************************
0e~0f 0100010100000000(展开为二进制,十六进制为 4500)
0100 IPv4(IP 版本)
0101 IP 包头长为 5  4=20Byte
00000000 未指定服务类型
10~11 003c IP 包总长度
12~13 d2bf 标识符
14~15 0100000000000000(展开为二进制,十六进制为 4000)
010 此包禁止被分段
000000000000 无效
16 40 生存时间
17 06 此 IP 包所携带数据为 TCP 包
18~19 d518 头部校验和
1A~1D cac2 fed3 源 IP 地址为 202.194.254.211
1e~21 cac2 fe8a 目的 IP 地址为 202.194.254.138
************(以下为 TCP 包的内容)*************************************
22~23 0050 源 TCP 端口号(WWW 服务器的周知端口号)
24~25 0413 目的 TCP 端口号
26~29 0563 0071 序列号
2a~2d 927a 4ac9 确认号
2e~2f 1010000000010010(展开为二进制,十六进制为 a012)
1010 TCP 头的长度为 0xa  4Byte
000000 保留字段
0 “紧急指针”字段无效
1 “确认号”字段有效
0 不要求接收方执行推送功能
0 发送方不要求此次连接复位
1 表示此 TCP 包用于初始化序列号字段
·134· Internet 应用协议实例剖析与服务器配置

0 结束位为 0 表示发送者不要求结束本次连接
30~31 7d78 窗口大小为 32120(十进制)Byte
32~33 369d TCP 校验和
34~35 0000 紧急指针
****************(以下为用横线隔开的多个 TCP 选项)****************
36 02 TCP 包最大长度选项
37 04 选项的长度为 4Byte
38~39 05b4 TCP 包的最大长度为 1460Byte
---------------------------------------------------------------------------------------
3a 04 发送方支持“选择性确认”
3b 02 选项的长度为 2Byte
---------------------------------------------------------------------------------------
3c 08 时间标签选项
3d 0a 选项长度为 10(十进制)Byte
3e~41 0719 e48d 发送方的时间标签值
42~45 0005 2dd7 接收方的时间标签值
---------------------------------------------------------------------------------------
46 01 空选项
---------------------------------------------------------------------------------------
47 03 窗口大小度量选项
47 03 选项长度为 3Byte
48 00 窗口大小字段没有经过右移位
---------------------------------------------------------------------------------------
(3)A 发向 B 的 TCP 确认帧
字节偏移 内容 含义
00~05 0060 948a 73c9 目的以太网地址(B 的以太网地址)
06~0b 0000 b491 8c6a 源以太网地址(A 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
*****************(以下为 IP 包的内容)*********************************
0e~0f 0100010100000000(展开为二进制,十六进制为 4500)
0100 IPv4 (IP 版本)
0101 IP 包头长为 5  4=20Byte
00000000 未指定服务类型
10~11 0034 IP 包总长度
12~13 1945 标识符
14~15 0100000000000000(展开为二进制,十六进制为 4500)
010 此包禁止被分段
000000000000 无效
16 40 生存时间
第6章 WWW 应用 ·135·

17 06 此 IP 包所携带数据为 TCP 包
18~19 8e9b 头部校验和
1A~1D cac2 fe8a 源 IP 地址为 202.194.254.138
1e~21 cac2 fed3 目的 IP 地址为 202.194.254.211
************(以下为 TCP 包的内容)*************************************
22~23 0413 源 TCP 端口号
24~25 0050 目的 TCP 端口号(WWW 服务器的周知端口号)
26~29 927a 4ac9 序列号
2a~2d 0563 0072 确认号
2e~2f 1000000000010000(展开为二进制,十六进制为 8010)
1000 TCP 头的长度为 0x8  4Byte
000000 保留字段
0 “紧急指针”字段无效
1 “确认号”字段有效
0 不要求接收方执行推送功能
0 发送方不要求此次连接复位.
0 同步位为 0 表示此 TCP 包非同步包
0 结束位为 0 表示发送者不要求结束本次连接
30~31 7d78 窗口大小为 32120(十进制)Byte
32~33 6562 TCP 校验和
34~35 0000 紧急指针
****************(以下为用横线隔开的多个 TCP 选项)*************
36 01 空选项
---------------------------------------------------------------------------------------
37 01 空选项
---------------------------------------------------------------------------------------
38 08 时间标签选项
39 0a 选项长度为 10(十进制)字节
3a~3d 0005 2dd7 发送方的时间标签值
3e~41 0719 e48d 接收方的时间标签值
---------------------------------------------------------------------------------------
(4)A 发向 B 的 HTTP 请求帧
字节偏移 内容 含义
00~05 0060 948a 73c9 目的以太网地址(B 的以太网地址)
06~0b 0000 b491 8c6a 源以太网地址(A 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
*********************(以下为 IP 包的内容)**********************
0e~0f 0100010100000000(展开为二进制,十六进制为 4500)
0100 IPv4 (IP 版本)
·136· Internet 应用协议实例剖析与服务器配置

0101 IP 包头长为 5  4=20Byte


00000000 未指定服务类型
10~11 0266 IP 包总长度
12~13 1946 标识符
14~15 0100000000000000(展开为二进制,十六进制为 4000)
010 此包禁止被分段
000000000000 无效
16 40 生存时间
17 06 此 IP 包所携带数据为 TCP 包
18~19 8c68 头部校验和
1A~1D cac2 fe8a 源 IP 地址为 202.194.254.138
1e~21 cac2 fed3 目的 IP 地址为 202.194.254.211
*************************(以下为 TCP 包的内容)************************
22~23 0413 源 TCP 端口号
24~25 0050 目的 TCP 端口号(WWW 服务器的周知端口号)
26~29 927a 4ac9 序列号
2a~2d 0563 0072 确认号
2e~2f 1000000000011000(展开为二进制,十六进制为 8018)
1000 TCP 头的长度为 0x8  4 字节
000000 保留字段
0 “紧急指针”字段无效
1 “确认号”字段有效
1 要求接收方执行推送功能
0 发送方不要求此次连接复位
0 同步位为 0 表示此 TCP 包非同步包
0 结束位为 0 表示发送者不要求结束本次连接.
30~31 7d78 窗口大小为 32120(十进制)Byte
32~33 fda8 TCP 校验和
34~35 0000 紧急指针
****************(以下是用横线隔开的多个 TCP 选项)****************
36 01 空选项
---------------------------------------------------------------------------------------
37 01 空选项
---------------------------------------------------------------------------------------
38 08 时间标签选项
39 0a 选项长度为 10(十进制)Byte
3a~3d 0005 2dd8 发送方的时间标签值
3e~41 0719 e48d 接收方的时间标签值
***********(以下是直接以字符形式显示的 HTTP 包的内容)**************
第6章 WWW 应用 ·137·

42~273 GET / HTTP/1.0


Host: 202.194.254.211
Accept:text/html,text/plain,application/applefile,application/x-metamail-
patch,sun-deskset-message,mail-file,default,postscript-file,audio-file,
x-sun-attachment,text/enriched,text/richtext,application/andrew-inset,
x-be2
Accept:application/postscript,message/external-body,message/partial,appli-
cation/pgp,application/pgp,video/mpeg,video/*,image/*,audio/mod,
text/sgml,*/*;q=0.01
Accept-Encoding: gzip,compress
Accept-Language: en
Negotiate: trans
User-Agent: Lynx/2.8.1rel.2 libwww-FM/2.14
---------------------------------------------------------------------------------------
下面分别解释 HTTP 请求包中的各行。
第 1 行内容为“GET / HTTP/1.0” ,它是 HTTP 包的请求行,表明浏览器希望得到 WWW
服务器根目录下的默认资源,并且此 HTTP 包遵循 HTTP/1.0 规范。
第 2 行的内容为“Host: 202.194.254.211” ,是头项表中的一项,用于向 WWW 服务器声
明用户在浏览器地址栏中输入的地址字符串是“202.194.254.211” 。
第 3~6 行和第 7~9 行分别是一个 Accept 头项,用于告诉 WWW 服务器,发送此请求
的 WWW 浏览器支持哪些类型的资源。
第 10 行是一个 Accept-Encoding 头项,它的作用是告诉 WWW 服务器发送此请求的
WWW 浏览器支持哪些类型的压缩编码方式。
第 11 行是一个 Accept-Language 头项,它的作用是告诉 WWW 服务器发送此请求的
WWW 浏 览 器 支 持 哪些种 语 言 。 此 例 中 的 Lynx 浏 览 器 只 支 持 英 语 ( english), 所 以
Accept-Language 头项的内容为“Accept-Language: en”。
第 12 行是一个 Negotiate 头项,用于规定浏览器与服务器之间的内容协商(Negotiation)
采用的方法,它具体解决的问题是:当服务器端对同一个内容有多种表示法(例如语言不同、
格式不同等)时,最终客户端应该获得哪一种。协商方法有 3 种,分别是服务器驱动法、浏
览器驱动法和透明(transparent)协商法,本例中 Lynx 浏览器要求使用透明(transparent)协
商法,所以 Negotiate 头项的内容为“Negotiate: trans” 。
第 13 行是一个 User-Agent 头项,它用于告诉 WWW 服务器,发出此请求的 WWW 浏览
器的名称和版本号等信息。此例中,User-Agent 头项的内容为“User-Agent: Lynx/2.8.1rel.2
libwww-FM/2.14” ,表明发出此 HTTP 请求的 WWW 浏览器是 Lynx2.8.1。
(5)B 发向 A 的 TCP 确认帧
字节偏移 内容 含义
00~05 0000 b491 8c6a 目的以太网地址(A 的以太网地址)
06~0b 0060 948a 73c9 源以太网地址(B 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
·138· Internet 应用协议实例剖析与服务器配置

***********(以下为 IP 包的内容)******************************
0e~0f 0100010100000000(展开为二进制,十六进制为 4500)
0100 IPv4 (IP 版本)
0101 IP 包头长为 5  4=20Byte
00000000 未指定服务类型
10~11 0034 IP 包总长度
12~13 d2c0 标识符
14~15 0100000000000000
010 此包禁止被分段
000000000000 无效
16 40 生存时间
17 06 此 IP 包所携带数据为 TCP 包
18~19 d51f 头部校验和
1A~1D cac2 fed3 源 IP 地址为 202.194.254.211
1e~21 cac2 fe8a 目的 IP 地址为 202.194.254.138
************(以下为 TCP 包的内容)*******************************
22~23 0050 源 TCP 端口号(WWW 服务器的周知端口号)
24~25 0413 目的 TCP 端口号
26~29 0563 0072 序列号
2a~2d 927a 4cfb 确认号
2e~2f 1000000000010000(展开为二进制,十六进制为 8010)
1000 TCP 头的长度为 0x8  4Byte
000000 保留字段
0 “紧急指针”字段无效
1 “确认号”字段有效
0 不要求接收方执行推送功能
0 发送方不要求此次连接复位
0 同步位为 0 表示此 TCP 包非同步包
0 结束位为 0 表示发送者不要求结束本次连接.
30~31 7c70 窗口大小为 31856(十进制)Byte
32~33 6436 TCP 校验和
34~35 0000 紧急指针
***************(以下为用横线隔开的多个 TCP 选项)***************
36 01 空选项
---------------------------------------------------------------------------------------
37 01 空选项
---------------------------------------------------------------------------------------
38 08 时间标签选项
39 0a 选项长度为 10(十进制)Byte
第6章 WWW 应用 ·139·

3a~3d 0719 e48e 发送方的时间标签值


3e~41 0005 2dd8 接收方的时间标签值
---------------------------------------------------------------------------------------
(6)B 发向 A 的 HTTP 应答帧
字节偏移 内容 含义
00~05 0000 b491 8c6a 目的以太网地址(A 的以太网地址)
06~0b 0060 948a 73c9 源以太网地址(B 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
************(以下为 IP 包的内容)**********************************
0e~0f 0100010100000000(展开为二进制,十六进制为 4500)
0100 IPv4 (IP 版本)
0101 IP 包头长为 5  4=20Byte
00000000 未指定服务类型
10~11 014f IP 包总长度
12~13 d2c1 标识符
14~15 0100000000000000(展开为二进制,十六进制为 4000)
010 此包禁止被分段
000000000000 无效
16 40 生存时间
17 06 此 IP 包所携带数据为 TCP 包
18~19 d403 头部校验和
1a~1d cac2 fed3 源 IP 地址为 202.194.254.211
1e~21 cac2 fe8a 目的 IP 地址为 202.194.254.138
************(以下为 TCP 包的内容)**********************************
22~23 0050 源 TCP 端口号(WWW 服务器的周知端口号)
24~25 0413 目的 TCP 端口号
26~29 0563 0072 序列号
2a~2d 927a 4cfb 确认号
2e~2f 1000000000011000(展开为二进制,十六进制为 8018)
1000 TCP 头的长度为 0x8  4Byte
000000 保留字段
0 “紧急指针”字段无效
1 “确认号”字段有效
1 要求接收方执行推送功能
0 发送方不要求此次连接复位.
0 同步位为 0 表示此 TCP 包非同步包
0 结束位为 0 表示发送者不要求结束本次连接.
30~31 7c70 窗口大小为 31856(十进制)Byte
32~33 6e3d TCP 校验和
·140· Internet 应用协议实例剖析与服务器配置

34~35 0000 紧急指针


****************(以下为用横线隔开的多个 TCP 选项)****************
36 01 空选项
---------------------------------------------------------------------------------------
37 01 空选项
---------------------------------------------------------------------------------------
38 08 时间标签选项
39 0a 选项长度为 10(十进制)Byte
3a~3d 0719 e48e 发送方的时间标签值
3e~41 0005 2dd8 接收方的时间标签值
************(以下是直接以字符形式显示的 HTTP 包的内容)*************
42~15c HTTP/1.1 200 OK
Date: Wed, 20 Mar 2002 15:31:29 GMT
Server: Apache/1.3.6 (Unix) (Red Hat/Linux)
Last-Modified: Wed, 20 Mar 2002 15:29:08 GMT
ETag: "dd803-16-3c98aac4"
Accept-Ranges: bytes
Content-Length: 22
Connection: close
Content-Type: text/html

<html>
hello!
</html>
---------------------------------------------------------------------------------------
HTTP 响应包中各行的含义如下所述。
第 1 行内容为“HTTP/1.1 200 OK” ,是 HTTP 应答包的状态行,表明此 HTTP 包遵循
HTTP/1.1 规范,状态码 200 表示一切正常,状态信息为“OK” 。
第 2 行为头项表的第一项,表明 WWW 服务器端的当前时间是 2002 年 3 月 20 日 15 点
31 分 29 秒。
第 3 行是一个 Server 头项,用于表明 WWW 服务器端的软件名称和版本,此例中 WWW
服务器软件是 Apache1.3.6,运行于 RedHat Linux 操作系统之上。
第 4 行是一个 Last-Modified 头项, 它用于标识响应包中所包含的资源最后被修改的时间,
此例中信息体中的文档最后被修改时间是 2002 年 2 月 20 日 15 点 29 分 08 秒。
第 5 行是一个 ETag(Entity Tag,实体标记)头项。实体标记即 HTTP 包信息体标记,
它由 WWW 服务器产生,用于惟一地标识一个信息体,浏览器得到此 HTTP 应答包后,可以
将实体标记和得到的资源及名字都进行缓存,当用户下次又访问同样一个资源时,若在两次
访问之间,WWW 服务器上的这个资源并没有改变过,则浏览器就可以直接将缓存中的内容
显示给用户,否则浏览器需要重新向服务器请求此资源。为了得知服务器端的文档是否已经
第6章 WWW 应用 ·141·

发生了改变,浏览器可以向服务器发送一个头项中包含与被请求资源相对应的标记的请求,
服务器根据请求包中的标记可以判断出被请求的资源是否改变过,若资源未改变,则 WWW
服务器使用一个不包含信息体的应答包,并且应答包的状态行包含状态码 304(表示资源未
改变) ,若 WWW 服务器端的资源已经改变,则服务器将使用包含正常信息体的应答包。
第 6 行是一个 Accept-Ranges 头项, “Accept-Ranges: bytes”表明 WWW 服务器支持浏览
器通过相应的头项请求一个资源的一部分(Ranges) ,并且是以开始字节偏移和结束字节偏移
来表达这个部分。WWW 浏览器可以利用 first-byte-pos 和 last-byte-pos 头项分别表达开始字
节偏移和结束字节偏移。
第 7 行是一个 Content-Length 头项,用于表达此应答包中信息体的长度,此例中信息体
的长度是 22(十进制)Byte。
第 8 行是一个 Connection 头项。Connection 头项可用于协商一次文档传输之后,双方之
间是否继续保持 TCP 连接,若保持则使用“Connection: Keep-Alive”,否则使用“Connection:
close”。
第 9 行是一个 Content-Type 头项,用于表达信息体的类型,此例中信息体是 text/html
类型。
第 10 行是分隔头项表和信息体的空行。
第 11~13 行是信息体,它是一个简单的 HTML 文档,浏览器解释此文档后,会在显示
区域显示“hello!”字符串。
(7)A 发向 B 的 TCP 确认帧
字节偏移 内容 含义
00~05 0060 948a 73c9 目的以太网地址(B 的以太网地址)
06~0b 0000 b491 8c6a 源以太网地址(A 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
************(以下为 IP 包的内容)***********************************
0e~0f 0100010100000000(展开为二进制,十六进制为 4500)
0100 IPv4 (IP 版本)
0101 IP 包头长为 5  4=20Byte
00000000 未指定服务类型
10~11 0034 IP 包总长度
12~13 1947 标识符
14~15 0100000000000000(展开为二进制,十六进制为 4000)
010 此包禁止被分段
000000000000 无效
16 40 生存时间
17 06 此 IP 包所携带数据为 TCP 包
18~19 8e99 头部校验和
1A~1D cac2 fe8a 源 IP 地址为 202.194.254.138
1e~21 cac2 fed3 目的 IP 地址为 202.194.254.211
************(以下为 TCP 包的内容)*********************************
·142· Internet 应用协议实例剖析与服务器配置

22~23 0413 源 TCP 端口号


24~25 0050 目的 TCP 端口号(WWW 服务器的周知端口号)
26~29 927a 4cfb 序列号
2a~2d 0563 018d 确认号
2e~2f 1000000000010000(展开为二进制,十六进制为 8010)
1000 TCP 头的长度为 0x8  4Byte
000000 保留字段
0 “紧急指针”字段无效
1 “确认号”字段有效
0 不要求接收方执行推送功能
0 发送方不要求此次连接复位
0 同步位为 0 表示此 TCP 包非同步包
0 结束位为 0 表示发送者不要求结束本次连接
30~31 7d78 窗口大小为 32120(十进制)Byte
32~33 6213 TCP 校验和
34~35 0000 紧急指针
****************(以下是用横线隔开的多个 TCP 选项)****************
36 01 空选项
---------------------------------------------------------------------------------------
37 01 空选项
---------------------------------------------------------------------------------------
38 08 时间标签选项
39 0a 选项长度为 10(十进制)Byte
3a~3d 0005 2dd8 发送方的时间标签值
3e~41 0719 e48e 接收方的时间标签值
---------------------------------------------------------------------------------------
(8)B 发向 A 的 TCP 连接结束帧
字节偏移 内容 含义
00~05 0000 b491 8c6a 目的以太网地址(A 的以太网地址)
06~0b 0060 948a 73c9 源以太网地址(B 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
************(以下为 IP 包的内容)***********************************
0e~0f 0100010100000000(展开为二进制,十六进制是 4500)
0100 IPv4 (IP 版本)
0101 IP 包头长为 5  4=20Byte
00000000 未指定服务类型
10~11 0034 IP 包总长度
12~13 d2c2 标识符
14~15 0100000000000000(展开为二进制,十六进制是 4000)
第6章 WWW 应用 ·143·

010 此包禁止被分段
000000000000 无效
16 40 生存时间
17 06 此 IP 包所携带数据为 TCP 包
18~19 d51d 头部校验和
1a~1d cac2 fed3 源 IP 地址为 202.194.254.211
1e~21 cac2 fe8a 目的 IP 地址为 202.194.254.138
************(以下为 TCP 包的内容)*********************************
22~23 0050 源 TCP 端口号(WWW 服务器的周知端口号)
24~25 0413 目的 TCP 端口号
26~29 0563 018d 序列号
2a~2d 927a 4cfb 确认号
2e~2f 1000000000010001(展开为二进制,十六进制是 8011)
1000 TCP 头的长度为 0x8  4Byte
000000 保留字段
0 “紧急指针”字段无效
1 “确认号”字段有效
0 不要求接收方执行推送功能
0 发送方不要求此次连接复位
0 同步位为 0 表示此 TCP 包非同步包
1 结束位为 1 表示发送者要求结束本次连接
30~31 7c70 窗口大小为 31856(十进制)Byte
32~33 631a TCP 校验和
34~35 0000 紧急指针
****************(以下是用横线隔开的多个 TCP 选项)****************
36 01 空选项
---------------------------------------------------------------------------------------
37 01 空选项
---------------------------------------------------------------------------------------
38 08 时间标签选项
39 0a 选项长度为 10(十进制)Byte
3a~3d 0719 e48e 发送方的时间标签值
3e~41 0005 2dd8 接收方的时间标签值
---------------------------------------------------------------------------------------
(9)A 发向 B 的 TCP 确认帧
字节偏移 内容 含义
00~05 0060 948a 73c9 目的以太网地址(B 的以太网地址)
06~0b 0000 b491 8c6a 源以太网地址(A 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
·144· Internet 应用协议实例剖析与服务器配置

************(以下为 IP 包的内容)***********************************
0e~0f 0100010100000000(展开为二进制,十六进制是 4500)
0100 IPv4 (IP 版本)
0101 IP 包头长为 5  4=20Byte
00000000 未指定服务类型
10~11 0034 IP 包总长度
12~13 1948 标识符
14~15 0100000000000000(展开为二进制,十六进制是 4500)
010 此包禁止被分段
000000000000 无效
16 40 生存时间
17 06 此 IP 包所携带数据为 TCP 包
18~19 8e98 头部校验和
1a~1d cac2 fe8a 源 IP 地址为 202.194.254.138
1e~21 cac2 fed3 目的 IP 地址为 202.194.254.211
************(以下为 TCP 包的内容)*********************************
22~23 0413 源 TCP 端口号
24~25 0050 目的 TCP 端口号(WWW 服务器的周知端口号)
26~29 927a 4cfb 序列号
2a~2d 0563 018e 确认号
2e~2f 1000000000010000(展开为二进制,十六进制是 8010)
1000 TCP 头的长度为 0x8  4Byte
000000 保留字段
0 “紧急指针”字段无效
1 “确认号”字段有效
0 不要求接收方执行推送功能
0 发送方不要求此次连接复位
0 同步位为 0 表示此 TCP 包非同步包
0 结束位为 0 表示发送者不要求结束本次连接
30~31 7d78 窗口大小为 32120(十进制)Byte
32~33 6212 TCP 校验和
34~35 0000 紧急指针
****************(以下是用横线隔开的多个 TCP 选项)****************
36 01 空选项
---------------------------------------------------------------------------------------
37 01 空选项
---------------------------------------------------------------------------------------
38 08 时间标签选项
39 0a 选项长度为 10(十进制)字节
第6章 WWW 应用 ·145·

3a~3d 0005 2dd8 发送方的时间标签值


3e~41 0719 e48d 接收方的时间标签值
-----------------------------------------------------------------------------------------
(10)A 发向 B 的 TCP 连接结束帧
字节偏移 内容 含义
00~05 0060 948a 73c9 目的以太网地址(B 的以太网地址)
06~0b 0000 b491 8c6a 源以太网地址(A 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
***********(以下为 IP 包的内容)*************************************
0e~0f 0100010100000000(展开为二进制,十六进制是 4500)
0100 IPv4 (IP 版本)
0101 IP 包头长为 5  4=20Byte
00000000 未指定服务类型
10~11 0034 IP 包总长度
12~13 1949 标识符
14~15 0100000000000000(展开为二进制,十六进制是 4000)
010 此包禁止被分段
000000000000 无效
16 40 生存时间
17 06 此 IP 包所携带数据为 TCP 包
18~19 8e97 头部校验和
1a~1d cac2 fe8a 源 IP 地址为 202.194.254.138
1e~21 cac2 fed3 目的 IP 地址为 202.194.254.211
************(以下为 TCP 包的内容)**********************************
22~23 0413 源 TCP 端口号
24~25 0050 目的 TCP 端口号(WWW 服务器的周知端口号)
26~29 927a 4cfb 序列号
2a~2d 0563 018e 确认号
2e~2f 1000000000010001(展开为二进制,十六进制是 8011)
1000 TCP 头的长度为 0x8  4Byte
000000 保留字段
0 “紧急指针”字段无效
1 “确认号”字段有效
0 不要求接收方执行推送功能
0 发送方不要求此次连接复位
0 同步位为 0 表示此 TCP 包非同步包
1 结束位为 1 表示发送者要求结束本次连接
30~31 7c70 窗口大小为 31856(十进制)Byte
30~31 7d78 窗口大小为 32120(十进制)Byte
·146· Internet 应用协议实例剖析与服务器配置

32~33 6210 TCP 校验和


34~35 0000 紧急指针
************(以下是用横线隔开的多个 TCP 选项)************
36 01 空选项
---------------------------------------------------------------------------------------
37 01 空选项
---------------------------------------------------------------------------------------
38 08 时间标签选项
39 0a 选项长度为 10(十进制)Byte
3a~3d 0005 2dd9 发送方的时间标签值
3e~41 0719 e48e 接收方的时间标签值
---------------------------------------------------------------------------------------
(11)B 发向 A 的 TCP 确认帧
字节偏移 内容 含义
00~05 0000 b491 8c6a 目的以太网地址(A 的以太网地址)
06~0b 0060 948a 73c9 源以太网地址(B 的以太网地址)
0c~0d 0800 表明所携带数据为 IP 包
************(以下为 IP 包的内容)*****************************
0e~0f 0100010100000000(展开为二进制,十六进制为 4500)
0100 IPv4 (IP 版本)
0101 IP 包头长为 5  4=20Byte
00000000 未指定服务类型
10~11 0034 IP 包总长度
12~13 d2c3 标识符
14~15 0100000000000000(展开为二进制,十六进制为 4000)
010 此包禁止被分段
000000000000 无效
16 40 生存时间
17 06 此 IP 包所携带数据为 TCP 包
18~19 d51c 头部校验和
1a~1d cac2 fed3 源 IP 地址为 202.194.254.211
1e~21 cac2 fe8a 目的 IP 地址为 202.194.254.138
************(以下为 TCP 包的内容)********************************
22~23 0050 源 TCP 端口号(WWW 服务器的周知端口号)
24~25 0413 目的 TCP 端口号
26~29 0563 018e 序列号
2a~2d 927a 4cfc 确认号
2e~2f 1000000000010000(展开为二进制,十六进制为 8010)
1000 TCP 头的长度为 0x8  4Byte
第6章 WWW 应用 ·147·

000000 保留字段
0 “紧急指针”字段无效
1 “确认号”字段有效
0 不要求接收方执行推送功能
0 发送方不要求此次连接复位
0 同步位为 0 表示此 TCP 包非同步包
0 结束位为 1 表示发送者不要求结束本次连接
30~31 7c70 窗口大小为 31856(十进制)Byte
32~33 6317 TCP 校验和
34~35 0000 紧急指针
****************(以下是用横线隔开的多个 TCP 选项)****************
36 01 空选项
---------------------------------------------------------------------------------------
37 01 空选项
---------------------------------------------------------------------------------------
38 08 时间标签选项
39 0a 选项长度为 10(十进制)Byte
3a~3d 0719 e48f 发送方的时间标签值
3e~41 0005 2dd9 接收方的时间标签值
---------------------------------------------------------------------------------------

6.5.4 校验和的计算

IP 头的校验值的计算已经在 1.6.6 节做过详细介绍,本节只对 TCP 包校验和进行详细


计算。
下面以 B 发向 A 的 HTTP 应答帧为例看一下 TCP 校验和的计算,依次执行以下步骤。
(1)组建 TCP 伪头。TCP 伪头的格式已经在“UDP 与 TCP 基础”一节介绍过,根据 B
发向 A 的 HTTP 应答帧组建出来的 TCP 伪头如图 6-6 所示。

0 15 16 31

源 IP 地址(202.194.254.211)

目的 IP 地址(202.194.254.138)

0 0x6 TCP 包长度(0x013b)

图 6-6 TCP 伪头示例

其中的“TCP 包长度”是整个 TCP 包的长度而不是 TCP 头部的“TCP 头的长度”字段


的值,所以此处 TCP 包长度为 0x15c-0x22+1=0x013b。
(2)确定要被校验的字段,组成一个字节序列。按照 TCP 协议要求,这个字节序列是根
据一个 TCP 伪头和将校验和字段清零后的 TCP 包组合得到的,因此可以把 TCP 伪头的各个
·148· Internet 应用协议实例剖析与服务器配置

字节和整个 TCP 包(校验和字段清零)的各个字节排列如下:


cac2 fed3 cac2 fe8a 0006 013b 0050 0413
0563 0072 927a 4cfb 8018 7c70 0000 0000
0101 080a 0719 e48e 0005 2dd8 4854 5450
2f31 2e31 2032 3030 204f 4b0d 0a44 6174
653a 2057 6564 2c20 3230 204d 6172 2032
3030 3220 3135 3a33 313a 3239 2047 4d54
0d0a 5365 7276 6572 3a20 4170 6163 6865
2f31 2e33 2e36 2028 556e 6978 2920 2028
5265 6420 4861 742f 4c69 6e75 7829 0d0a
4c61 7374 2d4d 6f64 6966 6965 643a 2057
6564 2c20 3230 204d 6172 2032 3030 3220
3135 3a32 393a 3038 2047 4d54 0d0a 4554
6167 3a20 2264 6438 3033 2d31 362d 3363
3938 6161 6334 220d 0a41 6363 6570 742d
5261 6e67 6573 3a20 6279 7465 730d 0a43
6f6e 7465 6e74 2d4c 656e 6774 683a 2032
320d 0a43 6f6e 6e65 6374 696f 6e3a 2063
6c6f 7365 0d0a 436f 6e74 656e 742d 5479
7065 3a20 7465 7874 2f68 746d 6c0d 0a0d
0a3c 6874 6d6c 3e0a 6865 6c6c 6f21 0a3c
2f68 746d 6c3e 0a
(3)确定要被校验的字节数。此例中被校验的是 327(十进制)Byte,总字节数为奇数,
需补零,补零后形成的字节序列为:
cac2 fed3 cac2 fe8a 0006 013b 0050 0413
.......................................
0a3c 6874 6d6c 3e0a 6865 6c6c 6f21 0a3c
2f68 746d 6c3e 0a00
(4)累加所有整数。为了计算方便,先把所有整数累加后,再将所有进位一次截取加到
剩余 16 位整数上:
cac2+fed3+cac2+fe8a+0006+013b+0050+0413+
.......................................
0a3c+6874+6d6c+3e0a+6865+6c6c+6f21+0a3c+
2f68+746d+6c3e+0a00=2e9194
9194+2e=91c2
(5)将结果取反:~91c2=6e3d。
(6)将结果 6e3d 填写到校验和字段。
最后得到的结果 6e3d 与实际看到的 B 发向 A 的 HTTP 应答帧的第 32~33Byte 吻合。
第7章 FTP 应用

7.1 FTP 协议基础

7.1.1 FTP 模型

文件传输是实现资源共享的重要方式和有效手段之一。文件传输协议(FTP,File Transfer
Protocol)是 Internet 应用层协议,它是 Internet 上最主要的文件传输协议。现在运行的各种
操作系统大都配备了使用方式基本相同的命令行 FTP 客户端程序。在 Linux 上最常用的 FTP
服务器软件是免费的 wu-ftpd。
FTP 协议模型如图 7-1 所示。

用户接口 用户

FTP 命令
服务器 用户

PI PI
FTP 应答

服务器 用户
文件系统 文件系统
DTP DTP
数据连接

服务器 FTP 实现 用户 FTP 实现

图 7-1 FTP 协议模型图

图中 PI 和 DTP 分别是 Protocol Interpreter(协议解释器)和 Data Transfer Process(数据


传输进程)的缩写。
在这个模型中,由用户 PI 发起与服务器 PI 的控制连接(默认服务器端端口号 TCP 21) ,
基于控制连接的通信遵循 TELNET 协议,标准 FTP 命令被用户 PI 产生并通过控制连接发送
至服务器 PI,而服务器 PI 则产生标准的 FTP 应答并通过控制连接发送给用户 PI。FTP 命令
和应答主要用于指定数据连接的参数(如数据连接端口号、数据表示等)。
FTP 服务器与 FTP 客户端之间的文件数据传输通过数据连接实现,数据连接的端口号是
TCP 20。客户端可以通过控制连接发送 PORT 命令以要求服务器 DTP 主动与用户 DTP 建立
数据连接,客户端也可以通过控制连接发送 PASV 命令以使服务器处于被动等待数据连接地
·150· Internet 应用协议实例剖析与服务器配置

位,双方在用户 DTP 与服务器 DTP 的连接之上完成指定方式的文件传输。

7.1.2 FTP 与 TELNET 之间的关系

FTP 协议在控制连接上使用 TELNET 协议,这可以通过两种途径实现:


(1)用户 PI 或服务器 PI 直接在它们的实现代码中遵循 TELNET 协议;
(2)用户 PI 或服务器 PI 可以利用系统已有的 TELNET 代码模块来实现 TELNET 协议。
第 1 种方法的优点是高效、独立,第 2 种方法的优点是实现简单、代码共享。FTP 协议仅仅
是部分依赖 TELNET 协议(使用 NVT 规定的网络虚拟终端功能) ,所以第一种方法使用较多。

7.1.3 数据表示

数据是在主机的存储设备之间传送的。如果两个系统的数据存储方式不同,就需要对它
进行转换,例如在传送文本时,可能会有对 NVT-ASCII 的不同的本地表示的问题;在传送二
进制文件的时候,会有不同系统对字节长度规定不同的问题(有的系统是 7bit,有的系统可
能是 32bit),这也需要进行适当的处理。FTP 规定了以下 4 种主要的数据表示方法。
① ASCII 类型
这是所有 FTP 必须实现的默认类型,用于传送文本文件,若主机间使用 EBCDIC 传送更为方
便时,则不使用 ASCII 类型。使用 ASCII 类型时,发送方将内部表示转换为 8bit NVT-ASCII 格式,
接收方则进行相反的过程接收数据。根据 NVT 标准,要在行结束处使用<CRLF>序列。
② EBCDIC 类型
EBCDIC 和 ASCII 非常相像,仅在字符编码上有一些差别。当通信双方的本地编码都是
EBCDIC 时,用 EBCDIC 类型非常有效。
③ 图像类型
在此类型下,传送的数据被看作连续的位,发送方将数据顺序放入到 8bit 传输字节中传
送,接收方亦把收到的数据看成连续的比特流。
④ 本地类型
发送方用控制命令通知接收方要发送文件的逻辑字节长度,然后将逻辑字节顺序放入
8bit 传输字节中传送,若在文件尾出现逻辑字节和传输字节不对齐的情况时,则补零对齐,
接收方从传输字节流中分离出逻辑字节。

7.1.4 数据结构

FTP 协议定义了 3 种数据结构:文件结构、记录结构和页结构。


① 文件结构
如果未使用 STRU 命令,则默认数据结构为文件结构,此时文件被看作是连续的字节串。
② 记录结构
记录结构文件是由连续的记录构成的。对于文本文件,记录结构必须是所有 FTP 协议的
实现必须有的。
③ 页结构
在 FTP 协议中,文件的一个部分称为页。文件非连续时使用页结构,这种文件称为随机
访问文件。这些文件中有时会有和文件整体或部分相关的信息出现。为了提供不同的页大小
第7章 FTP 应用 ·151·

和相关信息,每页都带页头发送。

7.1.5 FTP 命令

1.访问控制命令
(1)用户名(USER)
用法:USER name
参数 name 是标记用户的 NVT 串。用户名是访问服务器必须的,此命令通常是控制连接
后第一个发出的命令,大部分主机还会接着要求口令。服务器可以在任何时间接收新的 USER
命令以改变访问控制。
(2)口令(PASS)
用法:PASS password
参数 password 是标记用户口令的 NVT 串。此命令紧跟在 USER 命令之后,在大多站点
它是完成访问控制不可缺少的一步。因为口令信息非常重要,因此不能显示出来,服务器方
没有办法隐藏口令,所以这一任务由用户 FTP 进程完成。
(3)帐号(ACCT)
用法:ACCT account
参数 account 是标记用户帐号的 NVT 串。此命令不需要与 USER 相关,一些站点可能需
要帐号用于登录,另一些则用帐号限制用户的权限。在后一种情况下,此命令可在任何时候
发送。对 PASS 命令所作应答的不同可以用于区分服务器是否需要帐号信息:当登录需要帐
户信息时,对 PASS 命令的响应是“332” ;如果不需要帐户信息,对 PASS 的响应则为“230”

如果此后的某个命令需要帐户信息,服务器会为这个命令返回 332 或 532,这主要取决于此
命令是暂存了还是已经丢弃了。
(4)改变工作目录(CWD)
用法:CWD directory
此命令可使用户在不同的目录下工作而不用改变它的登录或帐户信息,且传输参数也不
变。参数 directory 是目录名。
(5)回到上一层目录(CDUP)
用法:CDUP
此命令使用户回到上一级目录,它的响应和 CWD 的响应相同。
(6)结构加载(SMNT)
用法:SMNT directory
此命令可使用户在不改变登录或帐户信息的情况下加载另一个文件系统数据结构,且传
输参数也不变。
(7)重新初始化(REIN)
用法:REIN
此命令将终止 USER,除了允许进行中的数据传输完成外,重置所有参数,并控制连接
打开。此时可以再次开始 USER 命令。
(8)退出登录(QUIT)
用法:QUIT
·152· Internet 应用协议实例剖析与服务器配置

此命令将终止 USER,如果没有数据正在传输,服务器关闭控制连接;如果有数据正在
传输,则等待传输完毕然后关闭控制连接。
2.传输参数命令
所有数据传输参数都有默认值。服务器程序必须知道这些默认值。
(1)数据端口(PORT)
用法:PORT h1,h2,h3,h4,p1,p2
PORT 命令用于指定数据连接的主机地址和 TCP 端口号。参数 h1、h2、h3、h4 指定了
一个 IP 地址,其中 h1 是 IP 地址的最高 8bit。参数 p1、p2 用来指定一个 TCP 端口号。这个
命令既可以被客户方使用,也可以被服务器方使用,取决于客户方是否使用了 PASV 命令。
(2)被动方式(PASV)
用法:PASV
客户方向服务器发送此命令要求服务器 DTP 在指定的数据端口侦听,进入被动接收的状
态。服务器在对此命令进行响应时应携带主机地址和端口号。
(3)表示类型(TYPE)
用法:TYPE type [para]
此命令用于指定数据表示类型,有些类型需要第 2 个参数,此时第 1 个参数由单个 NVT 字
符组成,第 2 个参数是十进制整数指定字节大小,参数间以空格分隔。NVT 字符及其意义如下:
A ASCII 类型 I Image 类型
E EBCDIC 类型 L <byte size> 本地字节大小
(4)数据结构(STRU)
用法:STRU structure
参数 structure 是一个 NVT 字符指定数据结构。其字符及意义如下:
F - 文件结构,这是默认值
R - 记录结构
P - 页结构
(5)传输模式(MODE)
用法:MODE mode
参数 mode 是一个 NVT 字符,指定传输模式,其字符及意义如下:
S - 流(默认值)
B- 块
C - 压缩
3.FTP 服务命令
FTP 服务命令用来定义用户请求的与文件传输或与文件系统操作有关的功能。此命令的
参数通常是路径名或文件名,推荐的默认值是最近指定的目录或文件名。除了下面特别指出
的若干命令外,命令的顺序通常没有限制,服务命令的响应通常在数据连接上传输。
(1)获得文件(RETR)
用法:RETR filename
此命令使服务器 DTP 拷贝指定路径内的文件到用户 DTP。服务器上文件的状态和内容
不受影响。
第7章 FTP 应用 ·153·

(2)保存文件(STOR)
用法:STOR filename
此命令使服务器 DTP 接收数据连接上传送过来的数据,并将数据保存在服务器的文件
中。如果文件已存在,原文件将被覆盖;如果文件不存在,则新建文件。
(3)惟一保存文件(STOU)
用法:STOU filename
此命令和 STOR 差不多,但要求在此目录下的文件名是惟一的,对此命令的响应必须包
括产生的文件名。
(4)附加文件(APPE)
用法:APPE filename
它和 STOR 的功能差不多,但是如果文件在指定路径内已存在,则把数据附加到原文件
尾部,如果不存在则新建文件。
(5)为分配存储空间(ALLO)
用法:ALLO size[ R size]
此命令用于在一些主机上为新传送的文件分配足够的存储空间,参数是十进制的逻辑字
节数。如果是记录或页结构,页或记录的最大大小也需要在第 2 个参数内以十进制指定。第
2 个参数是可选的,如果有它,它和第一个参数以 NVT 字符之间用空格分隔。此命令在 STOR
或 APPE 命令之前,对于不需要分配存储空间的计算机,它的作用等于 NOOP。
(6)重新开始(REST)
用法:REST restartpoint
参数 restartpoint 代表服务器要重新开始的那一点,此命令并不传送文件,而是令服务器
略过前面的数据直至指定点的数据,此命令后应该跟其他要求文件传输的 FTP 命令。
(7)重命名文件(RNFR)
用法:RNFR filename
这个命令指定要被改名的文件名,命令后面要跟有 RNTO 命令指定新的文件名。
(8)将文件重命名为(RNTO)
用法:RNTO filename
此命令和 RNFR 命令共同完成对文件的重命名。
(9)放弃(ABOR)
用法:ABOR
此命令通知服务器中止以前的 FTP 命令和与之相关的数据传送。如果先前的操作已经完
成,则没有动作,返回 226;如果没有完成,返回 426,然后再返回 226。执行此命令时,控
制连接不关闭,数据连接关闭。
(10)删除文件(DELE)
用法:DELE filename
此命令删除指定路径下的文件。
(11)删除目录(RMD)
用法:RMD dirname
此命令删除制定的目录。
·154· Internet 应用协议实例剖析与服务器配置

(12)创建目录(MKD)
用法:MKD dirname
此命令在指定路径下创建新目录。
(13)显示工作目录(PWD)
用法:PWD
服务器对此命令的响应是返回当前工作目录名。
(14)列表(LIST)
用法:LIST [pathname]
此命令要求服务器传送文件列表到用户 DTP,如果 pathname 指定一个目录或许多文件,返回
指定路径下的文件列表;如果路径名指定一个文件,将返回文件的当前信息;参数为空表示用户
当前的工作目录或默认目录。数据传输在 ASCII 或 EBCDIC 下进行,用户必须确认这一点。
(15)名字列表(NLST)
用法:NIST [pathname]
此命令可使服务器传送目录列表到用户,pathname 用来指定目录;参数为空则指当前目
录。服务器将返回文件名数据流(不包含名字以外的其他信息),以 ASCII 或 EBCDIC 形式
传送,并以<CRLF>或<NL>分隔。这里返回的信息可以供程序进行进一步处理使用。
(16)站点参数(SITE)
用法:SITE subopt
此命令可使服务器提供服务器系统信息,信息因系统不同而不同,subopt 在 HELP SITE
命令应答中给出。
(17)系统(SYST)
用法:SYST
此命令用于确定服务器上运行的操作系统。
(18)状态(STAT)
用法:STAT [pathname]
此命令用来返回控制连接状态。它可以在文件传送过程中发送,也可以在文件传送之间发送,
这时命令有参数,参数是路径名。如果指定部分路径,服务器以文件名或与参数相关的属性返回;
如没有参数,服务器返回服务器 FTP 进程的状态信息,包括传输参数的当前值和连接状态。
(19)帮助(HELP)
用法:HELP [command]
此命令用来查看帮助信息。若不带参数,则返回命令列表,若参数中指定了一个存在的
命令名,则返回该命令的用法和功能。
(20)等待(NOOP)
用法:NOOP
此命令不产生任何实际动作,仅使服务器返回 OK。
FTP 在控制连接上使用 TELNET 协议通信,特定的命令(如 ABOR,STAT)可以在数
据传输过程中在控制连接上传输。有些服务器不能同时监视数据和控制链路,此时就要采取
以下几个步骤来解决这个问题:
(1)用户系统将 TELNET 的“Interrupt Process(IP)
”信息插入 TELNET 流;
第7章 FTP 应用 ·155·

(2)用户系统发送 TELNET 的同步信号;


(3)用户系统将命令(如 ABOR)插入 TELNET 流;
(4)服务器 PI 在接收到 IP 后,在 TELNET 流中寻找 FTP 命令。

7.1.6 FTP 应答

FTP 命令的应答既是为了对数据传输请求和传输过程进行同步,也是为了让用户了解服
务器的状态。每个 FTP 命令必须至少有一个响应,如果是多个,则这些响应要易于区别。有
些命令是有顺序性的,因此其中任何一个命令的失败会导致操作从头开始。
FTP 响应由 3 个数字开始,后面是一些文本,其中数字带有足够的信息以使用户 PI 不用
检查文本就知道发生了什么,而文本信息与服务器相关,所以对应同样的数字信息,用户可
能得到不同的文本信息。数字和文本以空格间隔,文本后以 NVT 行结束符结束。文本可能
多于一行,这时文本必须在一个框架内,第一行内要有信息表示文本多于一行(在数字代码
后加上“-” ),最后一行也要有所标记(以同样的数字开始)。后面是空格,再加上 NVT 的行
结束符就可以了。下面是一个例子:
123 First line
Second line
234 A line beginning with numbers
123 The last line
其中的 3 位数字每位都有一定的意义,第 1 位数字用来确定响应是肯定的、否定的还是
不完全的。通过检查第 1 位,用户进程通常就能够知道大致要采取什么行动了。如果用户程
序希望了解出了什么问题,可以检查第 2 位、第 3 位用以表示其他信息。
第一位有 1、2、3、4、5 五个取值,含义如下:
① 1——确定预备应答,表明请求的操作正在被初始化;在进入下一个命令前等待另外
的应答。
② 2——确定完成应答,表明要求的操作已经完成,可以执行新命令。
③ 3——确定中间应答,表明命令已接受,但要求继续发送另外的命令。
④ 4——暂时否定完成应答,表明未接受命令,要求的操作未执行,但错误是临时的,
用户可以重试。用户应该返回命令序列的开始。
⑤ 5——永久否定完成应答,它与暂时否定完成应答的区别就在于错误是永久性的。
第 2 位有 0、1、2、3、4、5 六个取值,所代表的意义如下:
① 0——语法错误。
② 1——应答中包含所请求的信息。
③ 2——应答是关于控制和数据连接的。
④ 3——应答是关于认证和帐户登录过程。
⑤ 4——未使用。
⑥ 5——应答是关于文件系统的。
第 3 个数字是在第 2 个数字的基础上对应答内容的进一步细化。一般来说,实现时应该
尽量使用现有的代码,而不要随便添加新的意义不明确的代码。
下面是根据数字顺序列出的各个应答码及其意义。
·156· Internet 应用协议实例剖析与服务器配置

110:重传标记应答。在这种情况下文本是确定的,它必须是:MARK yyyy=mmmm,其
中 yyyy 是用户进程数据流标记,mmmm 是服务器标记。
120:服务在 nnn 分钟内准备好。
125:数据连接已打开,准备传送。
150:文件状态良好,打开数据连接。
200:命令成功。
202:命令未实现。
211:系统状态或系统帮助响应。
212:目录状态。
213:文件状态。
214:帮助信息,信息仅对用户有用。
215:名字系统类型。
220:对新用户服务准备好。
221:服务关闭控制连接,可以退出登录。
225:数据连接打开,无传输正在进行。
226:关闭数据连接,请求的文件操作成功。
227:进入被动模式。
230:用户登录。
250:请求的文件操作完成。
257:创建“PATHNAME”。
331:用户名正确,需要口令。
332:登录时需要帐户信息。
350:请求的文件操作需要进一步命令。
421:不能提供服务,关闭控制连接。
425:不能打开数据连接。
426:关闭连接,中止传输。
450:请求的文件操作未执行。
451:中止请求的操作,有本地错误。
452:未执行请求的操作,系统存储空间不足。
500:格式错误,命令不可识别。
501:参数语法错误。
502:命令未实现。
503:命令顺序错误。
504:此参数下的命令功能未实现。
530:未登录。
532:存储文件需要帐户信息。
550:未执行请求的操作。
551:请求操作中止,页类型未知。
522:请求的文件操作中止,存储分配溢出。
第7章 FTP 应用 ·157·

553:未执行请求的操作,文件名不合法。

7.1.7 FTP 服务器的最小实现

下面是 FTP 服务器的最小实现:


类型——ASCII Non-print
模式——Stream
结构——File, Record
命令——USER、QUIT、PORT、TYPE、 MODE、 STRU、RETR、STOR、NOOP
传输的默认参数为:
类型——ASCII Non-print
模式——Stream
结构——File
所有主机都应将上面的值作为默认值。

7.2 FTP 客户端

在各种操作系统中大都内置了 FTP 命令作为客户端,而 FTP 命令在各种系统中的使用方


式大致相同。在 Windows 操作系统中经常使用的是图形界面的 FTP 客户端程序 CuteFtp,这
里就重点介绍 FTP 命令行方式和 CuteFtp 的使用。

7.2.1 命令行 FTP

在命令提示符下直接输入 ftp 并回车,就会启动 FTP 协议,并出现提示符,如下所示:


D:\>ftp
ftp>
其中斜体部分是用户输入信息,且由回车结束本行输入,其他是系统显示的信息,下同。
这时候并没有连接任何 FTP 服务器,还需要使用“open+主机地址”连接服务器。例如:
ftp> open ftp.test.sdie.edu.cn
Connected to ftp.test.sdie.edu.cn.
220 ftp.test.sdie.edu.cn FTP server (Version wu-2.6.2-8) ready.
User (ftp.test.sdie.edu.cn:(none)):
前面的两个步骤也可以合并为:ftp ftp.test.sdie.edu.cn
普通用户以自己的用户名和口令登录,匿名用户可用 ftp 或 anonymous 为用户名,以任
意邮件地址为口令登录,例如:
ftp> open ftp.test.sdie.edu.cn
Connected to ftp.test.sdie.edu.cn.
220 ftp.test.sdie.edu.cn FTP server (Version wu-2.6.2-8) ready.
User (ftp.test.sdie.edu.cn:(none)): test
331 Password required for test.
·158· Internet 应用协议实例剖析与服务器配置

Password:(此处输入口令,不回显)
230 User test logged in. Access restrictions apply.
ftp>
这样 test 用户就登录到 ftp.test.sdie.edu.cn 了。
登录 FTP 服务器以后就可以进行上传、下载等操作。下面简单介绍几个常用 FTP 用户接
口命令(要与 FTP 命令区分开) 。
(1)?
列出可以使用的命令。例如:
ftp> ?
Commands may be abbreviated. Commands are:

! delete literal prompt send


? debug ls put status
append dir mdelete pwd trace
ascii disconnect mdir quit type
bell get mget quote user
binary glob mkdir recv verbose
bye hash mls remotehelp
cd help mput rename
close lcd open rmdir
ftp>
(2) !
默认状态下,所有命令都是针对远程计算机的,加上“!”后,所有的命令则是针对本
地计算机。
(3)ls 或 dir
查看当前目录下有哪些文件和子目录。例如:
ftp> dir
200 PORT command successful.
150 Opening ASCII mode data connection for directory listing.
total 232
-rw-r--r-- 1 root root 34817 Mar 1 2003 http.txt
-rw-r--r-- 1 root root 814 Mar 2 2003 perl.txt
-rw-r--r-- 1 root root 459 Mar 2 2003 php.txt
drwxr-xr-x 2 root root 4096 Aug 3 16:28 rfc
-rw-r--r-- 1 root root 36034 Aug 3 16:04 rfc1033.txt
226 Transfer complete.
ftp: 891 bytes received in 0.05Seconds 17.82Kbytes/sec.
(4)cd
切换当前工作目录。若查看当前工作目录则需用 PWD 命令。例如:
第7章 FTP 应用 ·159·

ftp> cd rfc
250 CWD command successful.
(5)prompt
在上传或下载文件时,开启或关闭交互模式(对每个文件的传输都要求确认的模式)。
用户登录后默认为 ON 状态。
(6)get 或 mget
从 FTP 服务器下载文件到本地主机,其中 get 用于一次下载一个文件,而 mget 可以使用
通配符一次下载多个文件,例如:
ftp> get rfc1033.txt
200 PORT command successful.
150 Opening ASCII mode data connection for rfc1033.txt (36034 bytes).
226 Transfer complete.
ftp: 37263 bytes received in 0.11Seconds 338.75Kbytes/sec.
ftp> prompt
Interactive mode Off .
ftp> mget *.txt
200 Type set to A.
200 PORT command successful.
150 Opening ASCII mode data connection for http.txt (34817 bytes).
226 Transfer complete.
ftp: 35850 bytes received in 0.16Seconds 224.06Kbytes/sec.
200 PORT command successful.
150 Opening ASCII mode data connection for perl.txt (814 bytes).
226 Transfer complete.
ftp: 836 bytes received in 0.06Seconds 13.93Kbytes/sec.
200 PORT command successful.
150 Opening ASCII mode data connection for php.txt (459 bytes).
226 Transfer complete.
ftp: 480 bytes received in 0.00Seconds 480000.00Kbytes/sec.
200 PORT command successful.
150 Opening ASCII mode data connection for rfc1033.txt (36034 bytes).
226 Transfer complete.
ftp: 37263 bytes received in 0.05Seconds 745.26Kbytes/sec.
(7)put 或 mput
与 get 和 mget 相反,put 和 mput 是从将本地的文件上传到 FTP 服务器。其中 put 一次
只能上传一个文件,而 mput 可以上传多个文件。
(8)ascii 或 binary
设置传输模式。一般传输文本文件以 ASCII 模式传输,图像文件或程序文件以 binary 模
式传输,默认是以 ASCII 方式传输。如果要转换为 binary 方式,则直接输入“binary”即可;
·160· Internet 应用协议实例剖析与服务器配置

如果要再转换为 ASCII 方式,则直接输入“ascii”即可。例如:


ftp> binary
200 Type set to I.
ftp> ascii
200 Type set to A.
(9)mkdir rmdir
建立和删除目录。例如:
ftp> mkdir test
257 "/test" new directory created.
ftp> rm test
250 RMD command successful.
(10)quit 或 bye
中断与 FTP 服务器的连接。例如:
ftp> bye
221-You have transferred 0 bytes in 0 files.
221-Total traffic for this session was 777 bytes in 0 transfers.
221-Thank you for using the FTP service on localhost.localdomain.
221 Goodbye.

7.2.2 CuteFtp

下面以 CuteFtp5.0 为例介绍 CuteFtp 软件的使用。


1.启动和设置 CuteFtp
启动 CuteFTP5.0 后,如果是安装后的第 1 次使用,则会出现 CuteFTP 连接向导,帮助你
完成 FTP 站点信息的建立。
首先 CuteFtp 将要求输入一个标签来标示站点,输入标签(如“实验中心 FTP 服务器”)
后,单击“下一步”按钮,将出现 FTP 站点地址窗口;在窗口中输入 FTP 站点的地址(如
,再单击“下一步”按钮可进入用户登录信息设置窗口,在该窗口中,
ftp://202.194.254.210)
然后可以选择使用匿名方式登录,或者输入在服务器上的普通用户名和口令;单击“下一步”
按钮,进入设置本地目录窗口,从中可以选择一个本地目录作为默认本地目录(如“H:\temp” ),
单击“下一步”按钮,进入完成界面,选择是否自动连接到该站点,或添加到右键快捷菜单
中。完成这些设置后,单击“完成”按钮,即可进入 CuteFtp 主窗口,如图 7-2 所示。

图 7-2 CuteFtp 主窗口


第7章 FTP 应用 ·161·

单击工具栏中的“站点管理器”按钮(第 1 个按钮)
,系统将打开站点管理器窗口,如图
7-3 所示。

图 7-3 站点管理器

在站点管理器中,左侧是已经存在的 FTP 站点,单击一个 FTP 站点即可将其选中,此时


右侧将显示该站点连接参数的设置。如果需要设置高级属性,可以单击窗口底部的“编辑”
按钮,在如图 7-4 所示的窗口中设置有关高级参数。

图 7-4 设置 FTP 站点的高级参数

在站点管理器中选择需要连接的 FTP 站点后,单击“连接”按钮,CuteFtp 即开始使用


配置的参数连接到指定的服务器。
除了使用站点管理器连接 FTP 站点外,还可以使用快速连接方式连接 FTP 站点。在
CuteFtp 主窗口的工具栏中,单击“快速连接”按钮 ,在工具栏底部就会出现如图 7-5 所示
的快速连接工具栏,并可在该工具栏中设置连接 FTP 的参数,快速连接到 FTP 站点。需要注
·162· Internet 应用协议实例剖析与服务器配置

意的是,在快速工具栏中连接的站点并不会自动添加到站点管理器中。

图 7-5 快速连接到 FTP 站点

2.上传与下载文件

登录到 FTP 服务器后,就可以进行文件的传输了。在 CuteFtp 主窗口(图 7-6)中,上


部是 CuteFtp 的信息窗口,可以在该窗口中查看 FTP 的操作过程,中部左侧是本地文件夹窗
口,显示了本地计算机上的文件和文件夹信息,右侧远程文件夹窗口,显示了 FTP 服务器上
的文件和文件夹信息,底部是文件传输队列,显示了传输过程中的任务完成情况。利用这些
窗口可以很方便地完成文件的上传和下载工作。

图 7-6 CuteFtp 主窗口

(1)上传文件
要上传文件,可以执行下列方法之一:
方法 1,在左窗口中单击文件,按住鼠标按钮,拖动文件到右窗口。
方法 2,在左窗口中用鼠标右键单击文件,从快捷菜单中选择“上传” 。
方法 3,在左窗口中双击文件。
方法 4,在左窗口中用鼠标左键单击文件,然后从“传输”菜单中选择“上传”。
方法 5,在左窗口中用鼠标左键单击文件,然后同时按下“Control”和“Page Up”键。
(2)下载文件
要下载文件,可使用下列方法之一:
方法 1,在右窗口中单击文件,按住鼠标按钮,拖动文件到左窗口。
方法 2,在右窗口中用鼠标右键单击文件,从快捷菜单中选择“下载” 。
方法 3,在右窗口中双击文件。
方法 4,在右窗口中用鼠标左键单击文件,然后从“传输”菜单中选择“下载”。
方法 5,在右窗口中用鼠标左键单击文件,然后同时按下“Control”和“PageDown”键。
第7章 FTP 应用 ·163·

传输中断时,用户可以重新连接并在传输中断处继续传输,此时只需重新进行传输文件
的操作即可。当 CuteFTP 发现此文件已部分下载或上传时,它会询问是要“续传、覆盖还是
跳过”。如果要替换现有文件,应选择“覆盖” ;如要完成被中断的传输任务,应选择“续传”;
如要取消操作,则选择“跳过”。

7.3 FTP 服务器

7.3.1 Wu-Ftpd 的获取和安装

Wu-Ftpd 有 多 种 分 发 方 式 , 二 进 制 的 发 布 版 本 可 以 在 Wu-Ftpd 的 官 方 网 站
ftp://ftp.wu-ftpd.org/pub/wuftpd 处下载。rpm 格式的发布版本可以 RedHat 的网站上免费下载
或在 Linux 安装光盘中找到。找到该 rpm 包后直接运行如下命令即可进行安装:
#rpm –i wu-ftpd-2.6.2-8.i386.rpm

7.3.2 Wu-Ftpd 服务器的配置

Wu-Ftpd 安装完成后,其主要配置文件在/etc 目录下,包括以下几个配置文件。


(1)/etc/ftpaccess 该文件是 Wu-Ftpd 的最重要的配置文件,它包含许多访问权限的设置,
具体介绍如下:
① guestuser *
此配置语句首先使所有普通用户成为 guest 类型,guest 类型用户的 home 目录为其根
目录。
② realuser user1,user2
此配置语句使用户 user1 和 user2 恢复成为 real 类型,real 类型用户以系统根目录为其根
目录。
③ class all real,guest,anonymous *
class 命令用来定义访问 FTP 服务器的用户类,包括类名、用户类型列表以及该类用户可
以从何处进行登录(允许登录的 IP 地址范围) ,其中 FTP 的用户类型可以分为 real(未被指
定为 guest 类型的普通用户) 、guest(被指定为 guest 的普通用户)
、anonymous (以 anonymous
或 ftp 身份登录的匿名用户,该类用户的权限一般很低)。
此配置语句定义了“all”类,包括 real、guest、anonymous 类型的用户,该类用户可以
从任何地址访问服务器。
④ email root@localhost
管理员的邮件地址(当 FTP-Server 发生错误时发邮件给管理员)。
⑤ loginfails 3
用户登录 FTP 服务器时,最多允许的登录失败的次数,如果在此范围内,用户不能正确
的输入用户名和口令,则 FTP 服务器将断开这次连接(此处设定了 FTP 服务器允许最多登录
失败 3 次) ,如下面的实例所示:
[test@test test]$ ftp 10.0.1.5
·164· Internet 应用协议实例剖析与服务器配置

Connected to 10.0.1.5.
220 test FTP server (Version wu-2.6.2-8) ready.
Name (10.0.1.5:test): test
331 Password required for test.
Password:
530 Login incorrect.
Login failed.
ftp> user test
331 Password required for test.
Password:
530 Login incorrect.
Login failed.
ftp> user test
331 Password required for test.
Password:
530 Login incorrect.
Login failed.
ftp> user test
421 Service not available, remote server has closed connection
Login failed.
ftp>
从以上可以看出,第 4 次试图登录时,连接已经断开。
⑥ readme README* login
当用户登录时提示用户阅读以 README 开头的文件。
⑦ readme README* cwd=*
当用户切换到某目录时提示用户阅读该目录下以 README 开头的文件
⑧ message /welcome.msg login
当用户登录时显示 welcome.msg 文件的内容
⑨ message .message cwd=*
当用户切换到任意目录时显示该目录的.message 文件
在 message 的信息文件里可以使用以下参量:
%T——FTP 服务器的主机时间
%F——目前目录所在分区所剩的空间大小
%C——目前所在的工作目录
%E——FTP 服务器管理员的 E-mail 地址
%R——远程(客户端)的主机名称
%L——FTP 服务器的主机名称
%U——建立 FTP 连接的用户名
%M——允许建立连接的最大用户数目
第7章 FTP 应用 ·165·

%N——当前连接的用户数目
以下是一个 welcome.msg 文件的范例:
欢迎来自%R 的朋友! !!
您是本站的第%N 位用户
目前的本地时间是:%T
您目前所在的目录为:%C
如果您有任何问题,或对本站的意见、建议请联系系统管理员%E
登录 FTP 服务器的过程及显示信息如下:
[test@test test]$ ftp 10.0.1.5
Connected to 10.0.1.5.
220 test FTP server (Version wu-2.6.2-8) ready.
Name (10.0.1.5:test): test
331 Password required for test.
Password:
230-欢迎来自 clab.sdie.edu.cn 的朋友! !!
230-您是本站的第 3 位用户
230-目前的本地时间是:Thu Aug 14 12:46:36 2003
230-您目前所在的目录为:/
230-如果您有任何问题,或对本站的意见、建议请联系系统管理员 root@localhost
230-
230 User test logged in. Access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
⑩ compress yes all
 tar yes all
在/etc/ftpconversions 定义了很多压缩程序,这里定义哪些人以及是否可以执行这些压缩
程序。
 delete no anonymous
设定 anonymous 用户没有删除文件的权限。
 overwrite no anonymous
设定 anonymous 用户没有覆盖文件的权限。
 rename no anonymous
设定 anonymous 用户没有重命名文件的权限。
 log transfers anonymous,guest,real inbound,outbound
记录 anonymous,guest,real 用户的上传、下载文件的动作。
(2)/etc/ftpusers
该文件用于设置哪些用户不能登录 FTP 服务器。缺省值是一些系统默认的帐号。如果想
限制某些用户通过 FTP 登录服务器,只要在这个文件里加入这些用户名即可。
·166· Internet 应用协议实例剖析与服务器配置

(3)/etc/ftphosts
该文件用来限制某些主机登录本 FTP 服务器。
① allow 可允许某些用户由特定地址登录(如果省略用户名称则针对所有用户) ,格式如
下:
allow <帐号名称> <主机地址范围>
例如,下面配置行允许 test 用户从地址段 202.194.240.0/20 登录:
allow test 202.194.240.0/20
② deny 可拒绝某些帐号的用户由特定地址登录(如果省略帐号名称则针对所有用户),
格式如下:
deny <账号名称> <主机地址范围>
例如,下面配置行拒绝所有用户从 202.194.253.245 登录:
deny 202.194.253.245
(4)/etc/ftpconversions
该文件用来设定当用户下载文件时所使用的压缩文件的压缩程序。FTP 服务器在传输文
件的同时,可以将正在传输的文件进行一系列处理(例如压缩、解压缩等),用户一般不必去
更改此文件的内容。下面是一个具体的 ftpconversions 文件:
:.Z:::/usr/bin/compress -d -c %s:T_REG|T_ASCII:O_UNCOMPRESS:UNCOMPRESS
#对以.Z 结尾的文件使用/usr/bin/compress -d –c 解压缩。
:::.Z:/usr/bin/compress -c %s:T_REG:O_COMPRESS:COMPRESS
#用/usr/bin/compress -c 将文件压缩为.Z 格式。
:.gz:::/bin/gzip -cd %s:T_REG|T_ASCII:O_UNCOMPRESS:GUNZIP
#对以.gz 结尾的文件使用/bin/gzip -cd 方式解压缩。
:::.gz:/bin/gzip -9 -c %s:T_REG:O_COMPRESS:GZIP
#用/bin/gzip -9 –c 将文件压缩为.gz 格式。
:::.tar:/bin/tar -c -f - %s:T_REG|T_DIR:O_TAR:TAR
#用 tar:/bin/tar -c –f 命令将文件用打包。
:::.tar.Z:/bin/tar -c -Z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+COMPRESS
#用/bin/tar -c -Z –f 命令将文件压缩为.tar.Z 格式。
:::.tar.gz:/bin/tar -c -z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+GZIP
#用/bin/tar -c -z –f 命令将文件压缩为.tar.gz 格式。

7.3.3 FTP 服务的启动和关闭

编 辑 文 件 /etc/xinetd.d/wu-ftpd , 把 该 文 件 的 disable 项 设 置 为 “ no ”, 然 后 运 行
/etc/rc.d/init.d/xinet restart 或重新启动操作系统即可启动 FTP 服务器。
若把该文件的 disable 项设置为“yes” ,然后运行 /etc/rc.d/init.d/xinet restart 或重新启动
操作系统则停止 FTP 服务器的运行。

7.3.4 FTP 服务器相关程序

下面是几个与 FTP 服务器相关的应用程序。


第7章 FTP 应用 ·167·

(1)ftpcount
该程序用来统计当前连接的用户数目,并给出上限。例如:
[root@test test]# ftpcount
Service class all - 2 users (no maximum)
说明只有一类用户 all,当前人数是 2 人,没有上限。
(2)ftpwho
该程序用来显示每位用户的联机状态,它提供的信息比 ftpcount 更为详细。例如:
[root@test test]# ftpwho
Service class all:
12833 ? S 0:00 ftpd: clab.sdie.edu.cn: test: IDLE
12835 ? S 0:00 ftpd: 10.0.2.40: test: IDLE
- 2 users (no maximum)
以上信息显示了有哪些用户在何处登录。
(3)ftpshut
该程序用来关闭 FTP 服务,命令的格式如下:
ftpshut [-d <分钟>] [-l <分钟>] [<关闭时间>] [“关闭时的警告信息”]
其中:
-d <分钟>设置切断所有 FTP 连接的时间(默认在 FTP 服务器关闭前 5 分钟之内关闭所
有连接) ,-l <分钟>设置停止接受 FTP 登录的时间(默认在 FTP 服务器关闭前 10 分钟之内禁
止所有新的连接) ,<关闭时间>指定关闭 FTP 服务器的时间。
例如:
[root@test test]#ftpshut -d 5 -l 10 1800
以上命令表示:系统将在 18:00 关闭 FTP 服务器。在关闭 FTP 服务器之前 10 分钟不准
新的用户登录。在关闭 FTP 服务器之前 5 分钟把已经登录的用户断开连接。
FTP 服务器一旦关闭,所有的用户就不能再登录了。执行 ftpshut 默认会在/etc 目录下建
立一个名为 shutmsg 的文件。只要该文件存在,FTP 服务器就不能登录,删除该文件后才可
以恢复 FTP 服务器的功能。

7.4 实 例 剖 析

7.4.1 环境介绍

本例中将使用基于以太网的同一个 IP 网络内的两台计算机,将这两台计算机分别命名为
A 和 B,A 和 B 的基本配置信息如下:
计算机 IP 地址 掩码
A 202.194.254.213 255.255.255.0
B 202.194.254.211 255.255.255.0
B 计算机运行 Linux 系统,并运行 FTP 服务器 wu-ftpd 2.4.2,用户 ftpuser 对应的默认目
·168· Internet 应用协议实例剖析与服务器配置

录下有文件 a.txt,a.txt 文件的内容由一行文本信息“this is a test file for ftp”构成。


A 计算机运行 Windows 系统的 IE 浏览器,并在地址栏中输入 ftp://ftpuser:ftppass@202.194.
254.211/a.txt 以下载 a.txt 文件。
下载 a.txt 的过程由以下几个步骤完成:
(1)客户端与服务器端的 TCP 21 端口建立控制连接;
(2)客户端通过控制连接登陆服务器并发送下载请求以及本地等待端口号等信息;
(3)服务器与客户端指定的端口号建立数据连接;
(4)文件内容通过数据连接由服务器发送到客户端;
(5)数据连接断开;
(6)控制连接断开。

7.4.2 通信过程中的帧

在 A 计算机上利用 TCPDUMP 工具可获得由 A 与 B 之间所有的帧,各个帧的作用和内


容如下:
(1)A 发向 B 的 TCP 同步帧(202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4500
0000010: 003c 6f6b 4000 4006 3822 cac2 fed5 cac2
0000020: fed3 043a 0015 b7df ed7d 0000 0000 a002
0000030: 7d78 4e73 0000 0204 05b4 0402 080a 060f
0000040: 3931 0000 0000 0103 0300
(2)B 发向 A 的 TCP 同步帧(202.194.254.211.21 → 202.194.254.213.1082)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4500
0000010: 003c fc82 4000 4006 ab0a cac2 fed3 cac2
0000020: fed5 0015 043a 0412 2c52 b7df ed7e a012
0000030: 7d78 9e48 0000 0204 05b4 0402 080a 05ba
0000040: 79fb 060f 3931 0103 0300
(3)A 发向 B 的 TCP 确认帧(202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4500
0000010: 0034 6f6c 4000 4006 3829 cac2 fed5 cac2
0000020: fed3 043a 0015 b7df ed7e 0412 2c53 8010
0000030: 7d78 cd0d 0000 0101 080a 060f 3931 05ba
0000040: 79fb
(4)B 发向 A 的服务器声明帧(202.194.254.211.21 → 202.194.254.213.1082)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4510
0000010: 008a fc86 4000 4006 aaa8 cac2 fed3 cac2
0000020: fed5 0015 043a 0412 2c53 b7df ed7e 8018
0000030: 7d78 a406 0000 0101 080a 05ba 7b2c 060f
0000040: 3931 3232 3020 6e6f 6e61 6d65 2046 5450
0000050: 2073 6572 7665 7220 2856 6572 7369 6f6e
第7章 FTP 应用 ·169·

0000060: 2077 752d 322e 342e 322d 5652 3137 2831


0000070: 2920 4d6f 6e20 4170 7220 3139 2030 393a
0000080: 3231 3a35 3320 4544 5420 3139 3939 2920
0000090: 7265 6164 792e 0d0a
(5)A 发向 B 的确认帧 (202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4510
0000010: 0034 6f6e 4000 4006 3817 cac2 fed5 cac2
0000020: fed3 043a 0015 b7df ed7e 0412 2ca9 8010
0000030: 7d78 ca55 0000 0101 080a 060f 3a62 05ba
0000040: 7b2c
(6)A 发向 B 的 USER 命令帧(202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4510
0000010: 0042 6f6f 4000 4006 3808 cac2 fed5 cac2
0000020: fed3 043a 0015 b7df ed7e 0412 2ca9 8018
0000030: 7d78 b1a2 0000 0101 080a 060f 3b93 05ba
0000040: 7b2c 5553 4552 2066 7470 7573 6572 0d0a
(7)B 发向 A 的确认帧(202.194.254.211.21 → 202.194.254.213.1082)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4510
0000010: 0034 fc87 4000 4006 aafd cac2 fed3 cac2
0000020: fed5 0015 043a 0412 2ca9 b7df ed8c 8010
0000030: 7d78 c7e5 0000 0101 080a 05ba 7c5d 060f
0000040: 3b93
(8)B 发向 A 的对 USER 的应答帧(202.194.254.211.21 → 202.194.254.213.1082)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4510
0000010: 0058 fc88 4000 4006 aad8 cac2 fed3 cac2
0000020: fed5 0015 043a 0412 2ca9 b7df ed8c 8018
0000030: 7d78 41d3 0000 0101 080a 05ba 7c5d 060f
0000040: 3b93 3333 3120 5061 7373 776f 7264 2072
0000050: 6571 7569 7265 6420 666f 7220 6674 7075
0000060: 7365 722e 0d0a
(9)A 发向 B 的确认帧(202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4510
0000010: 0034 6f70 4000 4006 3815 cac2 fed5 cac2
0000020: fed3 043a 0015 b7df ed8c 0412 2ccd 8010
0000030: 7d78 c7bf 0000 0101 080a 060f 3b95 05ba
0000040: 7c5d
(10)A 发向 B 的 PASS 命令帧(202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4510
0000010: 0042 6f71 4000 4006 3806 cac2 fed5 cac2
·170· Internet 应用协议实例剖析与服务器配置

0000020: fed3 043a 0015 b7df ed8c 0412 2ccd 8018


0000030: 7d78 9d55 0000 0101 080a 060f 3c9f 05ba
0000040: 7c5d 5041 5353 2066 7470 7061 7373 0d0a
(11)B 发向 A 的确认帧(202.194.254.211.21 → 202.194.254.213.1082)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4510
0000010: 0034 fc89 4000 4006 aafb cac2 fed3 cac2
0000020: fed5 0015 043a 0412 2ccd b7df ed9a 8010
0000030: 7d78 c599 0000 0101 080a 05ba 7d6b 060f
0000040: 3c9f
(12)B 发向 A 的对 PASS 的应答帧(202.194.254.211.21 → 202.194.254.213.1082)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4510
0000010: 0051 fc8a 4000 4006 aadd cac2 fed3 cac2
0000020: fed5 0015 043a 0412 2ccd b7df ed9a 8018
0000030: 7d78 3ba9 0000 0101 080a 05ba 7d6c 060f
0000040: 3c9f 3233 3020 5573 6572 2066 7470 7573
0000050: 6572 206c 6f67 6765 6420 696e 2e0d 0a
(13)A 发向 B 的 SYST 命令帧(202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4510
0000010: 003a 6f72 4000 4006 380d cac2 fed5 cac2
0000020: fed3 043a 0015 b7df ed9a 0412 2cea 8018
0000030: 7d78 11b3 0000 0101 080a 060f 3ca2 05ba
0000040: 7d6c 5359 5354 0d0a
(14)B 发向 A 的对 SYST 的应答帧(202.194.254.211.21 → 202.194.254.213.1082)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4510
0000010: 0047 fc8b 4000 4006 aae6 cac2 fed3 cac2
0000020: fed5 0015 043a 0412 2cea b7df eda0 8018
0000030: 7d78 5e07 0000 0101 080a 05ba 7d6c 060f
0000040: 3ca2 3231 3520 554e 4958 2054 7970 653a
0000050: 204c 380d 0a
(15)A 发向 B 的确认帧 (202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4510
0000010: 0034 6f73 4000 4006 3812 cac2 fed5 cac2
0000020: fed3 043a 0015 b7df eda0 0412 2cfd 8010
0000030: 7d78 c55d 0000 0101 080a 060f 3ca4 05ba
0000040: 7d6c
(16)A 发向 B 的 TYPE 命令帧 (202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4510
0000010: 003c 6f74 4000 4006 3809 cac2 fed5 cac2
0000020: fed3 043a 0015 b7df eda0 0412 2cfd 8018
第7章 FTP 应用 ·171·

0000030: 7d78 f100 0000 0101 080a 060f 3eff 05ba


0000040: 7d6c 5459 5045 2049 0d0a
(17)B 发向 A 的对 TYPE 的应答帧(202.194.254.211.21 → 202.194.254.213.1082)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4510
0000010: 0048 fc8c 4000 4006 aae4 cac2 fed3 cac2
0000020: fed5 0015 043a 0412 2cfd b7df eda8 8018
0000030: 7d78 2d9e 0000 0101 080a 05ba 7fc9 060f
0000040: 3eff 3230 3020 5479 7065 2073 6574 2074
0000050: 6f20 492e 0d0a
(18)A 发向 B 的 PORT 命令帧 (202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4510
0000010: 004f 6f75 4000 4006 37f5 cac2 fed5 cac2
0000020: fed3 043a 0015 b7df eda8 0412 2d11 8018
0000030: 7d78 0db7 0000 0101 080a 060f 3eff 05ba
0000040: 7fc9 504f 5254 2032 3032 2c31 3934 2c32
0000050: 3534 2c32 3133 2c34 2c35 390d 0a
(19)B 发向 A 的对 PORT 的应答帧(202.194.254.211.21 → 202.194.254.213.1082)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4510
0000010: 0052 fc8d 4000 4006 aad9 cac2 fed3 cac2
0000020: fed5 0015 043a 0412 2d11 b7df edc3 8018
0000030: 7d78 0361 0000 0101 080a 05ba 7fc9 060f
0000040: 3eff 3230 3020 504f 5254 2063 6f6d 6d61
0000050: 6e64 2073 7563 6365 7373 6675 6c2e 0d0a
(20)A 发向 B 的 RETR 命令帧(202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4510
0000010: 0040 6f76 4000 4006 3803 cac2 fed5 cac2
0000020: fed3 043a 0015 b7df edc3 0412 2d2f 8018
0000030: 7d78 4550 0000 0101 080a 060f 3f00 05ba
0000040: 7fc9 5245 5452 2061 2e74 7874 0d0a
(21)B 发向 A 的 TCP 同步帧(202.194.254.211.20 → 202.194.254.213.1083)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4508
0000010: 003c fc8e 4000 4006 aaf6 cac2 fed3 cac2
0000020: fed5 0014 043b 0530 41ce 0000 0000 a002
0000030: 7d78 668e 0000 0204 05b4 0402 080a 05ba
0000040: 7fca 0000 0000 0103 0300
(22)B 发向 A 的 TCP 同步帧(202.194.254.213.1083 → 202.194.254.211.20)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4500
0000010: 003c 6f77 4000 4006 3816 cac2 fed5 cac2
0000020: fed3 043b 0014 b8c0 0dda 0530 41cf a012
·172· Internet 应用协议实例剖析与服务器配置

0000030: 7d78 5ad3 0000 0204 05b4 0402 080a 060f


0000040: 3f00 05ba 7fca 0103 0300
(23)A 发向 B 的 TCP 确认帧(202.194.254.211.20 → 202.194.254.213.1083)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4508
0000010: 0034 fc8f 4000 4006 aafd cac2 fed3 cac2
0000020: fed5 0014 043b 0530 41cf b8c0 0ddb 8010
0000030: 7d78 8998 0000 0101 080a 05ba 7fca 060f
0000040: 3f00
(24)B 发向 A 的数据连接状态帧(202.194.254.211.21 → 202.194.254.213.1082)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4510
0000010: 0073 fc90 4000 4006 aab5 cac2 fed3 cac2
0000020: fed5 0015 043a 0412 2d2f b7df edcf 8018
0000030: 7d78 eaa5 0000 0101 080a 05ba 7fca 060f
0000040: 3f00 3135 3020 4f70 656e 696e 6720 4249
0000050: 4e41 5259 206d 6f64 6520 6461 7461 2063
0000060: 6f6e 6e65 6374 696f 6e20 666f 7220 612e
0000070: 7478 7420 2832 3820 6279 7465 7329 2e0d
0000080: 0a
(25)B 发向 A 的 a.txt 文件内容帧(202.194.254.211.20 → 202.194.254.213.1083)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4508
0000010: 0050 fc91 4000 4006 aadf cac2 fed3 cac2
0000020: fed5 0014 043b 0530 41cf b8c0 0ddb 8018
0000030: 7d78 3113 0000 0101 080a 05ba 7fca 060f
0000040: 3f00 7468 6973 2069 7320 6120 7465 7374
0000050: 2066 696c 6520 666f 7220 6674 700a
(26)A 发向 B 的确认帧(202.194.254.213.1083 → 202.194.254.211.20)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4500
0000010: 0034 6f78 4000 4006 381d cac2 fed5 cac2
0000020: fed3 043b 0014 b8c0 0ddb 0530 41eb 8010
0000030: 7d78 897c 0000 0101 080a 060f 3f00 05ba
0000040: 7fca
(27)B 发向 A 的数据连接结束帧(202.194.254.211.20 → 202.194.254.213.1083)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4508
0000010: 0034 fc92 4000 4006 aafa cac2 fed3 cac2
0000020: fed5 0014 043b 0530 41eb b8c0 0ddb 8011
0000030: 7d78 897b 0000 0101 080a 05ba 7fca 060f
0000040: 3f00
(28)A 发向 B 的确认帧(202.194.254.213.1083 → 202.194.254.211.20)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4500
第7章 FTP 应用 ·173·

0000010: 0034 6f79 4000 4006 381c cac2 fed5 cac2


0000020: fed3 043b 0014 b8c0 0ddb 0530 41ec 8010
0000030: 7d78 897b 0000 0101 080a 060f 3f00 05ba
0000040: 7fca
(29)A 发向 B 的数据连接结束帧(202.194.254.213.1083 → 202.194.254.211.20)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4508
0000010: 0034 6f7a 4000 4006 3813 cac2 fed5 cac2
0000020: fed3 043b 0014 b8c0 0ddb 0530 41ec 8011
0000030: 7d78 8979 0000 0101 080a 060f 3f01 05ba
0000040: 7fca
(30)B 发向 A 的确认帧(202.194.254.211.20 → 202.194.254.213.1083)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4508
0000010: 0034 fc93 4000 4006 aaf9 cac2 fed3 cac2
0000020: fed5 0014 043b 0530 41ec b8c0 0ddc 8010
0000030: 7d78 8978 0000 0101 080a 05ba 7fcb 060f
0000040: 3f01
(31)A 发向 B 的确认帧(202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4510
0000010: 0034 6f7b 4000 4006 380a cac2 fed5 cac2
0000020: fed3 043a 0015 b7df edcf 0412 2d6e 8010
0000030: 7d78 c001 0000 0101 080a 060f 3f02 05ba
0000040: 7fca
(32)B 发向 A 的数据传输状态帧(202.194.254.211.21 → 202.194.254.213.1082)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4510
0000010: 004c fc94 4000 4006 aad8 cac2 fed3 cac2
0000020: fed5 0015 043a 0412 2d6e b7df edcf 8018
0000030: 7d78 f0ea 0000 0101 080a 05ba 7fcb 060f
0000040: 3f02 3232 3620 5472 616e 7366 6572 2063
0000050: 6f6d 706c 6574 652e 0d0a
(33)A 发向 B 的确认帧(202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4510
0000010: 0034 6f7c 4000 4006 3809 cac2 fed5 cac2
0000020: fed3 043a 0015 b7df edcf 0412 2d86 8010
0000030: 7d78 bfe6 0000 0101 080a 060f 3f04 05ba
0000040: 7fcb
(34)A 发向 B 的 QUIT 命令帧(202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4510
0000010: 003a 6f7d 4000 4006 3802 cac2 fed5 cac2
0000020: fed3 043a 0015 b7df edcf 0412 2d86 8018
·174· Internet 应用协议实例剖析与服务器配置

0000030: 7d78 1738 0000 0101 080a 060f 3ff1 05ba


0000040: 7fcb 5155 4954 0d0a
(35)B 发向 A 的退出登录应答帧(202.194.254.211.21 → 202.194.254.213.1082)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4510
0000010: 0063 fc95 4000 4006 aac0 cac2 fed3 cac2
0000020: fed5 0015 043a 0412 2d86 b7df edd5 8018
0000030: 7d78 1a4e 0000 0101 080a 05ba 80ba 060f
0000040: 3ff1 3232 312d 596f 7520 6861 7665 2074
0000050: 7261 6e73 6665 7272 6564 2032 3820 6279
0000060: 7465 7320 696e 2031 2066 696c 6573 2e0d
0000070: 0a
(36)B 发向 A 的控制连接结束帧(202.194.254.211.21 → 202.194.254.213.1082)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4510
0000010: 00b8 fc96 4000 4006 aa6a cac2 fed3 cac2
0000020: fed5 0015 043a 0412 2db5 b7df edd5 8019
0000030: 7d78 2996 0000 0101 080a 05ba 80bb 060f
0000040: 3ff1 3232 312d 546f 7461 6c20 7472 6166
0000050: 6669 6320 666f 7220 7468 6973 2073 6573
0000060: 7369 6f6e 2077 6173 2034 3531 2062 7974
0000070: 6573 2069 6e20 3120 7472 616e 7366 6572
0000080: 732e 0d0a 3232 312d 5468 616e 6b20 796f
0000090: 7520 666f 7220 7573 696e 6720 7468 6520
00000a0: 4654 5020 7365 7276 6963 6520 6f6e 206e
00000b0: 6f6e 616d 652e 0d0a 3232 3120 476f 6f64
00000c0: 6279 652e 0d0a
(37)A 发向 B 的确认帧(202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4510
0000010: 0034 6f7e 4000 4006 3807 cac2 fed5 cac2
0000020: fed3 043a 0015 b7df edd5 0412 2e3a 8010
0000030: 7d78 bd50 0000 0101 080a 060f 3ff1 05ba
0000040: 80ba
(38)A 发向 B 的连接结束帧(202.194.254.213.1082 → 202.194.254.211.21)
0000000: 0000 b491 e66a 0000 b491 e64d 0800 4510
0000010: 0034 6f7f 4000 4006 3806 cac2 fed5 cac2
0000020: fed3 043a 0015 b7df edd5 0412 2e3a 8011
0000030: 7d78 bd4f 0000 0101 080a 060f 3ff1 05ba
0000040: 80ba
(39)B 发向 A 的确认帧(202.194.254.211.21 → 202.194.254.213.1082)
0000000: 0000 b491 e64d 0000 b491 e66a 0800 4510
第7章 FTP 应用 ·175·

0000010: 0034 fc97 4000 4006 aaed cac2 fed3 cac2


0000020: fed5 0015 043a 0412 2e3a b7df edd6 8010
0000030: 7d78 bd4e 0000 0101 080a 05ba 80bb 060f
0000040: 3ff1

7.4.3 帧剖析

第 1、2、3 三个帧完成了 A 主动发起的与 B 的控制连接,客户端口号为 TCP 1083,服


务器端口号为 21。
第 4 帧的第 0x42~0x97Byte 为应用层数据,是 B 发向 A 的服务器声明,其内容为“220
noname FTP server (Version wu-2.4.2-VR17(1) Mon Apr 19 09:21:53 EDT 1999) ready”。
第 6 帧的第 42~4fByte 为应用层数据,是 A 发向 B 的 USER 命令,其内容为“USER
ftpuser”。
第 8 帧的第 42~65Byte 为应用层数据,是 B 发向 A 的对 USER 命令的应答,其内容为
“331 Password required for ftpuser”。
第 10 帧的第 42~5eByte 为应用层数据,是 A 发向 B 的 PASS 命令,其内容为“PASS
ftppass”。
第 12 帧的第 42~4fByte 为应用层数据,是 B 发向 A 的对 PASS 命令的应答,其内容为
“230 User ftpuser logged in”。
第 13 帧的第 42~47Byte 为应用层数据,是 A 发向 B 的 SYST 命令,其内容为“SYST” 。
第 14 帧的第 42~54Byte 为应用层数据,是 B 发向 A 的对 SYST 的应答,其内容为“215
UNIX Type: L8” 。
第 16 帧的第 42~49Byte 为应用层数据,是 A 发向 B 的 TYPE 命令,其内容为“TYPE I” 。
第 17 帧的第 42~55Byte 为应用层数据,是 B 发向 A 的对 TYPE 的应答,其内容为“200
Type set to I”。
第 18 帧的第 42~55Byte 为应用层数据,是 A 发向 B 的 PORT 命令,其内容为“PORT
202,194,254,213,4,59”(字节值 4 和 59 组成双字节数 1083) 。
第 19 帧的第 42~5fByte 为应用层数据,是 B 发向 A 的对 PORT 命令的应答,其内容为
“200 PORT command successful” 。
第 20 帧的第 42~4dByte 为应用层数据,是 A 发向 B 的 RETR 命令,其内容为“RETR
a.txt”。
第 21、22、23 三个帧完成了 B 主动发起的与 A 的数据连接,服务器端口号为 20,客户
端口号为 1083。
第 24 帧的第 42~80Byte 为应用层数据,是 B 通过控制连接发向 A 的数据连接状态,其
内容为“150 Opening BINARY mode data connection for a.txt (28 Bytes)”。
第 25 帧的第 42~5dByte 为应用层数据,是 B 通过数据连接发向 A 的 a.txt 文件的内容,
其内容为“this is a test file for ftp”。
第 27、28、29、30 帧完成数据连接的断开。
第 32 帧的第 42~59Byte 为应用层数据,是 B 通过控制连接发向 A 的数据传输状态,其
内容为“226 Transfer complete” 。
·176· Internet 应用协议实例剖析与服务器配置

第 34 帧的第 24~47Byte 为应用层数据,是 A 通过控制连接发向 B 的 QUIT 命令,其内


容为“QUIT” 。
第 35 帧的第 42~70Byte 为应用层数据,是 B 通过控制连接发向 A 的退出登录应答,其
内容为“221-You have transferred 28 bytes in 1 files”。
第 36、37、38、39 帧完成控制连接的断开,其中第 36 帧的第 42~c5Byte 为应用层数据,
其内容为“221-Total traffic for this session was 451 bytes in 1 transfers
221-Thank you for using the FTP service on noname
221-Goodbye” 。
第8章 MAIL 应用

8.1 MAIL 系统的组成

MAIL 系统包括两部分:邮件用户代理(MUA,Mail User Agent)和邮件传输代理(MTA,


Mail Transport Agent)。
MUA 是邮件系统的客户端程序,如 Mutt、Outlook Express 等,它提供了阅读、发送和
接收电子邮件的用户接口。用 MUA 撰写邮件之后,要通过 SMTP(Simple Mail Transfer
Protocol)协议上传给相应 MTA,而阅读邮件则是通过 POP(Post Office Protocol)或 IMAP
(Internet Message Access Protocol)从相应的 MTA 那里下载回来。
MTA 指系统中负责处理信件存储和转发工作的程序,也称邮件系统的服务端程序,
例如 sendmail(sendmail 同时是 MUA 和 MTA)。当用户发送邮件时 MUA 使用 SMTP
协议将信件提交给 MTA,MTA 使用 SMTP 协议将邮件继续发送至其他 MTA;当用户
接收邮件时,MUA 使用 POP 或 IMAP 协议将用户邮件从目标 MTA 处下载,供用户阅
读。

8.2 SMTP 协议

8.2.1 SMTP 协议简介

SMTP 协议用于从 MUA 向 MTA 发送邮件或由 MTA 向 MTA 转发邮件,是 Internet 应用


层协议,RFC2821 描述了 SMTP 的标准信息。
在 Internet 通信中,SMTP 运行于 TCP 之上,服务器端端口号默认为 TCP 25。

8.2.2 SMTP 协议模型

SMTP 协议模型如图 8-1 所示。


当 SMTP 客户端要发送邮件时,它要首先与 SMTP 服务器建立 TCP 连接。SMTP 客户的
职责就是将邮件发送至 SMTP 服务器或报告出错的原因。
此处的 SMTP 服务器可以是邮件发送的最终目的 SMTP 服务器,也可以是“中间 SMTP
服务器”(它将充当 SMTP 客户端的角色与其他 SMTP 服务器联系)或“邮件网关” (它将使
用其他非 SMTP 协议继续转发邮件) 。由此可以看出:一个邮件信息可以通过一次 TCP 连接
直接从源到达目的,也可以经过多个中间环节到达目的。
·178· Internet 应用协议实例剖析与服务器配置

用户 SMTP
客户端 服务器端 文件
命令/响应
SMTP SMTP 系统
文件
邮件
系统

SMTP 客户端 SMTP 服务器端

图 8-1 SMTP 协议模型

在 SMTP 客户端与 SMTP 服务器的通信过程中,SMTP 命令从客户端发向服务器,与


SMTP 命令对应的 SMTP 应答从服务器发向客户端。一旦 TCP 连接建立完毕,SMTP 客户端
将向 SMTP 服务器发送一系列的命令,这些命令用于传递发件人、收件人等信息以及传输邮
件的正文(包含头信息) 。SMTP 服务器对每一个命令进行回答,表明命令已被接受或有错误
发生。
当一次邮件发送过程结束后,客户方可以与服务器断开连接,也可以继续发送下一封
邮件。

8.2.3 SMTP 命令

SMTP 命令是由以回车(CR)和换行(LF)结尾的字符串,基本的 SMTP 命令及格式如下


所述(其中斜体部分为用户输入信息) 。
(1)HELO domain
此命令用于向服务器方发送客户方标识信息,参数 domain 是客户的域名。
(2)EHLO domain
此命令类似 HELO 命令,但要求服务器作扩展应答。
(3)MAIL FROM:<reverse-path>
此命令告诉接收方一个新邮件发送的开始,参数 reverse-path 为发送者的地址。
(4)RCPT TO:<forward-path>
此命令用参数 forward-path 告诉接收方邮件接收者的地址。
(5)DATA
此命令使接收方把其后的输入看作邮件数据处理。
(6)REST
此命令复位当前的邮件传输。
(7)NOOP
此命令要求接收 SMTP 应答“OK”以用于测试。
(8)QUIT
此命令要求接收 SMTP 返回一个 OK 应答并关闭传输。
(9)VRFY string
此命令用于验证 string 指定的邮箱是否存在,由于安全因素,服务器多禁止响应此命令。
第8章 MAIL 应用 ·179·

(10)EXPN string
此命令用于验证 string 给定的邮箱列表是否存在,也常被禁止使用。
(11)HELP
此命令用于查询服务器支持的命令

8.2.4 SMTP 应答

对 SMTP 协议的每一个命令,服务器方都会返回一个应答码,应答码的每一个数字都有
特定含义,其基本含义与 FTP 应答码的定义类似,常用 SMTP 应答码如下:
应答码 说明
500 命令无法识别
501 参数格式错误
502 命令没有实现
503 错误的命令顺序
504 命令参数没有实现
211 系统状态或系统帮助响应
214 帮助信息
220 <domain>服务就绪
221 <domain>服务正在关闭传输通道
421 <domain>服务不可用,关闭传输信道
250 要求的邮件操作完成
251 用户非本地,将转发向<forward-path>
450 要求的邮件操作未完成,邮箱不可用
550 要求的操作未完成,邮箱不可用
451 放弃要求的操作;处理过程中出错
551 用户非本地,请尝试<forward-path>
452 系统存储不足,要求的操作未执行
552 过量的存储分配,要求的操作未执行
553 邮箱名不可用,要求的操作未执行
354 开始邮件输入,以只包含“.”的行结束
554 操作失败

8.2.5 用 telnet 模拟 SMTP 协议实现过程

可使用 telnet 作为 SMTP 客户端来模拟 SMTP 协议实现过程。下面的实例是用 telnet 完


成向 wang@mymail.com 发送一封文本邮件的过程(斜体部分是用户输入信息):
[nothing@IBMServer /nothing]$ telnet smtp.mymail.com 25
Connected to smtp.mymail.com.
Escape character is '^]'.
220 ESMTP
helo myhostname.com
·180· Internet 应用协议实例剖析与服务器配置

250 HELO: myhostname.com


mail from:<zhang@tmail.com>
250 OK
rcpt to:<wang@mymail.com>
250 OK
data
354 go ahead
helo
i am zhang
.
250 OK:has queued
quit
221 close connection
Connection closed by foreign host.

8.3 POP 协议

8.3.1 POP 协议简介

POP 协议用于 MUA 从 MTA 接收和查询邮件,是 Internet 应用层协议,RFC1939 描述了


POP3 协议的标准信息。
在 Internet 通信中,POP 运行于 TCP 之上,服务器端端口号默认为 TCP 110。

8.3.2 POP3 命令

和 SMTP 一样,由 NVT ASCII 字符串构成的 POP 命令和 POP 应答是客户方与服务器


方交互的基本形式,下面列举了常用的 POP3 命令及其功能(其中斜体部分为用户输入信
息):
(1)USER username
此命令向服务器传递能惟一代表信箱的用户名,与下面的 pass 命令配合使用。
(2)PASS password
此命令用于向服务器传递 username 所对应的口令。
(3)APOP name digest
若使用 APOP,则口令在传输之前被加密。当第 1 次与服务器连接时,POP3 服务器向客
户机发送一个 ASCII 码问候,这个问候由一串字符组成,对每个客户机这个问候码是惟一的,
与当时的时间有关,然后,客户机把它的纯文本口令附加到从服务器接收到的字符串之后,
然后计算出结果字符串的 MD5 单向散列值,最后由客户机把用户名与 MD5 消息摘要作为
APOP 命令的 name 和 digest 参数一起发送出去。
(4)STAT
第8章 MAIL 应用 ·181·

请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数。
(5)UIDL [messagenum]
若不带参数,返回所有邮件的惟一标识符,若用参数 messagenum 指定了一个邮件编号,
则只返回指定邮件的信息。
(6)LIST [messagenum ]
此命令用来使服务器返回邮件数量和每个邮件的大小。
(7)RETR messagenum
此命令用来返回由参数 messagenum 标识的邮件的全部内容。
(8)DELE messagenum
此命令使服务器将由参数标识的邮件标记为删除,从此对此邮件的任何操作将返回错
误。此命令不真正删除邮件,只有执行 UPDATE 命令后才真正删除。
(9)RSET
此命令使服务器重置所有标记为删除的邮件,撤消 DELE 命令。
(10)TOP messagenum n
此命令使服务器返回由参数 messagenum 标识的邮件前 n 行内容,n 必须是正整数。
(11)NOOP
此命令要求服务器返回一个肯定的响应。
(12)QUIT
此命令用于与服务器断开连接。

8.3.3 POP3 应答

除了 STAT、LIST、UIDL 命令外,POP3 服务器对其他任何命令的应答都是“+OK”或


“–ERR”,跟在它们后面的字符串可以被客户忽略。

8.3.4 用 telnet 模拟 POP3 协议实现过程

可用 telnet 作为 POP 客户端来模拟 POP 协议实现过程。下面的实例是用 telnet 完成从


pop.mymail.com 查询并阅读第一封邮件的过程(斜体部分是用户输入信息) :
[nothing@IBMServer /nothing]$ telnet pop.mymail.com 110
Trying pop.mymail.com...
Connected to pop.mymail.com.
Escape character is '^]'.
+OK POP3 ready
user wang
+OK
pass mypass
+OK authorization succeeded
list
+OK
1 176
·182· Internet 应用协议实例剖析与服务器配置

2 3361
3 32308
4 262
5 513
.
retr 1
+OK
Received: Sun, 10 Aug 2003 13:18:34 +0800
Message-ID: <260492714.00600@mymail.com>
Received: from unknown (HELO myhostname.com)
by smtp.mymail.com with SMTP; Sun, 10 Aug 2003 13:18:34 +0800
helo
i am zhang
.

8.4 MAIL 系统的客户端程序

一个 MUA 至少要具备 3 项功能:撰写邮件、显示邮件和处理邮件(删除、存盘、打印、


转发、整理等) 。
Windows 系统下比较常用的 MUA 有 Outlook Express 和 Foxmail。Foxmail 因其设计优秀、
使用方便、具有很高的运行效率等特点,赢得了广大用户的青睐。因此下面以 Foxmail 为例
介绍常用 MUA 的设置和使用。
1.Foxmail 的设置
首次启动 Foxmail 会进入 Foxmail 用户向导,要求用户建立 Foxmail 用户帐户,每一个
帐号都需要设置有关的服务器信息,下面给出具体的设置步骤。
(1)首先单击“下一步”按钮进入建立新用户帐户窗口,如图 8-2 所示。

图 8-2 建立新的用户账号
第8章 MAIL 应用 ·183·

(2)在图 8-2 所示的界面中输入用户名,该用户名用于区分 Foxmail 的不同使用者。邮


箱路径是该帐号的邮件保存的路径,一般情况下直接使用默认路径即可。设置用户名后,单
击“下一步”按钮,进入邮件标识窗口,如图 8-3 所示。

图 8-3 邮件身份标记

(3)在邮件身份标识窗口中,输入发送者姓名,该姓名信息会出现在发出邮件的邮件头
中,用于标识发送者的身份。邮件地址是 ISP 提供的电子邮件地址。输入后单击“下一步”
进入指定邮件服务器窗口,如图 8-4 所示。

图 8-4 指定邮件服务器

(4)邮件服务器是邮件接收和发送的服务器地址。一般邮件服务器使用 POP3 协议和


SMTP 协议。由于 POP3 服务器是用来接收邮件的服务器,所有的邮件都保存在该服务器中,
所以在收取邮件时需要输入用户名和密码信息。输入完毕后,单击“下一步”按钮,即进入
帐户建立完成窗口。
(5)在“帐户建立完成”窗口中,如果发信服务器(SMTP 服务器)需要身份验证,则
·184· Internet 应用协议实例剖析与服务器配置

应选中“SMTP 服务器需要身份验证”选项;如果在接收完邮件后,不希望邮件从服务器上
删除,则应选定“保留服务器备份”选项。设置以上选项后,单击“完成”按钮,即完成设
置,进入 Foxmail 的主窗口,如图 8-5 所示。

图 8-5 Foxmail 的主窗口

2.接收电子邮件
在图 8-5 所示的 Foxmail 主窗口中,单击工具栏中的“收取”工具按钮,即出现如图 8-6
所示的收取邮件窗口,开始从服务器上接收邮件。

图 8-6 收取邮件

邮件接收结束后,在“收件箱”旁边会显示蓝色的数字,表示收件箱中有多少封邮件
没有被查看。在邮件列表中,显示了邮件的优先等级、是否有附件、发件人、阅读状态、
邮件主题、日期、邮件大小等信息,其中加黑显示的邮件是未阅读的邮件。选中一个后,
在邮件列表的底部会显示该邮件的主题和内容。如果邮件内容是 HTML 格式,在主题的
右侧会显示一个放大镜样式的按钮,单击该按钮可以以 HTML 方式查阅信件,如图 8-7
所示。
直接双击邮件列表中邮件也可以打开邮件并显示该邮件的详细内容,如图 8-8 所示。
利用 Foxmail 窗口中的工具栏还可以进行如下操作:单击“回复”按钮可以直接回复发
件人,按“回复全部”可以回复所有发件人,单击“转发”可以将该邮件转发给另外的接收
者,使用“前一封” 、
“后一封”按钮可以在邮件间切换,使用“打印”按钮可以将该邮件打
第8章 MAIL 应用 ·185·

印,单击“删除”将该邮件放入“废件箱”中。

图 8-7 查看邮件内容

图 8-8 查看邮件内容

3.发送电子邮件
发送电子邮件时,可以选择“撰写” 、“回复”和“转发”3 种方式。单击相应按钮后,
将出现“写邮件”窗口,如图 8-9 所示。此时可在收件人栏中输入接收者的电子邮件地址(使
用分号分隔不同的收件人),在抄送栏中输入邮件要抄送者的地址(同样可以使用分号分隔不
同的收件人),在主题中输入该邮件的主题,在底部输入邮件的具体内容。
如果需要添加附件,需单击工具栏中的“附件”按钮,在弹出的窗口中选择需要附加的
文件,重复该过程可附加更多的文件。添加附件后,发送邮件窗口如图 8-10 所示,其中最后
一栏是已经添加的附件。
·186· Internet 应用协议实例剖析与服务器配置

图 8-9 写邮件

图 8-10 邮件附件

邮件编写完成后,单击工具栏中的“发送”按钮,邮件将立即发送出去,如图 8-11 所示。


单击“特快专递”按钮,可将邮件直接发送到目的 SMTP 服务器。

图 8-11 发送邮件
第8章 MAIL 应用 ·187·

如果不需要现在发送,可以单击“保存”,将邮件保存到发件箱,等候发送。对于还没
有编辑完的邮件,可以单击“草稿”按钮,将邮件保存为草稿,下一次编辑完成后再发送。

8.5 MAIL 服务器

在 UNIX 类系统(包括 Linux)中一般使用 sendmail 来执行 MTA 功能。

8.5.1 sendmail 的安装和启动

RedHat Linux 8.0 配备的是 sendmail-8.12.5 版本,读者从 www.redhat.com 站点可以得到


sendmail-8.12.5 的 RPM 发行包,也可以从 http://www.sendmail.org 或 ftp://ftp.sendmail.org 得
到 sendmail。
如果使用 RPM 软件包,安装时只需执行下面的命令:
# rpm -ivh sendmail-8.12.5.386.rpm
安装完成后,可以利用下面的命令启动 sendmail:
#/etc/rc.d/init.d/sendmail start

8.5.2 sendmail 的配置

sendmail 主要有以下几个配置文件。
(1)/etc/mail/sendmail.cf 文件
Sendmail 的配置文件 sendmail.cf 的语法非常难读。可通过使用 m4 宏处理命令,由宏
文件 sendmail.mc 来生成复杂的配置文件 sendmail.cf,使配置变得简单。
/etc/mail/sendmail.mc 文件是原始宏文件。生成配置文件 sendmail.cf 的命令为:
m4 sendmail.mc > sendmail.cf
默认的配置文件仅仅允许在本机发送邮件,如果需要更强的功能,需要修改宏文件
sendmail.mc。
缺省的 sendmail.mc 文件内容如下:
divert(-1)
dnl This is the sendmail macro config file. If you make changes to this
dnl file,you need the sendmail-cf rpm installed and then have to
dnl generate a new /etc/sendmail.cf by running the following command:
dnl
dnl m4 /etc/mail/sendmail.mc > /etc/sendmail.cf
dnl
include(`/usr/share/sendmail-cf/m4/cf.m4')
VERSIONID(`linux setup for Red Hat Linux')dnl
OSTYPE(`linux')
dnl Uncomment and edit the following line if your mail needs to be sent
dnl out through an external mail server:
·188· Internet 应用协议实例剖析与服务器配置

dnl define(`SMART_HOST',`smtp.your.provider')
define(`confDEF_USER_ID',``8:12'')dnl
undefine(`UUCP_RELAY')dnl
undefine(`BITNET_RELAY')dnl
define(`confAUTO_REBUILD')dnl
define(`confTO_CONNECT', `1m')dnl
define(`confTRY_NULL_MX_LIST',true)dnl
define(`confDONT_PROBE_INTERFACES',true)dnl
define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl
define(`ALIAS_FILE', `/etc/aliases')dnl
dnl define(`STATUS_FILE', `/etc/mail/statistics')dnl
define(`UUCP_MAILER_MAX', `2000000')dnl
define(`confUSERDB_SPEC', `/etc/mail/userdb.db')dnl
define(`confPRIVACY_FLAGS', authwarnings,novrfy,noexpn,restrictqrun')dnl
define(`confAUTH_OPTIONS', `A')dnl
dnl TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confTO_QUEUEWARN', `4h')dnl
dnl define(`confTO_QUEUERETURN', `5d')dnl
dnl define(`confQUEUE_LA', `12')dnl
dnl define(`confREFUSE_LA', `18')dnl
dnl FEATURE(delay_checks)dnl
FEATURE(`no_default_msa',`dnl')dnl
FEATURE(`smrsh',`/usr/sbin/smrsh')dnl
FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnl
FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl
FEATURE(redirect)dnl
FEATURE(always_add_domain)dnl
FEATURE(use_cw_file)dnl
FEATURE(use_ct_file)dnl
dnl The '-t' option will retry delivery if e.g. the user runs over
dnl his quota.
FEATURE(local_procmail,`',`procmail -t -Y -a $h -d $u')dnl
FEATURE(`access_db',`hash -o /etc/mail/access.db')dnl
FEATURE(`blacklist_recipients')dnl
EXPOSED_USER(`root')dnl
dnl This changes sendmail to only listen on the loopback device
dnl 127.0.0.1 and not on any other network devices. Comment this out if
dnl you want to accept email over the network.
第8章 MAIL 应用 ·189·

DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
dnl NOTE: binding both IPv4 and IPv6 daemon to the same port requires
dnl a kernel patch
dnl DAEMON_OPTIONS(`port=smtp,Addr=::1, Name=MTA-v6, Family=inet6')
dnl We strongly recommend to comment this one out if you want to protect
dnl yourself from spam. However, the laptop and users on computers that
dnl do not have 24x7 DNS do need this.
FEATURE(`accept_unresolvable_domains')dnl
dnl FEATURE(`relay_based_on_MX')dnl
MAILER(smtp)dnl
MAILER(procmail)dnl
Cwlocalhost.localdomain
配置行“DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')”使得 sendmail
仅在 127.0.0.1 这个自回环接口上侦听 SMPT 连接,若希望与外界通信应将此行改为注释或改
为“DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')”。对本配置文件的其他行这
里暂不作解释,在解释其他配置文件时,会用到并解释本文件的其他相关行。
(2)/etc/aliases 文件
sendmail 会检查收件人的名字是否有别名(alias)并可为每个帐号设置别名。例如,大
部分 Internet 站点都设有一管理员地址 Webmaster 以报告遇到的问题,然而大多数站点并没
有这一名字的实际帐号,而是利用别名把 Webmaster 的邮件转移到负责邮件管理的一个或几
个人。例如,在站点 sdie.edu.cn 上,用户 test 负责网站管理,可在别名文件/etc/aliases 中设
置下面一项内容:
Webmaster:test
这一行配置信息告诉 sendmail,寄向 Webmaster 的邮件将被改寄给用户名为 test 的用户。
需要指出的是,别名的右边可以指定一个非本地地址,但左边却不能。别名配置
test:test@sdu.edu.cn 是合法的,而 test@sdie.edu.cn:test@sdu.edu.cn 是不合法的。
别名可用于创建邮递列表(mailing list)。在上面的例子中,别名 Webmaster 实际上
就是一个本地邮件管理员的邮递列表。对于大型的或是经常改动的名单,可以利用“:
include”的别名形式指示 sendmail 从文件中来读取成员的名单。例如,如果别名文件包
含以下这行:
friends::include:/home/test/friends.aliases
并且文件/home/test/friends.aliases 包含 clab、zhangsan、lisi、wangwu,则其效果与下面
的别名配置相同:
friends:clab,zhangsan,lisi,wangwu
这一配置对于经常变动的邮递列表或那些由用户而非邮件管理员管理的邮递列表非常
方便。如果经常要求改变邮件别名,用户一般希望把它置于自己的控制之下。
用户还可以创建一个使 sendmail 向文件发送邮件的别名。下面是别名 root 的一个例子:
root:/dev/null
这个设置行令 sendmail 把 root 的邮件追加到被指定的文件/dev/null 中。由于文件/dev/null
·190· Internet 应用协议实例剖析与服务器配置

是 Linux 的一个“黑洞”文件,因此这一别名设置的作用其实是把邮件清除掉。
需要注意的是,要想使用/etc/aliases 必须在/etc/mail/sendmail.mc 中存在“define(`ALIAS_FILE',
,而且修改完/etc/aliases 后必须执行 newaliases 命令或重新启动 sendmail 才能使别
`/etc/aliases')”
名生效。
(3)/etc/mail/local-host-names 文件
此文件中存放应该被视为本地用户的域名信息,例如若文件内容为:
mail1.edu.cn
mail2.edu.cn
mail.com
则所有的发向 xxx@mail1.edu.cn、xxx@mail2.edu.cn、xxx@mail.com 的邮件均应该被视
为发给本机用户的邮件,其中“xxx”为用户名。
(4)/etc/mail/relay-domains 文件
默认情况下,sendmail 不为任何非本机用户转信,若希望为某些特定名字或 IP 地址的
主机转信,则可将这些名字或地址写入/etc/mail/relay-domains 文件中。例如下面是一个文
件实例:
10.0.2.3
10.0.1
10.1.3
10.2
此文件将允许地址为 10.0.2.3、10.0.1.*、10.1.3.*、10.2.*.*的主机利用本机转信。

8.6 实 例 剖 析

8.6.1 环境介绍

本例中将使用 3 台计算机 A1、A2 和 B,其基本配置信息如下:


计算机 IP 地址 掩码
A1 202.194.254.213 255.255.255.0
A2 202.194.254.124 255.255.255.0
B 202.194.240.72 255.255.255.0
A1 计算机运行 Linux 系统, 并用 mail 程序向 linteng@webmail.sdie.edu.cn 发送一封邮件,
邮件内容由 3 行文本构成,如下:
content begin
content....
content end
经过查询域名系统,webmail.sdie.edu.cn 对应的 MX 记录为:
webmail.sdie.edu.cn preference = 5, mail exchanger = 202.194.240.72
上述记录表明目的 SMTP 服务器为 B 计算机,因此 mail 程序直接利用 SMTP 协议将邮
第8章 MAIL 应用 ·191·

件发送至 B。
A2 计 算 机 运 行 Windows 系 统 , 并 运 行 Foxmail 。 在 Foxmail 中 将 邮 件 地 址
linteng@webmail.sdie.edu.cn 的 POP3 服务器设置为 202.194.240.72,用户名和口令分别
设置为“linteng”和“aaaaaa”,然后进行收邮件操作,即利用 POP3 协议从 B 计算机收
取邮件。
B 计算机运行 Linux 系统,并运行 sendmail 8.9.3。

8.6.2 通信过程的帧(SMTP)

在 A1 计算机上利用 TCPDUMP 工具可获得 A1 与 B 之间传送的所有相关帧,各个帧的


作用和内容如下:
(1)A1 发向 B 的 TCP 同步帧(202.194.254.213.1131→202.194.240.72.25)
0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 003c b8bf 4000 4006 fd58 cac2 fed5 cac2
0000020: f048 046b 0019 55a0 20c0 0000 0000 a002
0000030: 7d78 2674 0000 0204 05b4 0402 080a 0822
0000040: 9c70 0000 0000 0103 0300
(2)B 发向 A1 的 TCP 同步帧(202.194.240.72.25→202.194.254.213.1131)
0000000: 0000 b491 e64d 00d0 b739 3700 0800 4500
0000010: 003c 0000 4000 3d06 b918 cac2 f048 cac2
0000020: fed5 0019 046b 964d 4eb9 55a0 20c1 a012
0000030: 16a0 47d2 0000 0204 05b4 0402 080a 0820
0000040: 5842 0822 9c70 0103 0300
(3)A1 发向 B 的 TCP 确认帧(202.194.254.213.1131→202.194.240.72.25)
0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 0034 b8c0 4000 4006 fd5f cac2 fed5 cac2
0000020: f048 046b 0019 55a0 20c1 964d 4eba 8010
0000030: 7d78 0fbe 0000 0101 080a 0822 9c71 0820
0000040: 5842
(4)B 发向 A1 的 SMTP 应答帧(202.194.240.72.25→202.194.254.213.1131)
0000000: 0000 b491 e64d 00d0 b739 3700 0800 4500
0000010: 003f 16f8 4000 3e06 a11d cac2 f048 cac2
0000020: fed5 0019 046b 964d 4eba 55a0 20c1 8018
0000030: 16a0 276d 0000 0101 080a 0820 5851 0822
0000040: 9c71 3232 3020 4553 4d54 500d 0a
(5)A1 发向 B 的 TCP 确认帧(202.194.254.213.1131→202.194.240.72.25)
0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 0034 b8c1 4000 4006 fd5e cac2 fed5 cac2
0000020: f048 046b 0019 55a0 20c1 964d 4ec5 8010
0000030: 7d78 0f96 0000 0101 080a 0822 9c7f 0820
·192· Internet 应用协议实例剖析与服务器配置

0000040: 5851
(6)A1 发向 B 的 EHLO 命令帧(202.194.254.213.1131→202.194.240.72.25)
0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 004a b8c2 4000 4006 fd47 cac2 fed5 cac2
0000020: f048 046b 0019 55a0 20c1 964d 4ec5 8018
0000030: 7d78 b804 0000 0101 080a 0822 9c80 0820
0000040: 5851 4548 4c4f 2061 6263 2e73 6469 652e
0000050: 6564 752e 636e 0d0a
(7)B 发向 A1 的 TCP 确认帧(202.194.240.72.25→202.194.254.213.1131)
0000000: 0000 b491 e64d 00d0 b739 3700 0800 4500
0000010: 0034 16f9 4000 3e06 a127 cac2 f048 cac2
0000020: fed5 0019 046b 964d 4ec5 55a0 20d7 8010
0000030: 16a0 7657 0000 0101 080a 0820 5851 0822
0000040: 9c80
(8)B→A1 对 EHLO 的应答帧(202.194.240.72.25→202.194.254.213.1131)
0000000: 0000 b491 e64d 00d0 b739 3700 0800 4500
0000010: 007e 16fa 4000 3e06 a0dc cac2 f048 cac2
0000020: fed5 0019 046b 964d 4ec5 55a0 20d7 8018
0000030: 16a0 ed14 0000 0101 080a 0820 5851 0822
0000040: 9c80 3235 302d 4155 5448 3d4c 4f47 494e
0000050: 2050 4c41 494e 0d0a 3235 302d 4155 5448
0000060: 204c 4f47 494e 2050 4c41 494e 0d0a 3235
0000070: 302d 5049 5045 4c49 4e49 4e47 0d0a 3235
0000080: 3020 3842 4954 4d49 4d45 0d0a
(9)A1 发向 B 的 MAIL 命令帧(202.194.254.213.1131→202.194.240.72.25)
0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 0056 b8c3 4000 4006 fd3a cac2 fed5 cac2
0000020: f048 046b 0019 55a0 20d7 964d 4f0f 8018
0000030: 7d78 7a8a 0000 0101 080a 0822 9c80 0820
0000040: 5851 4d41 494c 2046 726f 6d3a 3c72 6f6f
0000050: 7440 6162 632e 7364 6965 2e65 6475 2e63
0000060: 6e3e 0d0a
(10)B→A1 对 MAIL 命令的应答帧(202.194.240.72.25→202.194.254.213.1131)
0000000: 0000 b491 e64d 00d0 b739 3700 0800 4500
0000010: 0047 16fb 4000 3e06 a112 cac2 f048 cac2
0000020: fed5 0019 046b 964d 4f0f 55a0 20f9 8018
0000030: 16a0 073c 0000 0101 080a 0820 5852 0822
0000040: 9c80 3235 3020 4f4b 2028 6579 6f75 206d
0000050: 7461 290d 0a
第8章 MAIL 应用 ·193·

(11)A1 发向 B 的 TCP 确认帧(202.194.254.213.1131→202.194.240.72.25)


0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 0034 b8c4 4000 4006 fd5b cac2 fed5 cac2
0000020: f048 046b 0019 55a0 20f9 964d 4f22 8010
0000030: 7d78 0efe 0000 0101 080a 0822 9c81 0820
0000040: 5852
(12)A1 发向 B 的 RCPT 命令帧(202.194.254.213.1131→202.194.240.72.25)
0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 005b b8c5 4000 4006 fd33 cac2 fed5 cac2
0000020: f048 046b 0019 55a0 20f9 964d 4f22 8018
0000030: 7d78 5940 0000 0101 080a 0822 9c81 0820
0000040: 5852 5243 5054 2054 6f3a 3c6c 696e 7465
0000050: 6e67 4077 6562 6d61 696c 2e73 6469 652e
0000060: 6564 752e 636e 3e0d 0a
(13)B 发向 A1 的对 RCPT 命令的应答帧(202.194.240.72.25→202.194.254.213.1131)
0000000: 0000 b491 e64d 00d0 b739 3700 0800 4500
0000010: 0047 16fc 4000 3e06 a111 cac2 f048 cac2
0000020: fed5 0019 046b 964d 4f22 55a0 2120 8018
0000030: 16a0 0700 0000 0101 080a 0820 5853 0822
0000040: 9c81 3235 3020 4f4b 2028 6579 6f75 206d
0000050: 7461 290d 0a
(14)A1 发向 B 的 TCP 确认帧(202.194.254.213.1131→202.194.240.72.25)
0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 0034 b8c6 4000 4006 fd59 cac2 fed5 cac2
0000020: f048 046b 0019 55a0 2120 964d 4f35 8010
0000030: 7d78 0ec2 0000 0101 080a 0822 9c82 0820
0000040: 5853
(15)A1 发向 B 的 DATA 命令帧(202.194.254.213.1131→202.194.240.72.25)
0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 003a b8c7 4000 4006 fd52 cac2 fed5 cac2
0000020: f048 046b 0019 55a0 2120 964d 4f35 8018
0000030: 7d78 6927 0000 0101 080a 0822 9c82 0820
0000040: 5853 4441 5441 0d0a
(16)B 发向 A1 的 DATA 命令的应答帧(202.194.240.72.25→202.194.254.213.1131)
0000000: 0000 b491 e64d 00d0 b739 3700 0800 4500
0000010: 004d 16fd 4000 3e06 a10a cac2 f048 cac2
0000020: fed5 0019 046b 964d 4f35 55a0 2126 8018
0000030: 16a0 ff90 0000 0101 080a 0820 5853 0822
0000040: 9c82 3335 3420 676f 2061 6865 6164 2028
·194· Internet 应用协议实例剖析与服务器配置

0000050: 6579 6f75 206d 7461 290d 0a


(17)A1 发向 B 的 TCP 确认帧(202.194.254.213.1131→202.194.240.72.25)
0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 0034 b8c8 4000 4006 fd57 cac2 fed5 cac2
0000020: f048 046b 0019 55a0 2126 964d 4f4e 8010
0000030: 7d78 0ea2 0000 0101 080a 0822 9c83 0820
0000040: 5853
(18)A1 发向 B 的邮件内容帧(202.194.254.213.1131→202.194.240.72.25)
0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 01a4 b8c9 4000 4006 fbe6 cac2 fed5 cac2
0000020: f048 046b 0019 55a0 2126 964d 4f4e 8018
0000030: 7d78 b074 0000 0101 080a 0822 9c83 0820
0000040: 5853 5265 6365 6976 6564 3a20 2866 726f
0000050: 6d20 726f 6f74 406c 6f63 616c 686f 7374
0000060: 290d 0a09 6279 2061 6263 2e73 6469 652e
0000070: 6564 752e 636e 2028 382e 392e 332f 382e
0000080: 392e 3329 2069 6420 4d41 4130 3136 3937
0000090: 0d0a 0966 6f72 206c 696e 7465 6e67 4077
00000a0: 6562 6d61 696c 2e73 6469 652e 6564 752e
00000b0: 636e 3b20 5361 742c 2036 2053 6570 2032
00000c0: 3030 3320 3132 3a31 323a 3539 2047 4d54
00000d0: 0d0a 4461 7465 3a20 5361 742c 2036 2053
00000e0: 6570 2032 3030 3320 3132 3a31 323a 3539
00000f0: 2047 4d54 0d0a 4672 6f6d 3a20 726f 6f74
0000100: 203c 726f 6f74 4061 6263 2e73 6469 652e
0000110: 6564 752e 636e 3e0d 0a4d 6573 7361 6765
0000120: 2d49 643a 203c 3230 3033 3039 3036 3132
0000130: 3132 2e4d 4141 3031 3639 3740 6162 632e
0000140: 7364 6965 2e65 6475 2e63 6e3e 0d0a 546f
0000150: 3a20 6c69 6e74 656e 6740 7765 626d 6169
0000160: 6c2e 7364 6965 2e65 6475 2e63 6e0d 0a53
0000170: 7562 6a65 6374 3a20 7465 7374 2066 6f72
0000180: 2073 6d74 700d 0a0d 0a63 6f6e 7465 6e74
0000190: 2062 6567 696e 0d0a 636f 6e74 656e 742e
00001a0: 2e2e 2e0d 0a63 6f6e 7465 6e74 2065 6e64
00001b0: 0d0a
(19)B 发向 A1 的 TCP 确认帧(202.194.240.72.25→202.194.254.213.1131)
0000000: 0000 b491 e64d 00d0 b739 3700 0800 4500
0000010: 0034 16fe 4000 3e06 a122 cac2 f048 cac2
第8章 MAIL 应用 ·195·

0000020: fed5 0019 046b 964d 4f4e 55a0 2296 8010


0000030: 1920 7184 0000 0101 080a 0820 5859 0822
0000040: 9c83
(20)A1 发向 B 的邮件结束行帧(202.194.254.213.1131→202.194.240.72.25)
0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 0037 b8ca 4000 4006 fd52 cac2 fed5 cac2
0000020: f048 046b 0019 55a0 2296 964d 4f4e 8018
0000030: 7d78 d50f 0000 0101 080a 0822 9c87 0820
0000040: 5859 2e0d 0a
(21)B 发向 A1 的 TCP 确认帧(202.194.240.72.25→202.194.254.213.1131)
0000000: 0000 b491 e64d 00d0 b739 3700 0800 4500
0000010: 0034 16ff 4000 3e06 a121 cac2 f048 cac2
0000020: fed5 0019 046b 964d 4f4e 55a0 2299 8010
0000030: 1920 717d 0000 0101 080a 0820 5859 0822
0000040: 9c87
(22)B 发向 A1 的邮件结束应答帧(202.194.240.72.25→202.194.254.213.1131)
0000000: 0000 b491 e64d 00d0 b739 3700 0800 4500
0000010: 0052 1700 4000 3e06 a102 cac2 f048 cac2
0000020: fed5 0019 046b 964d 4f4e 55a0 2299 8018
0000030: 1920 c1e1 0000 0101 080a 0820 5859 0822
0000040: 9c87 3235 3020 4f4b 3a68 6173 2071 7565
0000050: 7565 6420 2865 796f 7520 6d74 6129 0d0a
(23)A1 发向 B 的 TCP 确认帧(202.194.254.213.1131→202.194.240.72.25)
0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 0034 b8cb 4000 4006 fd54 cac2 fed5 cac2
0000020: f048 046b 0019 55a0 2299 964d 4f6c 8010
0000030: 7d78 0d05 0000 0101 080a 0822 9c89 0820
0000040: 5859
(24)A1 发向 B 的 QUIT 命令帧(202.194.254.213.1131→202.194.240.72.25)
0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 003a b8cc 4000 4006 fd4d cac2 fed5 cac2
0000020: f048 046b 0019 55a0 2299 964d 4f6c 8018
0000030: 7d78 653f 0000 0101 080a 0822 9c8d 0820
0000040: 5859 5155 4954 0d0a
(25)B 发向 A1 的 QUIT 命令应答帧(202.194.240.72.25→202.194.254.213.1131)
0000000: 0000 b491 e64d 00d0 b739 3700 0800 4500
0000010: 0055 1701 4000 3e06 a0fe cac2 f048 cac2
0000020: fed5 0019 046b 964d 4f6c 55a0 229f 8018
0000030: 1920 fdc6 0000 0101 080a 0820 585e 0822
·196· Internet 应用协议实例剖析与服务器配置

0000040: 9c8d 3232 3120 636c 6f73 6520 636f 6e6e


0000050: 6563 7469 6f6e 2028 6579 6f75 206d 7461
0000060: 290d 0a
(26)B 发向 A1 的 TCP 连接结束帧(202.194.240.72.25→202.194.254.213.1131)
0000000: 0000 b491 e64d 00d0 b739 3700 0800 4500
0000010: 0034 1702 4000 3e06 a11e cac2 f048 cac2
0000020: fed5 0019 046b 964d 4f8d 55a0 229f 8011
0000030: 1920 712c 0000 0101 080a 0820 585e 0822
0000040: 9c8d
(27)A1 发向 B 的 TCP 确认帧(202.194.254.213.1131→202.194.240.72.25)
0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 0034 b8cd 4000 4006 fd52 cac2 fed5 cac2
0000020: f048 046b 0019 55a0 229f 964d 4f8e 8010
0000030: 7d78 0cd4 0000 0101 080a 0822 9c8d 0820
0000040: 585e
(28)A1 发向 B 的 TCP 连接结束帧(202.194.254.213.1131→202.194.240.72.25)
0000000: 00d0 b739 3700 0000 b491 e64d 0800 4500
0000010: 0034 b8ce 4000 4006 fd51 cac2 fed5 cac2
0000020: f048 046b 0019 55a0 229f 964d 4f8e 8011
0000030: 7d78 0cd3 0000 0101 080a 0822 9c8d 0820
0000040: 585e
(29)B 发向 A1 的 TCP 确认帧(202.194.240.72.25→202.194.254.213.1131)
0000000: 0000 b491 e64d 00d0 b739 3700 0800 4500
0000010: 0034 0000 4000 fd06 f91f cac2 f048 cac2
0000020: fed5 0019 046b 964d 4f8e 55a0 22a0 8010
0000030: 1920 712a 0000 0101 080a 0820 585f 0822
0000040: 9c8d

8.6.3 帧剖析(SMTP)

第 1、2、3 三个帧完成了 A1 主动发起的与 B 的 TCP 连接,客户端口号为 TCP 1131,


服务器端口号为 25。
第 4 帧的第 42~4c Byte 为 B 发向 A1 的 SMTP 应答,其内容为:
“220 ESMTP”
第 6 帧的第 42~57 Byte 为 A1 发向 B 的 EHLO 命令,其内容为:
“EHLO abc.sdie.edu.cn”
第 8 帧的第 42~8b Byte 为 B 发向 A1 的对 EHLO 命令的应答,其内容为:
250-AUTH=LOGIN PLAIN
250-AUTH LOGIN PLAIN
250-PIPELINING
第8章 MAIL 应用 ·197·

250 8BITMIME
第 9 帧的第 42~63 Byte 为 A1 发向 B 的 MAIL 命令,其内容为:
“MAIL From:root@abc.sdie.edu.cn”
第 10 帧的第 42~54 Byte 为 B 发向 A1 的对 MAIL 命令的应答,其内容为:
“250 OK (eyou mta)”
第 12 帧的第 42~68 Byte 为 A1 发向 B 的 RCPT 命令,其内容为:
“RCPT To:linteng@webmail.sdie.edu.cn”
第 13 帧的第 42~54 Byte 为 B 发向 A1 的对 RCPT 命令的应答,其内容为:
“250 OK (eyou mta)”
第 15 帧的第 42~47 Byte 为 A1 发向 B 的 DATA 命令,其内容为:
“DATA”
第 16 帧的第 42~5a Byte 为 B 发向 A1 的对 DATA 命令的应答,其内容为:
“354 go ahead (eyou mta)”
第 18 帧的第 42~1b1 Byte 为 A1 发向 B 的邮件内容,其内容为:
Received: (from root@localhost)
by abc.sdie.edu.cn (8.9.3/8.9.3) id MAA01697
for linteng@webmail.sdie.edu.cn; Sat, 6 Sep 2003 12:12:59 GMT
Date: Sat, 6 Sep 2003 12:12:59 GMT
From: root <root@abc.sdie.edu.cn>
Message-Id: <200309061212.MAA01697@abc.sdie.edu.cn>
To: linteng@webmail.sdie.edu.cn
Subject: test for smtp

content begin
content....
content end
第 20 帧的第 42~44 Byte 为 A1 发向 B 的邮件结束行,其内容为:
“.”
第 22 帧的第 42~5f Byte 为 B 发向 A1 的邮件结束应答,其内容为:
“250 OK:has queued (eyou mta)”
第 24 帧的第 42~47 Byte 为 A1 发向 B 的 QUIT 命令,其内容为:
“QUIT”
第 25 帧的第 42~62 Byte 为 B 发向 A1 的 QUIT 命令应答,其内容为:
“221 close connection (eyou mta)”
第 26、27、28 和 29 四个帧完成结束 TCP 连接功能。

8.6.4 通信过程的帧(POP3)

(1)A2 发向 B 的 TCP 同步帧(202.194.254.124.1264→202.194.240.72.110)


0000000: 00d0 b739 3700 0000 b490 5aa1 0800 4500
·198· Internet 应用协议实例剖析与服务器配置

0000010: 0030 a689 4000 8006 cff3 cac2 fe7c cac2


0000020: f048 04f0 006e 0186 a633 0000 0000 7002
0000030: 2000 31bd 0000 0204 05b4 0101 0402
(2)B 发向 A2 的 TCP 同步帧(202.194.240.72.110→202.194.254.124.1264)
0000000: 0000 b490 5aa1 00d0 b739 3700 0800 4500
0000010: 0030 0000 4000 3f06 b77d cac2 f048 cac2
0000020: fe7c 006e 04f0 dee4 cd73 0186 a634 7012
0000030: 16d0 8e83 0000 0204 05b4 0101 0402
(3)A2 发向 B 的 TCP 确认帧(202.194.254.124.1264→202.194.240.72.110)
0000000: 00d0 b739 3700 0000 b490 5aa1 0800 4500
0000010: 0028 a789 4000 8006 cefb cac2 fe7c cac2
0000020: f048 04f0 006e 0186 a634 dee4 cd74 5010
0000030: 2238 afdf 0000
(4)B 发向 A2 的 ready 应答帧(202.194.240.72.110→202.194.254.124.1264)
0000000: 0000 b490 5aa1 00d0 b739 3700 0800 4500
0000010: 0038 23a8 4000 3f06 93cd cac2 f048 cac2
0000020: fe7c 006e 04f0 dee4 cd74 0186 a634 5018
0000030: 16d0 ace6 0000 2b4f 4b20 504f 5033 2072
0000040: 6561 6479 0d0a
(5)A2 发向 B 的 USER 命令帧(202.194.254.124.1264→202.194.240.72.110)
0000000: 00d0 b739 3700 0000 b490 5aa1 0800 4500
0000010: 0036 aa89 4000 8006 cbed cac2 fe7c cac2
0000020: f048 04f0 006e 0186 a634 dee4 cd84 5018
0000030: 2228 9b72 0000 5553 4552 206c 696e 7465
0000040: 6e67 0d0a
(6)B 发向 A2 的 TCP 确认帧(202.194.240.72.110→202.194.254.124.1264)
0000000: 0000 b490 5aa1 00d0 b739 3700 0800 4500
0000010: 0028 23a9 4000 3f06 93dc cac2 048 cac2
0000020: fe7c 006e 04f0 dee4 cd84 0186 a642 5010
0000030: 16d0 bb29 0000
(7)B 发向 A2 对 USER 命令的应答帧(202.194.240.72.110→202.194.254.124.1264)
0000000: 0000 b490 5aa1 00d0 b739 3700 0800 4500
0000010: 002e 23aa 4000 3f06 93d5 cac2 f048 cac2
0000020: fe7c 006e 04f0 dee4 cd84 0186 a642 5018
0000030: 16d0 37a2 0000 2b4f 4b20 0d0a
(8)A2 发向 B 的 PASS 命令帧(202.194.254.124.1264→202.194.240.72.110)
0000000: 00d0 b739 3700 0000 b490 5aa1 0800 4500
0000010: 0037 ad89 4000 8006 c8ec cac2 fe7c cac2
0000020: f048 04f0 006e 0186 a642 dee4 cd8a 5018
第8章 MAIL 应用 ·199·

0000030: 2222 5c93 0000 5041 5353 2061 6161 6161


0000040: 6161 610d 0a
(9)B 发向 A2 对 PASS 命令的应答帧(202.194.240.72.110→202.194.254.124.1264)
0000000: 0000 b490 5aa1 00d0 b739 3700 0800 4500
0000010: 0050 23ab 4000 3f06 93b2 cac2 f048 cac2
0000020: fe7c 006e 04f0 dee4 cd8a 0186 a651 5018
0000030: 16d0 6545 0000 2b4f 4b20 6175 7468 6f72
0000040: 697a 6174 696f 6e20 7375 6363 6565 6465
0000050: 6420 2865 796f 7520 6d74 6129 0d0a
(10)A2 发向 B 的 STAT 命令帧(202.194.254.124.1264→202.194.240.72.110)
0000000: 00d0 b739 3700 0000 b490 5aa1 0800 4500
0000010: 002e b089 4000 8006 c5f5 cac2 fe7c cac2
0000020: f048 04f0 006e 0186 a651 dee4 cdb2 5018
0000030: 21fa 0e02 0000 5354 4154 0d0a
(11)B 发向 A2 对 STAT 命令的应答帧(202.194.240.72.110→202.194.254.124.1264)
0000000: 0000 b490 5aa1 00d0 b739 3700 0800 4500
0000010: 0033 23ac 4000 3f06 93ce cac2 f048 cac2
0000020: fe7c 006e 04f0 dee4 cdb2 0186 a657 5018
0000030: 16d0 a006 0000 2b4f 4b20 3120 3630 330d
0000040: 0a
(12)A2 发向 B 的 LIST 命令帧(202.194.254.124.1264→202.194.240.72.110)
0000000: 00d0 b739 3700 0000 b490 5aa1 0800 4500
0000010: 002e b389 4000 8006 c2f5 cac2 fe7c cac2
0000020: f048 04f0 006e 0186 a657 dee4 cdbd 5018
0000030: 21ef 0307 0000 4c49 5354 0d0a
(13)B 发向 A2 的对 LIST 命令的应答帧(202.194.240.72.110→202.194.254.124.1264)
0000000: 0000 b490 5aa1 00d0 b739 3700 0800 4500
0000010: 002e 23ad 4000 3f06 93d2 cac2 f048 cac2
0000020: fe7c 006e 04f0 dee4 cdbd 0186 a65d 5018
0000030: 16d0 374e 0000 2b4f 4b20 0d0a
(14)A2 发向 B 的 TCP 确认帧(202.194.254.124.1264→202.194.240.72.110)
0000000: 00d0 b739 3700 0000 b490 5aa1 0800 4500
0000010: 0028 b489 4000 8006 c1fb cac2 fe7c cac2
0000020: f048 04f0 006e 0186 a65d dee4 cdc3 5010
0000030: 21e9 afb6 0000
(15)B 发向 A2 的对 LIST 命令的应答帧(202.194.240.72.110→202.194.254.124.1264)
0000000: 0000 b490 5aa1 00d0 b739 3700 0800 4500
0000010: 0032 23ae 4000 3f06 93cd cac2 f048 cac2
0000020: fe7c 006e 04f0 dee4 cdc3 0186 a65d 5018
·200· Internet 应用协议实例剖析与服务器配置

0000030: 16d0 0928 0000 3120 3630 330d 0a2e 0d0a


(16)A2 发向 B 的 RETR 命令帧(202.194.254.124.1264→202.194.240.72.110)
0000000: 00d0 b739 3700 0000 b490 5aa1 0800 4500
0000010: 0030 b889 4000 8006 bdf3 cac2 fe7c cac2
0000020: f048 04f0 006e 0186 a65d dee4 cdcd 5018
0000030: 21df dbd3 0000 5245 5452 2031 0d0a 0d0a
(17)B 发向 A2 的对 RETR 命令的应答帧(202.194.240.72.110→202.194.254.124.1264)
0000000: 0000 b490 5aa1 00d0 b739 3700 0800 4500
0000010: 002e 23af 4000 3f06 93d0 cac2 f048 cac2
0000020: fe7c 006e 04f0 dee4 cdcd 0186 a665 5018
0000030: 16d0 3736 0000 2b4f 4b20 0d0a
(18)A2 发向 B 的 TCP 确认帧(202.194.254.124.1264→202.194.240.72.110)
0000000: 00d0 b739 3700 0000 b490 5aa1 0800 4500
0000010: 0028 b989 4000 8006 bcfb cac2 fe7c cac2
0000020: f048 04f0 006e 0186 a665 dee4 cdd3 5010
0000030: 21d9 afae 0000
(19)B 发向 A2 的对 RETR 命令的应答帧(202.194.240.72.110→202.194.254.124.1264)
0000000: 0000 b490 5aa1 00d0 b739 3700 0800 4500
0000010: 0296 23b0 4000 3f06 9167 cac2 f048 cac2
0000020: fe7c 006e 04f0 dee4 cdd3 0186 a665 5018
0000030: 16d0 ac68 0000 5265 6365 6976 6564 3a20
0000040: 2865 796f 7520 7365 6e64 2070 726f 6772
0000050: 616d 293b 2053 6174 2c20 3232 204e 6f76
0000060: 2032 3030 3320 3136 3a34 353a 3030 202b
0000070: 3038 3030 0d0a 4d65 7373 6167 652d 4944
0000080: 3a20 3c32 3639 3439 3037 3030 2e33 3035
0000090: 3535 4077 6562 6d61 696c 2e73 6469 652e
00000a0: 6564 752e 636e 3e0d 0a52 6563 6569 7665
00000b0: 643a 2066 726f 6d20 756e 6b6e 6f77 6e20
00000c0: 2848 454c 4f20 6162 632e 7364 6965 2e65
00000d0: 6475 2e63 6e29 2028 756e 6b6e 6f77 6e40
00000e0: 3230 322e 3139 342e 3235 342e 3231 3329
00000f0: 0d0a 2062 7920 3230 322e 3139 342e 3234
0000100: 302e 3732 2077 6974 6820 534d 5450 3b20
0000110: 5361 742c 2032 3220 4e6f 7620 3230 3033
0000120: 2031 363a 3435 3a30 3020 2b30 3830 300d
0000130: 0a52 6563 6569 7665 643a 2028 6672 6f6d
0000140: 2072 6f6f 7440 6c6f 6361 6c68 6f73 7429
0000150: 0d0a 0962 7920 6162 632e 7364 6965 2e65
第8章 MAIL 应用 ·201·

0000160: 6475 2e63 6e20 2838 2e39 2e33 2f38 2e39


0000170: 2e33 2920 6964 2052 4141 3031 3734 310d
0000180: 0a09 666f 7220 6c69 6e74 656e 6740 7765
0000190: 626d 6169 6c2e 7364 6965 2e65 6475 2e63
00001a0: 6e3b 2053 6174 2c20 3620 5365 7020 3230
00001b0: 3033 2031 373a 3033 3a30 3620 474d 540d
00001c0: 0a44 6174 653a 2053 6174 2c20 3620 5365
00001d0: 7020 3230 3033 2031 373a 3033 3a30 3620
00001e0: 474d 540d 0a46 726f 6d3a 2072 6f6f 7420
00001f0: 3c72 6f6f 7440 6162 632e 7364 6965 2e65
0000200: 6475 2e63 6e3e 0d0a 4d65 7373 6167 652d
0000210: 4964 3a20 3c32 3030 3330 3930 3631 3730
0000220: 332e 5241 4130 3137 3431 4061 6263 2e73
0000230: 6469 652e 6564 752e 636e 3e0d 0a54 6f3a
0000240: 206c 696e 7465 6e67 4077 6562 6d61 696c
0000250: 2e73 6469 652e 6564 752e 636e 0d0a 5375
0000260: 626a 6563 743a 2074 6573 7420 666f 7220
0000270: 736d 7470 0d0a 0d0a 636f 6e74 656e 7420
0000280: 6265 6769 6e0d 0a63 6f6e 7465 6e74 2e2e
0000290: 2e2e 0d0a 636f 6e74 656e 7420 656e 640d
00002a0: 0a2e 0d0a
(20)A2 发向 B 的 TCP 确认帧(202.194.254.124.1264→202.194.240.72.110)
0000000: 00d0 b739 3700 0000 b490 5aa1 0800 4500
0000010: 0028 bb89 4000 8006 bafb cac2 fe7c cac2
0000020: f048 04f0 006e 0186 a665 dee4 d041 5010
0000030: 1f6b afae 0000
(21)A2 发向 B 的 DELE 命令帧(202.194.254.124.1264→202.194.240.72.110)
0000000: 00d0 b739 3700 0000 b490 5aa1 0800 4500
0000010: 0030 c289 4000 8006 b3f3 cac2 fe7c cac2
0000020: f048 04f0 006e 0186 a665 dee4 d041 5018
0000030: 1f6b f1d8 0000 4445 4c45 2031 0d0a
(22)B 发向 A2 的对 DELE 命令的应答帧(202.194.240.72.110→202.194.254.124.1264)
0000000: 0000 b490 5aa1 00d0 b739 3700 0800 4500
0000010: 002e 23b1 4000 3f06 93ce cac2 f048 cac2
0000020: fe7c 006e 04f0 dee4 d041 0186 a66d 5018
0000030: 16d0 34ba 0000 2b4f 4b20 0d0a
(23)A2 发向 B 的 QUIT 命令帧(202.194.254.124.1264→202.194.240.72.110)
0000000: 00d0 b739 3700 0000 b490 5aa1 0800 4500
0000010: 002e c589 4000 8006 b0f5 cac2 fe7c cac2
·202· Internet 应用协议实例剖析与服务器配置

0000020: f048 04f0 006e 0186 a66d dee4 d047 5018


0000030: 1f65 07e5 0000 5155 4954 0d0a
(24)B 发向 A2 的对 QUIT 命令的应答帧(202.194.240.72.110→202.194.254.124.1264)
0000000: 0000 b490 5aa1 00d0 b739 3700 0800 4500
0000010: 002e 23b2 4000 3f06 93cd cac2 f048 cac2
0000020: fe7c 006e 04f0 dee4 d047 0186 a673 5018
0000030: 16d0 34ae 0000 2b4f 4b20 0d0a
(25)B 发向 A2 的 TCP 连接结束帧(202.194.240.72.110→202.194.254.124.1264)
0000000: 0000 b490 5aa1 00d0 b739 3700 0800 4500
0000010: 0028 23b3 4000 3f06 93d2 cac2 f048 cac2
0000020: fe7c 006e 04f0 dee4 d04d 0186 a673 5011
0000030: 16d0 b82e 0000
(26)A2 发向 B 的 TCP 确认帧(202.194.254.124.1264→202.194.240.72.110)
0000000: 00d0 b739 3700 0000 b490 5aa1 0800 4500
0000010: 0028 c689 4000 8006 affb cac2 fe7c cac2
0000020: f048 04f0 006e 0186 a673 dee4 d04e 5010
0000030: 1f5f af9f 0000
(27)A2 发向 B 的 TCP 连接结束帧(202.194.254.124.1264→202.194.240.72.110)
0000000: 00d0 b739 3700 0000 b490 5aa1 0800 4500
0000010: 0028 c889 4000 8006 adfb cac2 fe7c cac2
0000020: f048 04f0 006e 0186 a673 dee4 d04e 5011
0000030: 1f5f af
(28)B 发向 A2 的 TCP 确认帧(202.194.240.72.110→202.194.254.124.1264
0000000: 0000 b490 5aa1 00d0 b739 3700 0800 4500
0000010: 0028 23b3 4000 3f06 9ed1 cac2 f048 cac2
0000020: fe7c 006e 04f0 dee4 d04d 0186 a673 5011
0000030: 16d0 c32f 0000

8.6.5 帧剖析(POP3)

第 1、2 和 3 三个帧完成了 A2 主动发起的与 B 的 TCP 连接,客户端口号为 1131,服务


器端口号为 110。
第 4 帧的第 36~45 Byte 为 B 发向 A2 的 ready 应答,其内容为:
“+OK POP3 ready”
第 5 帧的第 36~43 Byte 为 A2 发向 B 的 USER 命令,请内容为:
“USER linteng”
第 7 帧的第 36~3b Byte 为 B 发向 A2 的对 USER 命令的应答,其内容为:
“+OK”
第 8 帧的第 36~44 Byte 为 A2 发向 B 的 PASS 命令,其内容为:
“PASS aaaaaaaa”
第8章 MAIL 应用 ·203·

第 9 帧的第 36~5d Byte 为 B 发向 A2 的对 PASS 命令的应答,其内容为:


“+OK authorization succeeded (eyou mta) ”
第 10 帧的第 36~3b Byte 为 A2 发向 B 的 STAT 命令,其内容为:
“STAT”
第 11 帧的第 36~40 Byte 为 B 发向 A2 的对 STAT 命令的应答,其内容为:
“+OK 1 603”
第 12 帧的第 36~3b Byte 为 A2 发向 B 的 LIST 命令,其内容为:
“LIST”
第 13 帧的第 36~3b Byte 为 B 发向 A2 的对 LIST 命令的应答,其内容为:
“+OK”
第 15 帧的第 36~3f Byte 为 B 发向 A2 的对 LIST 命令的应答,其内容为:
1 603
第 16 帧的第 36~3f Byte 为 A2 发向 B 的 RETR 命令,其内容为:
“RETR 1”
第 17 帧的第 36~3b Byte 为 B 发向 A2 的对 RETR 命令的应答,其内容为:
“+OK”
第 19 帧的第 36~2a3 Byte 为 B 发向 A2 的对 RETR 命令的应答,其内容为:
Received: (eyou send program); Sat, 22
Nov 2003 16:45:00 +0800
Message-ID: <269490700.30555@webmail.sdie.edu.cn>
Received: from unknown (HELO abc.sdie.edu.cn) (unknown@202.194.254.213)
by 202.194.240.72 with SMTP; Sat, 22 Nov 2003 16:45:00 +0800
Received: (from root@localhost)
by abc.sdie.edu.cn (8.9.3/8.9.3) id RAA01741
for linteng@webmail.sdie.edu.cn; Sat, 6 Sep 2003 17:03:06 GMT
Date: Sat, 6 Sep 2003 17:03:06 GMT
From: root <root@abc.sdie.edu.cn>
Message-Id: <200309061703.RAA01741@abc.sdie.edu.cn>
To: linteng@webmail.sdie.edu.cn
Subject: test for smtp

content begin
content....
content end
第 21 帧的第 36~3d Byte 为 A2 发向 B 的 DELE 命令,其内容为:
“DELE 1”
第 22 帧的第 36~3b Byte 为 B 发向 A2 的对 DELE 命令的应答,其内容为:
“+OK”
第 23 帧的第 36~3b Byte 为 A2 发向 B 的 QUIT 命令,其内容为:
·204· Internet 应用协议实例剖析与服务器配置

“QUIT”
第 24 帧的第 36~3b Byte 为 B 发向 A2 的对 QUIT 命令的应答,其内容为:
“+OK”
第 25、26、27 和 28 四个帧完成结束 TCP 连接功能。
第9章 PROXY 应用

9.1 PROXY 简介

代理服务器(Proxy Server)就是在网络上代理其他计算机访问某些网络服务的服务器,
本章讨论的代理是指应用层代理。
在 Internet 上,当客户端向服务器索取数据时,服务器会将所要求的数据直接传给客户
端,如果服务器连接在一个速度比较慢的网络上或同时访问服务器的用户太多,数据传输就
会需要很长的时间。在这种情况下,如果有很多用户都索取同一数据,那么每个人都要花很
长的时间传输同样的内容。
如果多个客户端共同使用一个代理,则客户端改由向代理服务器索取数据。如 果代
理服务器没有该数据,代理服务器就会代替客户端向远端的服务器索取此数据,再将数
据传给客户端,并存储在代理服务器上(因此代理服务器需要很大的磁盘空间)。以后
再有其他客户端索取此数据时,代理服务器就可以直接把该数据传给客户端,不必再去
远程索取了。
PROXY 系统由 PROXY 客户端和 PROXY 服务器组成。大部分应用层协议都可以很简单
地使用代理功能,例如对于 HTTP 协议,可以配置 WWW 浏览器使它把用户发出的所有请求
发向固定的 HTTP 代理服务器。当然,在使用配置了代理服务器的浏览器之前必须配置好相
应的 HTTP 代理服务器,使它能够根据配置信息向真正的 WWW 服务器发送请求并把返回结
果转给真正的客户。

9.2 PROXY 的客户端配置

下面以 HTTP 代理为例介绍客户端配置。在 Internet Explorer 浏览器(我们以 IE5 为例)中


选择“工具”菜单中的“Internet 选项” ,在弹出的“Internet 选项”对话框中单击“连接”标
签,出现如图 9-1 所示的 Internet 连接设置界面。
在图 9-1 所示界面中单击“局域网设置”按钮,出现如图 9-2 所示的局域网(LAN)设
置界面。
在图 9-2 中选中“使用代理服务器” ,即表示浏览器将通过代理服务器访问 www 服务器,
下面的地址栏用来输入代理服务器的地址和 TCP 端口号。例如图 9-2 中所示的代理服务器的
IP 地址为 10.0.2.250,HTTP 代理的端口号为 8080。
·206· Internet 应用协议实例剖析与服务器配置

图 9-1 Internet 连接设置

图 9-2 局域网设置

9.3 PROXY 服务器

在 Linux 系统中常用的代理服务器是 squid,它支持对 HTTP、FTP、Gopher、SSL 和 WAIS


等协议的代理。squid 设置简单,只需对默认配置文件稍加改动就可使代理服务器运转起来,
下面以 HTTP 代理为例介绍其代理配置。

9.3.1 squid 代理服务器的安装和启动

在 RedHat 8.0 安装光盘中找到 squid 服务器的安装数据包 squid-2.4.STABLE7-4.i386.rpm,


然后运行如下的 rpm 命令即可进行安装:
第 9 章 PROXY 应用 ·207·

rpm –i squid-2.4.STABLE7-4.i386.rpm
安装完成后,执行如下的命令即可启动 squid 代理服务器:
/etc/rc.d/init.d/squid start

9.3.2 squid 代理服务器的配置

squid 代理服务器的主要配置文件为/etc/squid/squid.conf,文件中包含有如下的内容:
# TAG: http_access
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all
若允许任何客户使用 HTTP 代理,只需将最后一行改成下面的内容即可:
http_access allow all
下面是配置文件 squid.conf 中常用的一些配置项。
(1)设置连接端口
http_port 3128
squid 默认的 HTTP 代理端口是 3128,也可以指定其他端口号,比如 8080,但客户端也
要进行相应的修改。
(2)设置 squid 使用的内存
cache_mem 8MB
Squid 默认使用 8MB 内存作为缓存,根据硬件的配置情况,可以适当的增加此值。
(3)设置最大保存目标的大小
maximum_object_size 4096kB
当数据文件的大小超过设置值时,该数据将不被保存到磁盘上。
(4)设置存放缓存数据的目录
cache_dir ufs /var/spool/squid 100 16 256
默认情况下,缓存数据的类型是 ufs,存放缓存数据的目录为/var/spool/squid。此处的 100
是指使用的硬盘空间大小是 100MB,16 表示第 1 层子目录最多可以有 16 个,256 表示每个
第 1 层子目录下最多可以有 256 个第 2 层子目录。该配置项可以重复以设置多个目录空间来
缓存数据。
(5)设置记录文件及所在目录
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
其中,access.log 文件用于记录客户端的各项请求,cache.log 文件用于记录服务器的缓存
行为,store.log 文件用来记录数据的移入、移出以及保存时间等。
(6)设置数据保存时间
·208· Internet 应用协议实例剖析与服务器配置

reference_age 1 year
默认情况下,缓存中的数据最长可以保存一年,超过一年后数据将被删除。
(7)设置访问权限
此处的访问权限用来设置指定的主机和网络使用 squid 的权限,设置的方式为:先定义
访问控制列表 acl(access control list) ,然后设置权限。
① 定义访问控制列表
定义访问控制列表的格式为(斜体部分为用户输入信息) :acl aclname acltype string1 ...
或 acl aclname acltype "file" ...。其中,aclname 是访问控制列表的名称,在设置权限时,就以
这个名称来指定访问控制列表;acltype 是访问控制列表类型,例如如果要设置源 IP 地址,
就使用“src”,除了定义地址外,还可以定义时间、协议、端口号、浏览器和用户等。下面
是访问控制列表定义的实例:
acl all src 0.0.0.0/0.0.0.0
acl localhost src 127.0.0.1/255.255.255.255
acl myacl src 202.194.253.0/255.255.255.0
acl Safe_ports port 80

② 设置权限
下面是设置 HTTP 权限的几行实例:
http_access deny !Safe_ports
http_access allow localhost
http_access allow myacl
http_access deny all
上述配置行和访问控制列表结合起来将使服务器仅允许 IP 网络 202.194.253.0/255.255.255.0
内主机使用自己的 HTTP 代理服务。
(8)电子邮件通知
cache_mgr root
如果 Squid 服务出现错误,则会给指定的用户发送电子邮件。
需要注意的是,修改后的配置文件只有在保存并重新启动 squid 后才会生效。

9.4 实 例 剖 析

9.4.1 环境介绍

下面通过一个 HTTP 代理的实例来看一下代理的基本工作过程,网络连接与配置如图 9-3


所示。
在 C 计算机上运行 WWW 服务器,端口号为 TCP 80,默认网页为 Default.htm,其内容
为:
<html>
第 9 章 PROXY 应用 ·209·

Test for HTTP Proxy


</html>

A B C

客户: HTTP 代理服务器: WWW 服务器:

IP 地址:202.194.254.124 IP 地址:202.194.254.211 IP 地址:202.194.254.200

掩码:255.255.255.0 掩码:255.255.255.0 掩码:255.255.255.0

图 9-3 HTTP 代理实例环境

在 B 计算机上运行 squid 代理服务器,其 HTTP 代理端口为 TCP 3128。


在 A 计算机上运行 WWW 浏览器 Internet Exploror,并配置浏览器使其使用 HTTP 代理
服务器,其代理服务器地址为 202.194.254.211,代理服务器端口号设置为 3128,然后在地址
栏输入“http://202.194.254.200”,从请求发出到结果返回将经历下面的步骤:
(1)A 与 B 的 3128 端口建立 TCP 连接;
(2)A 通过与 B 的连接向 B 发出 HTTP 请求;
(3)B 与 C 的 80 端口建立 TCP 连接;
(4)B 通过与 C 的连接向 C 发送 HTTP 请求;
(5)C 同过与 B 的连接向 B 发送 HTTP 应答;
(6)B 通过与 A 的连接向 A 发送 HTTP 应答。

9.4.2 通信过程中的帧

在 B 计算机上利用 TCPDUMP 工具可获得 A、B、C 之间所有的与本例相关的帧,其作


用和内容如下:
(1)A 发向 B 的 TCP 同步帧(202.194.254.124.1087→202.194.254.211.3128)
0000000: 0000 b491 e66a 0000 b490 5aa1 0800 4500
0000010: 0030 cd03 4000 8006 9aee cac2 fe7c cac2
0000020: fed3 043f 0c38 003c 82aa 0000 0000 7002
0000030: 2000 3cec 0000 0204 05b4 0101 0402
(2)B 发向 A 的 TCP 同步帧(202.194.254.211.3128→202.194.254.124.1087)
0000000: 0000 b490 5aa1 0000 b491 e66a 0800 4500
0000010: 0030 fcde 4000 4006 ab13 cac2 fed3 cac2
0000020: fe7c 0c38 043f 1466 9e51 003c 82ab 7012
0000030: 7d78 2cab 0000 0204 05b4 0101 0402
(3)A 发向 B 的 TCP 确认帧(202.194.254.124.1087→202.194.254.211.3128)
0000000: 0000 b491 e66a 0000 b490 5aa1 0800 4500
0000010: 0028 ce03 4000 8006 99f6 cac2 fe7c cac2
·210· Internet 应用协议实例剖析与服务器配置

0000020: fed3 043f 0c38 003c 82ab 1466 9e52 5010


0000030: 2238 b4af 0000
(4)A 发向 B 的 HTTP 请求(202.194.254.124.1087→202.194.254.211.3128)
0000000: 0000 b491 e66a 0000 b490 5aa1 0800 4500
0000010: 01a8 cf03 4000 8006 9776 cac2 fe7c cac2
0000020: fed3 043f 0c38 003c 82ab 1466 9e52 5018
0000030: 2238 966b 0000 4745 5420 6874 7470 3a2f
0000040: 2f32 3032 2e31 3934 2e32 3534 2e32 3030
0000050: 2f20 4854 5450 2f31 2e30 0d0a 4163 6365
0000060: 7074 3a20 696d 6167 652f 6769 662c 2069
0000070: 6d61 6765 2f78 2d78 6269 746d 6170 2c20
0000080: 696d 6167 652f 6a70 6567 2c20 696d 6167
0000090: 652f 706a 7065 672c 2061 7070 6c69 6361
00000a0: 7469 6f6e 2f78 2d73 686f 636b 7761 7665
00000b0: 2d66 6c61 7368 2c20 6170 706c 6963 6174
00000c0: 696f 6e2f 766e 642e 6d73 2d70 6f77 6572
00000d0: 706f 696e 742c 2061 7070 6c69 6361 7469
00000e0: 6f6e 2f76 6e64 2e6d 732d 6578 6365 6c2c
00000f0: 2061 7070 6c69 6361 7469 6f6e 2f6d 7377
0000100: 6f72 642c 202a 2f2a 0d0a 4163 6365 7074
0000110: 2d4c 616e 6775 6167 653a 207a 682d 636e
0000120: 0d0a 4163 6365 7074 2d45 6e63 6f64 696e
0000130: 673a 2067 7a69 702c 2064 6566 6c61 7465
0000140: 0d0a 5573 6572 2d41 6765 6e74 3a20 4d6f
0000150: 7a69 6c6c 612f 342e 3020 2863 6f6d 7061
0000160: 7469 626c 653b 204d 5349 4520 352e 3031
0000170: 3b20 5769 6e64 6f77 7320 3938 290d 0a48
0000180: 6f73 743a 2032 3032 2e31 3934 2e32 3534
0000190: 2e32 3030 0d0a 5072 6f78 792d 436f 6e6e
00001a0: 6563 7469 6f6e 3a20 4b65 6570 2d41 6c69
00001b0: 7665 0d0a 0d0a
(5)B 发向 A 的 TCP 确认(202.194.254.211.3128→202.194.254.124.1087)
0000000: 0000 b490 5aa1 0000 b491 e66a 0800 4500
0000010: 0028 fcdf 4000 4006 ab1a cac2 fed3 cac2
0000020: fe7c 0c38 043f 1466 9e52 003c 842b 5010
0000030: 7d78 57ef 0000
(6)B 发向 C 的 TCP 同步帧(202.194.254.211.1398→202.194.254.200.80)
0000000: 0050 4500 2a06 0000 b491 e66a 0800 4500
0000010: 003c fce0 4000 4006 aab9 cac2 fed3 cac2
第 9 章 PROXY 应用 ·211·

0000020: fec8 0576 0050 145b d3bf 0000 0000 a002


0000030: 7d78 166d 0000 0204 05b4 0402 080a 06d2
0000040: 2c4d 0000 0000 0103 0300
(7)C 发向 B 的 TCP 同步帧(202.194.254.200.80→202.194.254.211.1398)
0000000: 0000 b491 e66a 0050 4500 2a06 0800 4500
0000010: 0040 04d9 4000 7f06 63bd cac2 fec8 cac2
0000020: fed3 0050 0576 30f5 2e71 145b d3c0 b012
0000030: ffff 5587 0000 0204 05b4 0103 0300 0101
0000040: 080a 0000 0000 0000 0000 0101 0402
(8)B 发向 C 的 TCP 确认帧(202.194.254.211.1398→202.194.254.200.80)
0000000: 0050 4500 2a06 0000 b491 e66a 0800 4500
0000010: 0034 fce1 4000 4006 aac0 cac2 fed3 cac2
0000020: fec8 0576 0050 145b d3c0 30f5 2e72 8010
0000030: 7d78 e5ba 0000 0101 080a 06d2 2c4d 0000
0000040: 0000
(9)B 发向 C 的 HTTP 请求(202.194.254.211.1398→202.194.254.200.80)
0000000: 0050 4500 2a06 0000 b491 e66a 0800 4500
0000010: 0203 fce2 000 4006 a8f0 cac2 fed3 cac2
0000020: fec8 0576 0050 145b d3c0 30f5 2e72 8018
0000030: 7d78 bbfa 0000 0101 080a 06d2 2c6f 0000
0000040: 0000 4745 5420 2f20 4854 5450 2f31 2e30
0000050: 0d0a 4163 6365 7074 3a20 696d 6167 652f
0000060: 6769 662c 2069 6d61 6765 2f78 2d78 6269
0000070: 746d 6170 2c20 696d 6167 652f 6a70 6567
0000080: 2c20 696d 6167 652f 706a 7065 672c 2061
0000090: 7070 6c69 6361 7469 6f6e 2f78 2d73 686f
00000a0: 636b 7761 7665 2d66 6c61 7368 2c20 6170
00000b0: 706c 6963 6174 696f 6e2f 766e 642e 6d73
00000c0: 2d70 6f77 6572 706f 696e 742c 2061 7070
00000d0: 6c69 6361 7469 6f6e 2f76 6e64 2e6d 732d
00000e0: 6578 6365 6c2c 2061 7070 6c69 6361 7469
00000f0: 6f6e 2f6d 7377 6f72 642c 202a 2f2a 0d0a
0000100: 4163 6365 7074 2d4c 616e 6775 6167 653a
0000110: 207a 682d 636e 0d0a 4163 6365 7074 2d45
0000120: 6e63 6f64 696e 673a 2067 7a69 702c 2064
0000130: 6566 6c61 7465 0d0a 5573 6572 2d41 6765
0000140: 6e74 3a20 4d6f 7a69 6c6c 612f 342e 3020
0000150: 2863 6f6d 7061 7469 626c 653b 204d 5349
0000160: 4520 352e 3031 3b20 5769 6e64 6f77 7320
·212· Internet 应用协议实例剖析与服务器配置

0000170: 3938 290d 0a48 6f73 743a 2032 3032 2e31


0000180: 3934 2e32 3534 2e32 3030 0d0a 5669 613a
0000190: 2031 2e30 206e 6f6e 616d 653a 3331 3238
00001a0: 2028 5371 7569 642f 322e 322e 5354 4142
00001b0: 4c45 3129 0d0a 582d 466f 7277 6172 6465
00001c0: 642d 466f 723a 2032 3032 2e31 3934 2e32
00001d0: 3534 2e31 3234 0d0a 4361 6368 652d 436f
00001e0: 6e74 726f 6c3a 206d 6178 2d61 6765 3d32
00001f0: 3539 3230 300d 0a43 6f6e 6e65 6374 696f
0000200: 6e3a 206b 6565 702d 616c 6976 650d 0a0d
0000210: 0a
(10)C 发向 B 的 HTTP 应答(202.194.254.200.80→202.194.254.211.1398)
0000000: 0000 b491 e66a 0050 4500 2a06 0800 4500
0000010: 0189 04db 4000 7f06 6272 cac2 fec8 cac2
0000020: fed3 0050 0576 30f5 2e72 145b d58f 8018
0000030: fe30 6626 0000 0101 080a 0010 08d9 06d2
0000040: 2c6f 4854 5450 2f31 2e31 2032 3030 204f
0000050: 4b0d 0a53 6572 7665 723a 204d 6963 726f
0000060: 736f 6674 2d49 4953 2f35 2e30 0d0a 436f
0000070: 6e6e 6563 7469 6f6e 3a20 6b65 6570 2d61
0000080: 6c69 7665 0d0a 436f 6e74 656e 742d 4c6f
0000090: 6361 7469 6f6e 3a20 6874 7470 3a2f 2f32
00000a0: 3032 2e31 3934 2e32 3534 2e32 3030 2f44
00000b0: 6566 6175 6c74 2e68 746d 0d0a 4461 7465
00000c0: 3a20 5468 752c 2032 3020 4e6f 7620 3230
00000d0: 3033 2030 363a 3230 3a33 3120 474d 540d
00000e0: 0a43 6f6e 7465 6e74 2d54 7970 653a 2074
00000f0: 6578 742f 6874 6d6c 0d0a 4163 6365 7074
0000100: 2d52 616e 6765 733a 2062 7974 6573 0d0a
0000110: 4c61 7374 2d4d 6f64 6966 6965 643a 2054
0000120: 6875 2c20 3230 204e 6f76 2032 3030 3320
0000130: 3035 3a31 343a 3239 2047 4d54 0d0a 4554
0000140: 6167 3a20 2239 3062 6362 3032 6332 3561
0000150: 6663 3331 3a66 3133 220d 0a43 6f6e 7465
0000160: 6e74 2d4c 656e 6774 683a 2033 380d 0a0d
0000170: 0a3c 6874 6d6c 3e0d 0a54 6573 7420 666f
0000180: 7220 4854 5450 2050 726f 7879 0d0a 3c2f
0000190: 6874 6d6c 3e0d 0a
(11)B 发向 C 的 TCP 确认(202.194.254.211.1398→202.194.254.200.80)
第 9 章 PROXY 应用 ·213·

0000000: 0050 4500 2a06 0000 b491 e66a 0800 4500


0000010: 0034 fce3 4000 4006 aabe cac2 fed3 cac2
0000020: fec8 0576 0050 145b d58f 30f5 2fc7 8010
0000030: 7d78 d98b 0000 0101 080a 06d2 2c6f 0010
0000040: 08d9
(12)B 发向 A 的 HTTP 应答(202.194.254.211.3128→202.194.254.124.1087)
0000000: 0000 b490 5aa1 0000 b491 e66a 0800 4500
0000010: 01aa fce4 4000 4006 a993 cac2 fed3 cac2
0000020: fe7c 0c38 043f 1466 9e52 003c 842b 5018
0000030: 7d78 eedf 0000 4854 5450 2f31 2e30 2032
0000040: 3030 204f 4b0d 0a53 6572 7665 723a 204d
0000050: 6963 726f 736f 6674 2d49 4953 2f35 2e30
0000060: 0d0a 436f 6e74 656e 742d 4c6f 6361 7469
0000070: 6f6e 3a20 6874 7470 3a2f 2f32 3032 2e31
0000080: 3934 2e32 3534 2e32 3030 2f44 6566 6175
0000090: 6c74 2e68 746d 0d0a 4461 7465 3a20 5468
00000a0: 752c 2032 3020 4e6f 7620 3230 3033 2030
00000b0: 363a 3230 3a33 3120 474d 540d 0a43 6f6e
00000c0: 7465 6e74 2d54 7970 653a 2074 6578 742f
00000d0: 6874 6d6c 0d0a 4163 6365 7074 2d52 616e
00000e0: 6765 733a 2062 7974 6573 0d0a 4c61 7374
00000f0: 2d4d 6f64 6966 6965 643a 2054 6875 2c20
0000100: 3230 204e 6f76 2032 3030 3320 3035 3a31
0000110: 343a 3239 2047 4d54 0d0a 4554 6167 3a20
0000120: 2239 3062 6362 3032 6332 3561 6663 3331
0000130: 3a66 3133 220d 0a43 6f6e 7465 6e74 2d4c
0000140: 656e 6774 683a 2033 380d 0a41 6765 3a20
0000150: 3438 3130 370d 0a58 2d43 6163 6865 3a20
0000160: 4d49 5353 2066 726f 6d20 6e6f 6e61 6d65
0000170: 0d0a 5072 6f78 792d 436f 6e6e 6563 7469
0000180: 6f6e 3a20 6b65 6570 2d61 6c69 7665 0d0a
0000190: 0d0a 3c68 746d 6c3e 0d0a 5465 7374 2066
00001a0: 6f72 2048 5454 5020 5072 6f78 790d 0a3c
00001b0: 2f68 746d 6c3e 0d0a
(13)A 发向 B 的 TCP 确认(202.194.254.124.1087→202.194.254.211.3128)
0000000: 0000 b491 e66a 0000 b490 5aa1 0800 4500
0000010: 0028 d103 4000 8006 96f6 cac2 fe7c cac2
0000020: fed3 043f 0c38 003c 842b 1466 9fd4 5010
0000030: 20b6 b32f 0000
·214· Internet 应用协议实例剖析与服务器配置

9.4.3 帧剖析

第 1、2、3 三个帧完成了 A 主动发起的与 B 的 TCP 连接,客户端口号为 TCP 1087,服


务器端口号为 3128。
第 4 帧的第 36~1b5 Byte 为应用层数据,其内容为 A 发向 B 的 HTTP 请求:
GET http://202.194.254.200/ HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash,
application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 98)
Host: 202.194.254.200
Proxy-Connection: Keep-Alive
第 6、7、8 三个帧完成了 B 主动发起的与 C 的 TCP 连接,客户端口号为 TCP 1398,服
务器端口号为 80。
第 9 帧的第 42~210 Byte 为应用层数据,其内容为 B 发向 C 的 HTTP 请求:
GET / HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash,
application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 98)
Host: 202.194.254.200
Via: 1.0 noname:3128 (Squid/2.2.STABLE1)
X-Forwarded-For: 202.194.254.124
Cache-Control: max-age=259200
Connection: keep-alive
第 10 帧的第 42~196 Byte 为应用层数据,其内容为 C 发向 B 的 HTTP 应答:
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Connection: keep-alive
Content-Location: http://202.194.254.200/Default.htm
Date: Thu, 20 Nov 2003 06:20:31 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Thu, 20 Nov 2003 05:14:29 GMT
ETag: "90bcb02c25afc31:f13"
Content-Length: 38
第 9 章 PROXY 应用 ·215·

<html>
Test for HTTP Proxy
</html>
第 12 帧的第 36~1b7 Byte 为应用层数据,其内容为 B 发向 A 的 HTTP 应答:
HTTP/1.0 200 OK
Server: Microsoft-IIS/5.0
Content-Location: http://202.194.254.200/Default.htm
Date: Thu, 20 Nov 2003 06:20:31 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Thu, 20 Nov 2003 05:14:29 GMT
ETag: "90bcb02c25afc31:f13"
Content-Length: 38
Age: 48107
X-Cache: MISS from noname
Proxy-Connection: keep-alive

<html>
Test for HTTP Proxy
</html>
第 10 章 常用网络调试软件的使用

10.1 用 tcpdump 进行网络数据的采集和分析

在 Linux 系统中,tcpdump 是经常使用的网络数据采集与分析工具。


tcpdump 可以将网络中传送的数据包完全或部分截获下来,并可对各个层次上的多种协
议进行分析。它支持协议类型、协议参数、参与通信主机等过滤条件,并提供 and、or、not
等逻辑语句来设置过滤条件。下面结合实例来说明 tcpdump 的使用。

10.1.1 数据选择和过滤

不带任何参数的 tcpdump 将侦听系统中所有的网络接口,并显示截获到的所有数据包的概括


信息。这些数据对用户来说不一定全都需要,而且数据太多也不利于分析,所以,应当先考虑好
需要哪些数据包,然后利用相应参数过滤数据包。tcpdump 提供以下参数用来选择或过滤数据。
(1)-i 该参数用来选择网络接口。如果是作为路由器的计算机,一般至少有两个网络接
口,通过这个选项,可以只分析指定接口上通过的数据包。例如: “tcpdump -i eth0”使 tcpdump
只分析和显示通过 eth0 接口上的所有数据包。
(2)src、dst、port、host、net、ether
这些选项或选项的组合用来过滤数据包的源和目的,其中 host 用于指定参与通信的源或目
的主机,net 用于指定源或目的网络,ether 用于指定以太网物理地址,例如: “src host 10.0.0.1”
用来指定源主机 IP 地址是 10.0.0.1, “dst net 10.0.0.0/8”用来指定目标网络是 10.0.0.0, “tcpdump
src host 10.0.0.1 and dst net 10.0.0.0/8”用来指定只截获和分析源主机为 10.0.0.1 并且目的网络为
10.0.0.0 的数据包, “tcpdump ether src 00:00:B4:91:E6:6A”用来指定只截获和分析源主机物理地
址为 00:00:B4:91:E6:6A 的数据包, “tcpdump src host 10.0.0.1 or dst port 23”用来指定只截获和
分析源主机 10.0.0.1 或者目的端口是 23(UDP 或 TCP)的数据包, “tcpdump src host 10.0.0.1 and
dst port not 23”用来指定只截获和分析源主机 10.0.0.1 并且目的端口不是 23 的数据包,等等。
(3)ip icmp arp rarp 和 tcp、udp
这些选项一般放到第 1 个参数的位置,用来过滤数据包的协议类型,例如: “tcpdump ip
src…… ”用来设定只截获和分析网络层协议为 IP 的数据包,“tcpdump udp and src host
10.0.1.5”用来设定只截获和分析源主机为 10.0.1.5 的所有 udp 数据包,等等。

10.1.2 数据输入和输出

tcpdump 提供了足够的参数来选择如何处理得到的数据,下面进行具体介绍。
(1)-n
·218· Internet 应用协议实例剖析与服务器配置

该参数用来说明不进行 IP 地址到主机名的转换。
如果不使用这一项,当系统可以查找到某一主机的名字时,tcpdump 会把 IP 地址转换为
名字显示,例如,在某主机上执行 tcpdump 命令后,显示如下结果:
17:45:46.527364 test.sdie.edu.cn.2882 > clab.sdie.edu.cn.telnet: P 1:4(3) ack 13 win 8748 (DF)
其中, “17:45:46.527364”是本机的系统时间, “test.sdie.edu.cn.2882 > clab.sdie.edu.cn.telnet”
表明该数据包是从主机 test.sdie.edu.cn 的 2882 端口发往主机 clab.sdie.edu.cn 的 telnet(23)端口,
“P”是 TCP 包中的标志信息 PUSH, “1:4(3)”是 TCP 相对序列号和字节数, “ack 13 ”表明对
对方的序列号 13 之前的数据进行确认, “win 8748”表明 IP 包窗口大小是 8748, “DF”代表 IP
包禁止分段标志。
而执行 tcpdump –n 命令后,显示结果改变为如下形式:
17:46:26.870453 10.0.0.5.2883 > 10.0.1.5.telnet: P 41:44(3) ack 112 win 8649 (DF)
(2)-nn
该参数用来说明不进行端口名称的转换。使用 –nn 参数后,上例中的信息将显示为:
17:50:25.679058 10.0.0.5.2888 > 10.0.1.5.23: P 38:41(3) ack 105 win 8656 (DF)
(3)-e
该参数用来显示链路层头信息,例如,在某主机上执行 tcpdump -n -e 的结果为:
11:32:46.905105 0:0:b4:91:e6:6a 0:d0:b7:37:55:0 0800 327: 202.194.254.211.8023 >
202.194.253.251.61830: P 1487:1760(273) ack 0 win 32120 (DF)
11:32:47.105340 0:d0:b7:37:55:0 0:0:b4:91:e6:6a 0800 64: 202.194.253.251.61830 >
202.194.254.211.8023: . ack 1760 win 16832 (DF)
这两条信息中都包含有链路层的头信息,其中第 1 条信息中的“0:0:b4:91:e6:6a”表示源
MAC 地址, “0:d0:b7:37:55:0”表示目的 MAC 地址, “0800”表示以太网帧中的“协议类型”
字段的值为 0800(封装的数据为 IP 包) 。
(4)-x
该参数表示去掉链路头之后,以十六进制显示包的内容。例如,在某主机上执行 tcpdump
-n -e -x 的结果为:
11:38:39.196232 0:d0:b7:37:55:0 0:0:b4:91:e6:6a 0800 64: 202.194.253.251.61830
202.194.254.211.8023: . ack 5730 win 16374 (DF)
4500 0028 1056 4000 7e06 5a25 cac2 fdfb
cac2 fed3 f186 1f57 d4ee c1c0 6088 98ad
5010 3ff6 3cc6 0000 0052 474f 7093 03da
d0ac
11:38:39.196283 0:0:b4:91:e6:6a 0:d0:b7:37:55:0 0800 627: 202.194.254.211.8023
202.194.253.251.61830: P 5730:6303(573) ack 0 win 32120 (DF)
4500 0265 5ed3 4000 4006 476b cac2 fed3
cac2 fdfb 1f57 f186 6088 98ad d4ee c1c0
5018 7d78 c554 0000 3131 3a33 383a 3338
2e39 3935 3933
对于第一条信息来说,从 4500~d0ac 即为 IP 包的内容。
第 10 章 常用网络调试软件的使用 ·219·

(5)-w
该参数表明要把截获的数据包信息存到文件中。例如,在某主机上执行 tcpdump -n -w
dump.bin,则结果信息会被写到文件 dump.bin 中。
(6)-r
该参数表明 tcpdump 从文件中而不是直接从网络接口获得数据包。例如,在某主机上执
行 tcpdump -n -r dump.bin,则 tcpdump 会从文件 dump.bin 中读取相应的分析数据包。

10.2 用 NetXray 进行网络数据的采集和分析

在 Windows 系统上安装好 NetXray 后,打开 Windows 的“开始”菜单,选择“程序”


中的“NetXray”,即可启动 NetXray 程序并显示如图 10-1 所示的界面。

图 10-1 NetxRay 界面

选择“Capture”菜单中的“Capture Filter Setting…”,单击“Profiles…”并选择“New…” ,


即进入“新建过滤”对话框,如图 10-2 所示。
在“New Profile Name”框中输入“test” ,选择“Copy Existing Profile”并以 Default 为
模板,然后一次选择“OK”和“Done”按钮,即进入过滤条件设置界面,如图 10-3 所示。
在同一行的 Station1 和 Station2 中分别输入一个 IP 地址,即可截获两者之间的数据包,
图 10-3 中的设置方式将会截取所有源或目的地址为 10.0.1.1 的数据包。
若要根据协议类型设置过滤,可在图 10-3 中单击“Advance Filter”进行协议选择,例如
·220· Internet 应用协议实例剖析与服务器配置

若只分析 ICMP 数据,则可以进行如图 10-4 所示的选择。

图 10-2 新建过滤

图 10-3 设置过滤

图 10-4 设置高级过滤

设置过滤条件后,单击“确定”按钮,然后从“Capture”菜单中选择“Start”命令项,
并在另外一台联网的计算机上发出“ping 10.0.1.1”命令,之后 DashBoard 和 Capture 窗口中
第 10 章 常用网络调试软件的使用 ·221·

的指针就会开始移动,说明 NetXray 已经开始截获数据包。选择“Capture”菜单中的“End and


View”命令项可结束捕获并查看结果,结果如图 10-5 所示。

图 10-5 查看数据包

另外,可以使用“Filter Setting”中的“Data Pattern”可设置更复杂的过滤条件,此处不


具体详述。

10.3 用 ifconfig 命令设置和查看网络接口

计算机是通过接口(Interface)连接网络的。如果是通过以太网卡连接,则网卡就是一
个接口,一个网卡可以绑定一个或多个 IP 地址。设置网络的一个很重要的步骤就是设置接口。
系统中常见的接口有:自回环(loopback)接口、以太网(Ethernet)接口和 PPP 接口等。在
Linux 上查看和设置网络接口一般是通过 ifconfig(Interface Config)命令来实现的。

10.3.1 查看接口信息

如果要查看接口的状态信息,直接输入 ifconfig 命令即可;如果查看某个接口状态信息,


则还需要输入接口号,例如:
[root@localhost test]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:E0:4C:3A:48:4E
inet addr:10.0.1.5 Bcast:10.255.255.255 Mask:255.0.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3474970 errors:0 dropped:0 overruns:0 frame:0
TX packets:27901 errors:0 dropped:0 overruns:0 carrier:0
·222· Internet 应用协议实例剖析与服务器配置

collisions:692 txqueuelen:100
RX bytes:3315373694 (3161.7 Mb) TX bytes:7416286 (7.0 Mb)
Interrupt:5 Base address:0x6000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:450 errors:0 dropped:0 overruns:0 frame:0
TX packets:450 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:40060 (39.1 Kb) TX bytes:40060 (39.1 Kb)
该例中显示了 eth0 和 lo 两个接口的信息,具体说明如下:
① eth0:系统的第 1 个以太网卡,如果有第 2 个,则名称是 eth1,依此类推。
② lo:系统上的自回环接口。每个系统默认情况下都有一个自回环接口,用来测试网络
功能或用于自身访问。lo 接口的固定 IP 地址为 127.0.0.1。
③ Link encap:链路封装类型。
④ Hwaddr:以太网卡的硬件地址,固化在网卡上。每个网卡的硬件地址都不相同。
⑤ inet addr:该接口的 IP 地址。
⑥ Bcast:广播地址。
⑦ UP:说明该接口处于激活状态。
⑧ MTU:Maximum Transfer Unit,用来设置该接口的最大传输单位。
⑨ Metric:表示该接口的路由距离值。Routed 等路由软件将使用这一个距离值。距离值
越小,所代表的路由优先级越高。
⑩ RX packets:接收的数据包的总数、错误数、遗失数、超负载丢失数和帧校验错的个数。
 TX packets:传送的数据包的总数、错误数、遗失数、超负载丢失数和介质故障数。
 Interrupt:接口卡的中断号。
 Base address:接口卡的 I/O 地址。

10.3.2 设置接口

ifconfig 命令还可以用来更改接口的设置,如启动或关闭接口、设置接口的 IP 地址和子网掩码


等,设置接口的语法是:ifconfig <接口> <参数>。下面是几个常用的设置接口的 ifconfig 命令形式。
(1)ifconfig eth0 down
该命令用来关闭 eth0 接口。执行命令后,若再用 ifconfig 命令查看接口信息,将只显示
lo 的信息,如下所示:
[root@localhost test]# ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:450 errors:0 dropped:0 overruns:0 frame:0
TX packets:450 errors:0 dropped:0 overruns:0 carrier:0
第 10 章 常用网络调试软件的使用 ·223·

collisions:0 txqueuelen:0
RX bytes:40060 (39.1 Kb) TX bytes:40060 (39.1 Kb)
(2)ifconfig eth0 up
该命令用来启动 eth0 接口。执行命令后,再用 ifconfig 命令查看接口信息时,则显示全
部接口的信息,如下所示:
[root@localhost test]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:E0:4C:3A:48:4E
inet addr:10.0.1.5 Bcast:10.255.255.255 Mask:255.0.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3474970 errors:0 dropped:0 overruns:0 frame:0
TX packets:27901 errors:0 dropped:0 overruns:0 carrier:0
collisions:692 txqueuelen:100
RX bytes:3315373694 (3161.7 Mb) TX bytes:7416286 (7.0 Mb)
Interrupt:5 Base address:0x6000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:450 errors:0 dropped:0 overruns:0 frame:0
TX packets:450 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:40060 (39.1 Kb) TX bytes:40060 (39.1 Kb)
(3)ifconfig eth0<主机地址>
该命令用来设置 eth0 接口的 IP 地址,例如,用 ifconfig eth0 10.0.0.10 命令可以将当前计
算机的 IP 地址设为 10.0.0.10,这时若用 ifconfig eth0 命令查看 eth0 接口的信息,则显示新的
IP 地址,如下所示:
[root@localhost test]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:E0:4C:3A:48:4E
inet addr:10.0.0.10 Bcast:10.255.255.255 Mask:255.0.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3474970 errors:0 dropped:0 overruns:0 frame:0
TX packets:27901 errors:0 dropped:0 overruns:0 carrier:0
collisions:692 txqueuelen:100
RX bytes:3315373694 (3161.7 Mb) TX bytes:7416286 (7.0 Mb)
Interrupt:5 Base address:0x6000

10.4 用 route 命令设置和查看路由信息

设置好主机接口信息后,要想与其他子网上的主机进行通信,还必须设置路由信息。在
·224· Internet 应用协议实例剖析与服务器配置

Linux 上查看和设置路由信息可以通过 route 命令来实现。

10.4.1 查看路由信息

在命令状态下直接输入 route 命令即可查看路由信息,如下所示:


[root@localhost test]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.0 * 255.0.0.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default 10.0.0.1 0.0.0.0 UG 0 0 0 eth0
在显示的路由表中,共有 3 个路由项,其各个字段的含义如下:
① Destination:目的主机或网络地址。
② Gateway:该条路径所使用的网关, “*”表示没有设置。
③ Genmask:子网掩码。
④ Flags:标志。其中“U”表示该路由被激活, “H”表示该路由的目的地址为主机地
址,“G”表示正在使用的网关“D”表示动态路由。
⑤ Metric:该条路径的路由距离值。
⑥ Ref:该字段目前尚未使用。
⑦ Use:本路径被使用的次数。
⑧ Iface:该路径所使用的网络接口。

10.4.2 设置路由

route 命令既可以设置目的地址为主机地址的路由,也可以设置目的地址为网络地址的
路由。
1.设置目的地址为主机地址的路由
用来设置目的地址为主机的 route 命令的格式为:
route add –host 地址 [gw 网关] [metric cost] dev 接口
例如,下面的命令可设置目的地址为主机 20.0.0.1 的路由:
[root@localhost test]# route add -host 20.0.0.1 dev eth0 gw 10.0.0.254
此时再执行 route 命令,即可显示出新的路由信息,如下所示:
[root@localhost test]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Use Iface
20.0.0.1 10.0.0.254 255.255.255.255 UH 0 0 eth0
10.0.0.0 * 255.0.0.0 U 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 lo
default 10.0.0.1 0.0.0.0 UG 0 0 eth0
2.设置目的地址为网络地址的路由
用来设置目的地址为网络的 route 命令的格式为:
第 10 章 常用网络调试软件的使用 ·225·

route add –net 地址 [gw 网关] [metric cost] [netmask 掩码] dev 接口
例如:
[root@localhost test]# route add -net 10.10.10.0 netmask 255.255.255.0 dev eth0 gw
10.0.0.254
此时再执行 route 命令,即可显示出新的路由信息,如下所示:
[root@localhost test]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
20.0.0.1 10.0.0.254 255.255.255.255 UH 0 0 0 eth0
10.0.0.0 * 255.0.0.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
10.10.10.0 10.0.0.254 255.255.255.0 U 0 0 0 eth0
default 10.0.0.1 0.0.0.0 UG 0 0 0 eth0
3.设置默认路由
设置默认路由的 route 命令的格式为:
route add default gw 网关
例如,下名的命令将 IP 地址为 10.0.0.1 的主机设置为默认网关:
[root@localhost test]# route add default gw 10.0.0.1

10.4.3 删除路由

利用 route 命令可以将不再需要的路由删除,用来删除路由的 route 命令的格式为:


route del <目的地址>
例如,下面的命令可以删除目的地址为 20.0.0.1 的路由信息:
[root@localhost test]# route del 20.0.0.1
此时再执行 route 命令后,即可显示更改后的路由信息,如下所示:
[root@localhost test]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Use Iface
10.0.0.0 * 255.0.0.0 U 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 lo
10.10.10.0 10.0.0.254 255.255.255.0 U 0 0 eth0
default 10.0.0.1 0.0.0.0 UG 0 0 eth0

10.5 用 ping 命令测试网络连通状态

ping 命令通过检查网络中其他主机的应答信息,来确认网络的连通性,在网络出现故障
时可以通过显示的结果判断故障的基本类型,ping 命令的格式是:
ping [参数] 主机名/IP 地址
·226· Internet 应用协议实例剖析与服务器配置

Linux 系统中 ping 命令常用的参数说明见表 10-1。

表 10-1 Linux 系统中 Ping 命令常用的参数说明


参 数 说 明

-c count 设置发送 ICMP 信息的次数为 count,发送 count 次后自动停止

-s packetsize 设置每次发送的 ICMP 数据字节数

-i wait 设置发送 ICMP 信息的时间间隔

-R 显示所经过的路由信息(注意,最多显示 9 步)

在 Windows 系统中 ping 命令常用的参数说明见表 10-2。


表 10-2 Windows 系统中 Ping 命令常用的参数说明
参 数 说 明

-t 若使用者不人为中断则不断发送 ICMP 信息

-n count 要求 ping 命令连续发送 count 个 ICMP 信息

-i wait 设置发送 ping 信息的时间间隔

-r count 显示经过的 count 步路由信息,其中的 count 取值范围是从 1~9

下面是一个在 Linux 系统中使用 ping 命令的实例:


[root@localhost test]# ping -c 3 www.edu.cn
PING www.edu.cn (202.112.0.36) from 10.0.1.5 : 56(84) bytes of data.
64 bytes from galaxy.net.edu.cn (202.112.0.36): icmp_seq=1 ttl=247 time=39.3 ms
64 bytes from galaxy.net.edu.cn (202.112.0.36): icmp_seq=2 ttl=247 time=29.8 ms
64 bytes from galaxy.net.edu.cn (202.112.0.36): icmp_seq=3 ttl=247 time=31.7 ms
--- www.edu.cn ping statistics ---
3 packets transmitted, 3 received, 0% loss, time 2005ms
rtt min/avg/max/mdev = 29.881/33.674/39.399/4.121 ms
下面是一个在 Windows 系统中使用 ping 命令的实例:
C:\>ping -r 3 -n 1 www.sdie.edu.cn
Pinging www.sdie.edu.cn [218.98.166.6] with 32 bytes of data:
Reply from 218.98.166.6: bytes=32 time=7ms TTL=124
Route: 202.194.253.251 ->
202.194.240.68 ->
218.98.166.62
Ping statistics for 218.98.166.6:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 7ms, Maximum = 7ms, Average = 7ms
第 10 章 常用网络调试软件的使用 ·227·

10.6 用 netstat 命令显示网络状态

netstat 是一个监视网络状态的工具,可以观察网络活动的状况,常用来显示路由表、网
络接口及 TCP 连接等信息。
(1)查看路由表
用 netstat 命令查看路由表时需要使用-r 参数,例如:
[root@localhost test]# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.0.0.0 * 255.0.0.0 U 40 0 0 eth0
127.0.0.0 * 255.0.0.0 U 40 0 0 lo
default 10.0.0.1 0.0.0.0 UG 40 0 0 eth0
在显示的路由表项中,大部分字段已在 route 命令中介绍过,其他几个字段的含义如下:
① MSS,该接口可传送的最大数据段大小(Maximum Segment Size) 。
② irtt,irtt 是初始环程时间(Initial Round Trip Time)。在按照 TCP 协议将数据从源计算
机 A 传到目的计算机 B 时,B 计算机在收到一个数据包后会回传确认信息给 A 计算机,而 A
计算机收到确认后就知道 B 计算机确实收到了数据。如果 A 计算机经过一段等待时间后还没
有收到 B 计算机的确认,则会重新传送数据。这个等待时间就是环程时间。该时间太长会浪
费时间,太短会传送太多不必要数据。
③ Window,TCP 窗口大小(Windows Size) 。
④ Iface,接口(Interface) 。
(2)查看接口
用 netstat 命令查看接口信息时需要使用-i 参数,例如:
[root@localhost test]# netstat -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 0 3478547 0 0 0 29991 0 0 0 BM RU
lo 16436 0 450 0 0 0 450 0 0 0 LR U
其中,有些字段在前面部分介绍过,其他几个字段的含义如下:
① RX-OK、TX-OK,为收到、发送的正确的数据包的数目。
② RX-ERR、TX-ERR,为收到、发送的错误的数据包的数目。
③ RX-DRP、TX-DRP,为收到、发送的丢弃的数据包的数目。
④ RX-OVR、TX-OVR,为收到、发送的超负载丢失的数据包的数目。
(3)查看 TCP 连接
用 netstat 命令查看当前的 TCP 连接状况时需要使用-t 参数,例如:
[root@localhost test]# netstat -t
Active Internet connections (w/o servers)
·228· Internet 应用协议实例剖析与服务器配置

Proto Recv-Q Send-Q Local Address Foreign Address State


tcp 0 126 10.0.1.5:telnet 10.0.0.5:1272 ESTABLISHED
在显示的 TCP 连接信息表中,只有一个连接行,表示目前只存在一个 TCP 连接。连接
信息表中各字段的含义如下:
① Proto,该连接所使用的协议。
② Recv-Q,在接收队列中的数据量。
③ Send-Q,在传送队列中的数据量。
④ Local Address,本地主机使用的地址和端口号。
⑤ Foreign Address,远端主机使用的地址和端口号。
⑥ State,目前的连接状况。

10.7 用 traceroute 命令显示经过的网关

当本机与其他主机通信时,traceroute 可以用来检测数据包所通过的路径中包含哪些网关
及其迟延时间。如果本机与某网络的连接出现故障,该命令还可以跟踪到发生问题的大概位
置。若在 traceroute 命令中使用-n 参数,则显示信息时不将 IP 地址将不转换为名字,例如:
[root@localhost test]# traceroute www.sdu.edu.cn -n
traceroute to www.sdu.edu.cn (202.194.15.22), 30 hops max, 38 Byte packets
1 10.0.0.1 0.240 ms 0.178 ms 0.174 ms
2 202.194.252.254 0.750 ms 0.667 ms 1.951 ms
3 202.194.240.69 4.139 ms 5.015 ms 4.953 ms
4 202.194.96.61 0.974 ms 0.965 ms 0.973 ms
5 202.112.53.221 0.824 ms 0.826 ms 0.820 ms
6 202.194.96.194 0.754 ms 0.737 ms 0.731 ms
7 ***
8 202.194.15.22 1.162 ms 0.887 ms 0.872 ms
该例说明,从本机到达目的主机 www.sdie.edu.cn 共经过了 8 步,其中第 7 步中的“* * *”
表示该步经过的网关没有响应。再如下例:
[root@localhost test]# traceroute www.redhat.com -n
traceroute to www.redhat.com (66.187.232.50), 30 hops max, 38 Byte packets
1 202.194.240.69 3.696 ms 5.040 ms 4.663 ms
2 202.194.96.61 0.568 ms 0.544 ms 0.539 ms
3 202.112.53.221 0.434 ms 0.396 ms 0.638 ms
4 202.112.46.229 11.536 ms 11.385 ms 11.439 ms
5 202.112.36.225 28.234 ms 28.523 ms 28.407 ms
6 202.112.61.197 28.452 ms 28.284 ms 28.590 ms
7 203.222.39.185 67.029 ms 66.618 ms 66.864 ms
第 10 章 常用网络调试软件的使用 ·229·

8 203.222.38.41 66.820 ms 68.942 ms 67.349 ms


9 144.232.20.195 229.852 ms 229.741 ms 229.182 ms
10 144.232.9.150 230.602 ms 231.012 ms 230.988 ms
11 144.232.6.90 230.760 ms 369.372 ms 246.195 ms
12 192.205.32.173 230.542 ms 230.603 ms 230.636 ms
13 12.123.44.130 232.460 ms 231.943 ms 232.043 ms
14 12.122.12.113 231.707 ms 229.494 ms 229.904 ms
15 12.122.9.137 229.650 ms 229.730 ms 229.779 ms
16 12.122.10.41 275.407 ms 275.416 ms 275.177 ms
17 12.122.10.65 288.684 ms 289.148 ms 288.834 ms
18 12.122.9.150 289.413 ms 290.747 ms 290.533 ms
19 12.122.3.61 294.501 ms 295.224 ms 294.614 ms
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
本 例 中 , 自 第 20 步 开 始 , 就 没 有 了 相 关 的 网 关 信 息 , 说 明 在 本 机 和 目 的 主 机
www.redhat.com 之间在 12.122.3.61 后网络通信出了故障。

10.8 用 arp 命令操作 ARP 缓存

ARP 是一个重要的 TCP/IP 协议簇成员,用于确定 IP 地址与物理地址的对应关系,使用


arp 命令,能够查看或改变本地计算机 ARP 缓存中的内容。
(1)查看 ARP 缓存中的所有项
在 Linux 系统下直接执行 arp 命令, 即可显示 ARP 缓存中存在的 IP 地址与物理地址的关
系,如下所示:
[root@localhost test]# arp
Address HWtype HWaddress Flags Mask Iface
10.0.0.5 ether 00:E0:4C:3A:BA:62 C eth0
若在 Windows 下使用 arp 命令查看 ARP 缓存,需使用-a 参数,如下所示:
C:\WINDOWS>arp -a
·230· Internet 应用协议实例剖析与服务器配置

Interface: 10.0.0.5 on Interface 0x1000002


Internet Address Physical Address Type
10.0.2.40 00-e0-4c-3a-44-18 dynamic
(2)向 ARP 缓存中加入一个静态项
向 ARP 缓存中加入一个静态项的命令格式为:arp -s <IP> <物理地址>,如下例所示:
在 Linux 系统下,
[root@localhost test]# arp -s 10.0.2.40 00:E0:4C:3A:44:18
此时再查看 ARP 缓存时,就可看到新增的静态项,如下所示:
[root@localhost test]# arp
Address HWtype HWaddress Flags Mask Iface
10.0.2.40 ether 00:E0:4C:3A:44:18 CM eth0
10.0.0.5 ether 00:E0:4C:3A:BA:62 C eth0
在 Windows 系统下,物理地址的格式有所不同,此时上例中操作变为如下形式:
C:\WINDOWS>arp -s 10.0.2.40 00-e0-4c-3a-44-18
C:\WINDOWS>arp -a
Interface: 10.0.0.5 on Interface 0x1000002
Internet Address Physical Address Type
10.0.0.2 00-00-e8-ee-09-f1 dynamic
10.0.2.40 00-e0-4c-3a-44-18 static
(3)删除一个静态项
在 Linux 系统下删除一个静态项的命令格式为:arp -d <IP>,如下例所示:
[root@localhost test]# arp -d 10.0.2.40
此时再查看 ARP 缓存时,就可看到相应的静态项已被删除,如下所示:
[root@localhost test]# arp
Address HWtype HWaddress Flags Mask Iface
10.0.0.5 ether 00:E0:4C:3A:BA:62 C eth0
在 Windows 系统删除静态项的命令格式与在 Linux 系统下是一样的,这里就不再具体举
例说明。

You might also like