首次提交

merge-requests/1/head
Xphi 4 years ago
commit 98fc5274ee

@ -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书籍模板”的早期版本。

@ -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}
}

@ -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

@ -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{华为模拟设备的基本配置及其配置命令}
命令行接口是用户对命令行使用的常用工具。
通过命令行接口输入命令,您可以对交换机进行配置和管理。
用户登录到交换机出现命令行提示符后,
即进入命令行接口CLICommand Line Interface
命令行接口是用户与交换机进行交互的常用工具。
系统向用户提供一系列命令,
用户可以通过命令行接口输入命令,对交换机进行配置和管理。
\subsubsection{命令视图}
命令视图就是执行命令行的界面环境。
系统的所有命令都注册在某个(或某些)命令视图下,
只有在相应的视图下才能执行该视图下的命令。
\begin{table}[!htp]
\centering
\caption{命令视图分类表}
\label{tab:c1_tools-command}
\begin{tabular}{m{5cm}<{\centering}m{6cm}<{\centering}} \toprule
视图 & 表现形式\\ \midrule
用户视图(缺省配置) & \texttt{<Quidway>}\\
系统视图 & \texttt{[Quidway]}\\
接口视图 & \texttt{[Quidway-ethernetX]}\\
VLAN视图 & \texttt{[Quidway-VLANX]}\\ \bottomrule
\end{tabular}
\end{table}
\begin{itemize}
\item 与交换机建立连接,如果此交换机是缺省配置,则进入用户视图,在屏幕上显示:
\begin{code}[text]
<Quidway>
\end{code}
\item 键入system-view后回车进入系统视图。
\begin{code}[text]
<Quidway> 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{<Quidway>?} & 相应命令模式下\\
& \texttt{[Quidway] sysname ?} & 键入命令,后接以空格分隔的“?”\\\midrule
部分帮助 & \texttt{<Quidway>d?} & 键入一字符串,其后紧接“?”,列出以该字符串开头的所有关键字\\\midrule
命令行错误信息 & & 如未通过语法检查则系统会向用户报告错误信息\\ \bottomrule
\end{tabular}
\end{table}
\begin{enumerate}
\item \textbf{完全帮助}
应用完全帮助,系统可以协助您在输入命令行时,给予全部关键字或参数的提示。
命令行的完全帮助可以通过以下3种方式获取
在所有命令视图下,键入“?”获取该命令视图下所有的命令及其简单描述。
\begin{code}[text]
<Quidway>?
\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 ?
<cr>
[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
是对关键字的分别描述。
<cr>表示该位置没有关键字或参数,在紧接着的下一个命令行该命令被复述,
直接键入回车即可执行。
键入命令,后接以空格分隔的“?”,如果该位置为参数,
则列出有关的参数名和参数描述。举例如下。
\begin{code}[text]
<Quidway>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]
<Quidway>d?
debugging delete
dir display
\end{code}
键入一命令,后接一字符串紧接“?”,列出命令以该字符串开头的所有关键字。
\begin{code}[text]
<Quidway>display b?
Bfdbgp
Bootrombpdu
bpdu-tunnel buffer
\end{code}
输入命令的某个关键字的前几个字母,按下<tab>键,
可以显示出完整的关键字,前提是这几个字母可以唯一标示出该关键字,
否则,连续按下<tab>键,可出现不同的关键字,用户可以从中选择所需要的关键字。
\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}

@ -0,0 +1,9 @@
%# -*- coding: utf-8-unix -*-
\chapter{网络抓包与协议分析}
\label{chap:wireshark}
本单元实验要求学生能熟练使用Wireshark软件捕捉、分析有线和无线网络数据包
掌握以太网、802.11、ARP、IP、ICMP和TCP等重要协议传输单元结构
深入理解相关网络命令和重要协议算法的工作原理,
从而培养网络故障检测、网络性能改进和网络安全分析的能力。

@ -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 ProtocolARP
主要作用是将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 请求为1ARP 响应为2RARP 请求为3RARP 响应为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缓存
开启Wiresharkping本机的同网段地址在显示过滤器条框中输入“\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 什么是免费 ARPGratuitous 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}

