commit 98fc5274eed51e37efd89626be23fd5adac122e9 Author: Xphi Date: Sun Feb 21 10:15:12 2021 +0800 首次提交 diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..ad7bd80 --- /dev/null +++ b/Readme.md @@ -0,0 +1,32 @@ +# 计算机网络 共同实验指导书 + +## 1. 概述 + +计算机网络共同实验指导书是由计算机网络教案社区发起, +配合社区网络教案,由各高校专家教授共同联合编纂的一份实验指导材料。 + +本项目工程包含了“计算机网络共同实验指导书”使用的各类相关文件。 + +## 2. 目录结构 + +项目根目录下的目录功能如下: + +* data:实验指导书分章节内容 +* figure:用到的图片 +* bib:参考文献 + +## 3. 编译 + +1. Windows 环境下,需要安装最新版texlive套件,然后在工程目录下运行以下命令编译: + + ```shell + compile.bat + ``` + +2. MacOS 环境下,需要安装MacTex套件,然后编译。 + +3. Linux 环境下,需要安装texlive套件,然后编译。 + +## 4. 说明 + +项目主要结构参考了“Q-book LaTeX书籍模板”的早期版本。 diff --git a/bib/main.bib b/bib/main.bib new file mode 100644 index 0000000..11f6c7a --- /dev/null +++ b/bib/main.bib @@ -0,0 +1,192 @@ +%# -*- coding: utf-8-unix -*- +@article {EK85, + AUTHOR = {Ed Turner and Karen Gold}, + TITLE = {Rubik's groups}, + JOURNAL = {\textbf{\textit{American Mathematical Monthly}}}, + VOLUME = {92}, + NUMBER = {9}, + PAGES = {617-629}, + YEAR = {1985} +} + +@article {G03, + AUTHOR = {Gabriel Navarro}, + TITLE = {On the fundamental theorem of finite abelian groups}, + JOURNAL = {\textbf{\textit{American Mathematical Monthly}}}, + VOLUME = {110}, + NUMBER = {2}, + PAGES = {153-154}, + YEAR = {2003} +} + +@article {G64, + AUTHOR = {Gert Sabidussi}, + TITLE = {Vertex-transitive graphs}, + JOURNAL = {\textbf{\textit{Monatshefte fur Mathematik}}}, + VOLUME = {68}, + NUMBER = {5}, + PAGES = {426-438}, + YEAR = {1964} +} + +@article {BDC64, + AUTHOR = { B.A. Kennedy and D.A. McQuarrie and Jr,C.H. Brubaker }, + TITLE = {Group theory and isomerism}, + JOURNAL = {\textbf{\textit{Inorganic Chemistry}}}, + VOLUME = {3}, + NUMBER = {2}, + PAGES = {265-268}, + YEAR = {1964} +} + +@book{U05, + title = {\textbf{\textit{International Tables for Crystallography}}}, + publisher = {Springer}, + year = {2005}, + edition = {5th edition}, + author = { Uri Shmueli}, + volume={ A} +} + +@book{D65, + title = {\textbf{\textit{Molecular Symmetry}}}, + publisher = {D. Van Nostrand}, + year = {1965}, + adress={London}, + author = { David S. Schonland} +} + +@book{ST69, + title = {\textbf{\textit{Theory of Groups and its Application to + Physical Problems}}}, + publisher = { Academic Press}, + year = {1969}, + author = {S. Bhagavantam and T. Venkatarayudu}, + address={ New York} +} + +@book{D07, + title = {\textbf{\textit{Music: a Mathematical Offering}}}, + publisher = { Cambridge University Press}, + year = {2007}, + author = { David J. Benson}, + address={Cambridge CB2 2RU, UK} +} + +@book{C78, + title = {\textbf{\textit{Field Theory and its Classic Problems}}}, + publisher = {Mathematical Association of America}, + year = {1978}, + author = { Charles Robert Hadlock}, + series={Number 19 in + Carus Mathematical Monographs} +} + +@book{WI64, + title = {\textbf{\textit{ Groups and their Graphs}}}, + publisher = {Mathematical Association of America}, + year = {1964}, + author = { Wilhelm Magnus and Israel Grossman}, + series={Anneli Lax New + Mathematical Library} +} + +@book{HBE02, + title = {The SmallGroups library + —— a GAP package}, + year = {2002}, + author = { Hans Ulrich Besche and Bettina Eick and Eamonn O'Brien} +} + +@book{JS03, + title = {Classification of finite abelian groups}, + publisher={ Course notes available on + the World Wide Web}, + year = {2003}, + author = { John M. Sullivan} +} + +@book{P88, + title = {\textbf{\textit{Group representations in probability and statistics}}}, + publisher = { Academic Press}, + year = {1988}, + author = { Persi Diaconis}, + address={ Institute of Mathe- + matical Statistics, Hayward, CA}, + series={Institute of + Mathematical Statistics Lecture Notes——Monograph Series,11} + +} + + + +@online {J05, + AUTHOR = {Jonathan Goss}, + TITLE = {Point group symmetry}, + URL = {www.phys.ncl.ac.uk/staff/njpg/symmetry/}, + YEAR = {2005} + +} + +@online {L03, + AUTHOR = {Larry Copes}, + TITLE = {Representations of contra dance moves}, + URL = { www.edmath.org/copes/contra/representations.html}, + YEAR = {2003} + +} + +@online {I03, + AUTHOR = { Ivars Peterson}, + TITLE = { Contra dances, matrices, and groups}, + URL = {www.sciencenews.org/articles/20030308/mathtrek.asp}, + YEAR = {2003} + +} + + +@book{M91, + author = {Michael Artin}, + title = { \textbf{\textit{Algebra}}}, + publisher = {Prentice Hall}, + address = { Englewood Cliffs, NJ}, + year = {1991} + +} + +@book{J02, + title = {\textbf{\textit{A First Course in Abstract Algebra}}}, + publisher = {Addison-Wesley}, + address = { Reading, MA}, + year = {2002}, + edition = {seventh edition}, + author = { John B. Fraleigh} +} + +@book{D01, + title = {\textbf{\textit{Solved and Unsolved Problems in Number Theory}}}, + publisher = {American + Mathematical Society Chelsea Publishing}, + address = { Providence, RI}, + year = {2001}, + edition = {fourth edition}, + author = { Daniel Shanks} +} + +@book{J04, + title = {\textbf{\textit{Contemporary Abstract Algebra}}}, + publisher = {Houghton Mifflin Company}, + year = {2004}, + author = { Joseph Gallian} +} + +@book{E30, + title = {\textbf{\textit{Algebraic Equations, An Introduction to the Theories of Lagrange + and Galois}}}, + publisher = {Columbia University Press}, + year = {1930}, + author = { Edgar Dehn}, + adress={New York} +} + + diff --git a/compile.bat b/compile.bat new file mode 100644 index 0000000..846faf9 --- /dev/null +++ b/compile.bat @@ -0,0 +1,63 @@ +@echo off +chcp 65001 >nul + +set flag=%1 +if %flag%x == x ( + set flag=instr +) + +if %flag%x == instrx ( + call :cleanall + call :instr + if ERRORLEVEL 1 ( + echo Error! Please check the 'instructions.log' for more details... + pause + ) else ( + call :clean + echo Finished! + ) + goto :EOF +) + +if %flag%x == cleanx ( + call :clean + goto :EOF +) + +if %flag%x == cleanallx ( + call :cleanall + goto :EOF +) + +:help + echo This is the compile batch script for CNAP Instructions. + echo Usage: + echo make.bat [option] + echo options: + echo instr Compile the instructions book (default) + echo clean Clean all work files + echo cleanall Clean all work files and generated pdf + echo help Print this help message +goto :EOF + +:instr + echo Compile... + latexmk -xelatex -halt-on-error -silent instructions >nul 2>nul +goto :EOF + +:clean + echo Clean files... + latexmk -c -silent 2>nul + del tex\*.aux >nul 2>nul +goto :EOF + +:cleanall + echo Clean files... + latexmk -C -silent 2>nul + del tex\*.aux >nul 2>nul + if exist instructions.pdf ( + echo Close the file: instructions.pdf! + pause + call :cleanall + ) +goto :EOF diff --git a/data/appendix1.tex b/data/appendix1.tex new file mode 100644 index 0000000..6fc1459 --- /dev/null +++ b/data/appendix1.tex @@ -0,0 +1,248 @@ +%# -*- coding: utf-8-unix -*- + +\chapter{华为网络仿真平台ENSP简介} +\label{app:ENSP} + +掌握华为ENSP软件的安装、操作和使用;熟悉华为模拟设备的基本配置及其配置命令; +掌握常见问题的解决方法。 + +\subsection{本地安装华为ENSP软件} +可在本机安装华为ENSP软件。 +安装版本如选择的是华为ENSP17年版本的,则安装包里自带所需软件, +则无需另行下载,默认4款软件全部安装; +如选择的是华为ENSP最新版即19年的版本, +在安装之前须自行下载安装以下3款软件且最好版本号一致: + +\begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{a1_ENSP-version} + \caption{TCP连接示意时序} + \label{fig:a1_ENSP-version} +\end{figure} + +\textbf{安装注意事项:}先装3款基础软件后再安装华为ENSP, +所有安装都建议默认安装,最好不要更改安装盘,更不要设置中文安装目录, +否则可能使用时会出现问题,则只能重装。 + +\subsection{华为ENSP操作和使用} +华为ENSP的操作和使用,强烈建议查看其帮助,并不断实践,如图: +\begin{figure}[!htp] + \centering + \includegraphics[width=13cm]{a1_ENSP-UI} + \caption{华为ENSP界面} + \label{fig:a1_ENSP-version} +\end{figure} + +\begin{figure}[!htp] + \centering + \includegraphics[width=13cm]{a1_ENSP-help} + \caption{华为ENSP帮助界面} + \label{fig:a1_ENSP-version} +\end{figure} + + \subsection{华为模拟设备的基本配置及其配置命令} +命令行接口是用户对命令行使用的常用工具。 +通过命令行接口输入命令,您可以对交换机进行配置和管理。 +用户登录到交换机出现命令行提示符后, +即进入命令行接口CLI(Command Line Interface)。 +命令行接口是用户与交换机进行交互的常用工具。 +系统向用户提供一系列命令, +用户可以通过命令行接口输入命令,对交换机进行配置和管理。 + +\subsubsection{命令视图} + +命令视图就是执行命令行的界面环境。 +系统的所有命令都注册在某个(或某些)命令视图下, +只有在相应的视图下才能执行该视图下的命令。 + +\begin{table}[!htp] + \centering + \caption{命令视图分类表} + \label{tab:c1_tools-command} + \begin{tabular}{m{5cm}<{\centering}m{6cm}<{\centering}} \toprule + 视图 & 表现形式\\ \midrule + 用户视图(缺省配置) & \texttt{}\\ + 系统视图 & \texttt{[Quidway]}\\ + 接口视图 & \texttt{[Quidway-ethernetX]}\\ + VLAN视图 & \texttt{[Quidway-VLANX]}\\ \bottomrule + \end{tabular} +\end{table} + +\begin{itemize} + \item 与交换机建立连接,如果此交换机是缺省配置,则进入用户视图,在屏幕上显示: + \begin{code}[text] + + \end{code} + \item 键入system-view后回车,进入系统视图。 + \begin{code}[text] + system-view + [Quidway] + \end{code} + \item 在系统视图下键入interface ethernetX/Y/Z,则可进入interface视图。 + \begin{code}[text] + [Quidway] interface ethernetX/Y/Z + [Quidway-ethernetX/Y/Z] + \end{code} + \item 返回到系统视图 + \begin{code}[text] + [Quidway-ethernetX/Y/Z] quit + \end{code} + \item 在系统视图下键入VLAN XX,则可进入VLAN视图。 + \begin{code}[text] + [Quidway] VLAN 10 + [Quidway-VLAN10] + \end{code} + \item 返回到系统视图 + \begin{code}[text] + [Quidway-VLAN10]quit + [Quidway] + \end{code} +\end{itemize} + +说明:命令行提示符“Quidway”是缺省的主机名(sysname)。 +通过提示符可以判断当前所处的视图,例如:“<>”表示用户视图, +“[]”表示除用户视图以外的其它视图。 + +\subsubsection{命令行操作基本技巧} + +如果需要联机帮助可以随时键入“?”。 + +Ctrl+Z:(在其他模式下)保存设置并退出到特权模式 + +Tab键的功用:完成一个命令的输入。在超级终端中,可能不支持某些组合键。 + +\textbf{注:}在不引起歧义的情况下,命令和参数均可以缩写 + +\textbf{在线帮助} + +输入命令行或进行配置业务时,在线帮助可以提供在配置手册之外的实时帮助。 +命令行接口提供如下三种在线帮助: + +\begin{itemize} + \item 完全帮助 + \item 部分帮助 + \item 命令行错误信息 +\end{itemize} + +\begin{table}[!htp] + \centering + \caption{帮助类型与对应命令表} + \label{tab:c1_tools-command} + \begin{tabular}{m{2cm}<{\centering}m{5cm}<{\centering}m{6cm}<{\centering}} \toprule + 帮助类型 & 表现形式 & 备注\\ \midrule + \multirow{2}{*}{完全帮助} & \texttt{?} & 相应命令模式下\\ + & \texttt{[Quidway] sysname ?} & 键入命令,后接以空格分隔的“?”\\\midrule + 部分帮助 & \texttt{d?} & 键入一字符串,其后紧接“?”,列出以该字符串开头的所有关键字\\\midrule + 命令行错误信息 & & 如未通过语法检查则系统会向用户报告错误信息\\ \bottomrule + \end{tabular} +\end{table} + +\begin{enumerate} + \item \textbf{完全帮助} + + 应用完全帮助,系统可以协助您在输入命令行时,给予全部关键字或参数的提示。 + 命令行的完全帮助可以通过以下3种方式获取: + 在所有命令视图下,键入“?”获取该命令视图下所有的命令及其简单描述。 + \begin{code}[text] + ? + \end{code} + + 键入命令,后接以空格分隔的“?”,如果该位置为关键字,则列出全部关键字及其描述。 + 举例如下。 + \begin{code}[text] + [Quidway-ui-vty0] authentication-mode ? + aaa AAA authentication + none Login without checking + password Authentication through the password of a user terminal interface + [Quidway-ui-vty0] authentication-mode aaa ? + + [Quidway-ui-vty0] authentication-mode aaa + \end{code} + + 其中aaa、none和password是关键字, + AAA authentication、 + Login without checking和Authentication through the password of a user terminal interface + 是对关键字的分别描述。 + 表示该位置没有关键字或参数,在紧接着的下一个命令行该命令被复述, + 直接键入回车即可执行。 + 键入命令,后接以空格分隔的“?”,如果该位置为参数, + 则列出有关的参数名和参数描述。举例如下。 + + \begin{code}[text] + system-view + [Quidway] sysname ? + \end{code} + + \begin{code}[text] + TEXT Host name(1 to 246 characters) + \end{code} + + 其中TEXT是参数名,Host name(1 to 246 characters)是对参数的描述。 + + \item 部分帮助 + + 应用部分帮助,系统可以协助您在输入命令行时, + 给予以该字符串开头的所有关键字或参数的提示。 + + 背景信息 + + 命令行的部分帮助可以通过以下三种方式获取。 + + 操作步骤 + + 键入一字符串,其后紧接“?”,列出以该字符串开头的所有关键字。 + + \begin{code}[text] + d? + debugging delete + dir display + \end{code} + + 键入一命令,后接一字符串紧接“?”,列出命令以该字符串开头的所有关键字。 + \begin{code}[text] + display b? + Bfdbgp + Bootrombpdu + bpdu-tunnel buffer + \end{code} + + 输入命令的某个关键字的前几个字母,按下键, + 可以显示出完整的关键字,前提是这几个字母可以唯一标示出该关键字, + 否则,连续按下键,可出现不同的关键字,用户可以从中选择所需要的关键字。 + +\item 命令行错误信息 + + 所有用户键入的命令,如果通过语法检查,则正确执行, + 否则系统将会向用户报告错误信息。常见错误信息参见下表: + + \begin{table}[!htp] + \centering + \caption{命令行常见错误信息表} + \label{tab:c1_tools-command} + \begin{tabular}{m{4cm}<{\centering}m{5cm}<{\centering}} \toprule + 英文错误信息 & 错误原因\\ \midrule + \multirow{2}{*}{Unrecognized command} & 没有查找到命令\\ + & 没有查找到关键字\\\midrule + \multirow{2}{*}{Wrong parameter} & 参数类型错\\ + & 参数值越界\\\midrule + Incomplete command & 输入命令不完整\\\midrule + Too many parameters & 输入参数太多\\\midrule + Ambiguous command & 输入命令不明确\\ \bottomrule + \end{tabular} + \end{table} + + \textbf{注意:}可以用display cur检查当前系统中已经配置的命令。 + 如果命令输出过多,显示一屏幕后会暂停, + 这时可以用空格键翻页,用q或者ctrl+c退出。 +\end{enumerate} + + \subsection{常见问题的解决方法} + + 模拟器毕竟是模拟的,有问题是难免的,如下图令人崩溃的设备启动后进入命令配置界面的等待。如长时间都不能正常工作,建议新建一台设备,如正常后替代失常设备,重新连线。就本人多年指导经验,各种问题会小概率出现,默认重装,更换版本则解决地较为彻底。 + + \begin{figure}[!htp] + \centering + \includegraphics[width=10cm]{a1_error} + \caption{令人崩溃的等待} + \label{fig:a1_error} +\end{figure} diff --git a/data/chapter1/preface.tex b/data/chapter1/preface.tex new file mode 100644 index 0000000..79ce111 --- /dev/null +++ b/data/chapter1/preface.tex @@ -0,0 +1,9 @@ +%# -*- coding: utf-8-unix -*- + +\chapter{网络抓包与协议分析} +\label{chap:wireshark} + +本单元实验要求学生能熟练使用Wireshark软件,捕捉、分析有线和无线网络数据包, +掌握以太网、802.11、ARP、IP、ICMP和TCP等重要协议传输单元结构, +深入理解相关网络命令和重要协议算法的工作原理, +从而培养网络故障检测、网络性能改进和网络安全分析的能力。 diff --git a/data/chapter1/section1.tex b/data/chapter1/section1.tex new file mode 100644 index 0000000..473ab43 --- /dev/null +++ b/data/chapter1/section1.tex @@ -0,0 +1,298 @@ +%# -*- coding: utf-8-unix -*- + +\section{Wireshark软件使用与ARP分析} +\label{sec:c1_s1} + +\subsection{实验目的} +\label{subsec:c1_s1_object} + +本实验旨在让学生掌握Wireshark的基本操作,使用捕获过滤器和显示过滤器, +抓取和分析有线局域网的数据包;掌握以太网MAC帧的基本结构,掌握ARP协议的特点及工作过程。 + +\subsection{实验内容} +\label{subsec:c1_s1_content} + +练习使用Wireshark抓取相关有线局域网的数据包并进行分析。 + +\begin{enumerate} + \item \textbf{熟悉Wireshark界面、基本设置和使用方法:} + 熟悉菜单、工具栏和主窗口,根据自己需要设置Wireshark视图; + 学习使用捕获过滤器和显示过滤器;捕获有线局域网的数据包并保存 + \item \textbf{MAC地址:}了解MAC地址的组成,查看其OUI信息。 + \item \textbf{分析以太网帧结构:}观察以太网帧的首部和尾部, + 了解数据封装成帧的过程,计算帧长度。 + \item \textbf{差错检测,FCS计算检验:}计算帧尾校验和, + 并用抓包数据文件进行验证。 + \item \textbf{ARP协议分析:}取ARP请求和应答报文,分析其工作过程。 +\end{enumerate} + +\subsection{实验原理} +\label{subsec:c1_s1_principle} + +\subsubsection{Wireshark简介} + +Wireshark软件是目前全球使用最广泛的开源网络数据包分析工具(前身为Ethereal), +由Gerald Combs编写并于1988年获开源许可发布。 +网络数据包分析是指进入网络通信系统、 +捕获和解码网络上实时传输数据以及搜集统计信息的过程。 +通过Wireshark对网络数据进行分析, +我们能够了解网络是如何运行的、数据包是如何被转发的、应用是如何被访问的; +能够分析各层网络协议的性能、掌握通信主体的运行情况, +确认带宽分配和时延大小、查看应用的快慢并改进优化, +识别网络中存在的攻击或恶意行为、解决网络异常和故障。 +Wireshark可以在Windows、Linux和MacOS操作系统中运行, +具备友好的图形界面、丰富的统计及图表分析功能。 + +\subsubsection{以太网MAC帧格式} + +本实验基于使用最广泛的有线局域网(以太网Ethernet II), +以太网的帧结构如表\ref{tab:c1_eth-format}所示。 +其中,MAC地址(Media Access Control Address,媒体存取控制位址)或称物理地址(Physical Address), +用于在网络中标识网卡。MAC地址的长度为48位(6个字节), +通常表示为12个16进制数,如:00-16-EA-AE-3C-40。 +其中前3个字节的16进制数00-16-EA代表网络硬件制造商的编号、即组织唯一标志符(OUI), +它由IEEE分配; +而后3个字节的16进制数AE-3C-40代表该制造商所生产的某个网络产品(如网卡)的系列号。 + +\begin{table}[!hpb] + \centering + \caption{以太网帧格式} + \label{tab:c1_eth-format} + \begin{tabular}{cccccc} \toprule + 前导字符 & 目的MAC地址 & 源MAC地址 & 类型 & IP数据报 & 帧校验\\ \midrule + 8字节 & 6字节 & 6字节 & 2字节 & & 4字节 \\ \bottomrule + \end{tabular} +\end{table} + +\subsubsection{ARP协议及数据报格式} +地址解析协议(Address Resolution Protocol,ARP), +主要作用是将IP地址解析为MAC地址。当某主机或网络设备要发送数据给目标主机时, +必须知道对方的网络层地址(即IP地址),而且在数据链路层封装成帧时, +还必须有目标主机(或下一跳路由器)的MAC地址。 +本实验重点观察最简单的情形: +同一个网段内,主机A要向主机B发送信息时, +ARP解析的过程(主机A和B不在同一网段的情况请参阅课本相关内容)。具体如下: + +\begin{enumerate} + \item 主机A首先查看自己的ARP表。如果找到了主机B的MAC地址, + 则利用这个地址对IP数据报进行帧封装,并将数据报发送给主机B。 + \item 如果主机A在ARP表中找不到主机B的MAC地址,则以广播方式发送一个ARP请求报文。 + ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址, + 目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。 + 由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求, + 但只有被请求的主机(即主机B)会对该请求进行处理。 + \item 主机B比较自己的IP地址和ARP请求报文中的目标IP地址, + 当两者相同时进行如下处理: + 将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。 + 然后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。 + \item 主机A收到ARP响应报文后, + 将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发, + 同时将IP数据报进行封装后发送出去。 +\end{enumerate} + +ARP报文结构如图\ref{fig:c1_arp-format}所示, +ARP报文总长度为28字节,MAC地址长度为6字节, +IP地址长度为4字节。每个字段的含义如下: + +\begin{itemize} + \item \textbf{硬件类型:}指明了发送方想知道的硬件接口类型,以太网的值为1。 + \item \textbf{协议类型:}表示要映射的协议地址类型。IP 地址的类型值为0x0800。 + \item \textbf{硬件地址长度和协议地址长度:}分别指出硬件地址和协议地址的长度, + 以字节为单位。在以太网中,它们的值分别为6和4。 + \item \textbf{操作码(op):}用来表示这个报文的类型, + ARP 请求为1,ARP 响应为2,RARP 请求为3,RARP 响应为4。 +\end{itemize} + +\begin{figure}[!htp] + \centering + \includegraphics[width=9cm]{c1_arp-format} + \caption{ARP报文结构示意图} + \label{fig:c1_arp-format} +\end{figure} + +\subsubsection{实验方法及手段} + +本实验借助Wireshark软件在有线局域网中捕捉相关网络操作的数据包, +运用观察对比、计算验证、分析统计等方法, +掌握以太网MAC帧和IP数据报的结构以及ARP协议的工作过程。 + +\subsection{实验条件} +\label{subsec:c1_s1_requirement} + +\begin{itemize} + \item 装有Wireshark软件的PC机一台(Windows或Linux操作系统); + \item 处于局域网环境。Wireshark建议3.0及以上。 +\end{itemize} + +\subsection{实验步骤} +\label{subsec:c1_s1_procedure} + +\subsubsection{WireShark基本使用} + +\begin{enumerate} + \item 通过Wireshark官网下载最新版软件,按默认选项安装。 + \item 运行Wireshark软件,程序界面会显示当前的网络接口列表, + 选择要抓取的网络接口,双击开始抓包, + Wireshark软件选择网络接口的界面如图\ref{fig:c1_wireshark-boot-ui}所示。 + + \begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{c1_wireshark-boot-ui} + \caption{Wireshark软件启动界面} + \label{fig:c1_wireshark-boot-ui} + \end{figure} + + \item 点击工具栏上红色的stop按钮停止抓包。 + \item 菜单、工具栏、状态栏和主窗口如图\ref{fig:c1_wireshark-main-ui}所示, + 可以根据自己需要通过菜单“视图”以及“编辑/首选项/外观”的相关选项对基本设置进行更改。 + 例如图\ref{fig:c1_wireshark-setup-ui}中的语言、字体缩放、颜色、布局等项目。 + + \begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{c1_wireshark-main-ui} + \caption{Wireshark主窗口界面} + \label{fig:c1_wireshark-main-ui} + \end{figure} + + \begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{c1_wireshark-setup-ui} + \caption{Wireshark的设置界面} + \label{fig:c1_wireshark-setup-ui} + \end{figure} + + \item 使用“显示过滤器”可以方便地从捕获的数据包中筛选出我们想要观察的某些数据包信息。 + 显示过滤器支持若干的过滤选项: + 源MAC、目的MAC、源IP、目的IP、TCP/UDP传输协议、 + 应用层协议(HTTP, DHCP)、源端口Port、目的端口Port等。 + 在显示过滤器栏中输入过滤表达式(图\ref{fig:c1_wireshark-filters}), + 例如下面的命令: + 更详细的显示过滤语法可以查看WireShark的官方文档 + \footnote{ + \href{https://www.wireshark.org/docs/wsug_html_chunked/ChWorkBuildDisplayFilterSection.html} + {WireShark显示过滤器语法} + }。 + + \begin{itemize} + \item \texttt{arp} \hfill \textit{//显示arp协议报文} + \item \texttt{ip.src == a.b.c.d \&\& icmp} \hfill \textit{//显示源地址为a.b.c.d的icmp报文} + \end{itemize} + + \begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{c1_wireshark-filters} + \caption{显示过滤规则的示例} + \label{fig:c1_wireshark-filters} + \end{figure} + + \item 通过主菜单“文件”/“导出特定分组”(如图\ref{fig:c1_wireshark-save}), + 可以保存抓取的网络数据(也可以先选中某个包,只保存部分数据)。 + + \begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{c1_wireshark-save} + \caption{操作主菜单保存数据文件} + \label{fig:c1_wireshark-save} + \end{figure} + + \item 如果只抓取特定的数据包, + 可以使用菜单“捕获”/”捕获过滤器”选定想要的类型 + (如图\ref{fig:c1_wireshark-special-type})。 + 例如,选择“IPv4 only”,Wireshark只抓取ipv4类型的数据包。 + Wireshark过滤器官方文档提供了更加全面详细的语法和常用示例 + \footnote{\href{https://wiki.wireshark.org/CaptureFilters/\#Useful_Filters} + {WireShark常用过滤器语法}}。 + + \begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{c1_wireshark-special-type} + \caption{选中特定的捕获类型} + \label{fig:c1_wireshark-special-type} + \end{figure} + + \item Wireshark还提供了丰富的统计功能供用户选用, + 如图\ref{fig:c1_wireshark-statistic}。 + 更多文档可以查询Wireshark使用帮助 + \footnote{\href{https://www.wireshark.org/\#learnWS}{WireShark学习手册}}。 + + \begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{c1_wireshark-statistic} + \caption{统计功能} + \label{fig:c1_wireshark-statistic} + \end{figure} +\end{enumerate} + +\subsubsection{查看OUI信息} +查看本机MAC地址字段,查看OUI信息,搜索各厂商的OUI进行验证。 +\subsubsection{分析以太网的帧结构} +选择其中一个数据包,点击Ethernet II展开(图\ref{fig:c1_eth-frame-detail}), +查看MAC帧的各个字段。计算帧的长度,并与Wireshark的分析结果比较。 +同时查看比较广播帧和单播帧的异同。 + +\begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{c1_eth-frame-detail} + \caption{以太网帧结构展开界面} + \label{fig:c1_eth-frame-detail} +\end{figure} + +\subsubsection{差错检测,FCS计算检验} +计算以太网帧的尾部校验和,并与Wireshark显示数值进行比较验证。 +\subsubsection{ARP协议分析} +\begin{enumerate} + \item 使用\texttt{arp –d}命令(其语法见图\ref{fig:arp-cmd}),清空本机已有的ARP缓存, + 开启Wireshark,ping本机的同网段地址,在显示过滤器条框中输入“\texttt{arp}”, + 观察捕获的ARP报文的各个字段,分析请求/响应的过程。 + \begin{figure}[!htp] + \centering + \begin{code}[text] +arp [-a [InetAddr] [-N IfaceAddr]] [-g [InetAddr] [-N IfaceAddr]] + [-d InetAddr [IfaceAddr]] [-s InetAddr EtherAddr [IfaceAddr]] + + -a显示所有接口/特定接口的当前 ARP 缓存表。 + -g 同-a。 + -d删除所有/指定的IP地址项。 + -s向ARP 缓存添加可将IP地址InetAddr解析成物理地址EtherAddr的静态项。 + \end{code} + \caption{arp命令语法及参数} + \label{fig:arp-cmd} +\end{figure} + + \item 使用\texttt{arp –d}命令,清空本机已有的ARP缓存。开启Wireshark, + ping本机的不同网段地址或域名,观察捕获的ARP报文的各个字段, + 分析请求/响应的过程。 +\end{enumerate} + +\subsection{思考题} +\label{subsec:c1_s1_rethink} + +\begin{enumerate} + \item 使用了显示过滤器后,Wireshark的抓包工作量会减少吗? + \item MAC帧的长度和IP数据报的长度有怎样的关系?请用你的数据记录进行验证。 + \item 假设本机IP地址是192.168.0.38,在本机上运行Wireshark捕获报文, + 使用“\texttt{ip.addr == 192.168.0.38}”作为过滤条件, + 能否过滤出本机发出/收到的ARP报文?为什么? + \item ping同一局域网内的主机和局域网外的主机,都会产生ARP报文么? + 所产生的ARP报文有何不同,为什么? + \item ARP请求数据包是支撑TCP/IP协议正常运作的广播包。 + 如果滥发或错发ARP广播包会产生那些不良影响?如何发现和应对? + \item 什么是免费 ARP(Gratuitous ARP)?它的作用是什么? + 请使用Wireshark进行捕捉和分析。 +\end{enumerate} + +\subsection{考核方法} +\label{subsec:c1_s1_criterion} + +考核分为现场考核和实验报告两个部分,具体如下。 +报告内容应包含以下内容,相关的分析解释都需要截图证明, +并与提交的Wireshark抓包数据文件相吻合。 + +\begin{enumerate} + \item (20分)现场考核:Wireshark的基本使用。 + \item (30分)以太网帧格式分析:OUI查看、长度计算、校验和计算。 + \item (30分)结合捕捉的网络数据,描述ARP数据包,描述ARP协议工作过程。 + \item (10分)回答任意两道思考题。 + \item (10分)记录自己在本次实验中所遇到的问题,以及心得感悟。 + 如果遇到异常情况,或者无法完成任务时,也请分析错误产生的原因。 +\end{enumerate} diff --git a/data/chapter1/section2.tex b/data/chapter1/section2.tex new file mode 100644 index 0000000..b452dcb --- /dev/null +++ b/data/chapter1/section2.tex @@ -0,0 +1,359 @@ +%# -*- coding: utf-8-unix -*- + +\section{IP与ICMP分析} +\label{sec:c1_s2} + +\subsection{实验目的} +\label{subsec:c1_s2_object} + +IP和ICMP协议是TCP/IP协议簇中的网络层协议, +在网络寻址定位、数据分组转发和路由选择等任务中发挥了重要作用。 +本实验使学生能熟练使用Wireshark软件,观察IP数据报的基本结构, +分析数据报的分片;掌握基于ICMP协议的ping和traceroute命令及其工作过程。 + +\subsection{实验内容} +\label{subsec:c1_s2_content} + +启动Wireshark,捕捉网络命令执行过程中本机接受和发送的数据报。 + +\begin{enumerate} + \item \textbf{执行ping命令,观察IP数据报和ICMP询问报文的结构:} + 通过Wireshark监视器观察捕获流量中的ICMP询问报文和IP数据报的结构。 + 注意比较ICMP请求帧与回应帧,及其IP头部数据字段的异同。 + \item \textbf{改变ping命令的参数,观察IP数据报分片:} + 更改ping命令参数MTU,使其发出长报文以触发IP数据报分片, + 再观察IP数据报的结构变化。 + \item \textbf{执行Traceroute命令,观察ICMP差错报文的结构,并分析其工作原理:} + 使用Linux操作系统提供的traceroute命令(或者Windows系统提供的tracert命令), + 捕获和分析该命令所产生的IP数据报,特别注意相关的ICMP差错报文。 + 结合捕获的具体数据,画出命令执行过程中数据交互的示意图, + 掌握traceroute的工作原理。 +\end{enumerate} + +\subsection{实验原理、方法和手段} +\label{subsec:c1_s2_principle} + +\subsubsection{IP协议及数据报格式} + +网际互连协议(Internet Protocol,IP),是TCP/IP体系中的网络层协议, +可实现大规模的异构网络互联互通,为主机提供无连接的、尽力而为的数据包传输服务。 +在网际协议第4版(IPv4)中,IP数据报是一个可变长分组, +包括首部和数据两部分(如图\ref{c1_ip-structure})。 +首部由20~60字节组成,包含与路由选择和传输有关的重要信息,其各字段意义如下: + +\begin{figure}[!htp] + \centering + \includegraphics[width=10cm]{c1_ip-structure} + \caption{IP数据报结构示意图} + \label{c1_ip-structure} +\end{figure} + +\begin{enumerate} + \item \textbf{版本(4位):}该字段定义IP协议版本, + 所有字段都要按照此版本的协议来解释。 + \item \textbf{首部长度(4位):}该字段定义数据报协议头长度, + 表示协议首部具有32位字长的数量,最小值为5,最大值为15。 + \item \textbf{服务(8位):}该字段定义上层协议对处理当前数据报所期望的服务质量, + 并对数据报按照重要性级别进行分配。前3位成为优先位,后面4位成为服务类型, + 最后1位没有定义。这些8位字段可用于分配优先级、延迟、吞吐量以及可靠性。 + \item \textbf{总长度(16位):}该字段定义整个IP数据报的字节长度, + 包括协议首部和数据,其最大值为65535字节。 + \item \textbf{标识(16位):}该字段包含一个整数,用于标识当前数据报。 + 当数据报分片时,标识字段的值被复制到所有的分中片。 + \item \textbf{标记(3位):}该字段由3位字段构成,其中最低位(MF)控制分片: + 若存在下一个分片则值为1;否则置0代表该分片是最后一个。 + 中间位(DF)指出数据报是否可进行分片,若置1则不允许该数据报进行分片。 + 第三位即最高位保留不使用,值为0。 + \item \textbf{分片偏移(13位):}该字段指出数据分片在源数据报中的相对位置, + 以8字节为长度单位。 + \item \textbf{生存时间(8位):}该字段是计数器, + 转发该数据报的路由器依次减1直至减少为0。 + \item \textbf{协议(8位):}该字段指出在IP处理过程完成之后, + 有哪种上层协议接收导入数据报。 + \item \textbf{头部校验和(16位):}该字段帮助确保IP协议头的正确性。 + 计算过程是先将校验和字段置为0,然后将整个头部每16位划分为一部分, + 将个部分相加,再将计算结果取反码,插入到校验和字段中。 + \item \textbf{源地址(32位):}源主机的IP地址。 + \item \textbf{目的地址(32位):}目标主机的IP地址。 +\end{enumerate} + +一个IP包从源主机传输到目标主机可能需要经过多个传输媒介不同的网络。 +每种网络对数据帧都设置了一个最大传输单元(MTU)的限制(例如以太网的MTU是1500字节)。 +因此,当路由器在转发IP包时,如果数据包的大小超过了出口链路网络的MTU时, +需将对该IP数据报进行分片,才能在目标链路上顺利传输。每个IP分片将独立传输, +直到所有分片都到达目的地后,目标主机才会把他们重组成一个完整的IP数据报。 +在IP数据报的分片与重组过程中,以下三个首部字段发挥了重要作用: + +\begin{enumerate} + \item 标记占3位,该字段目前只有后两位有意义。 + 其中,最低位记为MF(More Fragment),MF = 1代表还有后续分片, + MF = 0表示此为原始数据报的最后分片。次低位DF(Don't Fragment), + 用来控制数据报是否允许分片。DF = 1表示该数据报不允许分片;DF = 0允许分片。 + \item 标识符占16位,用于目的主机将IP数据报的各个分片重装成原来的数据报。 + 当IP数据报分片时,该标识字段的值被复制到所有的数据报分片的标识字段中。 + 这样,目的主机就可以正确的将标识字段值相同的各数据报分片重装成原来的数据报。 + \item 片偏移占13位,表示本分片在原IP数据报中的偏移位置,偏移量以8字节为单位。 + 由于每个数据分片按照独立数据报方式传输,因此到达目的主机的顺序是不确定的, + 目的主机在重装IP数据报时需要根据该字段提供偏移量进行排序。 +\end{enumerate} + +\subsubsection{ICMP协议及报文格式} + +因特网控制报文协议(Internet Control Message Protocol,ICMP), +用于IP主机、路由器之间传递控制消息。 +控制消息是指网络是否连通、主机是否可达、路由是否可用等网络本身的控制管理消息, +对网络正常运行起着重要的作用。 + +ICMP报文的类型可以分为ICMP差错报文和ICMP询问报文两种 +(其结构如图\ref{c1_icmp-structure})。 +ICMP差错报告报文主要有终点不可达、源站抑制、超时、参数问题和路由重定向5种。 +ICMP询问报文有回送请求和应答、时间戳请求和应答、 +地址掩码请求和应答以及路由器询问和通告4种。 +其常见的类型与代码如表\ref{tab:c1_icmp-format}所示。 + +\begin{figure}[!htp] + \centering + \includegraphics[width=10cm]{c1_icmp-structure} + \caption{ICMP报文结构示意图} + \label{c1_icmp-structure} +\end{figure} + +\begin{table}[!htp] + \centering + \caption{ICMP各类型报文的格式} + \label{tab:c1_icmp-format} + \begin{tabular}{m{1.4cm}<{\centering}m{1.4cm}<{\centering}m{8cm}<{\centering}m{1.4cm}<{\centering}m{1.4cm}<{\centering}} \toprule + 类型(TYPE) & 代码(CODE) & 描述(Description) & 查询类(Query) & 差错类(Error)\\ \midrule + 0 & 0 & Echo Reply——回显应答(Ping应答)& x & \\ + 3 & 1 & Host Unreachable——主机不可达 & & x\\ + 3 & 3 & Port Unreachable——端口不可达 & & x\\ + 3 & 4 & Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 & &x\\ + 8 & 0 & Echo request——回显请求(Ping请求)& x & \\ + 11& 0 & TTL equals 0 during transit——传输期间生存时间为0 & & x\\ \bottomrule + \end{tabular} +\end{table} + +本实验涉及以下两个常用网络命令,都属于ICMP协议的典型应用。 + +\begin{enumerate} + \item ping命令,是测试网络最有效的工具之一。 + 它是由主机或路由器执行ping命令向一个特定的目的主机发送一份ICMP回显请求(Echo request)报文, + 并等待其返回ICMP回显应答(Echo Reply)。 + ping命令可以检测网络的连通性,简单估测数据报的往返时间(Round Trip Time), + 确定是否有数据包丢失或损坏,从而帮助分析网络故障。 + ping命令格式和常用参数如图\ref{fig:ping-cmd}所示。 + \begin{figure}[!htp] + \centering + \begin{code}[text] + ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] + [-r count] [-s count] [-j computer-list] | [-k computer-list] + [-w timeout] destination-list + + -a 将地址解析为计算机名。 + -n count 发送 count 指定的 ECHO 数据包数。默认值为 4。 + -l length 发送包含由 length 指定的数据量的 ECHO 数据包。默认为 32 字节;最大值是65,527。 + -f 在数据包中发送"不要分片"标志。数据包就不会被路由上的网关分片。 + -i ttl 将"生存时间"字段设置为 ttl 指定的值。 \end{code} + \caption{ping命令语法及参数} + \label{fig:ping-cmd} +\end{figure} + + \item traceroute/tracert命令,利用TTL字段和ICMP差错类型报文, + 查找IP数据报的路由转发路径(含路由器信息)。 + 源主机执行该命令向目的主机发送生存时间(TTL)不同的ICMP回送请求报文, + 直至收到目的主机应答,并通过分析应答报文获得转发路径和时延信息。 +\end{enumerate} + +首先源主机发起一个TTL=1的ICMP报文。 +第一个路由器收到该报文后,TTL减1变为0并丢弃此报文, +返回一个[ICMP time exceeded]的消息。 +源主机通过这个消息获知IP数据报转发路径上的第一个路由器信息。 +然后,依次增加发送ICMP报文的TTL值,可以获取路径上的后续路由器的信息。 +当到达目的地时,目标主机返回一个[ICMP port unreachable]的消息, +使发起者确认IP数据报已经正常到达。 +至此,traceroute命令发起者已经获得了通向目标主机路径上的所有路由信息。 +tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示。 + +\begin{figure}[!htp] + \centering +\begin{code}[text] + tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] [-R] + [-S srcaddr] [-4] [-6] target_name + + -d Do not resolve addresses to hostnames. + -h maximum_hops Maximum number of hops to search for target. + -j host-list Loose source route along host-list (IPv4-only). + -w timeout Wait timeout milliseconds for each reply. + -R Trace round-trip path (IPv6-only). + -S srcaddr Source address to use (IPv6-only). + -4 Force using IPv4. + -6 Force using IPv6. +\end{code} +\caption{tracert命令语法及参数} +\label{fig:tracert-cmd} +\end{figure} + +\subsubsection{实验方法和手段} + +\begin{enumerate} + \item 使用Wireshark软件, + 捕获本机在ping和traceroute网络命令执行过程中接收和发出的全部数据流量。 + \item 合理设置过滤条件,观察IP数据报和ICMP报文, + 着重分析报文首部和内容变化,从而掌握协议的工作原理。 + \item 调整ping命令的参数,观察并分析IP数据报分片情况。 + \item 结合所捕获的数据报,画出traceroute命令过程中数据交互示意图。 +\end{enumerate} + +\subsection{实验条件} +\label{subsec:c1_s2_requirement} + +装有Wireshark软件的PC机一台(Linux或OS 操作系统);局域网环境。 + +参考资料: + +\begin{itemize} + \item \href{http://www-net.cs.umass.edu/wireshark-labs/Wireshark_ICMP_v8.0.pdf} + {J.F Kurose and K.W. Ross, Wireshark Lab: ICMP v8.0} + \item \href{https://www.wireshark.org/docs/man-pages/wireshark-filter.html} + {Wireshark官方过滤器语法指导书} + \item \href{https://datatracker.ietf.org/doc/rfc791/}{IP协议的RFC} +\end{itemize} + +\subsection{实验步骤} +\label{subsec:c1_s2_procedure} + +\subsubsection{ping命令} + +本机(示例IP为10.24.90.1)启动Wireshark软件, +选择要监听的网络接口(如eth0、wlan0); +然后在终端发起网络命令:ping IP地址/域名。 + +\begin{enumerate} + \item 在Wireshark监视器中设置过滤条件。 + 例如图\ref{fig:c1_wireshark-monitor}设置过滤条件为icmp, + 则显示出所捕获的ICMP数据包。 + + \begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{c1_wireshark-monitor} + \caption{Wireshark监视器界面} + \label{fig:c1_wireshark-monitor} + \end{figure} + + \item 点击Internet Protocol Version 4展开(如图\ref{fig:c1_ip-view}), + 查看IP数据报,特别观察IP数据报的首部字段及其内容。 + + \begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{c1_ip-view} + \caption{查看IP数据报} + \label{fig:c1_ip-view} + \end{figure} + + \item 点击Internet Control Message Protocol展开(如图\ref{fig:c1_echo-request}), + 查看ICMP报文,并解释回显(Echo Request和Echo Reply)报文的首部字段。 + + \begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{c1_echo-request} + \caption{Echo request示例} + \label{fig:c1_echo-request} + \end{figure} + + \item 清空Wireshark监控器,重新发起网络命令(如图\ref{c1_ping-exec}): + ping IP地址/域名 –l \#length,并解释对比前后两次执行ping命令的结果。 + 其中,-l \#length确定echo数据报的长度为\#length, + 其默认值为32字节,且小于65,527字节。 + + \begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{c1_ping-exec} + \caption{ping命令执行示例} + \label{fig:c1_ping-exec} + \end{figure} + + \item 可以多次改变\#length的大小(例如1000字节、2000字节和4000字节), + 观察IP数据报何时会分片?请解释IP数据报分片的原因和具体情况。 + 提示:请先确认该网络的MTU,可在Wireshark记录中查找“IPv4 fragments”项目。 +\end{enumerate} + +\subsubsection{traceroute命令} + +本机(示例IP为10.24.90.172)启动Wireshark软件, +选择要监听的网络接口(如eth0、wlan0); +然后在终端发起网络命令:traceroute IP地址/域名。 + +\begin{enumerate} + \item 启动Wireshark软件,选择要监听的网络接口,设置过滤条件icmp + (如图\ref{fig:c1_wireshark-filter-setup})。 + + \begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{c1_wireshark-filter-setup} + \caption{在Wireshark中设置过滤条件} + \label{fig:c1_wireshark-filter-setup} + \end{figure} + + \item 在终端中使用traceroute命令, + 目的主机是外网的一台设备(如图\ref{fig:c1_traceroute-exec},示例IP为210.34.0.12)。 + + \begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{c1_traceroute-exec} + \caption{在Wireshark中设置过滤条件} + \label{fig:c1_traceroute-exec} + \end{figure} + + \item 点击Internet Control Message Protocol展开, + 查看ICMP差错报文,观察并解释ICMP报文结构和字段内容。 + \item 结合ICMP报文记录画出数据交互示意图,并描述tracert工作原理。 + +\end{enumerate} + +\subsection{思考题} +\label{subsec:c1_s2_rethink} + +\begin{enumerate} + \item 在有线局域网中,PC1的IP地址为192.168.1.5/24, + 默认路由器的IP地址为192.168.1.1; + PC2的IP地址为192.168.2.6/24,默认路由器的IP地址为192.168.2.1。 + 在PC1向PC2发送数据的传输过程中, + 以太网数据帧的首部字段和IP数据报的首部字段是怎样变化的? + 如果有条件,请搭建实验平台进行实验,并使用Wireshark软件验证你的答案。 + \item 拒绝服务(Denial of Service,DoS)攻击,通过消耗目标主机设备的某种资源, + 导致其网络服务不能被正常用户使用。 + \begin{enumerate} + \item IP数据报分片机制可能被攻击者利用来构建拒绝服务攻击。 + 试设计一种利用IP数据报分片机制发动DOS攻击的方法,并提出防御的思路。 + \item 请思考利用ICMP报文构建DOS攻击的可能性以及防御方法。 + \end{enumerate} + \item 在实际操作中,Traceroute命令返回的某些条目以“*”号表示。 + 请思考有哪些原因可能导致这样的情况,该如何避免这样的情况。 + \item 发送方要怎样决定IP数据报分组大小, + 才能避免因为不同网络MTU不一致而引起分片呢? + \item 从客户端给服务器(其地址为\texttt{\#IP})发送三个ping命令, + 请比较命令的结果,并用Wireshark软件进行观察分析。 + \begin{enumerate} + \item \texttt{ping \#IP -l 1472 -f -n 1} + \item \texttt{ping \#IP -l 1473 -f -n 1} + \item \texttt{ping \#IP -l 1473 -n 1} + \end{enumerate} +\end{enumerate} + +\subsection{考核方法} +\label{subsec:c1_s2_criterion} + +本次实验需提交一份实验报告和一组Wireshark数据存储文件。 +报告内容应当包括以下三个部分,其中的分析解释都有对应的截图, +且与数据存储文件记录相符。 +\begin{enumerate} + \item (30分)实施ping命令,记录引发的IP数据报和ICMP报文,保存为pcapng文件; + 解释任一个IP数据报的首部,并对比ICMP Echo请求帧和回应帧; + 改变ping的长度参数,解释IP数据报分片情况。 + \item (40分)实施tracert命令,记录引发的ICMP报文,保存为pcapng文件; + 解释任一个ICMP差错报文的结构; + 描述tracert工作原理,结合ICMP报文记录画出数据交互示意图。 + \item (20分)回答任意两道思考题。 + \item (10分)记录自己在本次实验中所遇到的问题,以及心得感悟。 + 如果遇到异常情况,或者无法完成任务时,也请分析错误产生的原因。 +\end{enumerate} diff --git a/data/chapter1/section3.tex b/data/chapter1/section3.tex new file mode 100644 index 0000000..0fc9696 --- /dev/null +++ b/data/chapter1/section3.tex @@ -0,0 +1,469 @@ +%# -*- coding: utf-8-unix -*- + +\section{TCP与拥塞控制} +\label{sec:c1_s3} + +\subsection{实验目的} +\label{subsec:c1_s3_object} + +TCP(Transmission Control Protocol传输控制协议)是一种面向连接的、 +可靠的、基于字节流的传输层通信协议。 +本实验通过运用Wireshark对网络活动进行抓包分析, +让学生观察TCP协议报文,分析通信时序,帮助同学理解TCP的工作过程, +掌握TCP工作原理与实现; +学会运用Wireshark分析TCP连接管理、流量控制和拥塞控制的过程,发现TCP的性能问题。 + +\subsection{实验内容} +\label{subsec:c1_s3_content} + +启动Wireshark,捕捉网络活动中的TCP报文并按要求分析。 +\begin{enumerate} + \item 连接管理:观察正常TCP连接中的三次握手与四次挥手报文, + 绘制出时序图,并标出双方TCP状态变化。 + \item 异常情况分析:观察分析TCP连接建立过程的异常 + (例如,尝试连接未存活的主机或未监听端口或客户端发送了第一个SYN连接请求而服务端无响应); + 观察SYN洪泛影响;观察分析TCP通信过程中的各类异常报文(例如数据超时、乱序), + 了解其触发机制与含义。 + \item 流量控制(进阶):运行一组TCP连接客户端/服务器程序(Python代码见附录), + 制造收发不平衡场景,观察收发报文中通告窗口的变化,分析与窗口机制相关的类型报文, + 了解滑动窗口工作原理。 + \item 拥塞控制(进阶):改变带宽、时延、丢包率等网络参数,观察大文件传输过程, + 分析识别TCP的慢启动、拥塞避免、快速恢复等拥塞控制阶段; + 在构建的网络试验环境下运行iperf3进行网络性能测试,比较不同拥塞控制策略的性能表现。 +\end{enumerate} + +\subsection{实验原理、方法和手段} +\label{subsec:c1_s3_principle} + +\subsubsection{TCP协议} + +作为TCP/IP协议簇中的骨干, +TCP协议基于“尽力而为”的网络层为应用层提供可靠的进程间通信服务, +具体地说是可靠的全双工的端对端字节流传输服务。 +在TCP的协议传输单元中(TCP报文段,TCP Segment), +发送方和接收方使用字节序号(Sequence Number)明确收发的数据,并精确到字节单位; +使用ACK反馈(Acknowledgment)机制,实现端对端的可靠传输控制。 +接下来,简要介绍TCP报文段的结构, +TCP的连接管理、差错控制、流量控制和拥塞控制的原理。 + +\paragraph{TCP报文段(Segment)}~{} +\\ + +TCP 报文段结构如图\ref{fig:c1_TCP-structure}所示, +采用20字节的报文段头并有最长40字节的可选项。 + +\begin{figure}[!htp] + \centering + \includegraphics[width=10cm]{c1_TCP-structure} + \caption{TCP报文段结构标意图} + \label{fig:c1_TCP-structure} +\end{figure} + +主要字段如下: + +\begin{enumerate} + \item \textbf{源端口号(Source Port):}16位的源端口, + 与源IP地址一起标识发送该TCP 报文段的通信进程。端口号范围0\~65535。 + \item \textbf{目的端口号(Destionation Port):}16位目的端口, + 与目的IP地址一起标识接收该TCP 报文段的通信进程。端口号范围0\~65535。 + \item \textbf{序号(Sequence Number):}该TCP 报文段中第一个数据字节的序号,占4个字节。在TCP连接建立时,通常生成一个随机数作为字节序列号的初始值(ISN)。 + \item \textbf{确认号(Acknowledgement Number):} + 表示期望收到对方下一个报文段的字节序号,占4个字节。 + \item \textbf{标志位(TCP Flags):} + \begin{enumerate} + \item 确认ACK (Acknowledgement):置1表示确认号字段有效。 + \item 推送PSH (Push):置1表示该报文段优先级高, + 接收方 TCP 应该尽快推送给接收应用程序。 + \item 复位RST(Reset):置1表示需要释放 TCP 连接并重新建立连接。 + 一般称携带 RST 标志的 TCP 报文段为「复位报文段」。 + \item 同步SYN(Synchronization):置1表示这是TCP请求连接报文段。 + 一般称携带 SYN 标志的 TCP 报文段为“同步报文段”。 + \item 终止FIN(Finish):置l表示发送方的数据已经发送完毕, + 并要求释放 TCP 连接。 + \end{enumerate} + \item \textbf{窗口大小(Window):}表示接收缓存大小,即暂时缓存接收的数据。 + 最早TCP协议首部只设置了16位的窗口大小,允许的最大缓存大小不超过64KB; + 而RFC1323打破此限定,设置了TCP窗口缩放因子(Window size scaling factor), + 使窗口大小等于二者的乘积。 +\end{enumerate} + +\paragraph{TCP连接管理}~{} +\\ + +为维护一个可靠的端对端传输,TCP设计实现了完整的连接管理, +重点是三次握手的连接建立和四次挥手的连接释放过程, +如图\ref{fig:c1_TCP-time-line}。 + +\begin{figure}[!htp] + \centering + \includegraphics[width=9cm]{c1_TCP-time-line} + \caption{TCP连接示意时序} + \label{fig:c1_TCP-time-line} +\end{figure} + +\textbf{建立过程:}TCP是面向连接的,数据传输之前必须在双方之间建立一条连接, +并通过三次握手过程完成。 +其主要目的是,同步连接双方的序列号和确认号,并交换 TCP窗口大小等控制信息。 +一般地,客户端主动向服务器端发起连接请求,具体过程如下: + +\begin{enumerate} + \item 第一次握手:建立连接。客户端发送连接请求报文段, + 将SYN位置为1,Sequence Number为x; + 然后,客户端进入SYN\_SEND状态,等待服务器的确认; + \item 第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段, + 需要对这个SYN报文段进行确认,设置确认号为x+1; + 同时,将SYN位置为1,系列号为y。 + 服务器端将上述信息放入SYN+ACK报文段中, + 一起发送给客户端,此时服务器进入SYN\_RECV状态; + \item 第三次握手:客户端收到服务器的SYN+ACK报文段之后, + 将确认号设置为y+1,向服务器发送ACK报文段。 + 这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态, + 完成TCP三次握手。 +\end{enumerate} + +\textbf{释放连接(四次挥手):}客户端没有新数据要发送时,就会释放TCP连接, +发送一个报文段(FIN=1,LEN=0),进入FIN-WAIT1状态。服务器端收到后, +返回客户端一个ACK报文段,进入CLOSE-WAIT状态。 +此时客户端进入FIN-WAIT2状态,不能再发送信息,但仍可接收信息。 +服务器端完成数据发送之后,也发出FIN=1的报文请求释放连接, +并进入 LAST-ACK状态,直至客户端返回确认(第四次挥手)才关闭TCP连接。 +客户端收到服务器的FIN报文后,则进入TIME\_WAIT状态, +并等待 2MSL(最大存活时间- Maximum Segment Lifetime)时间之后,完全关闭TCP连接。 +(注:释放连接也可由服务器端先发起) + +\paragraph{TCP流量控制}~{} +\\ + +流量控制的目的是让发送方的数据发送速率不要过快,以便接收方能及时接收。 +TCP利用滑动窗口(Sliding Window)机制实施流量控制, +其基本原理是用TCP报文段中的窗口大小字段来控制数据发送速率, +即发送方的发送窗口应小于接收方回应报文中的通告窗口值。 +为了提高信道利用率,TCP采用了连续ARQ (Automatic Repeat reQuest), +TCP两端都可以连续发出若干个分组然后等待确认, +也都设有发送/接收窗口和发送/接收缓存。 +其中发送窗口可以用3个指针表示, +而且发送窗口随着TCP报文段中窗口(Window)字段的数值动态变化。 +该窗口字段是告知对方自己还能接收多少字节的数据。 +发送方只发送序号在发送窗口之内的数据,避免发送过快, +从而实现流量控制。具体的缓存、窗口和指针变化过程请参阅教材相关内容。 + +若接收方没有空余缓存,就会发送零窗口大小(Window=0)的报文段, +即要求发送端停止数据发送。 +然而,当接收方释放出足够缓存后, +发送方往往无法及时恢复数据发送,这就产生了死锁问题。 +为解决零窗口(Zero-Window)问题, +TCP为每一个连接设置一个持续计时器(persistence timer)。 +只要TCP的一方收到对方的零窗口报文段,就启动该计时器, +并周期性的发送一个长度为1字节的探测报文段(周期亦会增加)。 +收到探测报文段的一方,在返回ACK报文段时, +将使用Window字段发送其最新缓存大小; +若最新缓存足够大,数据发送恢复,解决死锁问题。 + +\paragraph{TCP拥塞控制}~{} +\\ + +计算机网络中的带宽、节点(路由器和主机)中的缓存和处理机等, +都属于网络的资源,在某段时间, +若对网络中某一资源的需求超出该资源所能提供的可用部分, +网络的性能就会变坏,这种情况就叫做拥塞。 +TCP拥塞控制的目的是避免过多的数据注入网络引发路由器或链路资源过载。 +拥塞控制是一个全局性的系统化的工程,将报文段丢失视作网络拥塞发生的信号, +通过调整拥塞控制窗口(cwnd - Congestion Window)和利用ACK反馈机制来控制数据发送速率。 + +TCP Tahoe是TCP的最早版本,主要用三种算法去控制数据流和拥塞窗口: +慢启动(Slow Start)、拥塞避免(Congestion Avoidance)、快重传(Fast Retransmit)。 +TCP事先并不知道网络资源的状况,首先采用慢启动算法开始发送数据: +cwnd初始值为1个MSS(Maximum Segment Size); +每收到一个有效的ACK确认,cwnd+1, +直至出现网络丢包超时或cwnd达到阀值ssthresh(slow start thresh)。 +当cwnd等于或大于ssthresh,采用拥塞避免算法, +由AIMD(加性增、积性减)策略控制发送速率。 +若TCP报文段发送后RTO (Retransmission Time Out)时间仍未得到确认或收到三个确认号重复的ACK报文段, +则启用快重传算法,并将cwnd重置为1,ssthresh减半。 + +TCP拥塞控制算法一直处在不断的改进之中,围绕对网络环境因素感知和拥塞避免的控制, +涌现了策略算法。TCP Reno继承Tahoe的三个算法并增加了快速恢复(Fast Recovery)算法。 +收到三个重复的ACK后,Reno会把当前的ssthresh的值设置为当前cwnd的一半, +并将cwnd更新为ssthresh+3MSS;然后每收到一个重复ACK则cwnd+1, +直至收到新确认号的ACK则将cwnd更新为ssthresh。 +TCP NewReno则进一步改进了快速恢复算法。 + +随着网络速度增长,传统拥塞控制算法的cwnd增长速度影响了TCP的性能,CUBIC应运而生。 +CUBIC的关键特征是:cwnd窗口的增长依赖两次丢包的时间。 +2016年,谷歌提出了BBR拥塞控制算法,它不再基于丢包感知来调整cwnd, +而是利用估算的带宽和延迟直接推测拥塞程度进而确定发送窗口。 + +\subsubsection{实验方法和手段} + +使用VMWare软件配置两台本地虚拟机,本地相互连接(如图\ref{fig:c1_TCP-topo})。 +在VMWare中的虚拟机设置->网络适配器->高级中虚拟机的网卡传入/传出带宽、 +传输速率、时延等,用来仿真不同的网络条件(如图\ref{fig:c1_VM-advance-setup})。 +本实验需要使用的命令和工具,如表\ref{tab:c1_tools-command}所列。 +常用的Linux操作系统命令还包括:echo、cat、sysctl、ping、ftp。 + +\begin{figure}[!htp] + \centering + \includegraphics[width=9cm]{c1_TCP-topo} + \caption{实验拓扑图} + \label{fig:c1_TCP-topo} +\end{figure} + +\begin{figure}[!htp] + \centering + \includegraphics[width=6cm]{c1_VM-advance-setup} + \caption{虚拟机网络适配器高级设置} + \label{fig:c1_VM-advance-setup} +\end{figure} + +\begin{table}[] + \centering + \caption{主要工具及命令列表} + \label{tab:c1_tools-command} + \begin{tabular}{m{1.5cm}<{\centering}m{3cm}<{\centering}m{10cm}} \toprule + 命令 & 作用 & 参考\\ \midrule + \texttt{ifconfig} & 配置网络 & \url{https://man.linuxde.net/ifconfig}\\ + \texttt{nmap} & 网络扫描 & \url{https://nmap.org/man/zh/index.html}\\ + \texttt{curl} & 文本浏览器 & \url{https://man.linuxde.net/curl}\\ + \texttt{wget} & 下载Web文件 & \texttt{wget /}\\ + \texttt{tc} & 流量控制 & \href{https://man7.org/linux/man-pages/man8/tc.8.html}{TC命令手册} \\ + \texttt{iptables} & 防火墙配置 & \url{https://man.linuxde.net/iptables}\\ + \texttt{netwox} & 网络工具 & \url{https://sourceforge.net/projects/ntwox}/\\ + \texttt{ss} & Socket状态 & \texttt{ss –atn}\\ + \texttt{netstat} & 显示网络状态 & \texttt{netstat –atn}\\ + \texttt{iperf3} & 网络性能分析 & \url{https://iperf.fr/}\\ \bottomrule + \end{tabular} +\end{table} + +\subsection{实验条件} +\label{subsec:c1_s3_requirement} + +\begin{enumerate} + \item 硬件:每个学生一台物理实验机(8G以上内存,80G以上硬盘空间)。 + \item 软件:物理机装Windows7/10、VMWare或VisualBox; + 两台 Ubuntu18虚拟机(每台2G内存、20G HD)。 + 每台Ubuntu虚机上预装wireshark、curl、vsftp、netwox、telnet、namp和iperf3。 + \item 环境准备:分别以Ubuntu 1\#机、Ubuntu2\#机作为TCP的客户端与服务端, + 以下简称1\#机,2\#机;设置虚机网络连接为NAT模式,IPv4设置为DHCP。 + 启动两台实验虚机后,可使用ping进行连接性测试, + 也可使用nmap扫一下对方打开的端口, + 确保实验环境正常 + (指导书中服务器的IP为192.168.100.144,指导书中命令若有用及此IP, + 应替换为实际观察到的IP) 。 +\end{enumerate} +参考资料: + +\begin{itemize} + \item \href{https://tools.ietf.org/html/rfc793}{TCP协议RFC} + \item \href{http://www-net.cs.umass.edu/wireshark-labs/Wireshark_TCP_v7.0.pdf} + {计算机网络--自顶向下方法:Wireshark实验指导书--TCP} + \item \href{https://www.semanticscholar.org/paper/Congestion-Control-in-Linux-TCP-Sarolahti-Kuznetsov/0e9c968d09ab2e53e24c4dca5b2d67c7f7140f8e} + {Congestion Control in Linux TCP} +\end{itemize} + +\subsection{实验步骤} +\label{subsec:c1_s3_procedure} + +\subsubsection{TCP正常连接观察} + +\begin{enumerate} + \item 利用python自带的SimpleHTTPServer模块, + 在2\#机上启动一个简易的web服务器。 + 终端上运行\texttt{echo "TCP lab test" > index.html}创建index.html文件为测试站首页, + 运行\texttt{sudo python -m SimpleHTTPServer 80}启动一个简易web服务器; + 打开新终端,键入\texttt{ss -tln}查看当前主机打开的TCP连接,确认80端口处理监听状态。 + \item 在1\#机上打开一个终端,键入\texttt{sudo wireshark}启动抓包软件; + 再打开一个新终端,键入 curl <2\#机IP> ; + 停止抓包,在wireshark过滤出TCP类型报文。 + 观察首个TCP报文头,并分析各段值代表的意义。 + 如果想要关闭相对序列号/确认号, + 可以选择Wireshark菜单栏中的 + Edit$\rightarrow$Preference$\rightarrow$protocols$\rightarrow$TCP, + 去掉Relative sequence number勾选项。 + 使用Wireshark内置的绘制流功能,选择菜单栏中的Statistics$\rightarrow$Flow Graph, + Flow Type选择TCP flows可以直观地显示TCP序列号和确认号是如何工作的。 + \item 观察TCP三次握手与四次挥手报文,注意报文收发过程中,双方TCP状态的变化。 + 以本次抓得报文为据,分别画出本次TCP连接三次握手与四次挥手的时序图, + 结合TCP状态机,在双方各阶段标出对应的TCP状态。选择其中一个TCP报文, + 配合Wireshark截图,分析该报文TCP首部各字段的定义、值及其含义。 +\end{enumerate} + +\subsubsection{异常传输观察分析} + +\begin{enumerate} + \item 尝试连接未存活的主机或对未监听端口。 + \begin{enumerate} + \item 用curl访问一个不存在的主机IP,抓包观察共发送了几次SYN报文。 + 根据每次时间间隔变化,估算RTO(重传超时)。 + \item 查看Linux主机的系统的TCP参数SYN重传设定: + + \texttt{cat /proc/sys/net/ipv4/tcp\_syn\_retries} + \item 更改SYN重传次数为3: + + \texttt{echo "3" > /proc/sys/net/ipv4/tcp\_syn\_retries} + \item 再次curl访问,观察抓包内容。 + \item 关闭服务器端的SimpleHTTPServer(ctrl+C中断,或关闭所在终端), + 客户端curl访问服务器80端口,观察应答报文。 + \item 运行\texttt{nmap -sS <2\#机IP>}扫描服务器,并抓包。 + \item 在报告中总结以上观察结果,解释SYN扫描原理。 + \end{enumerate} + \item 客户端发送了第一个SYN连接请求,服务器无响应的情景。 + \begin{enumerate} + \item 服务器开启telnet或ssh服务,客户端先尝试连接服务器, + 连接成功后,在双方键入 ss -tan 查看所有TCP连接状态。 + 我们看到的TCP连接建立过程同1中的HTTP访问类似。 + 在客户端,利用iptables拦截服务器回应的SYN ACK包, + 命令如下: + + \texttt{sudo iptables -I INPUT -s 192.168.100.144 -p tcp -m tcp --tcp-flags ALL SYN, ACK -j DROP} + \item 再次尝试连接并启动wireshark抓包,并在双方多次用ss -tan观察TCP状态。 + \item 观察TCP的状态变化,分析wireshark抓到的TCP异常报文。 + \item 服务端的SYN-RECV 状态何时释放? + \item SYN ACK重传了几次,时间间隔有何变化? + \item 参考(1)在服务端修改SYN ACK重传次数(tcp\_synack\_retries), + 再次观察,此任务结束后清空防火墙规则(iptables -F)。 + \end{enumerate} + \item SYN洪泛。 + 在服务器端\texttt{sudo echo "0">/proc/sys/net/ipv4/tcp\_syncookies}禁用syncookies, + 通过\texttt{sudo sysctl -w net.ipv4.tcp\_max\_syn\_backlog = 6} + 指定所能接受SYN同步包的最大客户端数量为6; + 在客户端运用netwox工具对服务器监听的端口产生大量SYN连接请求 + (如\texttt{sudo netwox 76 -i 192.168.100.144 -p 23}), + 再使用正常的连接工具(如telnet)连接,观察现象(特别是服务器端的TCP连接状态), + 抓包总结分析,解释SYN泛洪攻击原理与对策。 + \item 异常报文分析。在服务器端产生一个100M的大文件, + 利用1中的web服务器,在客户端上用wget下载它。 + 参考命令: + \begin{enumerate} + \item 产生一个100M文件: + + \texttt{dd if=/dev/zero of=100M.file bs=1M count=100} + \item 模拟网络抖动: + + \texttt{tc qdisc add dev ens33 root netem delay 70ms 10ms 30\% duplicate 1\% reorder 5\% 10\% corrupt 0.1\%} + + (将此行命令的add改为change即修改、del即删除此行规则)。 + \item 下载服务器上的大文件:\texttt{wget 192.168.100.144/100M.file} + \end{enumerate} + + 抓包记录以上过程,分析黑色标签错误报文,结合TCP实现机制, + 分析这些报文产生的原因。此类报文也可以从现实网络行为抓取获得, + 请结合实际抓得报文分析,报文附件随报告提交。 + 包含但不限于以下几种类型报文: + [Duplicate ACK]、[TCP Retransmission]、[Fast Retransmission]、 + [TCP Spurious Retransmission]、[TCP Out-Of-Order]、 + [TCP Previous segment not captured]。 +\end{enumerate} + +\subsubsection{流量控制} + +\begin{enumerate} + \item 编写一对简单的TCP连接程序, + 也可以直接运行指导书提供的Python程序(见附件)。 + 在客户端快速发送数据给服务端,而服务端则有意缓慢地接收数据, + 观察TCP如何用窗口大小值进行流量控制。虚拟机两端分别运行 + \texttt{python3 server.py}和\texttt{python3 client.py}。 + \item 抓取两端通信报文数据,分析报文中的Win值变化,联系上下报文, + 解释为什么出现[TCP Windows Full]、[TCP ZeroWindows]、[TCP Keep-Alive] + 等和窗口大小相关的流量控制报文。 + 抓取的原始报文存成附件随实验报告提交。 +\end{enumerate} + +\subsubsection{拥塞控制} +\begin{enumerate} + \item 在VMWare中的虚拟机设置$\rightarrow$网络适配器$\rightarrow$高级中设置, + 设置两台虚拟机的网卡传入/传出带宽为10Mbps以下, + 再启动应用(可以是http wget,也可以ftp下载/上传)传输大文件观察。 + \item Wireshark抓取全部传输过程数据,找出该网络活动的拥塞点, + 并结合Analyze$\rightarrow$Expert Information、Statistic$\rightarrow$IO Graphs、 + Statistic$\rightarrow$TCP Stream Graphs(如图\ref{fig:c1_io-graphs}), + 分析此传输过程中的慢启动、拥塞避免、快速恢复等阶段。 + + \begin{figure}[!htp] + \centering + \includegraphics[width=10cm]{c1_io-graphs} + \caption{IO Graphs} + \label{fig:c1_io-graphs} + \end{figure} + + \item TCP竞争观察:类似以上试验,我们在一个大文件传输过程中, + 迅速启动另一应用,双向进行大文件传输,观察两路(或两路以上)TCP连接的速率变化。 + \item TCP拥塞控制算法比较:运用iperf3性能分析工具, + 设置ubuntu系统的tcp\_congestion\_control策略, + 分析比较不同网络环境下、不同拥塞控制算法的表现。 + 参考如下命令(灵活组合使用): + \begin{enumerate} + \item 可用策略: + + \texttt{cat /proc/sys/net/ipv4/tcp\_available\_congestion\_control} + \item 修改策略: + + \texttt{sysctl -w net.ipv4.tcp\_congestion\_control=bbr} + \item iperf3服务端启动: \texttt{iperf3 -s -p 5555} + \item iperf3客户端启动: \texttt{iperf3 -c 192.168.100.144 -p 5555} + \item 设置链路带宽、时延、丢包率可以使用虚拟网卡高级属性配置, + 也可以参考前面使用tc命令配置。 + \end{enumerate} +\end{enumerate} + +\subsection{思考题} +\label{subsec:c1_s3_rethink} + +\begin{enumerate} + \item TCP在不可靠的IP层上建立了可靠的端对端连接, + 如何在不可靠的UDP上建立可靠的端对端传输系统呢? + \item TCP连接建立过程中,存在哪些等待队列? + 这些队列是否可能出现溢出状况,高并发TCP连接应用如何调优? + \item 本次实验观察了Linux环境下的TCP实现,在Windows、MacOS环境下, + 操作系统又是如何实现TCP的呢? + 类似Linux TCP参数,在不同系统环境下如何查看或设置, + 请尝试通过抓包其通信过程发现其实现异同。 + \item TCP是封装单元为MSS,可是我们在抓包过程中常发现远大于此值的TCP包, + 为什么TCP可以提交如此大的报文呢? + 此类型的包远超出链路层的MTU,它是如何被处理的呢?请从两端同时抓包观察比对。 + \item 在TCP状态机(图\ref{fig:c1_TCP-status-machine})中, + 有些状态停留时间较长,易观察到,有些状态很短暂不易观察到。 + 试列出不易观察到的状态,并考虑观察到它们的可能方法。 + + \begin{figure}[!htp] + \centering + \includegraphics[width=11cm]{c1_TCP-status-machine} + \caption{TCP连接管理状态机} + \label{fig:c1_TCP-status-machine} + \end{figure} + +\end{enumerate} + +\subsection{注意事项及有关说明} +\label{subsec:c1_s3_notice} + +\begin{enumerate} + \item Linux上运行wireshark抓包需要root权限, + 请先在终端中通过su命令切换为root后,再键入\texttt{wireshark \&}启动; + 或是打开个终端键入\texttt{sudo wireshark。netwox/netwag}同样需要root权限。 + \item Ubuntu中装有python2和python3两种类型版本, + 实验中用了python2启动简易Web服务器,附件中的程序用Python3运行。 + \item 环境还原:前面操作的iptables、tc遗留规则可能会影响后面的操作效果, + \texttt{iptables --list}查看核对一下当前的规则, + \texttt{iptables -F}清空当前规则; + 同样,使用\texttt{tc qdisc del dev eth0 root RULE}清除网卡eth0队列规则。 + 使用虚拟机的快照功能是更原始、更彻底的还原方式。 + \item 批量网络扫描是威害网络行为,仅在实验室环境下进行试验学习, + 不得用于运营网络。 +\end{enumerate} + +\subsection{考核方法} +\label{subsec:c1_s3_criterion} + +完成本次实验,并提交一份实验报告和一组Wireshark数据存储文件。 +报告内容应当包括以下部分,相关的分析解释都对应有截图证明,并与数据存储文件吻合。 +\begin{enumerate} + \item (20分) 正确绘制出了三次握手报文与四次挥手报文(须结合抓得报文序号), + 并正确标识出了各阶段TCP状态; + \item (20分) 观察传输异常现象,并进行分析; + \item (20分) 完成流量控制操作要求,结合上下分析报文窗口变化, + 解释说明相关的类型报文成因。 + \item (20分) 完成拥塞控制操作要求, + 成功从抓得数据分析出了一次完整TCP流的各阶段(慢启动、拥塞控制、快速恢复)。 + \item (10分)完成任2道思考题。 + \item (10分)记录自己在本次实验中所遇到的问题,以及心得感悟实验总结。 +\end{enumerate} diff --git a/data/chapter2/preface.tex b/data/chapter2/preface.tex new file mode 100644 index 0000000..88302a5 --- /dev/null +++ b/data/chapter2/preface.tex @@ -0,0 +1,9 @@ +%# -*- coding: utf-8-unix -*- + +\chapter{基于套接字的网络程序设计} +\label{chap:program} + +本单元通过编写简单的UDP应用程序和适配常见应用层协议的TCP应用程序使学生能熟练掌握基本套接字编程, +熟悉HTTP与SMTP等应用层协议, +从而深入理解理解跨网络进程通信的原理和过程, +培养开发网络应用程序的能力。 \ No newline at end of file diff --git a/data/chapter2/section1.tex b/data/chapter2/section1.tex new file mode 100644 index 0000000..a2cc234 --- /dev/null +++ b/data/chapter2/section1.tex @@ -0,0 +1,123 @@ +%# -*- coding: utf-8-unix -*- + +\section{套接字基础与UDP通信} +\label{sec:c2_s1} + +\subsection{实验目的} +\label{subsec:c2_s1_object} + +熟悉Python中UDP套接字编程的基础知识,掌握使用UDP套接字发送和接收数据包, +以及设置正确的套接字超时, +了解Ping应用程序及其在计算数据包丢失率等统计数据方面的有用性。 + +\subsection{实验内容} +\label{subsec:c2_s1_content} + +标准的ping使用ICMP,该实验创建一个简单的, +非标准的基于UDP的ping程序。用Python编写一个客户ping程序。 +该客户将发送一个简单的ping报文,接收一个从服务器往返的对应pong报文, +并确定从该客户发送ping报文到接收pong报文为止的时延(往返时延RTT)。 + +要求你的ping程序经UDP向目标服务器发送10个ping报文。 +对于每个报文,当对应的pong报文返回时,客户端要确认和打印RTT; +要求考虑分组丢失情况,客户端最多等待1秒,超过该时长则打印丢失报文。 + +\subsection{实验原理、方法和手段} +\label{subsec:c2_s1_principle} + +UDP提供了无连接通信,且不对传送数据包进行可靠性保证, +适合于一次传输少量数据,UDP传输的可靠性由应用层负责。 +常用的UDP端口号有:53(DNS)、69(TFTP)、161(SNMP), +使用UDP协议包括:TFTP、SNMP、NFS、DNS、BOOTP。 + +UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。 +但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高, +适合对可靠性要求不高的应用程序, +或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。 + +基于UDP协议的无连接客户/服务器的工作流程是: +在服务器端首先启动服务器通过调用socket( )创建套接字, +然后调用bind( )指定服务器socket地址,最后服务器调用recvfrom( )等待接收数据。 +在客户端,客户调用socket( )创建套接字,然后调用sendto( )向服务器发送数据。 +服务器接收到客户发来数据后,调用sendto( )向客户发送应答数据, +客户调用recvfrom接收服务器发来的应答数据。 +一旦数据传输结束,服务器和客户通过调用close( )来关闭套接字。 +具体流程如图\ref{fig:c2_udp-flow}所示。 + +\begin{figure}[!htp] + \centering + \includegraphics[width=8cm]{c2_udp-flow} + \caption{无连接客户/服务器流程图} + \label{fig:c2_udp-flow} +\end{figure} + +\subsection{实验条件} +\label{subsec:c2_s1_requirement} + +\begin{itemize} + \item 装有python环境的电脑两台; + \item 局域网环境; + \item 服务器程序(实验步骤中已给出)。 +\end{itemize} + +\subsection{实验步骤} +\label{subsec:c2_s1_procedure} + +下面的服务器代码中30\%的客户端数据包被模拟为丢失。 +请参考该代码,按照实验任务完成ping客户端代码。 + +注意在运行客户端程序前,需要先运行服务器端代码。 + +使用客服端ping程序经UDP向目标服务器发送10个ping报文。要求: + +\begin{enumerate} + \item 使用UDP发送ping消息(注意:因为UDP是无连接协议,不需要建立连接。); + \item 如果服务器在1秒内响应,则打印该响应消息; + 计算并打印每个数据包的往返时间RTT(以秒为单位); + \item 否则,打印“请求超时”。 +\end{enumerate} + +在开发过程中,可以将客户端程序和服务器程序放在同一台电脑上进行测试。 +在完成代码调试后,可以尝试将客户端和服务器代码运行在不同网络环境, +记录并分析结果。下面是UDP服务器示例代码: + +\begin{code}[python] + from socket import * + # 创建一个UDP套接字(SOCK_DGRAM) + serverSocket = socket(AF_INET, SOCK_DGRAM) + serverSocket.bind(('', 12000)) + while True: + rand = random.randint(0, 10) + message, address = serverSocket.recvfrom(1024) + message = message.upper() + # 模拟40%的数据包丢失。 + if rand < 4: + Continue + serverSocket.sendto(message, address) +\end{code} + +\subsection{思考题} +\label{subsec:c2_s1_rethink} + +尝试修改代码计算所有ping结束时报告最小、最大、平均rtt和计算丢包率(百分比) +以符合标准ping程序的工作方式。 + +\subsection{考核方法} +\label{subsec:c2_s1_criterion} + +本次实验需提交一份实验报告和代码文件。报告内容应当包括以下三个部分: +\begin{itemize} + \item 代码的说明; + \item 不同环境下代码运行的结果; + \item 对结果的分析和总结体会。 +\end{itemize} + +本实验评分标准: + +\begin{enumerate} + \item 规定时间内完成实验报告20分; + \item 代码正确运行,20分(不能正常运行0分); + \item 实验报告格式整洁,20分; + \item 实验报告中详细记录了实验过程,在实验中所遇到的问题以及解决方法,20分; + \item 实验报告中仔细分析了实验结果,并能提出自己的改进措施,20分。 +\end{enumerate} diff --git a/data/chapter2/section2.tex b/data/chapter2/section2.tex new file mode 100644 index 0000000..6c7b08f --- /dev/null +++ b/data/chapter2/section2.tex @@ -0,0 +1,114 @@ +%# -*- coding: utf-8-unix -*- + +\section{TCP通信与Web服务器} +\label{sec:c2_s2} + +\subsection{实验目的} +\label{subsec:c2_s2_object} + +掌握Python中TCP套接字编程的基础知识,理解HTTP报文格式, +了解开发一个简单Web服务器的流程。 + +\subsection{实验内容} +\label{subsec:c2_s2_content} + +使用Python开发一个一次处理一个HTTP请求的Web服务器。 +Web服务器接受并解析HTTP请求,从服务器的文件系统中获取请求的文件, +创建一个HTTP响应消息,该消息由前面带有首部行信息的请求文件组成, +然后将响应直接发送给客户端。如果服务器中不存在请求的文件, +则服务器将发送HTTP“404 not Found”的消息给客户端。 + +\subsection{实验原理、方法和手段} +\label{subsec:c2_s2_principle} + +基于TCP协议的面向客户/服务器的工作流程是: +在服务器端首先启动服务器调用socket( )创建套接字; +然后调用bind( )指定服务器socket地址(IP地址+端口号); +再调用listen( )让服务器做好侦听准备,并规定好请求队列的长度, +然后服务器进入阻塞状态,等待客户的连接请求; +最后通过accept( )来接收连接请求,并获得客户的socket地址。 +在客户端,客户调用socket( )创建套接字,然后调用connect( )和服务器建立连接。 +连接建立成功后,客户和服务器之间就可以通过调用read( )和write( )来接收和发送数据。 +一旦数据传输结束,服务器和客户通过调用close( )来关闭套接字。具体流程图如下图所示。 + +\begin{figure}[!htp] + \centering + \includegraphics[width=6cm]{c2_tcp-flow} + \caption{面向连接客户/服务器流程图} + \label{fig:c2_udp-flow} +\end{figure} + +\subsection{实验条件} +\label{subsec:c2_s2_requirement} + +\begin{itemize} + \item 装有python环境的电脑两台; + \item 局域网环境; + \item 部分代码(实验步骤中已给出)。 +\end{itemize} + +\subsection{实验步骤} +\label{subsec:c2_s2_procedure} + +开发一个简单的Web服务器,一次处理一个请求,具体要求如下: +\begin{enumerate} + \item 当收到请求时创建一个连接套接字; + \item 通过这个连接套接字接收HTTP请求; + \item 解释HTTP请求以确定所请求的特定文件; + \item 从服务器的文件系统获得请求的文件; + \item 创建一个由请求的文件组成的HTTP响应报文; + \item 通过TCP连接返回响应。 +\end{enumerate} + +补充完善下面的的服务器代码,完成要求功能。 +运行服务器代码,在不同主机上的使用浏览器发送请求测试服务器,分析并记录结果。 +\begin{code}[python] + #import socket module + from socket import * + #准备服务器端socket + serverSocket = socket(AF_INET, SOCK_STREAM) + #按需补充代码 + while True: + #建立连接 + print 'Ready to serve...' + connectionSocket, addr = #按需补充 + try: + message = #按需补充 + filename = message.split()[1] + f = open(filename[1:]) + #通过socket发送HTTP首部行 + outputdata = #按需补充 + #将请求文件的内容发送到客户端 + for i in range(0, len(outputdata)): + connectionSocket.send(outputdata[i]) + connectionSocket.close() + except IOError: + #发送未找到文件的响应消息 + #按需补充代码 + #关闭客户端socket + #按需补充代码 + serverSocket.close() +\end{code} + +\subsection{思考题} +\label{subsec:c2_s2_rethink} + +本实验中的Web服务器一次只能处理一个HTTP请求,请自行查阅线程知识, +修改代码,实现一个能够同时处理多个请求的多线程服务器。 + +\subsection{注意事项及有关说明} +\label{subsec:c2_s2_notice} + +将HTML文件放在服务器代码同一目录中。运行服务器程序。 +确定运行服务器的主机的IP地址(例如,128.238.251.26)。 +从另一个主机打开浏览器并提供相应的URL。 + +例如:\url{http://128.238.251.26:6789/HelloWorld.html}。 + +“HelloWorld.html”是放置在服务器目录中的文件的名称。 +6789为端口号,如果省略则使用默认端口号80。 + +\subsection{考核方法} +\label{subsec:c2_s2_criterion} + +同实验\ref{sec:c2_s1}。 diff --git a/data/chapter2/section3.tex b/data/chapter2/section3.tex new file mode 100644 index 0000000..ecb3db5 --- /dev/null +++ b/data/chapter2/section3.tex @@ -0,0 +1,126 @@ +%# -*- coding: utf-8-unix -*- + +\section{SMTP客户端实现} +\label{sec:c1_s2} + +\subsection{实验目的} +\label{subsec:c2_s3_object} + +进一步理解和掌握Python中TCP套接字编程的基础知识, +理解SMTP报文格式,了解开发一个简单应用程序的流程。 + +\subsection{实验内容} +\label{subsec:c2_s3_content} + +创建一个可以向任何接收方发送电子邮件的简单邮件客户端。 +通过Python编写代码与邮件服务器创建一个TCP连接, +使用SMTP协议与邮件服务器交谈并发送邮件报文,最后关闭连接。 + +\subsection{实验原理、方法和手段} +\label{subsec:c2_s3_principle} + +SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议, +是因特网电子邮件中主要的应用层协议,它使用TCP可靠数据传输服务, +从发送方的邮件服务器向接收方的邮件服务器发送邮件。 +SMTP有两个部分:运行在发送方邮件服务器的客户端和运行在接收方邮件服务器的服务器端。 + +RFC5321给出了SMTP的定义。SMTP有众多出色的性质, +但也具有一些陈旧特征, +例如,它限制所有邮件报文的主体部分只能采用简单的7比特ASCII码表示。 +所以在用SMTP传送邮件之前需要将二进制多媒体数据编码为ASCII码, +在传输后再进行解码还原为多媒体数据。 + +下来分析一个在SMTP客户(C)和SMTP服务器(S)之间交换报文文本的例子。 +客户的主机名为crepes.fr,服务器的主机名为hamburger.edu。 +以C:开头的ASCI码文本行正是客户交给其TCP套接字的那些行, +以S:开头的ASCl码则是服务器发送给其TCP套接字的那些行。 +一旦创建了TCP连接,就开始了如下过程: + +\begin{code}[text] + S: 220 hamburger. edu + C: HELO crepes. fr + S: 250 Hello crepes. fr, pleased to meet you + C: MAIL FROM: + S: 250 alice@ crepes. fr... Sender ok + C: RCPT TO: + S: 250 bob@ hamburger. edu... Recipient ok + C: DATA S:354 Enter mail, end with "."on a line by itself + C: Do you like ketchup? + C: How about pickles? + C: . + S: 250 Message accepted for delivery + C: QUIT + S: 221 hamburger. edu closing connection +\end{code} + +在上例中,客户从邮件服务器crepes.fr向邮件服务器hamburger.edu发送了一个报文 +("Do you like ketchup?How about pickles?")。 +作为对话的一部分, +该客户发送了5条命令:HELO(是HELLO的缩写)、MAIL FROM、RCPTTO、DATA以及QUIT。 +这些命令都是自解释的。 +该客户通过发送一个只包含一个句点的行,向服务器指示该报文结束了。 +(按照ASClI码的表示方法,每个报文以CRLF.CRLF结束,其中的CR和LF分别表示回车和换行。) +服务器对每条命令做出回答,其中每个回答含有一个回答码和一些(可选的)英文解释。 +我们在这里指出SMTP用的是持续连接: +如果发送邮件服务器有几个报文发往同一个接收邮件服务器, +它可以通过同一个TCP连接发送这些所有的报文。 +对每个报文,该客户用一个新的MAIL FROM:crepes.fr开始, +用一个独立的句点指示该邮件的结束,并且仅当所有邮件发送完后才发送QUIT。 + +\subsection{实验条件} +\label{subsec:c2_s3_requirement} + +\begin{itemize} + \item 下列装有python环境的电脑一台; + \item 邮件服务器账号(开启SMTP); + \item 部分代码(实验步骤中已给出)。 +\end{itemize} + +\subsection{实验步骤} +\label{subsec:c2_s3_procedure} + +通过Python开发一个简单的SMTP客户端发送邮件。 +补充完善下面的代码并通过向不同的账号发送电子邮件测试程序。 + +\begin{code}[python] + from socket import * + msg = "\r\n I love computer networks!" + endmsg = "\r\n.\r\n" + # 选择一个邮件服务器 + mailserver = #按需补充 + # 创建socket和邮件服务器建立TCP连接 + recv = clientSocket.recv(1024) + print(recv) + if recv[:3] != '220': + print '220 reply not received from server.' + # 发送HELO命令,打印服务器响应。 + heloCommand = 'HELO Alice\r\n' + clientSocket.send(heloCommand) + recv1 = clientSocket.recv(1024) + print((recv1) + + if recv1[:3] != '250': + print ('250 reply not received from server.') + + # 发送MAIL FROM命令,打印服务器响应。 + # 发送RCPT TO命令,打印服务器响应。 + # 发送DATA命令,打印服务器响应。 + # 发送邮件内容。 + # 消息以单个"."结束。 + # 发送QUIT命令,获取服务器响应。 +\end{code} + +\subsection{思考题} +\label{subsec:c2_s3_rethink} + +修改代码使程序发送的邮件中不仅包含文本还能够包含图片。 + +\subsection{注意事项及有关说明} +\label{subsec:c2_s3_notice} + +注意部分邮件服务器默认关闭SMTP,需进入设置手动开启SMTP协议。 + +\subsection{考核方法} +\label{subsec:c2_s3_criterion} + +同实验\ref{sec:c2_s1}。 diff --git a/data/chapter3/preface.tex b/data/chapter3/preface.tex new file mode 100644 index 0000000..dd6ae7d --- /dev/null +++ b/data/chapter3/preface.tex @@ -0,0 +1,11 @@ +%# -*- coding: utf-8-unix -*- + +\chapter{组网基础} +\label{chap:routing} + +掌握静态路由、动态路由RIP和OSPF协议的配置,并理解分析静态与动态路由的区别, +两种动态路由协议各自的适用环境,理解网络收敛的概念。 +推荐使用华为ENSP模拟器, +在附录\ref{app:ENSP}中有该软件的安装、操作和使用, +以熟悉华为模拟设备的基本配置及其配置命令, +掌握软件安装常见问题的解决方法。 diff --git a/data/chapter3/section1.tex b/data/chapter3/section1.tex new file mode 100644 index 0000000..138303a --- /dev/null +++ b/data/chapter3/section1.tex @@ -0,0 +1,188 @@ +%# -*- coding: utf-8-unix -*- + +\section{静态路由} +\label{sec:c3_s1} + +\subsection{实验目的} +\label{subsec:c3_s1_object} + +掌握静态路由协议,理解路由器工作原理,掌握路由器相关的配置、检测操作。 + +\subsection{实验内容} +\label{subsec:c3_s1_content} + +\begin{itemize} + \item 华为网络设备常用配置命令; + \item 华为网络模拟器ENSP的安装; + \item IP地址的配置; + \item 静态路由的配置; + \item 路由规划; + \item 网络收敛的概念; + \item 网络测试与排错操作。 +\end{itemize} + +\subsection{实验原理、方法和手段} +\label{subsec:c3_s1_principle} + +\begin{figure}[!htp] + \centering + \includegraphics[width=8cm]{c3_static-topo} + \caption{实验拓扑图} + \label{fig:c3_static-topo} +\end{figure} + +\begin{enumerate} + \item 用路由器连接若干局域网, + 局域网之间建议采用Ethernet协议连接, + 局域网之间采用静态路由, + 从而使在不同局域网上的计算机能够交换信息。 + 观察联通前后计算机和路由器路由表的变化情况,并给出解释。 + \item 通过ping其他主机,用Wireshark捕捉网络流量, + 找出与ping相关的ARP协议、ICMP协议报文逐字节地进行剖析(选做)。 +\end{enumerate} + +\subsection{实验条件} +\label{subsec:c3_s1_requirement} + +\begin{itemize} + \item 华为ENSP仿真平台中:2台PC,两台路由器; + \item 双绞线若干。 +\end{itemize} + +\subsection{实验步骤} +\label{subsec:c3_s1_procedure} + +实验说明:路由器端口以具体选用的设备为准 +(如路由器型号为AR2240以上,端口为千兆以太网口GE0/0/0; +如路由器型号为AR201,端口为以太网口E0/0/0), +请将Ethernet X口和Y口对应到实际设备上的端口名称, +如实际使用的端口名称应为GE0/0/0或E0/0等类似名称。 +如果是实际设备,请观察路由器前面板和后面板的端口名称, +并使用disp int或者disp cur命令查看端口的实际名称。 +在对路由器进行配置时,可使用disp cur命令来检查当前路由器上生效的配置命令。 +\begin{enumerate} + \item 硬件连接,完成PC1、PC2到路由器RT1和RT2的网络连接, + 路由器RT1到路由器RT2的连接;PC1到路由器RT1控制线的连接, + PC2到路由器RT2控制线的连接。 + 拓扑图检查无误后方可进行后面的实验步骤, + 实验报告中的拓扑图必须标清路由器实际连接的端口。 + \item 为PC1、PC2分别设置IP地址、掩码和网关。 + \item 使用sysname命令为路由器R1和R2命名。 + 路由器R1的名称为学生自己的姓名拼音+R1, + 路由器R2的名称为学生自己的姓名拼音+R2, + 要求记录输入的命令和输出(截屏)。 + + R1上的命令: + \begin{code}[text] + system-view + [Huawei]sysname zhangsanR1 + \end{code} + + \begin{figure}[!htp] + \centering + \includegraphics[width=10cm]{c3_sysname-R1_1} + \caption{R1配置图} + \label{fig:c3_sysname-R1_1} + \end{figure} + + R2上的命令: + \begin{code}[text] + system-view + [Huawei]sysname zhangsanR2 + \end{code} + + \begin{figure}[!htp] + \centering + \includegraphics[width=10cm]{c3_sysname-R2_1} + \caption{R1配置图} + \label{fig:c3_sysname-R2_1} + \end{figure} + + \item 为路由器R1的 GE0接口配置IP地址。 + 配置完成后PC1应该可以Ping通RT1的E0口的地址。 + 为路由器R2的 E1接口配置IP地址。 + 配置完成后PC2应该可以Ping通RT2的E1口的地址。 + 要求记录输入的命令和输出(截屏)。 + (本模拟器R1实际使用的接口名由实际使用的路由器型号确定,可能有Ethernet0/0/0;或GigabitEthernet0/0/x;或FastEthernet0/0/x) + + R1上的命令: + \begin{code}[text] + [zhangsanR1]interface GigabitEthernet 0/0/0 + [zhangsanR1- GigabitEthernet0/0/0]ip address 192.168.1.1 255.255.255.0 + [zhangsanR1- GigabitEthernet0/0/0] + \end{code} + PC1可以Ping通R1的192.168.1.1地址 + \begin{code}[text] + PC1>ping 192.168.1.1 + \end{code} + + \begin{figure}[!htp] + \centering + \includegraphics[width=10cm]{c3_ping_1} + \caption{Ping通效果图} + \label{fig:c3_ping_1} + \end{figure} + + R2上的命令: + \begin{code}[text] + [zhangsanR2]interface GigabitEthernet 0/0/1 + [zhangsanR1-GigabitEthernet0/0/1]ip address 192.168.3.1 255.255.255.0 + \end{code} + PC2可以Ping通R2的192.168.3.1地址 + \begin{code}[text] + PC1>ping 192.168.3.1 + \end{code} + + \item 为路由器R1的 Ethernet0/0/1接口配置IP地址, + 为路由器R2的Ethernet0/0/0接口配置IP地址。 + 配置完成后路由器R1和R2应该可以互相Ping通。要求记录输入的命令和输出(截屏)。 + \begin{code}[text] + [zhangsanR1-GigabitEthernet0/0/1]ip address 192.168.2.1 255.255.255.0 + [zhangsanR1-GigabitEthernet0/0/1]quit + [zhangsanR2-GigabitEthernet0/0/0]ip address 192.168.2.2 255.255.255.0 + [zhangsanR2-GigabitEthernet0/0/0]quit + \end{code} + \item 为RT1和RT2配置路由。要求记录输入的命令和输出(截屏或文本复制)。 + 配置后可以用disp cur检查配置,或者disp ip route检查路由表。 + 要求记录输入的命令和输出(截屏)。 + \begin{code}[text] + [zhangsanR1]ip route-static 192.168.3.0 255.255.255.0 192.168.2.2 + [zhangsanR2]ip route-static 192.168.1.0 255.255.255.0 192.168.2.1 + \end{code} + 注意:如果路由输入错误,如输入 + \begin{code}[text] + [rt1]ip route-static 192.168.3.0 255.255.255.0 192.168.2.2 + \end{code} + 则输入下列命令则可删除刚才的路由 + \begin{code}[text] + [rt1]undo ip route-static 192.168.3.0 255.255.255.0 192.168.2.2 + \end{code} + \item 验证PC1和PC2可以ping通。 + 分别使用ping命令和traceRT命令来验证,解释结果显示。 + 要求记录输入的命令和输出(截屏)。 + \begin{code}[text] + Ping 192.168.3.2 + traceRT 192.168.3.2 + \end{code} + \item (可选作)在PC1上使用抓包工具进行抓包。 + 首先使用arp –d命令清空arp表。 + 再使用Ping命令测试到PC2的连通性(192.168.3.2)。 + 分析抓到的ping命令的icmp报文。 +\end{enumerate} + +\subsection{思考题} +\label{subsec:c3_s1_rethink} + +如未达到网络收敛状态时,最远两端能够ping通, +请问网络中间的任意两点间也能ping通吗?为什么? + +\subsection{注意事项及有关说明} +\label{subsec:c3_s1_notice} + +路由器端口以具体选用的设备为准, +请将E0口和E1口对应到实际设备上的端口名称, +接口名由实际使用的路由器型号确定, +可能有Ethernet0/0/0;或GigabitEthernet0/0/x;或FastEthernet0/0/x。 +如果是实际设备,请观察路由器前面板和后面板的端口名称, +并使用disp int或者disp cur命令查看端口的实际名称。 +在对路由器进行配置时,可使用disp cur命令来检查当前路由器上生效的配置命令。 diff --git a/data/chapter3/section2.tex b/data/chapter3/section2.tex new file mode 100644 index 0000000..85d1b16 --- /dev/null +++ b/data/chapter3/section2.tex @@ -0,0 +1,198 @@ +%# -*- coding: utf-8-unix -*- + +\section{动态路由(RIP)} +\label{sec:c3_s2} + +\subsection{实验目的} +\label{subsec:c3_s2_object} + +理解动态路由协议RIP的工作原理; +掌握采用动态路由协议RIP进行网络设计的基本原则和方法。 + +\subsection{实验内容} +\label{subsec:c3_s2_content} + +\begin{itemize} + \item 华为路由器IP地址的配置; + \item 动态路由协议rip的配置; + \item 路由规划; + \item 网络测试与排错操作; + \item 静态路由与动态路由的区别。 +\end{itemize} + +\subsection{实验原理、方法和手段} +\label{subsec:c3_s2_principle} + +简要说明RIP工作原理和适用范围;设计至少包括3个网络由RIP协议互连起来; +观察并记录各设备状态变化情况,特别留意路由信息的交换和路由表。 +解释说明与路由协议、路由表的相关性。 + +可参考下图连线,具体联线情况请自行标注。 + +\begin{figure}[!htp] + \centering + \includegraphics[width=8cm]{c3_RIP-topo} + \caption{实验拓扑图} + \label{fig:c3_RIP-topo} +\end{figure} + +\subsection{实验条件} +\label{subsec:c3_s2_requirement} + +\begin{itemize} + \item 华为ENSP仿真平台中:2台PC,两台路由器; + \item 双绞线若干。 +\end{itemize} + +\subsection{实验步骤} +\label{subsec:c3_s2_procedure} + +实验说明:路由器端口以具体选用的设备为准。 +如果是实际设备,请观察路由器前面板和后面板的端口名称, +并使用disp int或者disp cur命令查看端口的实际名称。在对路由器进行配置时, +可使用disp cur命令来检查当前路由器上生效的配置命令。 + +\begin{enumerate} + \item 硬件连接,完成PC1、PC2到路由器RT1和RT2的网络连接, + 路由器RT1到路由器RT2的连接; + PC1到路由器RT1控制线的连接,PC2到路由器RT2控制线的连接。 + 拓扑图检查无误后方可进行后面的实验步骤, + 实验报告中的拓扑图必须标清路由器实际连接的端口。 + \item 为PC1、PC2分别设置IP地址、掩码和网关。 + \item 使用sysname命令为路由器R1和R2命名。 + 路由器R1的名称为学生自己的姓名拼音+R1, + 路由器R2的名称为学生自己的姓名拼音+R2,要求记录输入的命令和输出(截屏)。 + R1上的命令: + \begin{code}[text] + system-view + [Huawei]sysname zhangsanR1 + \end{code} + + \begin{figure}[!htp] + \centering + \includegraphics[width=10cm]{c3_sysname-R1_2} + \caption{R1配置图} + \label{fig:c3_sysname-R1_1} + \end{figure} + + R2上的命令: + \begin{code}[text] + system-view + [Huawei]sysname zhangsanR2 + \end{code} + + \begin{figure}[!htp] + \centering + \includegraphics[width=10cm]{c3_sysname-R2_2} + \caption{R2配置图} + \label{fig:c3_sysname-R2_1} + \end{figure} + + \item 为路由器R1的 GE0接口配置IP地址。 + 配置完成后PC1应该可以Ping通RT1的 GE0口的地址。 + 为路由器R2的 GE1接口配置IP地址。 + 配置完成后PC2应该可以Ping通RT2的GE1口的地址。 + 要求记录输入的命令和输出(截屏)。 + (本模拟器R1实际使用的接口名由实际使用的路由器型号确定, + 可能有Ethernet0/0/0;或GigabitEthernet0/0/x;或FastEthernet0/0/x) + + R1上的命令: + \begin{code}[text] + [zhangsanR1]interface GigabitEthernet 0/0/0 + [zhangsanR1- GigabitEthernet0/0/0]ip address 192.168.1.1 255.255.255.0 + [zhangsanR1- GigabitEthernet0/0/0] + \end{code} + + PC1可以Ping通R1的192.168.1.1地址 + + \begin{code}[text] + PC1>ping 192.168.1.1 + \end{code} + + \begin{figure}[!htp] + \centering + \includegraphics[width=10cm]{c3_ping_2} + \caption{Ping通效果图} + \label{fig:c3_ping_2} + \end{figure} + + R2上的命令: + \begin{code}[text] + [zhangsanR2]interface GigabitEthernet 0/0/1 + [zhangsanR1-GigabitEthernet0/0/1]ip address 192.168.3.1 255.255.255.0 + \end{code} + + PC2可以Ping通R2的192.168.3.1地址 + + \begin{code}[text] + PC1>ping 192.168.3.1 + \end{code} + + \item 为路由器R1的 Ethernet0/0/1接口配置IP地址, + 为路由器R2的Ethernet0/0/0接口配置IP地址。 + 配置完成后路由器R1和R2应该可以互相Ping通。 + 要求记录输入的命令和输出(截屏)。 + + \begin{code}[text] + [zhangsanR1-GigabitEthernet0/0/1]ip address 192.168.2.1 255.255.255.0 + [zhangsanR1-GigabitEthernet0/0/1]quit + \end{code} + \begin{code}[text] + [zhangsanR2-GigabitEthernet0/0/0]ip address 192.168.2.2 255.255.255.0 + [zhangsanR2-GigabitEthernet0/0/0]quit + \end{code} + + \item 为RT1和RT2配置动态路由协议rip。 + 要求记录输入的命令和输出(截屏或文本复制)。 + 配置后可以用disp cur检查配置,或者disp ip routing-table检查路由表。 + 要求记录输入的命令和输出(截屏)。 + + \begin{code}[text] + [zhangsanR1]rip + [zhangsanR1-rip]network 192.168.1.0 + [zhangsanR1-rip]network 192.168.2.0 + \end{code} + + \begin{code}[text] + [zhangsanR2]rip + [zhangsanR2-rip]network 192.168.3.0 + [zhangsanR2-rip]network 192.168.2.0 + \end{code} + + \begin{code}[text] + [zhangsanR1]display ip routing-table + \end{code} + + \begin{code}[text] + [zhangsanR2]display ip routing-table + \end{code} + + 等待1分钟后,在两台路由器上重复disp ip rout(缩写)命令, + 比较路由表,rip协议是否出现? + + 注意:如果要删除某路由器上的所有rip配置,或路由输入错误, + 则输入下列命令则可删除刚才的路由 + \begin{code}[text] + [zhangsanR2]undo rip + \end{code} + + \item 验证PC1和PC2可以ping通。要求记录输入的命令和输出(截屏)。 + \item (为后续实验,建议保存拓扑和具体设备的配置命令, + 即在模式中输入save命令,并保存已配置命令 + +\end{enumerate} + +\subsection{思考题} +\label{subsec:c3_s2_rethink} + +\begin{enumerate} + \item 在完成rip动态路由配置后,最远两端能够ping通, + 请问网络中间的任意两点间也能ping通吗?为什么? + \item 静态路由和动态路由协议的区别是什么? +\end{enumerate} + +\subsection{注意事项及有关说明} +\label{subsec:c3_s2_notice} + +路由器端口以具体选用的设备为准,请将E0口和E1口对应到实际设备上的端口名称,接口名由实际使用的路由器型号确定,可能有Ethernet0/0/0;或GigabitEthernet0/0/x;或FastEthernet0/0/x。如果是实际设备,请观察路由器前面板和后面板的端口名称,并使用disp int或者disp cur命令查看端口的实际名称。在对路由器进行配置时,可使用disp cur命令来检查当前路由器上生效的配置命令。 + diff --git a/data/chapter3/section3.tex b/data/chapter3/section3.tex new file mode 100644 index 0000000..b869c0f --- /dev/null +++ b/data/chapter3/section3.tex @@ -0,0 +1,214 @@ +%# -*- coding: utf-8-unix -*- + +\section{动态路由(OSPF)} +\label{sec:c3_s3} + +\subsection{实验目的} +\label{subsec:c3_s3_object} + +理解动态路由协议OSPF的工作原理; +掌握采用动态路由协议OSPF进行网络设计的基本原则和方法。 + +\subsection{实验内容} +\label{subsec:c3_s3_content} + +\begin{itemize} + \item 华为路由器IP地址的配置; + \item 动态路由协议OSPF的配置; + \item 路由规划; + \item 网络测试与排错操作; + \item RIP与OSPF路由协议的区别。 +\end{itemize} + +\subsection{实验原理、方法和手段} +\label{subsec:c3_s3_principle} + +简要说明OSPF工作原理和适用范围; +可设计至少包括3个由OSPF协议互连起来的网络; +观察并记录各设备状态变化情况,特别留意路由信息的交换和路由表。 +分析说明相对于RIP协议,OSPF做了哪些改进。 +解释说明与路由协议、路由表的相关性。 + +可参考图\ref{fig:c3_OSPF-topo}连线,具体联线情况请自行标注。 + +\begin{figure}[!htp] + \centering + \includegraphics[width=8cm]{c3_OSPF-topo} + \caption{选中特定的捕获类型} + \label{fig:c3_OSPF-topo} +\end{figure} + +\subsection{实验条件} +\label{subsec:c3_s3_requirement} + +\begin{itemize} + \item 华为ENSP仿真平台中:2台PC,两台路由器; + \item 双绞线若干。 +\end{itemize} + +\subsection{实验步骤} +\label{subsec:c3_s3_procedure} + +实验说明:路由器端口以具体选用的设备为准, +如果是实际设备,请观察路由器前面板和后面板的端口名称, +并使用disp int或者disp cur命令查看端口的实际名称。 +在对路由器进行配置时, +可使用disp cur命令来检查当前路由器上生效的配置命令。 + +\begin{enumerate} + \item 硬件连接,完成PC1、PC2到路由器RT1和RT2的网络连接, + 路由器RT1到路由器RT2的连接; + PC1到路由器RT1控制线的连接,PC2到路由器RT2控制线的连接。 + 拓扑图检查无误后方可进行后面的实验步骤, + 实验报告中的拓扑图必须标清路由器实际连接的端口。 + \item 为PC1、PC2分别设置IP地址、掩码和网关。 + \item 使用sysname命令为路由器R1和R2命名。 + 路由器R1的名称为学生自己的姓名拼音+R1, + 路由器R2的名称为学生自己的姓名拼音+R2,要求记录输入的命令和输出(截屏)。 + + R1上的重命名命令如下例: + \begin{code}[text] + system-view + [Huawei]sysname zhangsanR1 + \end{code} + + 输出结果如图\ref{fig:c3_sysname-R1_3}所示。 + \begin{figure}[!htp] + \centering + \includegraphics[width=10cm]{c3_sysname-R1_3} + \caption{R1的sys配置图} + \label{fig:c3_sysname-R1_3} + \end{figure} + + R2上的重命名命令如下例: + \begin{code}[text] + system-view + [Huawei]sysname zhangsanR2 + \end{code} + + 输出结果如图\ref{fig:c3_sysname-R2_3}所示。 + \begin{figure}[!htp] + \centering + \includegraphics[width=10cm]{c3_sysname-R2_3} + \caption{R2的sys配置图} + \label{fig:c3_sysname-R2_3} + \end{figure} + + \item 为路由器R1的 GE0接口配置IP地址。 + 配置完成后PC1应该可以Ping通RT1的 GE0口的地址。 + 为路由器R2的 GE1接口配置IP地址。 + 配置完成后PC2应该可以Ping通RT2的GE1口的地址。 + 要求记录输入的命令和输出(截屏)。 + (本模拟器R1实际使用的接口名由实际使用的路由器型号确定, + 可能有Ethernet0/0/0;或GigabitEthernet0/0/x;或FastEthernet0/0/x) + + R1上的重命名命令如下例: + \begin{code}[text] + [zhangsanR1]interface GigabitEthernet 0/0/0 + [zhangsanR1- GigabitEthernet0/0/0]ip address 192.168.1.1 255.255.255.0 + [zhangsanR1- GigabitEthernet0/0/0] + \end{code} + + PC1可以Ping通R1的192.168.1.1地址 + \begin{code}[text] + PC1> ping 192.168.1.1 + \end{code} + + R2上的命令: + \begin{code}[text] + [zhangsanR2]interface GigabitEthernet 0/0/1 + [zhangsanR1-GigabitEthernet0/0/1]ip address 192.168.3.1 255.255.255.0 + \end{code} + + PC2可以Ping通R2的192.168.3.1地址 + + \begin{code}[text] + PC1>ping 192.168.3.1 + \end{code} + + \item 为路由器R1的 Ethernet0/0/1接口配置IP地址, + 为路由器R2的Ethernet0/0/0接口配置IP地址。 + 配置完成后路由器R1和R2应该可以互相Ping通。 + 要求记录输入的命令和输出(截屏)。 + \begin{code}[text] + [zhangsanR1-GigabitEthernet0/0/1]ip address 192.168.2.1 255.255.255.0 + [zhangsanR1-GigabitEthernet0/0/1]quit + \end{code} + + \begin{code}[text] + [zhangsanR2-GigabitEthernet0/0/0]ip address 192.168.2.2 255.255.255.0 + [zhangsanR2-GigabitEthernet0/0/0]quit + \end{code} + + \item (如在实验3.2的基础上进行实验则执行此步骤,否则直接配置第七步) + 为RT1和RT2配置动态路由协议ospf,首先删除原来的rip配置。 + 要求记录输入的命令和输出(截屏或文本复制)。 + 配置后可以用display current configuration检查配置, + 或者display ip routing-table检查路由表。 + 要求记录输入的命令和输出(截屏)。 + \begin{code}[text] + [zhangsanR1]undo rip + \end{code} + + \begin{figure}[!htp] + \centering + \includegraphics[width=12cm]{c3_confirm} + \label{fig:c3_confirm} + \end{figure} + + 确认删除?Y + + 此时用disp cur检查配置,rip相关配置全部删除; + + disp ip routing-table检查路由表,rip那条路由也将被删除 + \begin{code}[text] + [zhangsanR2]undo rip + \end{code} + 确认删除?Y + + \item 为RT1和RT2配置动态路由协议ospf。 + 配置后可以用disp cur检查配置,或者disp ip routing-table检查路由表。 + 配置完成后路由器R1和R2应该可以互相Ping通。 + 要求记录输入的命令和输出(截屏)。 + + \begin{code}[text] + [zhangsanR1]ospf + [zhangsanR1-ospf-1]area 0 + [zhangsanR1-ospf-1-area-0.0.0.0]network 192.168.1.0 0.0.0.255 + [zhangsanR1-ospf-1-area-0.0.0.0]network 192.168.2.0 0.0.0.255 + [ctrl+z] + [zhangsanR1]ping 192.168.3.2 + \end{code} + + \begin{code}[text] + [zhangsanR2]ospf + [zhangsanR2-ospf-1]area 0 + [zhangsanR2-ospf-1-area-0.0.0.0]network 192.168.2.0 0.0.0.255 + [zhangsanR2-ospf-1-area-0.0.0.0]network 192.168.3.0 0.0.0.255 + [zhangsanR2-ospf-1-area-0.0.0.0]display ip routing-table + [ctrl+z] + [zhangsanR2]ping 192.168.1.2 + \end{code} + +\end{enumerate} + +\subsection{思考题} +\label{subsec:c3_s3_rethink} + +Rip和OSPF协议的区别是什么?请对比路由表,收敛速度等。 + +\subsection{注意事项及有关说明} +\label{subsec:c3_s3_notice} + +\begin{enumerate} + \item 路由器端口以具体选用的设备为准, + 请将E0口和E1口对应到实际设备上的端口名称, + 接口名由实际使用的路由器型号确定, + 可能有Ethernet0/0/0;或GigabitEthernet0/0/x;或FastEthernet0/0/x。 + 如果是实际设备,请观察路由器前面板和后面板的端口名称, + 并使用disp int或者disp cur命令查看端口的实际名称。 + 在对路由器进行配置时,可使用disp cur命令来检查当前路由器上生效的配置命令。 + \item 此实验的第1-5步骤同前一实验3.2-rip, + 如在原rip基础上配置选第六步; + 如是全新实验,则跳过第六步,直接配置第七步。 + \end{enumerate} \ No newline at end of file diff --git a/data/cover.tex b/data/cover.tex new file mode 100644 index 0000000..d0a8b8d --- /dev/null +++ b/data/cover.tex @@ -0,0 +1,58 @@ +%# -*- coding: utf-8-unix -*- +\thispagestyle{empty} +\begin{tikzpicture}[overlay,remember picture,font=\sffamily\bfseries] +% \draw[ultra thick,c4,name path=big arc] ([xshift=-2mm]current page.north) arc(150:285:11) +% coordinate[pos=0.225] (x0); +% \begin{scope} +% \clip ([xshift=-2mm]current page.north) arc(150:285:11) --(current page.north +% east); +% \fill[c4!50,opacity=0.25] ([xshift=4.55cm]x0) circle (4.55); +% \fill[c4!50,opacity=0.25] ([xshift=3.4cm]x0) circle (3.4); +% \fill[c4!50,opacity=0.25] ([xshift=2.25cm]x0) circle (2.25); +% \draw[ultra thick,c4!50] (x0) arc(-90:30:6.5); +% \draw[ultra thick,c4] (x0) arc(90:-30:8.75); +% \draw[ultra thick,c4!50,name path=arc1] (x0) arc(90:-90:4.675); +% \draw[ultra thick,c4!50] (x0) arc(90:-90:2.875); +% \path[name intersections={of=big arc and arc1,by=x1}]; +% \draw[ultra thick,c4,name path=arc2] (x1) arc(135:-20:4.75); +% \draw[ultra thick,c4!50] (x1) arc(135:-20:8.75); +% \path[name intersections={of=big arc and arc2,by={aux,x2}}]; +% \draw[ultra thick,c4!50] (x2) arc(180:50:2.25); +% \end{scope} +% \path[decoration={text along path,text color=c4, +% raise = -2.8ex, +% text along path, +% text = {|\sffamily\bfseries|计算机网络教案社区}, +% text align = center, +% }, +% decorate +% ] ([xshift=-2mm]current page.north) arc(150:245:11); + +\begin{scope} +\path[clip,postaction={fill=c2}] +([xshift=2cm,yshift=2cm]current page.center) rectangle ++ (4.2,7.7); +% \fill[c2] ([xshift=0.5cm,yshift=2cm]current page.center) +% ([xshift=0.5cm,yshift=2cm]current page.center) arc(180:60:2) +% |- ++ (-3,6) --cycle; +% \draw[ultra thick,c4] ([xshift=-1.5cm,yshift=2cm]current page.center) +% arc(180:0:2); +% \draw[ultra thick,c4] ([xshift=0.5cm,yshift=2cm]current page.center) +% arc(180:0:2); +% \draw[ultra thick,c4] ([xshift=2.5cm,yshift=2cm]current page.center) +% arc(180:0:2); +% \draw[ultra thick,c4] ([xshift=4.5cm,yshift=2cm]current page.center) +% arc(180:0:2); +% \fill[red] ([xshift=2.5cm,yshift=-8cm]current page.center) +(60:2) circle(1.5mm); +\end{scope} + +\fill[c1] ([xshift=2cm,yshift=2cm]current page.center) rectangle ++ (-13.7,7.7); + +\node[text=white,anchor=west,scale=4,inner sep=0pt] at +([xshift=-8.55cm,yshift=7cm]current page.center) {计算机网络}; +\node[text=white,anchor=west,scale=2,inner sep=0pt] at +([xshift=-6.2cm,yshift=4.2cm]current page.center) {共同实验指导书}; + +\node[text=gray,anchor=west,scale=1.5,inner sep=0pt] at +([xshift=-3cm,yshift=-10.5cm]current page.center) {计算机网络教案社区}; + +\end{tikzpicture} \ No newline at end of file diff --git a/data/preface.tex b/data/preface.tex new file mode 100644 index 0000000..3a80219 --- /dev/null +++ b/data/preface.tex @@ -0,0 +1,29 @@ +\begin{pre} + + \thispagestyle{empty} +本实验指导书是为计算机网络教案社区发布的课件配套撰写的实验指导书。 +总体上分为基础实验与高级实验两大部分。 +基础实验主要包括网络协议分析与网络程序设计两个单元(共计6个实验), +高级实验主要包括组网基础、路由器设计实现、 +软件定义网络与网络测量等三个单元(共计8个实验), +供有需要的高校选用。 + +考虑到每个学校都有各自的教学大纲和实验环境, +不同学校前序课程不同,开设网络课程的学期也不一致, +社区难以顾及方方面面的需求。 +因此本实验指导书主要是提出了一个实验框架,其中同时包括了基础、进阶和创新内容, +故而命名为“共同”实验。 +在实际使用中, +各位任课老师可以根据具体需求在本指导书的基础上通过 +增删、组合、修改等方法设计合宜的实验方案。 + +本实验指导书由计算机网络教案社区发起, +各高校专家教授共同联合编纂,各章节主要编纂人员如下: + +\begin{itemize} + \item 第一单元:谢怡、陈建发、洪劼超、雷蕴奇,厦门大学 + \item 第二单元:吴荻,国防科技大学 + \item 第三单元:张晓丽,昆明理工大学 +\end{itemize} + +\end{pre} \ No newline at end of file diff --git a/figure/appendix1/a1_ENSP-UI.png b/figure/appendix1/a1_ENSP-UI.png new file mode 100644 index 0000000..9a2d0b7 Binary files /dev/null and b/figure/appendix1/a1_ENSP-UI.png differ diff --git a/figure/appendix1/a1_ENSP-help.png b/figure/appendix1/a1_ENSP-help.png new file mode 100644 index 0000000..e59aeb9 Binary files /dev/null and b/figure/appendix1/a1_ENSP-help.png differ diff --git a/figure/appendix1/a1_ENSP-version.png b/figure/appendix1/a1_ENSP-version.png new file mode 100644 index 0000000..e7f4138 Binary files /dev/null and b/figure/appendix1/a1_ENSP-version.png differ diff --git a/figure/appendix1/a1_error.png b/figure/appendix1/a1_error.png new file mode 100644 index 0000000..0547b16 Binary files /dev/null and b/figure/appendix1/a1_error.png differ diff --git a/figure/by-nc.eps b/figure/by-nc.eps new file mode 100644 index 0000000..ef57d06 --- /dev/null +++ b/figure/by-nc.eps @@ -0,0 +1,2727 @@ +%!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 8.0 %%AI8_CreatorVersion: 13.0.1 %%For: (Alex Roberts) () %%Title: (by-nc.eps) %%CreationDate: 3/27/08 4:28 PM %%BoundingBox: 340 278 461 321 %%HiResBoundingBox: 340.5 278.5 460.5 320.5 %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0 %%+ procset Adobe_ColorImage_AI6 1.3 0 %%+ procset Adobe_Illustrator_AI5 1.3 0 %%+ procset Adobe_cshow 2.0 8 %%+ procset Adobe_shading_AI8 1.0 0 %AI5_FileFormat 4.0 %AI3_ColorUsage: Color %AI3_IncludePlacedImages %AI7_ImageSettings: 1 %%CMYKProcessColor: 0.74902 0.678431 0.670588 0.901961 ([Registration]) %%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) %%+ Options: 1 16 0 1 1 1 0 0 0 0 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 2 3 4 %%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 -1 -1 () %AI3_Cropmarks: 340.5 278.5 460.5 320.5 %AI3_TemplateBox: 400.5 299.5 400.5 299.5 %AI3_TileBox: 112 -56 688 678 %AI3_DocumentPreview: Macintosh_ColorPic %AI5_ArtSize: 800 600 %AI5_RulerUnits: 6 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI8_OpenToView: -381 756 1 1566 923 26 0 0 73 75 0 0 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 48 8 48 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %AI7_Thumbnail: 128 48 8 %%BeginData: 8668 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45A8FD7DF827A8F8275258527D5258527D5258527D5258527D525852 %7D5258527D5258527D5258527D5258527D5258527D5258527D5258527D52 %58527D5258527D5258527D5258527D5258527D5258527D5258527D525852 %7D5258527D5258527D5258527D5258527D5258527D5258527D5258527D52 %58527D5258527D5258527D5258527DF8F8F852A87D837DA87D837DA87D83 %7DA87D837DA87D847DA87D847DA87D837DA87D837DA87D837DA87D837DA8 %7D837DA87D837DA87D837DA87D837DA87D837DA87DA87DA883A87DA87D83 %7DA87D837DA87D837DA87D837DA87D837DA87D837DA87DA87DA883A87DA8 %7D837DA87D837DA87D837DA87D837DA87D837DA87D837D7DF8F8FD127D83 %FD2C7D58FD0652FD177D587D52522D5252FD197D52F8F852A87D837D837D %837D837D837DA87D835858FD07277D7DA87D847D837D837D837D837D837D %837D837D837D837D837D837D837D837D837DA87D7D2727FD05F82727527D %A87D837D837D837D837D837D837D837DA87D7D2727FD05F80404527DA87D %837D837D837D837D837D837D837D837D837D837D7DF8F8FD0C7D837D52FD %0BF827277D7D83FD1B7D845227FD0BF8275284FD0F7D52FD0CF82DFD157D %52F8F858837D837D7D7D837D7D7DA85227FD0FF8277DA87D7D7D837D7D7D %837D7D7D837D7D7D837D7D7D837D7D7D837DA852FD04F8527DA8A8A87D52 %FD04F827A87D7D7D837D7D7D837D7D7DA87D27F8F8F85252A8A8A87D7D27 %F8F8F8277D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7DF8F8FD0B7D %27FD06F827275252522727FD06F85283FD177D8352F8F8F827A8FD08FF52 %F8F8F82783FD0A7D5227F8F8F8A8FD08FF7DF8F8F804FD137D52F8F858A8 %7D837D837D837D8327FD04F8277DFD08FFA85227FD04F852A87D837D837D %837D837D837D837D837D837D837D837DA858F8F8F87DFD04FF7D277DFD04 %FFA827F8F852A87D837D837D837D837D27F8F852FD05FFA8A8FD04FFA852 %F8F827A87D837D837D837D837D837D837D837D837D7DF8F8FD087D8327FD %04F87DFD0CFFA852FD04F85283FD157D27F8F87DFD04FFA8F8F8F8A8FD04 %FFA8F8F8F858FD087D27F8F852FD06FF2727FD05FFA827F8F85284FD0F7D %8352F8F852A87D7D7D837DA827FD04F8A8FD0FFF7DFD04F852A87D837D7D %7D837D7D7D837D7D7D837D7D7D837D52F8F852FD05FF7DF8F8F87DFD05FF %7DF8F8527D7D7D83FD047DF8F827FD06FFA8F827A8FD05FFA827F8277D83 %7D7D7D837D7D7D837D7D7D83FD047DF8F859FD057D8352FD04F8A8FD11FF %7DFD04F858FD137DF8F8F8FD07FF522752FD07FF27F8F8FD077D27F8F8F8 %27A8FFFFA852FD05F87DFD04FF7DF8F852FD107D52F8F852A87D837DA87D %27F8F8F8FD14FF7DF8F8F82D7D847D837D837D837D837D837D837D837DA8 %52F8F8A8FD06FF527D527D52A8FD05FFA8F8F852A87D837D837D27FD05F8 %527D52F8F8F827F8F852FD05FF27F827A87D837D837D837D837D837D837D %837D7DF8F8FD067D52F8F8F87DFD15FF52F8F8F859FD117D52F8F8A8FD05 %FF27FD06F8FD06FF27F827FD057D52F8F85227FD07F8A8A87D52FD06FF7D %F8F858FD0F7D52F8F858837D837D7DF8F8F852FD17FF27F8F827847D837D %7D7D837D7D7D837D7D7D837D8327F827FD06FF27FD06F8A8FD05FF52F8F8 %837D7D7DA852F8F8FFFF7D27FD04F8277DFD09FF7DF8F87D7D837D7D7D83 %7D7D7D837D7D7D837D7DF8F8FD047D8327F8F8F8A8FD17FF52F8F8F858FD %107D27F852FD06FFFD07F8FD06FF7DF8F858FD047D52F827A8FFFFFF7D52 %FD05F852A8FD06FFA8F8F852FD0F7D52F8F858A87DA87D27F8F852FD05FF %7D52275252FD05FF7D5227527DFD05FFF8F8F8527D837D837D837D837D83 %7D837D837D7DF8F87DFD06FF27FD05F827FD06FF7DF8F87D7D837DA82DF8 %27FD06FFA852FD04F82752FD06FF27F8587D837D837D837D837D837D837D %837D7DF8F8FD057DF8F8F8A8FD04FF52FD06F8A8FFA8FD06F827FD04FF52 %F8F82783FD0F7D27F87DFD06FFFD07F8FD06FF7DF8F858FD047D52F827FD %08FFA852FD05F852A8FFFFA8F8F852FD0E7D8352F8F852A87D8352F8F8F8 %A8FFFFFF52F8F8F82752F8F8F8FF27F8F8275227F8F852FFFFFF7DF8F827 %7D7D7D837D7D7D837D7D7D837D7D7D8327F827FD06FF52FD05F852FD06FF %52F8F87D7D837DA827F8F8FD0BFF27FD05F827A8A8F8F8FD047D837D7D7D %837D7D7D83FD047DF8F8597D7D7D52F8F8F8FFFFFFA8F8F8F852FFFF52F8 %A87DF8F8F8A8FFA82727A8FFFFFFA8F8F8F8FD107D27F827A8FD06FF7DF8 %F8F87DFD07FF27F827FD057D52F8F8A8FD05FF7D52A8FFFF52FD07F827F8 %F852FD0F7D52F8F852A87DA852F8F852FFFFFFA8F8F8F8FD06FF7DF8F852 %FFFFFFA8FD05FFA8F8F8277D837D837D837D837D837D837D837DA852F8F8 %A8FD06FF7DF8F8F852FD07FFF8F827A87D837D837D27F87DFD04FFA8F8F8 %272727F8F8F8FF7D27FD05F8837D837D837D837D837D837D837D837D7DF8 %F8FD047D52F8F827FFFFFF7DF8F827FD06FF27F8F87DFD09FFA8F8F8F8FD %117DF8F827FD06FF7DF8F8F87DFD06FF52F8F8FD077DF8F8F8FD04FFA827 %FD06F8A8FFFFFFA827F8F82DFD107D52F8F858837DA852F8F852FFFFFFA8 %F8F8F8FD06FF52F8F852FD09FFA8F8F8F87D837D7D7D837D7D7D837D7D7D %837D7D7D52F8F87DFD05FF7DF8F8F852FD05FFA827F8277D837D7D7D837D %52F8F852FD05FF7D7DF82752FD06FF52F8F858837D837D7D7D837D7D7D83 %7D7D7D837D7DF8F8FD047D52F8F827FFFFFFA8F8F8F87DFFFFA827FF52F8 %F827FFFFFF7D52FD04FFA8F8F8F8FD117D52F8F8F8A8FD04FF7DF8F8F87D %FD04FFA827F8F852FD087D27F8F87DFD06FF27F8FD06FF52F8F82783FD10 %7D52F8F858A87DA852F8F827FD04FF27F8F8277DA827F8F8A8F8F8F8527D %7DF8F852FFFFFF7DF8F8277DA87D837D837D837D837D837D837D837DA852 %F8F827A8FFFFFF7DF8F8F87DFD04FF27F8F827A87D837D837D837DA87D27 %F8F87DFD05FF7D7DFD05FF7DF8F8F8837D837D837D837D837D837D837D83 %7D837D7DF8F8FD057DF8F8F8A8FFFFFFA8FD07F852FF7DFD07F8A8FFFFFF %52F8F827FD127D8327F8F8F87DFFFFFFA8FFA8FFFFFF7D27F8F8F8FD0A7D %8352F8F8F852FD09FFA852F8F8F8FD127D8352F8F852A87D837D27F8F852 %FD04FFA827FD04F87DFFFFFF7DFD04F827A8FD04FF27F8F8527D7D7D837D %7D7D837D7D7D837D7D7D837D7D7DA827F8F8F8277DA8FFFFFFA8A827F8F8 %F8277D7D837D7D7D837D7D7D837DA852FD04F87DA8FD04FFA85227F8F8F8 %FD047D837D7D7D837D7D7D837D7D7D83FD047DF8F859FD047D27F8F827A8 %FD05FFA8A87DFFFFFFA8FFFFFFA8A8A8FD05FF7DF8F8F85283FD137D8352 %FD06F827FD06F827FD0E7D835227FD05F827F827FD04F827FD157D52F8F8 %52A87D837D7DF8F8F87DFD17FF52F8F8F8A87D837D837D837D837D837D83 %7D837D837D837D837DA87D52FD09F82D58A87D837D837D837D837D837D83 %7D837DA87D52FD09F82752A87D837D837D837D837D837D837D837D837D83 %7D837D7DF8F8FD067D27F8F8F8FD16FF7DF8F8F852FD1A7D52522727272D %52FD177D525227272752527D7D84FD167D52F8F858837D837D8452F8F8F8 %27FD15FFF8F8F8277D837D837D7D7D837D7D7D837D7D7D837D7D7D837D7D %7D837D7D7DA87D847DA87D847D837D7D7D837D7D7D837D7D7D837D7D7D83 %7D7D7D837D837DA87D847DA87D7D7D837D7D7D837D7D7D837D7D7D837D7D %7D837D7D7D837D7DF8F8FD047D837D7D27F8F8F852FD13FFFD04F852837D %7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D %837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D %7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7DA852F8F8 %527D527D52837D83FD04F852FD11FF27F8F8F827A87D7D527D5258527D52 %58527D5258527D5258527D5258527D5258527D5258527D5258527D525852 %7D5258527D5258527D5258527D5258527D5258527D5258527D5258527D52 %58527D5258527D5258527D5258527D5258527D5252FD07F852837D7DFD04 %F827A8FD0DFFA8FD04F8277D7D8327FD5FF8277D837D7DFD05F87DA8FD09 %FFA852FD04F827837DA852FD61F82DFD047DFD06F8277D7DA87DA87D7D27 %FD05F8277D7D8358FD63F8527DA87D7D27FD08F827FD07F82752A87DA87D %27FD17F8277DA87D7D27277D7DF8F827A827FD10F8527D52F8277D52F8F8 %52A8A87DFD22F852FD047D5227FD0DF82752A87D7D7D27FD18F852FFA8A8 %FFFFF8A8FF27F8A8FF27FD10F852FFA8F8F8FF7DF852FFA8A8FFA8FD22F8 %527DA87DA87D7D2727FD07F8272D7D7D837DA87D27FD19F852FF27F87DFF %27F8FFA852FF7DFD11F852FFFF52F8A87DF8FFA8F8F87DFF27FD22F82752 %837D7D7D837D7D5258527D527D7D83FD047D52FD1BF827FF7D7DA8A8F8F8 %52FFFFFFFD12F852FF7DFFF8A85252FF52FD28F82752837DA87D837DA87D %A87DA87D837DA87D7D27FD1CF852FFA87DFFFF52F8F8A8FF52FD12F852FF %27FFA8A87D52FF27FD04F827FD26F85252837D7D7D837D7D7D837D7D5227 %FD1EF852FFF8F8F8FF7DF8F87DFF27FD12F852FFF852FFFF5227FF7DF8F8 %52FF27FD28F82752527D527D587D5252FD21F852FFA852A8FF7DF8F87DFF %27FD12F852FF27F8A8FF7DF8A8FFA87DFFA8FD54F827A8A8FFA87DF8F8F8 %52A827FD12F827A8F8F827FF52F8F87DFFFF7D27FD7CF827FD9BF852FD7F %27FD7FFFFF %%EndData %%EndComments %%BeginProlog %%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 0 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 26 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + (AI8_CMYK_CustomColor) + 6 packedarray + } bind def + /findrgbcustomcolor + { + (AI8_RGB_CustomColor) + 5 packedarray + } bind def + /setcustomcolor + { + exch + aload pop dup + (AI8_CMYK_CustomColor) eq + { + pop pop + 4 + { + 4 index mul + 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + { + dup (AI8_RGB_CustomColor) eq + { + pop pop + 3 + { + 1 exch sub + 3 index mul + 1 exch sub + 3 1 roll + } repeat + 4 -1 roll pop + setrgbcolor + } + { + pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } ifelse + } ifelse + } + def + } if + /setAIseparationgray + { + false setoverprint + 0 setgray + /setseparationgray where{ + pop setseparationgray + }{ + /setcolorspace where{ + pop + [/Separation (All) /DeviceCMYK {dup dup dup}] setcolorspace + 1 exch sub setcolor + }{ + setgray + }ifelse + }ifelse + } def + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.3 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 53 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin +/initialize { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 { + dup type /arraytype eq { + dup xcheck { + bind + } if + } if + pop pop + } forall +} def +/terminate { end } def +currentdict /Adobe_ColorImage_AI6_Vars known not { + /Adobe_ColorImage_AI6_Vars 41 dict def +} if +Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + /_newproc null def + /_proc1 null def + /_proc2 null def + /sourcearray 4 array def + /_ptispace null def + /_ptiname null def + /_pti0 0 def + /_pti1 0 def + /_ptiproc null def + /_ptiscale 0 def + /_pticomps 0 def + /_ptibuf 0 string def + /_gtigray 0 def + /_cticmyk null def + /_rtirgb null def + /XIEnable true def + /XIType 0 def + /XIEncoding 0 def + /XICompression 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIRowBytes 0 def + /XIFile null def + /XIBuffer1 null def + /XIBuffer2 null def + /XIBuffer3 null def + /XIDataProc null def + /XIColorSpace /DeviceGray def + /XIColorValues 0 def + /XIPlateList false def +end +/ci6colorimage /colorimage where {/colorimage get}{null} ifelse def +/ci6image systemdict /image get def +/ci6curtransfer systemdict /currenttransfer get def +/ci6curoverprint /currentoverprint where {/currentoverprint get}{{_of}} ifelse def +/ci6foureq { + 4 index ne { + pop pop pop false + }{ + 4 index ne { + pop pop false + }{ + 4 index ne { + pop false + }{ + 4 index eq + } ifelse + } ifelse + } ifelse +} def +/ci6testplate { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + /setcmykcolor where { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + 1 0 0 0 ci6foureq { + /plateindex 0 def + }{ + 0 1 0 0 ci6foureq { + /plateindex 1 def + }{ + 0 0 1 0 ci6foureq { + /plateindex 2 def + }{ + 0 0 0 1 ci6foureq { + /plateindex 3 def + }{ + 0 0 0 0 ci6foureq { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end +} def +/ci6concatprocs { + /packedarray where { + pop dup type /packedarraytype eq 2 index type + /packedarraytype eq or + }{ + false + } ifelse + { + /_proc2 exch cvlit def + /_proc1 exch cvlit def + _proc1 aload pop + _proc2 aload pop + _proc1 length + _proc2 length add + packedarray cvx + }{ + /_proc2 exch cvlit def + /_proc1 exch cvlit def + /_newproc _proc1 length _proc2 length add array def + _newproc 0 _proc1 putinterval + _newproc _proc1 length _proc2 putinterval + _newproc cvx + } ifelse +} def +/ci6istint { + type /arraytype eq +} def +/ci6isspot { + dup type /arraytype eq { + dup length 1 sub get /Separation eq + }{ + pop false + } ifelse +} def +/ci6spotname { + dup ci6isspot {dup length 2 sub get}{pop ()} ifelse +} def +/ci6altspace { + aload pop pop pop ci6colormake +} def +/ci6numcomps { + dup /DeviceGray eq { + pop 1 + }{ + dup /DeviceRGB eq { + pop 3 + }{ + /DeviceCMYK eq { + 4 + }{ + 1 + } ifelse + } ifelse + } ifelse +} def +/ci6marksplate { + dup /DeviceGray eq { + pop plateindex 3 eq + }{ + dup /DeviceRGB eq { + pop plateindex 5 ne + }{ + dup /DeviceCMYK eq { + pop plateindex 5 ne + }{ + dup ci6isspot { + /findcmykcustomcolor where { + pop + dup length 2 sub get + 0.1 0.1 0.1 0.1 5 -1 roll + findcmykcustomcolor 1 setcustomcolor + systemdict /currentgray get exec + 1 ne + }{ + pop plateindex 5 ne + } ifelse + }{ + pop plateindex 5 ne + } ifelse + } ifelse + } ifelse + } ifelse +} def +/ci6colormake { + dup ci6numcomps + exch 1 index 2 add 1 roll + dup 1 eq {pop}{array astore} ifelse + exch +} def +/ci6colorexpand { + dup ci6spotname exch + dup ci6istint { + ci6altspace + exch 4 1 roll + }{ + 1 3 1 roll + } ifelse +} def +/ci6colortint { + dup /DeviceGray eq { + 3 1 roll 1 exch sub mul 1 exch sub exch + }{ + dup /DeviceRGB eq { + 3 1 roll {1 exch sub 1 index mul 1 exch sub exch} forall pop 3 array astore exch + }{ + dup /DeviceCMYK eq { + 3 1 roll {1 index mul exch} forall pop 4 array astore exch + }{ + 3 1 roll mul exch + } ifelse + } ifelse + } ifelse +} def +/ci6colortocmyk { + dup /DeviceGray eq { + pop 1 exch sub 0 0 0 4 -1 roll 4 array astore + }{ + dup /DeviceRGB eq { + pop aload pop _rgbtocmyk 4 array astore + }{ + dup /DeviceCMYK eq { + pop + }{ + ci6altspace ci6colortint ci6colortocmyk + } ifelse + } ifelse + } ifelse +} def +/ci6makeimagedict { + 7 dict begin + /ImageType 1 def + /Decode exch def + /DataSource exch def + /ImageMatrix exch def + /BitsPerComponent exch def + /Height exch def + /Width exch def + currentdict end +} def +/ci6stringinvert { + 0 1 2 index length 1 sub { + dup 2 index exch get 255 exch sub 2 index 3 1 roll put + } for +} def +/ci6stringknockout { + 0 1 2 index length 1 sub { + 255 2 index 3 1 roll put + } for +} def +/ci6stringapply { + 0 1 4 index length 1 sub { + dup + 4 index exch get + 3 index 3 1 roll + 3 index exec + } for + pop exch pop +} def +/ci6walkrgbstring { + 0 3 index + dup length 1 sub 0 3 3 -1 roll { + 3 getinterval {} forall + 5 index exec + 3 index + } for + + 5 {pop} repeat +} def +/ci6walkcmykstring +{ + 0 3 index + dup length 1 sub 0 4 3 -1 roll { + 4 getinterval {} forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + +} def +/ci6putrgbtograystr +{ + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add +} def +/ci6putcmyktograystr +{ + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add +} def +/ci6rgbtograyproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + XIBuffer3 + dup 3 1 roll + + /ci6putrgbtograystr load exch + ci6walkrgbstring + end +} def +/ci6cmyktograyproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + XIBuffer3 + dup 3 1 roll + + /ci6putcmyktograystr load exch + ci6walkcmykstring + end +} def +/ci6separatecmykproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + + XIBuffer3 + + 0 2 index + + plateindex 4 2 index length 1 sub { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + pop pop exch pop + end +} def + +/ci6compositeimage { + dup 1 eq { + pop pop image + }{ + /ci6colorimage load null ne { + ci6colorimage + }{ + 3 1 roll pop + sourcearray 0 3 -1 roll put + 3 eq {/ci6rgbtograyproc}{/ci6cmyktograyproc} ifelse load + image + } ifelse + } ifelse +} def +/ci6knockoutimage { + gsave + 0 ci6curtransfer exec 1 ci6curtransfer exec + eq { + 0 ci6curtransfer exec 0.5 lt + }{ + 0 ci6curtransfer exec 1 ci6curtransfer exec gt + } ifelse + {{pop 0}}{{pop 1}} ifelse + systemdict /settransfer get exec + ci6compositeimage + grestore +} def +/ci6drawimage { + ci6testplate -1 eq { + pop ci6compositeimage + }{ + dup type /arraytype eq { + dup length plateindex gt {plateindex get}{pop false} ifelse + }{ + { + true + }{ + dup 1 eq {plateindex 3 eq}{plateindex 3 le} ifelse + } ifelse + } ifelse + { + dup 1 eq { + pop pop ci6image + }{ + dup 3 eq { + ci6compositeimage + }{ + pop pop + sourcearray 0 3 -1 roll put + /ci6separatecmykproc load + ci6image + } ifelse + } ifelse + }{ + ci6curoverprint { + 7 {pop} repeat + }{ + ci6knockoutimage + } ifelse + } ifelse + } ifelse +} def +/ci6proctintimage { + /_ptispace exch store /_ptiname exch store /_pti1 exch store /_pti0 exch store /_ptiproc exch store + /_pticomps _ptispace ci6numcomps store + /_ptiscale _pti1 _pti0 sub store + level2? { + _ptiname length 0 gt version cvr 2012 ge and { + [/Separation _ptiname _ptispace {_ptiproc}] setcolorspace + [_pti0 _pti1] ci6makeimagedict ci6image + }{ + [/Indexed _ptispace 255 {255 div _ptiscale mul _pti0 add _ptiproc}] setcolorspace + [0 255] ci6makeimagedict ci6image + } ifelse + }{ + _pticomps 1 eq { + { + dup + { + 255 div _ptiscale mul _pti0 add _ptiproc 255 mul cvi put + } ci6stringapply + } ci6concatprocs ci6image + }{ + { + dup length _pticomps mul dup _ptibuf length ne {/_ptibuf exch string store}{pop} ifelse + _ptibuf { + exch _pticomps mul exch 255 div _ptiscale mul _pti0 add _ptiproc + _pticomps 2 add -2 roll + _pticomps 1 sub -1 0 { + 1 index add 2 index exch + 5 -1 roll + 255 mul cvi put + } for + pop pop + } ci6stringapply + } ci6concatprocs false _pticomps + /ci6colorimage load null eq {7 {pop} repeat}{ci6colorimage} ifelse + } ifelse + } ifelse +} def +/ci6graytintimage { + /_gtigray 5 -1 roll store + {1 _gtigray sub mul 1 exch sub} 4 1 roll + /DeviceGray ci6proctintimage +} def +/ci6cmyktintimage { + /_cticmyk 5 -1 roll store + {_cticmyk {1 index mul exch} forall pop} 4 1 roll + /DeviceCMYK ci6proctintimage +} def +/ci6rgbtintimage { + /_rtirgb 5 -1 roll store + {_rtirgb {1 exch sub 1 index mul 1 exch sub exch} forall pop} 4 1 roll + /DeviceRGB ci6proctintimage +} def +/ci6tintimage { + ci6testplate -1 eq { + ci6colorexpand + 3 -1 roll 5 -1 roll {0}{0 exch} ifelse 4 2 roll + dup /DeviceGray eq { + pop ci6graytintimage + }{ + dup /DeviceRGB eq { + pop ci6rgbtintimage + }{ + pop ci6cmyktintimage + } ifelse + } ifelse + }{ + dup ci6marksplate { + plateindex 5 lt { + ci6colortocmyk plateindex get + dup 0 eq ci6curoverprint and { + 7 {pop} repeat + }{ + 1 exch sub + exch {1 0}{0 1} ifelse () ci6graytintimage + } ifelse + }{ + pop exch {0}{0 exch} ifelse 0 3 1 roll () ci6graytintimage + } ifelse + }{ + ci6curoverprint { + 8 {pop} repeat + }{ + pop pop pop + {pop 1} 0 1 () /DeviceGray ci6proctintimage + } ifelse + } ifelse + } ifelse +} def +/XINullImage { +} def +/XIImageMask { + XIImageWidth XIImageHeight false + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + imagemask +} def +/XIImageTint { + XIImageWidth XIImageHeight XIBitsPerPixel + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + XIType 3 eq XIColorValues XIColorSpace ci6tintimage +} def +/XIImage { + XIImageWidth XIImageHeight XIBitsPerPixel + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + false XIChannelCount XIPlateList ci6drawimage +} def +/XG { + pop pop +} def +/XF { + 13 {pop} repeat +} def +/Xh { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIType exch def + /XIImageHeight exch def + /XIImageWidth exch def + /XIImageMatrix exch def + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + /_lp /null ddef + _fc + /_lp /imagemask ddef + end +} def +/XH { + Adobe_ColorImage_AI6_Vars begin + grestore + end +} def +/XIEnable { + Adobe_ColorImage_AI6_Vars /XIEnable 3 -1 roll put +} def +/XC { + Adobe_ColorImage_AI6_Vars begin + ci6colormake + /XIColorSpace exch def + /XIColorValues exch def + end +} def +/XIPlates { + Adobe_ColorImage_AI6_Vars begin + /XIPlateList exch def + end +} def +/XI +{ + Adobe_ColorImage_AI6_Vars begin + gsave + /XIType exch def + cvi dup + 256 idiv /XICompression exch store + 256 mod /XIEncoding exch store + pop pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + XIBitsPerPixel 1 eq { + XIImageWidth 8 div ceiling cvi + }{ + XIImageWidth XIChannelCount mul + } ifelse + /XIRowBytes exch def + XIEnable { + /XIBuffer3 XIImageWidth string def + XICompression 0 eq { + /XIBuffer1 XIRowBytes string def + XIEncoding 0 eq { + {currentfile XIBuffer1 readhexstring pop} + }{ + {currentfile XIBuffer1 readstring pop} + } ifelse + }{ + /XIBuffer1 256 string def + /XIBuffer2 XIRowBytes string def + {currentfile XIBuffer1 readline pop (%) anchorsearch {pop} if} + /ASCII85Decode filter /DCTDecode filter + /XIFile exch def + {XIFile XIBuffer2 readstring pop} + } ifelse + /XIDataProc exch def + + XIType 1 ne { + 0 setgray + } if + XIType 1 eq { + XIImageMask + }{ + XIType 2 eq XIType 3 eq or { + XIImageTint + }{ + XIImage + } ifelse + } ifelse + }{ + XINullImage + } ifelse + /XIPlateList false def + grestore + end +} def +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.3 0 +%%Title: (Adobe Illustrator (R) Version 8.0 Full Prolog) +%%Version: 1.3 0 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1998 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 112 dict dup begin +put +/_?cmyk false def +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_lineorientation 0 def +/_charorientation 0 def +/_yokoorientation 0 def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_shift [0 0] def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fontSize 0 def +/_fontAscent 0 def +/_fontDescent 0 def +/_fontHeight 0 def +/_fontRotateAdjust 0 def +/Ss 256 string def +Ss 0 (fonts/) putinterval +/_cnt 0 def +/_scale [1 1] def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_hfname 100 string def +/_hffound false def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_rgbf 3 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_rgbs 3 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/_lobyte 0 def +/_hibyte 0 def +/_cproc null def +/_cscript 0 def +/_hvax 0 def +/_hvay 0 def +/_hvwb 0 def +/_hvcx 0 def +/_hvcy 0 def +/_bitfont null def +/_bitlobyte 0 def +/_bithibyte 0 def +/_bitkey null def +/_bitdata null def +/_bitindex 0 def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 100 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + /_aicmykps where {pop /_?cmyk _aicmykps def}if + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/hswj +{ + dup stringwidth 3 2 roll + { + _hvwb eq { exch _hvcx add exch _hvcy add } if + exch _hvax add exch _hvay add + } cforall +} def +/vswj +{ + 0 0 3 -1 roll + { + dup 255 le + _charorientation 1 eq + and + { + dup cstring stringwidth 5 2 roll + _hvwb eq { exch _hvcy sub exch _hvcx sub } if + exch _hvay sub exch _hvax sub + 4 -1 roll sub exch + 3 -1 roll sub exch + } + { + _hvwb eq { exch _hvcy sub exch _hvcx sub } if + exch _hvay sub exch _hvax sub + _fontHeight sub + } ifelse + } cforall +} def +/swj +{ + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + _lineorientation 0 eq { hswj } { vswj } ifelse +} def +/sw +{ + 0 0 0 6 3 roll swj +} def +/vjss +{ + 4 1 roll + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + gsave + false charpath currentpoint + 5 index setmatrix stroke + grestore + _fontRotateAdjust sub + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + 5 index sub + 3 index _sp eq + { + 9 index sub + } if + + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + + gsave + 2 index false charpath + 6 index setmatrix stroke + grestore + + moveto pop pop + } ifelse + } cforall + 6 npop +} def +/hjss +{ + 4 1 roll + { + dup cstring + gsave + false charpath currentpoint + 5 index setmatrix stroke + grestore + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + } cforall + 6 npop +} def +/jss +{ + _lineorientation 0 eq { hjss } { vjss } ifelse +} def +/ss +{ + 0 0 0 7 3 roll jss +} def +/vjsp +{ + 4 1 roll + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + false charpath + currentpoint + _fontRotateAdjust sub + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + 5 index sub + 3 index _sp eq + { + 9 index sub + } if + + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + + 2 index false charpath + + moveto pop pop + } ifelse + } cforall + 6 npop +} def +/hjsp +{ + 4 1 roll + { + dup cstring + false charpath + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + } cforall + 6 npop +} def +/jsp +{ + matrix currentmatrix + _lineorientation 0 eq {hjsp} {vjsp} ifelse +} def +/sp +{ + matrix currentmatrix + 0 0 0 7 3 roll + _lineorientation 0 eq {hjsp} {vjsp} ifelse +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/_rgbtocmyk +{ + 3 + { + 1 exch sub 3 1 roll + } repeat + 3 copy 1 4 1 roll + 3 + { + 3 index 2 copy gt + { + exch + } if + pop 4 1 roll + } repeat + pop pop pop + 4 1 roll + 3 + { + 3 index sub + 3 1 roll + } repeat + 4 -1 roll +} def +/setrgbfill +{ + _rgbf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _rgbf aload pop setrgbcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/setrgbstroke +{ + _rgbs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _rgbs aload pop setrgbcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/Xa +{ + _?cmyk { + 3 npop k + }{ + setrgbfill 4 npop + } ifelse +} def +/XA +{ + _?cmyk { + 3 npop K + }{ + setrgbstroke 4 npop + } ifelse +} def +/Xs +{ + /_gf exch ddef + 5 npop + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setAIseparationgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/XS +{ + /_gs exch ddef + 5 npop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setAIseparationgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/Xx +{ + exch + /_gf exch ddef + 0 eq { + findcmykcustomcolor + }{ + _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse + { + 4 1 roll 3 npop + findcmykcustomcolor + }{ + 8 -4 roll 4 npop + findrgbcustomcolor + } ifelse + } ifelse + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/XX +{ + exch + /_gs exch ddef + 0 eq { + findcmykcustomcolor + }{ + _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse + { + 4 1 roll 3 npop + findcmykcustomcolor + }{ + 8 -4 roll 4 npop + findrgbcustomcolor + } ifelse + } ifelse + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/XK +{ + 3 -1 roll pop + 0 eq + { + 1 exch sub + 3 {dup 3 1 roll mul 5 1 roll} repeat + mul 4 1 roll + K + } + { + 1 exch sub 4 1 roll + 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat + 4 -1 roll pop + XA + } ifelse +} def +/Xk +{ + 3 -1 roll pop + 0 eq + { + 1 exch sub + 3 {dup 3 1 roll mul 5 1 roll} repeat + mul 4 1 roll + k + } + { + 1 exch sub 4 1 roll + 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat + 4 -1 roll pop + Xa + } ifelse +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/Xt { + pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer {readline} stopped { + % assume error was due to overfilling the buffer + }{ + not + { + stop + } if + endString eq { + cleartomark stop + } if + }ifelse + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer {readline} stopped { + % assume error was due to overfilling the buffer + }{ + not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + }ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 6 npop + 7 2 roll + 5 npop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 4 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setrgbcolor +{ + 3 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +/XP +{ + 4 npop +} bind def +/XD +{ + pop +} bind def +end +setpacking +%%EndResource +%%BeginResource: procset Adobe_cshow 2.0 8 +%%Title: (Writing System Operators) +%%Version: 2.0 8 +%%CreationDate: (1/23/89) () +%%Copyright: ((C) 1992-1996 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_cshow 14 dict dup begin put +/initialize +{ + Adobe_cshow begin + Adobe_cshow + { + dup xcheck + { + bind + } if + pop pop + } forall + end + Adobe_cshow begin +} def +/terminate +{ +currentdict Adobe_cshow eq + { + end + } if +} def +/cforall +{ + /_lobyte 0 ddef + /_hibyte 0 ddef + /_cproc exch ddef + /_cscript currentfont /FontScript known { currentfont /FontScript get } { -1 } ifelse ddef + { + /_lobyte exch ddef + _hibyte 0 eq + _cscript 1 eq + _lobyte 129 ge _lobyte 159 le and + _lobyte 224 ge _lobyte 252 le and or and + _cscript 2 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript 3 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript 25 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript -1 eq + or or or or and + { + /_hibyte _lobyte ddef + } + { + _hibyte 256 mul _lobyte add + _cproc + /_hibyte 0 ddef + } ifelse + } forall +} def +/cstring +{ + dup 256 lt + { + (s) dup 0 4 3 roll put + } + { + dup 256 idiv exch 256 mod + (hl) dup dup 0 6 5 roll put 1 4 3 roll put + } ifelse +} def +/clength +{ + 0 exch + { 256 lt { 1 } { 2 } ifelse add } cforall +} def +/hawidthshow +{ + { + dup cstring + show + _hvax _hvay rmoveto + _hvwb eq { _hvcx _hvcy rmoveto } if + } cforall +} def +/vawidthshow +{ + { + dup 255 le + _charorientation 1 eq + and + { + -90 rotate + 0 _fontRotateAdjust rmoveto + cstring + _hvcx _hvcy _hvwb _hvax _hvay 6 -1 roll awidthshow + 0 _fontRotateAdjust neg rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + exch _hvay sub exch _hvax sub + 2 index _hvwb eq { exch _hvcy sub exch _hvcx sub } if + 3 2 roll + cstring + dup stringwidth pop 2 div neg _fontAscent neg rmoveto + show + moveto + } ifelse + } cforall +} def +/hvawidthshow +{ + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + _lineorientation 0 eq { hawidthshow } { vawidthshow } ifelse +} def +/hvwidthshow +{ + 0 0 3 -1 roll hvawidthshow +} def +/hvashow +{ + 0 0 0 6 -3 roll hvawidthshow +} def +/hvshow +{ + 0 0 0 0 0 6 -1 roll hvawidthshow +} def +currentdict readonly pop end +setpacking +%%EndResource +%%BeginResource: procset Adobe_shading_AI8 1.0 0 +%%Title: (Adobe Illustrator 8 Shading Procset) +%%Version: 1.0 0 +%%CreationDate: (12/17/97) () +%%Copyright: ((C) 1987-1997 Adobe Systems Incorporated All Rights Reserved) +userdict /defaultpacking currentpacking put true setpacking +userdict /Adobe_shading_AI8 10 dict dup begin put +/initialize { + Adobe_shading_AI8 begin + Adobe_shading_AI8 bdprocs + Mesh /initialize get exec +} def +/terminate { + currentdict Adobe_shading_AI8 eq { + end + } if +} def +/bdprocs { + { + dup xcheck 1 index type /arraytype eq and { + bind + } if + pop pop + } forall +} def +/X! {pop} def +/X# {pop pop} def +/Mesh 40 dict def +Mesh begin +/initialize { + Mesh bdprocs + Mesh begin + /emulate? /AI8MeshEmulation where { + pop AI8MeshEmulation + }{ + systemdict /shfill known not + } ifelse def + end +} def +/bd { + shadingdict begin +} def +/paint { + emulate? { + end + }{ + /_lp /none ddef _fc /_lp /none ddef + + /AIColorSpace AIColorSpace tocolorspace store + /ColorSpace AIColorSpace topsspace store + + version_ge_3010.106 not systemdict /setsmoothness known and { + 0.0001 setsmoothness + } if + + composite? { + /DataSource getdatasrc def + Matrix concat + currentdict end + shfill + }{ + AIColorSpace makesmarks AIPlateList markingplate and not isoverprint and { + end + }{ + /ColorSpace /DeviceGray store + /Decode [0 1 0 1 0 1] store + /DataSource getplatesrc def + Matrix concat + currentdict end + shfill + } ifelse + } ifelse + } ifelse +} def +/shadingdict 12 dict def +shadingdict begin + /ShadingType 6 def + /BitsPerCoordinate 16 def + /BitsPerComponent 8 def + /BitsPerFlag 8 def +end +/datafile null def +/databuf 256 string def +/dataptr 0 def +/srcspace null def +/srcchannels 0 def +/dstchannels 0 def +/dstplate 0 def +/srctodstcolor null def +/getplatesrc { + /srcspace AIColorSpace store + /srcchannels AIColorSpace getnchannels store + /dstchannels 1 store + /dstplate getplateindex store + /srctodstcolor srcspace makesmarks { + dstplate 4 eq { + {1 exch sub} + }{ + {srcspace tocmyk 3 dstplate sub index 1 exch sub 5 1 roll 4 {pop} repeat} + } ifelse + }{ + {srcchannels {pop} repeat 1} + } ifelse store + /datafile getdatasrc store + /rdpatch168 load DataLength () /SubFileDecode filter +} def +/getdatasrc { + /rdcmntline load /ASCII85Decode filter +} def +/rdpatch168 { + /dataptr 0 store + 49 rdcount + 4 { + dup {pop srcchannels getint8} if + dup {pop srctodstcolor dstchannels putint8 true} if + } repeat + {databuf 0 dataptr getinterval}{()} ifelse +} def +/rdpatch3216 { + /dataptr 0 store + 97 rdcount + 4 { + dup {pop srcchannels getint16} if + dup {pop srctodstcolor dstchannels putint16 true} if + } repeat + {databuf 0 dataptr getinterval}{()} ifelse +} def +/rdcount { + dup 0 gt { + datafile databuf dataptr 4 -1 roll getinterval readstring + exch length dataptr add /dataptr exch store + }{ + true + } ifelse +} def +/getint8 { + mark true 3 -1 roll + { + dup {pop datafile read} if + dup {pop 255 div true} if + } repeat + { + counttomark 1 add -1 roll pop true + }{ + cleartomark false + } ifelse +} def +/putint8 { + dup dataptr add /dataptr exch store + dataptr exch + { + 1 sub exch + 255 mul cvi + databuf 2 index + 3 -1 roll put + } repeat + pop +} def +/getint16 { + mark true 3 -1 roll + { + dup {pop datafile read} if + dup {pop 256 mul datafile read} if + dup {pop add 65535 div true} if + } repeat + { + counttomark 1 add -1 roll pop true + }{ + cleartomark false + } ifelse +} def +/putint16 { + dup 2 mul dataptr add /dataptr exch store + dataptr exch + { + 2 sub exch + 65535 mul cvi dup + 256 idiv databuf 3 index 3 -1 roll put + 256 mod databuf 2 index 1 add 3 -1 roll put + } repeat + pop +} def +/srcbuf 256 string def +/rdcmntline { + currentfile srcbuf readline pop + (%) anchorsearch {pop} if +} def +/getplateindex { + 0 [cyan? magenta? yellow? black? customColor?] {{exit} if 1 add} forall +} def +/aicsarray 4 array def +/aicsaltvals 4 array def +/aicsaltcolr aicsaltvals def +/tocolorspace { + dup type /arraytype eq { + mark exch aload pop + aicsarray 0 3 -1 roll put + aicsarray 1 3 -1 roll put + dup aicsarray 2 3 -1 roll put + gettintxform aicsarray 3 3 -1 roll put + counttomark aicsaltvals 0 3 -1 roll getinterval /aicsaltcolr exch store + aicsaltcolr astore pop pop + aicsarray + } if +} def +/subtintxform {aicsaltcolr {1 index mul exch} forall pop} def +/addtintxform {aicsaltcolr {1 sub 1 index mul 1 add exch} forall pop} def +/gettintxform { + /DeviceRGB eq {/addtintxform}{/subtintxform} ifelse load +} def +/getnchannels { + dup type /arraytype eq {0 get} if + colorspacedict exch get begin Channels end +} def +/makesmarks { + composite? { + pop true + }{ + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin MarksPlate end + } ifelse +} def +/markingplate { + composite? { + pop true + }{ + dup type /arraytype eq { + dup length getplateindex gt {getplateindex get}{pop false} ifelse + } if + } ifelse +} def +/tocmyk { + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin ToCMYK end +} def +/topsspace { + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin ToPSSpace end +} def +/colorspacedict 5 dict dup begin + /DeviceGray 4 dict dup begin + /Channels 1 def + /MarksPlate {pop black?} def + /ToCMYK {pop 1 exch sub 0 0 0 4 -1 roll} def + /ToPSSpace {} def + end def + /DeviceRGB 4 dict dup begin + /Channels 3 def + /MarksPlate {pop isCMYKSep?} def + /ToCMYK {pop _rgbtocmyk} def + /ToPSSpace {} def + end def + /DeviceCMYK 4 dict dup begin + /Channels 4 def + /MarksPlate {pop isCMYKSep?} def + /ToCMYK {pop} def + /ToPSSpace {} def + end def + /Separation 4 dict dup begin + /Channels 1 def + /MarksPlate { + /findcmykcustomcolor where { + pop dup 1 exch ToCMYK 5 -1 roll 1 get + findcmykcustomcolor 1 setcustomcolor + systemdict /currentgray get exec + 1 ne + }{ + pop false + } ifelse + } def + /ToCMYK { + dup 2 get mark exch 4 2 roll + 3 get exec + counttomark -1 roll tocmyk + 5 -1 roll pop + } def + /ToPSSpace {} def + end def + /Process 4 dict dup begin + /Channels 1 def + /MarksPlate { + isCMYKSep? { + 1 exch ToCMYK 4 array astore getplateindex get 0 ne + }{ + pop false + } ifelse + } def + /ToCMYK { + dup 2 get mark exch 4 2 roll + 3 get exec + counttomark -1 roll tocmyk + 5 -1 roll pop + } def + /ToPSSpace { + 4 array copy dup 0 /Separation put + } def + end def +end def +/isoverprint { + /currentoverprint where {pop currentoverprint}{_of} ifelse +} def +/version_ge_3010.106 { + version {cvr} stopped { + pop + false + }{ + 3010.106 ge + } ifelse +} def +end +end +defaultpacking setpacking +%%EndResource +%%EndProlog %%BeginSetup userdict /_useSmoothShade false put userdict /_aicmykps true put userdict /_forceToCMYK true put Adobe_level2_AI5 /initialize get exec +Adobe_cshow /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_shading_AI8 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +%AI3_BeginRider currentpacking true setpacking setpacking %AI3_EndRider %AI5_Begin_NonPrinting Np %AI8_PluginGroupInfo (Adobe Path Blends) (Adobe Blends Plugin) (LiveBlends.aip) %AI8_PluginGroupInfo (Adobe Tracing Object) (Tracing) (TracingSuite.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe Calligraphic Brush Tool) (Adobe Calligraphic Brush Plugin) (CalligBrushTool.aip) %AI8_PluginGroupInfo (Adobe Flare Plugin) (Flare) (Flare.aip) %AI8_PluginGroupInfo (Adobe Symbolism) (Adobe Symbolism) (ParticleSystem.aip) %AI8_PluginGroupInfo (Adobe Deform Plugin) (Adobe Envelope Plugin) (Envelope and Warp.aip) %AI8_PluginGroupInfo (Pathfinder Suite) (Adobe Compound Shape) (PathFinderS.aip) %AI8_PluginGroupInfo (Adobe Planar Group) (Adobe Live Paint Plugin) (Live Paint.aip) %AI5_End_NonPrinting-- %AI5_BeginPalette 0 0 Pb 0.74902 0.678431 0.670588 0.901961 ([Registration]) 0 Xs ([Registration]) Pc PB %AI5_EndPalette %%EndSetup %AI5_BeginLayer 1 1 1 1 0 0 1 0 79 128 255 0 50 Lb (svg2759) Ln 0 A u U u u 0 O 0.34902 0.231373 0.305882 0 0.666667 0.698039 0.670588 Xa 0 J 0 j 1 w 4 M []0 d 0 XR 343.9077 320.061 m 457.2617 319.8594 L 458.8457 319.8594 460.2617 320.0942 460.2617 316.6992 C 460.123 279.3691 L 341.0474 279.3691 L 341.0474 316.8379 L 341.0474 318.5122 341.2095 320.061 343.9077 320.061 C f u 0 0 0 0 1 1 1 Xa 375.022 300.9619 m 375.0269 293.4326 368.9258 287.3242 361.3955 287.3203 C 353.8657 287.3154 347.7568 293.416 347.7524 300.9453 C 347.7524 300.9512 347.7524 300.9561 347.7524 300.9619 C 347.748 308.4917 353.8491 314.5996 361.3789 314.604 C 368.9102 314.6084 375.0181 308.5078 375.022 300.9785 C 375.022 300.9731 375.022 300.9678 375.022 300.9619 C f u *u 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa 372.4712 312.0669 m 375.4951 309.0435 377.0068 305.3413 377.0068 300.9619 c 377.0068 296.582 375.521 292.9199 372.5493 289.9736 C 369.396 286.8711 365.6685 285.3203 361.3682 285.3203 c 357.1191 285.3203 353.4565 286.8584 350.3809 289.9355 C 347.3052 293.0107 345.7676 296.6865 345.7676 300.9619 c 345.7676 305.2373 347.3052 308.9385 350.3809 312.0669 C 353.3784 315.0913 357.041 316.603 361.3682 316.603 c 365.7471 316.603 369.4478 315.0913 372.4712 312.0669 C f 1 D 352.4165 310.0332 m 349.8604 307.4517 348.5825 304.4268 348.5825 300.958 c 348.5825 297.4902 349.8477 294.4912 352.3774 291.9619 C 354.9072 289.4326 357.9194 288.168 361.4141 288.168 c 364.9087 288.168 367.9463 289.4453 370.5283 292.001 C 372.98 294.374 374.2061 297.3594 374.2061 300.958 c 374.2061 304.5303 372.96 307.5615 370.4692 310.0522 C 367.979 312.542 364.9609 313.7876 361.4141 313.7876 c 357.8672 313.7876 354.8677 312.5361 352.4165 310.0332 C f 0 D 359.1436 302.4834 m 358.7529 303.3354 358.168 303.7612 357.3887 303.7612 c 356.0098 303.7612 355.3208 302.833 355.3208 300.978 c 355.3208 299.1221 356.0098 298.1943 357.3887 298.1943 c 358.2988 298.1943 358.9492 298.6465 359.3389 299.5513 C 361.25 298.5342 L 360.3394 296.916 358.9727 296.1064 357.1509 296.1064 c 355.7456 296.1064 354.6196 296.5371 353.7744 297.3984 C 352.9277 298.2598 352.5054 299.4482 352.5054 300.9619 c 352.5054 302.4497 352.9414 303.6309 353.813 304.5054 C 354.6851 305.3804 355.771 305.8174 357.0732 305.8174 c 358.999 305.8174 360.3779 305.0591 361.2119 303.543 C 359.1436 302.4834 L f 368.1338 302.4834 m 367.7427 303.3354 367.1694 303.7612 366.4141 303.7612 c 365.0078 303.7612 364.3042 302.833 364.3042 300.978 c 364.3042 299.1221 365.0078 298.1943 366.4141 298.1943 c 367.3257 298.1943 367.9644 298.6465 368.3286 299.5513 C 370.2822 298.5342 L 369.373 296.916 368.0083 296.1064 366.1899 296.1064 c 364.7866 296.1064 363.6631 296.5371 362.8184 297.3984 C 361.9751 298.2598 361.5522 299.4482 361.5522 300.9619 c 361.5522 302.4497 361.9814 303.6309 362.8389 304.5054 C 363.6958 305.3804 364.7866 305.8174 366.1123 305.8174 c 368.0347 305.8174 369.4116 305.0591 370.2427 303.543 C 368.1338 302.4834 L f *U U /AdobeObjectMatrix (1.000000 0.000000 0.000000 1.000000 -289.615692 99.065300) XT U /AdobeObjectMatrix (0.872921 0.000000 0.000000 0.872921 50.125359 143.214401) XT *u 1 D 458.2539 320.5 m 342.7471 320.5 L 341.5083 320.5 340.5 319.4927 340.5 318.2539 C 340.5 279.0068 L 340.5 278.7266 340.7275 278.5 341.0073 278.5 C 459.9922 278.5 L 460.2725 278.5 460.5 278.7266 460.5 279.0068 C 460.5 318.2539 L 460.5 319.4927 459.4922 320.5 458.2539 320.5 C f 0 D 342.7471 319.4858 m 458.2539 319.4858 L 458.9326 319.4858 459.4844 318.9336 459.4844 318.2539 C 459.4844 302.4688 459.4844 291.0449 V 376.9277 291.0449 L 373.9019 285.5742 368.0723 281.8594 361.3813 281.8594 c 354.688 281.8594 348.8599 285.5713 345.8354 291.0449 C 341.5151 291.0449 L 341.5151 302.4688 341.5151 318.2539 Y 341.5151 318.9336 342.0679 319.4858 342.7471 319.4858 C f *U u *u 0 0 0 0 1 1 1 Xa 400.4966 287.7529 m 400.8125 287.7529 401.0996 287.7246 401.3604 287.6699 c 401.6211 287.6143 401.8438 287.5234 402.0293 287.3955 C 402.2148 287.2695 402.3594 287.1006 402.4619 286.8906 C 402.5635 286.6807 402.6152 286.4219 402.6152 286.1113 c 402.6152 285.7783 402.5391 285.5 402.3867 285.2783 C 402.2363 285.0547 402.0107 284.873 401.7129 284.7305 C 402.123 284.6133 402.4287 284.4082 402.6309 284.1133 c 402.832 283.8203 402.9336 283.4658 402.9336 283.0508 c 402.9336 282.7168 402.8691 282.4277 402.7383 282.1836 C 402.6084 281.9395 402.4326 281.7402 402.2129 281.5859 C 401.9932 281.4307 401.7422 281.3164 401.4609 281.2422 C 401.1777 281.168 400.8887 281.1309 400.5908 281.1309 C 397.3745 281.1309 L 397.3745 287.7529 L 400.4966 287.7529 L 400.4966 287.7529 L f 1 D 400.3105 285.0742 m 400.5703 285.0742 400.7842 285.1367 400.9517 285.2598 C 401.1191 285.3828 401.2021 285.583 401.2021 285.8604 c 401.2021 286.0146 401.1738 286.1426 401.1191 286.2402 C 401.0625 286.3389 400.9888 286.416 400.8955 286.4717 C 400.8027 286.5273 400.6958 286.5664 400.5752 286.5879 c 400.4546 286.6094 400.3291 286.6191 400.1992 286.6191 C 398.834 286.6191 L 398.834 285.0742 L 400.3105 285.0742 L f 400.3955 282.2637 m 400.5381 282.2637 400.6743 282.2773 400.8047 282.3057 C 400.9341 282.334 401.0498 282.3809 401.1484 282.4453 C 401.248 282.5098 401.3262 282.5977 401.3857 282.709 C 401.4453 282.8203 401.4736 282.9629 401.4736 283.1357 c 401.4736 283.4746 401.3779 283.7178 401.1855 283.8633 C 400.9937 284.0078 400.7397 284.0811 400.4238 284.0811 C 398.834 284.0811 L 398.834 282.2637 L 400.3955 282.2637 L 400.3955 282.2637 L f *U 0 D 403.1904 287.7529 m 404.8242 287.7529 L 406.375 285.1377 L 407.916 287.7529 L 409.5391 287.7529 L 407.082 283.6719 L 407.082 281.1309 L 405.6211 281.1309 L 405.6211 283.709 L 403.1904 287.7529 L f U u 426.9336 287.7529 m 429.7012 283.3105 L 429.7168 283.3105 L 429.7168 287.7529 L 431.082 287.7529 L 431.082 281.1309 L 429.626 281.1309 L 426.8691 285.5645 L 426.8516 285.5645 L 426.8516 281.1309 L 425.4844 281.1309 L 425.4844 287.7529 L 426.9336 287.7529 L f 436.6113 285.9883 m 436.5254 286.1289 436.416 286.25 436.2861 286.3555 c 436.1563 286.46 436.0098 286.543 435.8457 286.6016 C 435.6816 286.6602 435.5098 286.6895 435.332 286.6895 c 435.0039 286.6895 434.7246 286.626 434.4961 286.499 C 434.2666 286.373 434.082 286.2031 433.9395 285.9902 C 433.7969 285.7764 433.6934 285.5332 433.6279 285.2617 c 433.5625 284.9902 433.5313 284.709 433.5313 284.418 c 433.5313 284.1406 433.5625 283.8691 433.6279 283.6074 C 433.6934 283.3438 433.7969 283.1074 433.9395 282.8984 C 434.082 282.6875 434.2666 282.5195 434.4961 282.3926 C 434.7246 282.2656 435.0039 282.2021 435.332 282.2021 c 435.7754 282.2021 436.124 282.3379 436.375 282.6104 C 436.625 282.8828 436.7783 283.2412 436.834 283.6865 C 438.2441 283.6865 L 438.207 283.2725 438.1113 282.8984 437.957 282.5645 C 437.8027 282.2295 437.5977 281.9453 437.3438 281.709 C 437.0908 281.4727 436.7939 281.2939 436.4531 281.1699 C 436.1133 281.0449 435.7383 280.9834 435.332 280.9834 c 434.8242 280.9834 434.3672 281.0723 433.9619 281.248 C 433.5566 281.4238 433.2148 281.668 432.9355 281.9766 c 432.6563 282.2852 432.4434 282.6494 432.2949 283.0664 C 432.1465 283.4844 432.0713 283.9336 432.0713 284.418 c 432.0713 284.9121 432.1465 285.3711 432.2949 285.7949 C 432.4434 286.2197 432.6563 286.5898 432.9355 286.9043 C 433.2148 287.2207 433.5566 287.4678 433.9619 287.6465 C 434.3672 287.8262 434.8242 287.916 435.332 287.916 c 435.6963 287.916 436.041 287.8633 436.3652 287.7578 C 436.6895 287.6523 436.9805 287.5 437.2373 287.2979 C 437.4941 287.0967 437.7061 286.8477 437.873 286.5508 c 438.04 286.2539 438.1445 285.9131 438.1885 285.5293 C 436.7783 285.5293 L 436.7539 285.6963 436.6973 285.8496 436.6113 285.9883 C f U u 442.2178 305.5195 m 442.2217 300.0186 437.7656 295.5566 432.2646 295.5527 C 426.7637 295.5488 422.3008 300.0049 422.2979 305.5049 C 422.2979 305.5107 422.2979 305.5151 422.2979 305.5195 C 422.2939 311.0205 426.749 315.4819 432.25 315.4863 C 437.752 315.4897 442.2139 311.0342 442.2178 305.5342 C 442.2178 305.5298 442.2178 305.5244 442.2178 305.5195 C f *u 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa 432.2432 317.1147 m 435.4932 317.1147 438.2422 315.9941 440.4863 313.7529 C 442.7314 311.5107 443.8535 308.7661 443.8535 305.5195 c 443.8535 302.2729 442.75 299.5576 440.5449 297.373 C 438.2031 295.0742 435.4355 293.9248 432.2432 293.9248 c 429.0879 293.9248 426.3691 295.0645 424.0859 297.3457 C 421.8027 299.625 420.6611 302.3501 420.6611 305.5195 c 420.6611 308.6895 421.8027 311.4341 424.0859 313.7529 C 426.3115 315.9941 429.0313 317.1147 432.2432 317.1147 c f 1 D 423.2695 308.6348 m 422.9238 307.6563 422.752 306.6182 422.752 305.5195 c 422.752 302.9492 423.6895 300.7275 425.5664 298.8525 C 427.4434 296.9785 429.6777 296.041 432.2725 296.041 c 434.8652 296.041 437.1191 296.9873 439.0352 298.8818 C 439.6758 299.501 440.2051 300.1772 440.6191 300.9102 C 436.248 302.856 L 435.9512 301.3857 434.6406 300.3921 433.0566 300.2759 C 433.0566 298.4883 L 431.7246 298.4883 L 431.7246 300.2759 L 430.4238 300.2905 429.166 300.8228 428.2051 301.6641 C 429.8008 303.2744 L 430.5703 302.5503 431.3408 302.2256 432.3906 302.2256 c 433.0703 302.2256 433.8252 302.4917 433.8252 303.3784 c 433.8252 303.6924 433.7031 303.9106 433.5117 304.0747 C 432.4063 304.5674 L 431.0293 305.1797 L 430.3486 305.4834 429.7725 305.7393 429.1934 305.9976 C 423.2695 308.6348 L f 432.2725 315.0278 m 429.6406 315.0278 427.415 314.1006 425.5957 312.2446 C 425.1006 311.7451 424.6699 311.2231 424.3037 310.6787 C 428.7383 308.7046 L 429.1377 309.9346 430.3066 310.6812 431.7246 310.7637 C 431.7246 312.5513 L 433.0566 312.5513 L 433.0566 310.7637 L 433.9736 310.7192 434.9785 310.4678 435.9697 309.7002 C 434.4463 308.1343 L 433.8848 308.5327 433.1748 308.8135 432.4648 308.8135 c 431.8887 308.8135 431.0742 308.6367 431.0742 307.9136 c 431.0742 307.8022 431.1113 307.7051 431.1787 307.6191 C 432.6621 306.959 L 433.665 306.5117 L 434.3066 306.2251 434.9199 305.9531 435.5273 305.6826 C 441.4688 303.0376 L 441.666 303.8154 441.7637 304.6431 441.7637 305.5195 c 441.7637 308.168 440.835 310.4087 438.9775 312.2446 C 437.1387 314.1006 434.9033 315.0278 432.2725 315.0278 c f *U U /AdobeObjectMatrix (1.146822 0.000000 0.000000 1.146822 457.937500 166.153000) XT u 0 D 0 0 0 0 1 1 1 Xa 403.8594 316.0215 m 409.791 316.0215 414.5986 311.2139 414.5986 305.2832 c 414.5986 299.3525 409.791 294.5449 403.8594 294.5449 c 397.9287 294.5449 393.1206 299.3525 393.1206 305.2832 c 393.1206 311.2139 397.9287 316.0215 403.8594 316.0215 c f u 1 D 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa 406.9678 308.3896 m 406.9678 308.8037 406.6318 309.1392 406.2188 309.1392 C 401.4756 309.1392 L 401.0625 309.1392 400.7266 308.8037 400.7266 308.3896 C 400.7266 303.647 L 402.0488 303.647 L 402.0488 298.0313 L 405.6445 298.0313 L 405.6445 303.647 L 406.9678 303.647 L 406.9678 308.3896 L 406.9678 308.3896 L f 0 D 403.8477 313.0078 m 404.7432 313.0078 405.4688 312.2813 405.4688 311.3857 c 405.4688 310.4897 404.7432 309.7637 403.8477 309.7637 c 402.9512 309.7637 402.2246 310.4897 402.2246 311.3857 c 402.2246 312.2813 402.9512 313.0078 403.8477 313.0078 c f U *u 1 D 403.832 317.1143 m 400.6206 317.1143 397.9009 315.9941 395.6758 313.752 C 393.3921 311.4331 392.251 308.6885 392.251 305.5195 c 392.251 302.3506 393.3921 299.625 395.6758 297.3447 C 397.9595 295.0645 400.6787 293.9248 403.832 293.9248 c 407.0254 293.9248 409.793 295.0742 412.1338 297.374 C 414.3408 299.5571 415.4434 302.2725 415.4434 305.5195 c 415.4434 308.7666 414.3213 311.5103 412.0762 313.752 C 409.832 315.9941 407.084 317.1143 403.832 317.1143 c f 0 D 403.8613 315.0278 m 406.4932 315.0278 408.7285 314.0996 410.5664 312.2446 C 412.4248 310.4087 413.3535 308.167 413.3535 305.5195 c 413.3535 302.8525 412.4443 300.6396 410.625 298.8809 C 408.709 296.9873 406.4551 296.041 403.8613 296.041 c 401.2676 296.041 399.0332 296.9785 397.1567 298.8525 C 395.2788 300.7271 394.3408 302.9492 394.3408 305.5195 c 394.3408 308.0898 395.2891 310.3315 397.1851 312.2446 C 399.0044 314.0996 401.2305 315.0278 403.8613 315.0278 c f *U U U /AdobeObjectMatrix (0.993781 0.000000 0.000000 0.993693 -177.694138 -148.877289) XT U LB %AI5_EndLayer-- %AI3_BeginCrops userdict /AI3_noCropMarks known not { 0 A u u 0 R 0 G 0 J 0 j 0.5 w 4 M []0 d 0 XR 331.5 278.5 m 304.5 278.5 L S 340.5 269.5 m 340.5 242.5 L S U u 331.5 320.5 m 304.5 320.5 L S 340.5 329.5 m 340.5 356.5 L S U u 469.5 320.5 m 496.5 320.5 L S 460.5 329.5 m 460.5 356.5 L S U u 469.5 278.5 m 496.5 278.5 L S 460.5 269.5 m 460.5 242.5 L S U U } if %AI3_EndCrops %%PageTrailer gsave annotatepage grestore showpage %%Trailer Adobe_Illustrator_AI5 /terminate get exec +Adobe_shading_AI8 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_cshow /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF \ No newline at end of file diff --git a/figure/chapter1/c1_TCP-status-machine.png b/figure/chapter1/c1_TCP-status-machine.png new file mode 100644 index 0000000..7b7d24d Binary files /dev/null and b/figure/chapter1/c1_TCP-status-machine.png differ diff --git a/figure/chapter1/c1_TCP-structure.png b/figure/chapter1/c1_TCP-structure.png new file mode 100644 index 0000000..cf32bf4 Binary files /dev/null and b/figure/chapter1/c1_TCP-structure.png differ diff --git a/figure/chapter1/c1_TCP-time-line.png b/figure/chapter1/c1_TCP-time-line.png new file mode 100644 index 0000000..72d0ddc Binary files /dev/null and b/figure/chapter1/c1_TCP-time-line.png differ diff --git a/figure/chapter1/c1_TCP-topo.png b/figure/chapter1/c1_TCP-topo.png new file mode 100644 index 0000000..d34e1aa Binary files /dev/null and b/figure/chapter1/c1_TCP-topo.png differ diff --git a/figure/chapter1/c1_VM-advance-setup.png b/figure/chapter1/c1_VM-advance-setup.png new file mode 100644 index 0000000..9ff1af6 Binary files /dev/null and b/figure/chapter1/c1_VM-advance-setup.png differ diff --git a/figure/chapter1/c1_arp-format.png b/figure/chapter1/c1_arp-format.png new file mode 100644 index 0000000..02004bd Binary files /dev/null and b/figure/chapter1/c1_arp-format.png differ diff --git a/figure/chapter1/c1_echo-request.png b/figure/chapter1/c1_echo-request.png new file mode 100644 index 0000000..1f0b83a Binary files /dev/null and b/figure/chapter1/c1_echo-request.png differ diff --git a/figure/chapter1/c1_eth-frame-detail.png b/figure/chapter1/c1_eth-frame-detail.png new file mode 100644 index 0000000..b7b8bb7 Binary files /dev/null and b/figure/chapter1/c1_eth-frame-detail.png differ diff --git a/figure/chapter1/c1_icmp-structure.png b/figure/chapter1/c1_icmp-structure.png new file mode 100644 index 0000000..36bb397 Binary files /dev/null and b/figure/chapter1/c1_icmp-structure.png differ diff --git a/figure/chapter1/c1_io-graphs.png b/figure/chapter1/c1_io-graphs.png new file mode 100644 index 0000000..32b60c8 Binary files /dev/null and b/figure/chapter1/c1_io-graphs.png differ diff --git a/figure/chapter1/c1_ip-structure.png b/figure/chapter1/c1_ip-structure.png new file mode 100644 index 0000000..15af114 Binary files /dev/null and b/figure/chapter1/c1_ip-structure.png differ diff --git a/figure/chapter1/c1_ip-view.png b/figure/chapter1/c1_ip-view.png new file mode 100644 index 0000000..bf1547f Binary files /dev/null and b/figure/chapter1/c1_ip-view.png differ diff --git a/figure/chapter1/c1_ping-exec.png b/figure/chapter1/c1_ping-exec.png new file mode 100644 index 0000000..d8e9cc1 Binary files /dev/null and b/figure/chapter1/c1_ping-exec.png differ diff --git a/figure/chapter1/c1_traceroute-exec.png b/figure/chapter1/c1_traceroute-exec.png new file mode 100644 index 0000000..40a8210 Binary files /dev/null and b/figure/chapter1/c1_traceroute-exec.png differ diff --git a/figure/chapter1/c1_wireshark-boot-ui.png b/figure/chapter1/c1_wireshark-boot-ui.png new file mode 100644 index 0000000..ea22b0f Binary files /dev/null and b/figure/chapter1/c1_wireshark-boot-ui.png differ diff --git a/figure/chapter1/c1_wireshark-filter-setup.png b/figure/chapter1/c1_wireshark-filter-setup.png new file mode 100644 index 0000000..33aa6c7 Binary files /dev/null and b/figure/chapter1/c1_wireshark-filter-setup.png differ diff --git a/figure/chapter1/c1_wireshark-filters.png b/figure/chapter1/c1_wireshark-filters.png new file mode 100644 index 0000000..9712588 Binary files /dev/null and b/figure/chapter1/c1_wireshark-filters.png differ diff --git a/figure/chapter1/c1_wireshark-main-ui.png b/figure/chapter1/c1_wireshark-main-ui.png new file mode 100644 index 0000000..68c070d Binary files /dev/null and b/figure/chapter1/c1_wireshark-main-ui.png differ diff --git a/figure/chapter1/c1_wireshark-monitor.png b/figure/chapter1/c1_wireshark-monitor.png new file mode 100644 index 0000000..60c8c96 Binary files /dev/null and b/figure/chapter1/c1_wireshark-monitor.png differ diff --git a/figure/chapter1/c1_wireshark-save.png b/figure/chapter1/c1_wireshark-save.png new file mode 100644 index 0000000..3695860 Binary files /dev/null and b/figure/chapter1/c1_wireshark-save.png differ diff --git a/figure/chapter1/c1_wireshark-setup-ui.png b/figure/chapter1/c1_wireshark-setup-ui.png new file mode 100644 index 0000000..2558d74 Binary files /dev/null and b/figure/chapter1/c1_wireshark-setup-ui.png differ diff --git a/figure/chapter1/c1_wireshark-special-type.png b/figure/chapter1/c1_wireshark-special-type.png new file mode 100644 index 0000000..0cdef6a Binary files /dev/null and b/figure/chapter1/c1_wireshark-special-type.png differ diff --git a/figure/chapter1/c1_wireshark-statistic.png b/figure/chapter1/c1_wireshark-statistic.png new file mode 100644 index 0000000..9588e62 Binary files /dev/null and b/figure/chapter1/c1_wireshark-statistic.png differ diff --git a/figure/chapter2/c2_tcp-flow.png b/figure/chapter2/c2_tcp-flow.png new file mode 100644 index 0000000..0e2f8f2 Binary files /dev/null and b/figure/chapter2/c2_tcp-flow.png differ diff --git a/figure/chapter2/c2_udp-flow.png b/figure/chapter2/c2_udp-flow.png new file mode 100644 index 0000000..1fe1c24 Binary files /dev/null and b/figure/chapter2/c2_udp-flow.png differ diff --git a/figure/chapter3/c3_OSPF-topo.png b/figure/chapter3/c3_OSPF-topo.png new file mode 100644 index 0000000..8983c02 Binary files /dev/null and b/figure/chapter3/c3_OSPF-topo.png differ diff --git a/figure/chapter3/c3_RIP-topo.png b/figure/chapter3/c3_RIP-topo.png new file mode 100644 index 0000000..8983c02 Binary files /dev/null and b/figure/chapter3/c3_RIP-topo.png differ diff --git a/figure/chapter3/c3_confirm.jpg b/figure/chapter3/c3_confirm.jpg new file mode 100644 index 0000000..4f4cad0 Binary files /dev/null and b/figure/chapter3/c3_confirm.jpg differ diff --git a/figure/chapter3/c3_ping_1.png b/figure/chapter3/c3_ping_1.png new file mode 100644 index 0000000..02241de Binary files /dev/null and b/figure/chapter3/c3_ping_1.png differ diff --git a/figure/chapter3/c3_ping_2.jpg b/figure/chapter3/c3_ping_2.jpg new file mode 100644 index 0000000..fd6779e Binary files /dev/null and b/figure/chapter3/c3_ping_2.jpg differ diff --git a/figure/chapter3/c3_static-topo.png b/figure/chapter3/c3_static-topo.png new file mode 100644 index 0000000..8983c02 Binary files /dev/null and b/figure/chapter3/c3_static-topo.png differ diff --git a/figure/chapter3/c3_sysname-R1_1.png b/figure/chapter3/c3_sysname-R1_1.png new file mode 100644 index 0000000..734ad5c Binary files /dev/null and b/figure/chapter3/c3_sysname-R1_1.png differ diff --git a/figure/chapter3/c3_sysname-R1_2.jpg b/figure/chapter3/c3_sysname-R1_2.jpg new file mode 100644 index 0000000..64e0264 Binary files /dev/null and b/figure/chapter3/c3_sysname-R1_2.jpg differ diff --git a/figure/chapter3/c3_sysname-R1_3.jpg b/figure/chapter3/c3_sysname-R1_3.jpg new file mode 100644 index 0000000..64e0264 Binary files /dev/null and b/figure/chapter3/c3_sysname-R1_3.jpg differ diff --git a/figure/chapter3/c3_sysname-R2_1.png b/figure/chapter3/c3_sysname-R2_1.png new file mode 100644 index 0000000..d9d538f Binary files /dev/null and b/figure/chapter3/c3_sysname-R2_1.png differ diff --git a/figure/chapter3/c3_sysname-R2_2.jpg b/figure/chapter3/c3_sysname-R2_2.jpg new file mode 100644 index 0000000..85f674b Binary files /dev/null and b/figure/chapter3/c3_sysname-R2_2.jpg differ diff --git a/figure/chapter3/c3_sysname-R2_3.jpg b/figure/chapter3/c3_sysname-R2_3.jpg new file mode 100644 index 0000000..85f674b Binary files /dev/null and b/figure/chapter3/c3_sysname-R2_3.jpg differ diff --git a/instructions.cfg b/instructions.cfg new file mode 100644 index 0000000..0795729 --- /dev/null +++ b/instructions.cfg @@ -0,0 +1,23 @@ +%# -*- coding: utf-8-unix -*- +%====================================================================== +%% qbook.cfg for Qbook Template +%====================================================================== +\ProvidesFile{qbook.cfg}[2019/03/19 v1.00 Qbook configuration file] +\def\q@contentsname{目~~~~录} +\def\q@figurename{图} +\def\q@listfigurename{插图索引} +\def\q@tablename{表} +\def\q@listtablename{表格索引} +\def\q@overviewname{概~~~~览} +\def\q@pre{前~~~~言} +\def\q@label@thm{定理} +\def\q@label@defn{定义} +\def\q@label@keypoint{关键点} +\def\q@label@rem{注} +\def\q@label@prop{性质} +\def\q@label@proof{证明} +\def\q@label@lem{引理} +\def\q@label@cor{推论} +\def\q@label@exmp{例} +\def\q@value@listingname{算法} +\endinput \ No newline at end of file diff --git a/instructions.cls b/instructions.cls new file mode 100644 index 0000000..de237c3 --- /dev/null +++ b/instructions.cls @@ -0,0 +1,423 @@ +%# -*- coding: utf-8-unix -*- +%========================================================================= +% instructions.cls for Computer Network Assigenment & Project Instructions +%========================================================================= +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{instructions}[2019/05/16 v2.01 Qbook Template] +\def\version{v2.01} +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{ctexbook}} +\ProcessOptions\relax +\PassOptionsToClass{scheme=chinese}{ctexbook} +\PassOptionsToClass{zihao=-4}{ctexbook} +\PassOptionsToPackage{no-math}{fontspec} +\LoadClass[a4paper,UTF8]{ctexbook} +%======================================================================== +% 导入 instructions.cfg 文件 +\AtEndOfClass{\input{instructions.cfg}} +%======================================================================== +% 导入 LaTeX 宏包 +\RequirePackage{extarrows} +\RequirePackage{eso-pic} +\RequirePackage{url} +\RequirePackage{environ} +\RequirePackage{manfnt,pifont} +\RequirePackage{titlesec} +\RequirePackage{float} +\RequirePackage{wallpaper} +\RequirePackage[breakable,minted]{tcolorbox} +\RequirePackage{xpatch} +\RequirePackage[centering,a4paper,body={16cm,22cm}]{geometry} +\RequirePackage{fancyhdr} +\RequirePackage{lastpage} +\RequirePackage{amsmath,mathtools,amsthm,amsfonts,amssymb,bm} +\RequirePackage{sourcecodepro} +\RequirePackage{upgreek} +\RequirePackage{wasysym} +\RequirePackage{anyfontsize} +\RequirePackage{metalogo,doc} +\RequirePackage{array} +\RequirePackage{threeparttable} +\RequirePackage{dcolumn} +\RequirePackage{multirow} +\RequirePackage{booktabs} +\RequirePackage{graphicx} +\RequirePackage[labelformat=empty]{caption} +\RequirePackage[list=off]{bicaption} +\RequirePackage{subcaption} +\RequirePackage[backend=biber, hyperref=auto,maxnames=4]{biblatex} +\RequirePackage{xcolor} +\RequirePackage{listings} +\RequirePackage[unicode, xetex, bookmarksnumbered, colorlinks, urlcolor=blue, linkcolor=purple, citecolor=red, plainpages=false, pdfstartview=FitH]{hyperref} +\RequirePackage{bookmark} +\bookmarksetup{ + open, + numbered +} +\RequirePackage{longtable} +\RequirePackage[perpage, bottom]{footmisc} +\RequirePackage[inline]{enumitem} +\RequirePackage{pdfpages} +\RequirePackage{calc} +\RequirePackage{algorithm, algorithmicx, algpseudocode} +\RequirePackage{siunitx} +\RequirePackage{tikz} + +\usepackage{titlesec} +\newcommand{\sectionbreak}{\clearpage} + +\usepackage{setspace} + +%====================================================================== +% 导入tikz库 +\usetikzlibrary{shapes.geometric, arrows} +\usetikzlibrary{shapes,decorations} +\usetikzlibrary{intersections,decorations.text} +%====================================================================== +% 设置 PDF 文件信息 +\hypersetup{ + pdfauthor = {333}, + pdftitle = {Q-book}, + pdfkeywords = {template}} +%====================================================================== +% 汉化参考文献标题 +\g@addto@macro\backmatter{ + \renewcommand{\em}{\itshape} % 书目部分以斜体表示强调 + \renewcommand{\refname}{参考文献} + \renewcommand{\bibname}{参考文献} +} +\DefineBibliographyStrings{english}{% + in = {刊于}, + editor = {主编}, + byeditor = {编者为}, +} +%====================================================================== +% 添加水印 +\newcommand{\watermark}[3]{\AddToShipoutPictureBG{ + \parbox[b][\paperheight]{\paperwidth}{ + \vfill% + \centering% + \tikz[remember picture, overlay]% + \node [rotate = #1, scale = #2] at (8.5,-13)% + {\textcolor{gray!80!cyan!30}{#3}}; + \vfill}}} +%====================================================================== +% 自定义颜色 +\definecolor{ocre}{RGB}{243,102,25} +\definecolor{LightGoldenrod}{RGB}{238,221,130} +\definecolor{sthlmGreen}{RGB}{0,134,127} +\definecolor{Gold}{RGB}{255,215,0} +\definecolor{C1}{RGB}{32,88,153} +\definecolor{C2}{RGB}{218,222,238} +\definecolor{tssteelblue}{RGB}{0,40,220} +\definecolor{tsorange}{RGB}{255,138,88} +\definecolor{tsblue}{RGB}{23,74,117} +\definecolor{tsforestgreen}{RGB}{21,122,81} +\definecolor{tsyellow}{RGB}{255,185,88} +\definecolor{tsgrey}{RGB}{200,200,200} +\definecolor{main}{RGB}{0,120,2} +\definecolor{seco}{RGB}{230,90,7}% +\definecolor{thid}{RGB}{0,160,152}% +\definecolor{bule}{RGB}{18,29,57} +\definecolor{bablue}{RGB}{248,248,248} +\definecolor{c1}{RGB}{116, 52, 129} +\definecolor{c2}{RGB}{130, 80, 140} +\definecolor{c3}{RGB}{230, 180, 240} +\definecolor{c4}{RGB}{100, 172, 174} +\definecolor{c5}{RGB}{95, 162, 162} +%====================================================================== +% 设置日期显示格式为yyyy-mm-dd +\def\twodigits#1{\ifnum#1<10 0\fi\the#1} +\renewcommand{\today}{\number\year-\twodigits\month-\number\day} +%====================================================================== +\setcounter{secnumdepth}{4} % 章节编号深度 (part 对应 -1) +\setcounter{tocdepth}{1} % 目录深度 (part 对应 -1) +\newcolumntype{d}[1]{D{.}{.}{#1}}% or D{.}{,}{#1} or D{.}{\cdot}{#1} +%====================================================================== +\newcommand{\cndash}{\rule{0.0em}{0pt}\rule[0.35em]{1.4em}{0.05em}\rule{0.2em}{0pt}} +\newcommand{\ch}{\titleformat{\chapter}[display]{\centering}{}{-3mm}{\Huge\bfseries} + \titlespacing{\chapter}{0pt}{0pt}{2\baselineskip}}%用来将需要的章节标题居中 +%====================================================================== +% 行距缩放因子 +\linespread{1.3} +%====================================================================== +% 设置名称:目录、表格索引、插图索引 +\ctexset{contentsname={\q@contentsname}} +\ctexset{listfigurename={\q@listfigurename}} +\ctexset{listtablename={\q@listtablename}} +\renewcommand{\lstlistingname}{\q@value@listingname} +%====================================================================== +% 定制章节样式 +\ctexset{chapter/name={第,单元}} +\titleformat{\chapter}[display]{\flushleft}{ + \begin{tikzpicture} + \node[anchor=south west] (chap) at (0,1.3){ + \Large\heiti {第\zhnumber{\thechapter}单元}}; + \path [left color=c1,right color=c3] (0,-0.3) rectangle (\textwidth,-0.5); + \path(0,-0.2); + \end{tikzpicture} +}{-30mm}{\Huge\heiti} +\titlespacing{\chapter}{0pt}{0pt}{2\baselineskip} +%====================================================================== +% section级样式设置 +\ctexset{section/break = \Needspace{\textheight}} +\ctexset{section={ + name={实验}, + format={\color{tssteelblue}\Large\bfseries\centering}, + afterskip={1.0ex \@plus .2ex}, + } +} +%====================================================================== +% subection级样式设置 +\ctexset{subsection={ + format={\color{tssteelblue}\bfseries\normalsize}, + indent={0\ccwd}, + afterskip={1.0ex \@plus .2ex}, + number={\chinese{subsection}~.} + } +} +%====================================================================== +% subsubection级样式设置 +\ctexset{subsubsection={ + format={\bfseries\normalsize}, + indent={0\ccwd}, + afterskip={1.0ex \@plus .2ex}, + number={\arabic{subsection}.\arabic{subsubsection}} + } +} +%====================================================================== +% paragraph级样式设置 +\ctexset{paragraph={ + format={\normalfont\normalsize}, + indent={0\ccwd}, + number={\arabic{subsection}.\arabic{subsubsection}.\arabic{paragraph}} + } +} +%====================================================================== +% 设置item条目的索引符号为bullet +\renewcommand{\labelitemi}{\ensuremath{\RHD}} +%====================================================================== +% 设置图片载入路径及扩展名 +\graphicspath{{fig/}{figure/}{figures/}{logo/}{logos/}{graph/}{graphs}} +\DeclareGraphicsExtensions{.pdf,.eps,.png,.jpg,.jpeg} +%====================================================================== +% 设置图片的标题样式 +\DeclareCaptionFont{kaishu}{\kaishu} +\captionsetup{format=plain,labelformat=simple,labelsep=space,justification=centering,font={small,kaishu}} +\captionsetup[sub]{font=footnotesize} +\DeclareCaptionOption{bi-first}[]{ + \def\tablename{\q@tablename} + \def\figurename{\q@figurename} +} +\DeclareCaptionOption{bi-second}[]{ + \def\tablename{Table} + \def\figurename{Figure} +} +\captionsetup[bi-first]{bi-first} +\captionsetup[bi-second]{bi-second} + +%====================================================================== +% Set fontnote font size in threeparttable +\appto\TPTnoteSettings{\footnotesize} +%====================================================================== +% 浮动参数 +\renewcommand{\textfraction}{0.15} +\renewcommand{\topfraction}{0.85} +\renewcommand{\bottomfraction}{0.65} +\renewcommand{\floatpagefraction}{0.60} +%====================================================================== +% 定理、公式、图、表的编号为"3.1"的形式 +\numberwithin{figure}{section} +\renewcommand{\theequation}{\arabic{chapter}.\arabic{equation}} +\renewcommand{\thefigure}{\arabic{chapter}.\arabic{section}--\arabic{figure}} +\renewcommand\p@subfigure{\thefigure} +\renewcommand{\thetable}{\arabic{chapter}.\arabic{section}--\arabic{table}} +\AtBeginDocument{\renewcommand{\thelstlisting}{\arabic{chapter}--\arabic{lstlisting}}} +%====================================================================== +% 使用enumitem宏包配制列表环境 +\setlist{nosep} % 紧凑间距 +\setlist[itemize]{label=$\bullet$} +\setlist*{leftmargin=*} % 列表和段落头对齐 +\setlist[1]{labelindent=\parindent} % Only the level 1 +%====================================================================== +% 设置宏包 listings/lstlistings +\lstset{ + tabsize=4, % + frame=shadowbox, %把代码用带有阴影的框圈起来 + commentstyle=\color{red!50!green!50!blue!50}, %浅灰色的注释 + rulesepcolor=\color{red!20!green!20!blue!20}, %代码块边框为淡青色 + keywordstyle=\color{blue!90}\bfseries, %代码关键字的颜色为蓝色,粗体 + showstringspaces=false, %不显示代码字符串中间的空格标记 + stringstyle=\ttfamily, % 代码字符串的特殊格式 + keepspaces=true, % + numbers=left, %左侧显示行号 + stepnumber=1, % + numberstyle=\tiny, %行号字体用小号 + basicstyle={\footnotesize\ttfamily}, % + showspaces=false, % + flexiblecolumns=true, % + breaklines=true, %对过长的代码自动换行 + breakautoindent=true, % + breakindent=4em, % + aboveskip=1em, %代码块边框 + fontadjust, + captionpos=t, + framextopmargin=2pt,framexbottommargin=2pt,abovecaptionskip=-9pt,belowcaptionskip=9pt, + xleftmargin=2em,xrightmargin=2em, % 设定listing左右的空白 + texcl=true, + % 设定中文冲突,断行,列模式,数学环境输入,listing数字的样式 + extendedchars=false,columns=flexible,mathescape=true + numbersep=-1em +} +%====================================================================== +% Setting Package siunitx +\sisetup{detect-all} % Detecting fonts +%====================================================================== +% 定制定理、定义、观察、规则、keypoint环境 + \tcbset{ + commondef/.style={ + fontupper=\kaishu, + lower separated=false, + coltitle=white, + colback=yellow!20, + fonttitle=\heiti\bfseries, + enhanced, + breakable, + top=10pt, + left=8pt, + % bottom=6pt, + before skip=8pt, + attach boxed title to top left={yshift=-0.11in,xshift=0.15in}, + boxed title style={boxrule=0pt,colframe=white,arc=0pt,outer arc=0pt}, + }, + commonthm/.style={ + fontupper=\kaishu, + lower separated=false, + coltitle=white, + colback=blue!10, + fonttitle=\heiti\bfseries, + enhanced, + breakable, + top=10pt, + % bottom=6pt, + before skip=8pt, + attach boxed title to top left={yshift=-0.11in,xshift=0.15in}, + boxed title style={boxrule=0pt,colframe=white,arc=0pt,outer arc=0pt}, + }, + common/.style={ + fontupper=\kaishu, + lower separated=false, + coltitle=white, + colback=gray!10, + fonttitle=\heiti\bfseries, + enhanced, + breakable, + top=10pt, + % bottom=6pt, + before skip=8pt, + attach boxed title to top left={yshift=-0.11in,xshift=0.15in}, + boxed title style={boxrule=0pt,colframe=white,arc=0pt,outer arc=0pt}, + }, + defstyle/.style={ + commondef, + colframe=seco, + colbacktitle=seco, + overlay unbroken and last={\node[anchor=south east, outer sep=6pt] at (\textwidth-width,0) {\textcolor{seco}{$\clubsuit$}}; }, + separator sign none + }, + thmstyle/.style={ + common, + colframe=main, + colbacktitle=main, + overlay unbroken and last={\node[anchor=south east, outer sep=6pt] at (\textwidth-width,0) {\textcolor{main}{$\heartsuit$}}; }, + separator sign none + }, + propstyle/.style={ + common, + colframe=thid, + colbacktitle=thid, + overlay unbroken and last={\node[anchor=south east, outer sep=6pt] at (\textwidth-width,0) {\textcolor{thid}{$\spadesuit$}}; }, + separator sign none + }, + } + +\newenvironment{remark} +{\begin{observation}} {\end{observation}} +%====================================================================== +% 引用样式为“图x.y”等 +\newcommand{\requ}[1]{(\ref{#1})} +\newcommand{\rremark}[1]{\text{{\color{purple}{注}}} \ref{#1}} +\newcommand{\rfig}[1]{\text{{\color{purple}{图}}} \ref{#1}} +\newcommand{\rtab}[1]{\text{{\color{purple}{表}}} \ref{#1}} +\newcommand{\rprop}[1]{\text{{\color{purple}{性质}}} \ref{#1}} +\newcommand{\rdef}[1]{\text{{\color{purple}{定义}}} \ref{#1}} +\newcommand{\rthm}[1]{\text{{\color{purple}{定理}}} \ref{#1}} +\newcommand{\mylem}[1]{\text{引理} \ref{#1}} +\newcommand{\rexa}[1]{\text{{\color{purple}{例}}} \ref{#1}} +\renewcommand{\proofname}{\bfseries\q@label@proof} +%====================================================================== +% 设置页眉与页脚样式 +\newcommand\q@fancyhead{\small\kaishu} +\def\markboxwidth{0.75\textwidth} +\pagestyle{fancy} +\fancyhf{} +\renewcommand{\chaptername}{第\zhnumber{\thechapter}单元} +\renewcommand{\chaptermark}[1]{\markboth{\chaptername\ #1}{}} +\fancyhead[LE,RO]{\sffamily\normalsize\thepage} %在奇数页的右上角显示页码,偶数页的左上角显示页码 +\fancyhead[LO]{\nouppercase{\q@fancyhead\rightmark}} % 在奇数页的左侧显示小节名 +\fancyhead[RE]{\nouppercase{\q@fancyhead\leftmark}} % 在偶数页的右侧显示章名 +\renewcommand{\headrulewidth}{0.5pt} +\addtolength{\headheight}{2.5pt} +\renewcommand{\footrulewidth}{0pt} +\fancypagestyle{plain}{\fancyhead{}\renewcommand{\headrulewidth}{0pt}} +%====================================================================== +% Removes the header from odd empty pages at the end of chapters +% \makeatletter +% \renewcommand{\cleardoublepage}{ +% \clearpage\ifodd\c@page\else +% \hbox{} +% \vspace*{\fill} +% \thispagestyle{empty} +% \newpage +% \fi} +%====================================================================== +% 前言 +\newenvironment{pre}{ + \ch\chapter{\q@pre}{}}{} +%====================================================================== +% 概览 +\newenvironment{overview}{ +\ch\chapter{\q@overviewname}{}}{} +%====================================================================== +% 设置目录 +\renewcommand\tableofcontents{% + \cleardoublepage + \pdfbookmark[0]{\contentsname}{toc} + \chapter*{\centerline{\contentsname}} + \@mkboth{\MakeUppercase\contentsname}{\MakeUppercase\contentsname}% + \@starttoc{toc}% +} +\addtocontents{toc}{\let\string\CTEX@spaceChar\relax} +%====================================================================== +%定制代码框 +\newtcblisting{code}[1][]{ + center, + width=0.9\linewidth, + listing only, + breakable=true, + minted language=#1, + frame empty, + extras={frame empty}, + % minted style=colorful, + fontupper=\footnotesize, + minted options={ %自动移除前置空白、制表为4字符、mathhe和||内的不处理 + breaksymbol=, + autogobble, + tabsize=4, + startinline, + breaklines, + mathescape + } +} +%====================================================================== +\renewcommand{\baselinestretch}{1.5} +\endinput \ No newline at end of file diff --git a/instructions.tex b/instructions.tex new file mode 100644 index 0000000..12a1dea --- /dev/null +++ b/instructions.tex @@ -0,0 +1,86 @@ +%# -*- coding: utf-8-unix -*- +%========================================================================= +% instructions.tex for Computer Network Assigenment & Project Instructions +%========================================================================= +% 双面打印 +\documentclass{instructions} +\addbibresource{bib/main.bib} % 导入参考文献数据库 +\begin{document} +\pagestyle{empty} +\include{data/cover} % 载入封面 + +\begin{center} + \Large{\sffamily\bfseries\heiti Version 0.4} \\ \vspace{2em} + \Large{\sffamily\bfseries\heiti 发布日期: \today} \\ \vspace{1em} + % \Large{\sffamily\bfseries\heiti 任何建议及错误信息请发送至邮箱} \\ + % \texttt{jey74165@163.com} +\end{center} +% \vfill +% \vspace{30em} +% \begin{tabular*}{\textwidth}{ccc} +% \includegraphics{figure/by-nc.eps} +% & \begin{minipage}[b]{0.6\textwidth} +% \small\sffamily +% 本作品采用知识共享 署名-非商业性使用 4.0 国际许可协议进行许可。\\ +% 访问~\href{http://creativecommons.org/licenses/by-nc/4.0/}{此链接}~查看该许可协议。 +% \end{minipage} +% \end{tabular*} + +\thispagestyle{empty} +\frontmatter % 对前言和概览用罗马数字作为页码 +\pagestyle{empty} +\include{data/preface} +\cleardoublepage +\pagestyle{empty} +\tableofcontents +% \cleardoublepage +% \include{tex/overview} +\mainmatter % 对正文用阿拉伯数字作为页码 + +%====================================================================== +% 正文内容 +\pagestyle{fancy} +\setcounter{page}{1} + +\graphicspath{{figure/chapter1/}} +\include{data/chapter1/preface} +\include{data/chapter1/section1} +\include{data/chapter1/section2} +\include{data/chapter1/section3} + +\graphicspath{{figure/chapter2/}} +\include{data/chapter2/preface} +\include{data/chapter2/section1} +\include{data/chapter2/section2} +\include{data/chapter2/section3} + +\graphicspath{{figure/chapter3/}} +\include{data/chapter3/preface} +\include{data/chapter3/section1} +\include{data/chapter3/section2} +\include{data/chapter3/section3} + +\appendix +\titleformat{\chapter}[display]{\flushleft}{ + \begin{tikzpicture} + \node[anchor=south west] (chap) at (0,1.3){ + \Large\heiti {附录\Alph{chapter}}}; + \path [left color=c1,right color=c3] (0,-0.3) rectangle (\textwidth,-0.5); + \path(0,-0.2); + \end{tikzpicture} +}{-30mm}{\Huge\heiti} +\titlespacing{\chapter}{0pt}{0pt}{2\baselineskip} +\renewcommand{\thefigure}{\Alph{chapter}--\arabic{figure}} +\renewcommand{\thetable}{\Alph{chapter}--\arabic{table}} +\renewcommand{\chaptername}{附录\Alph{chapter}} + +\graphicspath{{figure/appendix1/}} +\include{data/appendix1} + +\backmatter +%====================================================================== +% 打印参考文献 +% \printbibliography[heading=bibintoc] +% \makeatletter +% \makeatother +\end{document} \ No newline at end of file