@ -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 ProtocolIP是TCP/IP体系中的网络层协议
可实现大规模的异构网络互联互通,为主机提供无连接的、尽力而为的数据包传输服务。
在网际协议第4版IPv4IP数据报是一个可变长分组
包括首部和数据两部分(如图\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位该字段目前只有后两位有意义。
其中最低位记为MFMore FragmentMF = 1代表还有后续分片
MF = 0表示此为原始数据报的最后分片。次低位DFDon't Fragment
用来控制数据报是否允许分片。DF = 1表示该数据报不允许分片DF = 0允许分片。
\item 标识符占16位用于目的主机将IP数据报的各个分片重装成原来的数据报。
当IP数据报分片时该标识字段的值被复制到所有的数据报分片的标识字段中。
这样,目的主机就可以正确的将标识字段值相同的各数据报分片重装成原来的数据报。
\item 片偏移占13位表示本分片在原IP数据报中的偏移位置偏移量以8字节为单位。
由于每个数据分片按照独立数据报方式传输,因此到达目的主机的顺序是不确定的,
目的主机在重装IP数据报时需要根据该字段提供偏移量进行排序。
\end{enumerate}
\subsubsection{ICMP协议及报文格式}
因特网控制报文协议Internet Control Message ProtocolICMP
用于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 ServiceDoS攻击通过消耗目标主机设备的某种资源
导致其网络服务不能被正常用户使用。
\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}

@ -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位置为1Sequence 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=1LEN=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达到阀值ssthreshslow start thresh
当cwnd等于或大于ssthresh采用拥塞避免算法
由AIMD(加性增、积性减)策略控制发送速率。
若TCP报文段发送后RTO (Retransmission Time Out)时间仍未得到确认或收到三个确认号重复的ACK报文段
则启用快重传算法并将cwnd重置为1ssthresh减半。
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 <IP>/<PathAndFileName>}\\
\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}

@ -0,0 +1,9 @@
%# -*- coding: utf-8-unix -*-
\chapter{基于套接字的网络程序设计}
\label{chap:program}
本单元通过编写简单的UDP应用程序和适配常见应用层协议的TCP应用程序使学生能熟练掌握基本套接字编程
熟悉HTTP与SMTP等应用层协议
从而深入理解理解跨网络进程通信的原理和过程,
培养开发网络应用程序的能力。

@ -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端口号有53DNS、69TFTP、161SNMP
使用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}

@ -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}

@ -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}
SMTPSimple 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:<alice@ crepes. fr>
S: 250 alice@ crepes. fr... Sender ok
C: RCPT TO:<bobehamburger. edu>
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 ketchupHow 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}

@ -0,0 +1,11 @@
%# -*- coding: utf-8-unix -*-
\chapter{组网基础}
\label{chap:routing}
掌握静态路由、动态路由RIP和OSPF协议的配置并理解分析静态与动态路由的区别
两种动态路由协议各自的适用环境,理解网络收敛的概念。
推荐使用华为ENSP模拟器
在附录\ref{app:ENSP}中有该软件的安装、操作和使用,
以熟悉华为模拟设备的基本配置及其配置命令,
掌握软件安装常见问题的解决方法。

@ -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]
<Huawei>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]
<Huawei>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]
<pc1>Ping 192.168.3.2
<pc1>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命令来检查当前路由器上生效的配置命令。

@ -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]
<Huawei>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]
<Huawei>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 (为后续实验,建议保存拓扑和具体设备的配置命令,
即在<router>和<switch>模式中输入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命令来检查当前路由器上生效的配置命令。

@ -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]
<Huawei>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]
<Huawei>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}

@ -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}

@ -0,0 +1,29 @@
\begin{pre}
\thispagestyle{empty}
本实验指导书是为计算机网络教案社区发布的课件配套撰写的实验指导书。
总体上分为基础实验与高级实验两大部分。
基础实验主要包括网络协议分析与网络程序设计两个单元共计6个实验
高级实验主要包括组网基础、路由器设计实现、
软件定义网络与网络测量等三个单元共计8个实验
供有需要的高校选用。
考虑到每个学校都有各自的教学大纲和实验环境,
不同学校前序课程不同,开设网络课程的学期也不一致,
社区难以顾及方方面面的需求。
因此本实验指导书主要是提出了一个实验框架,其中同时包括了基础、进阶和创新内容,
故而命名为“共同”实验。
在实际使用中,
各位任课老师可以根据具体需求在本指导书的基础上通过
增删、组合、修改等方法设计合宜的实验方案。
本实验指导书由计算机网络教案社区发起,
各高校专家教授共同联合编纂,各章节主要编纂人员如下:
\begin{itemize}
\item 第一单元:谢怡、陈建发、洪劼超、雷蕴奇,厦门大学
\item 第二单元:吴荻,国防科技大学
\item 第三单元:张晓丽,昆明理工大学
\end{itemize}
\end{pre}

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

@ -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

@ -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}}
}
}
%======================================================================
% itembullet
\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={ %4mathhe||
breaksymbol=,
autogobble,
tabsize=4,
startinline,
breaklines,
mathescape
}
}
%======================================================================
\renewcommand{\baselinestretch}{1.5}
\endinput

@ -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}
Loading…
Cancel
Save