Merge remote-tracking branch 'upstream/master'

edit
Jeff Chen 4 years ago
commit 9a64d0fdbb

@ -23,12 +23,13 @@
建议使用Python的包管理工具进行安装。Pygments可以在各种操作系统下运行。
``` shell
$ pip install Pygments
pip install Pygments
```
1. Windows 环境下推荐使用最新版TeX Live套件然后在工程目录下运行以下命令编译
``` shell
cd book
compile.bat
```
@ -36,6 +37,8 @@ $ pip install Pygments
3. Linux 环境下推荐使用最新版TeX Live套件然后编译。
由于实验指导书较长,从头开始进行一次编译需要几分钟时间,请耐心等待。
## 4. 说明
项目主要结构参考了“Q-book LaTeX书籍模板”的早期版本。

@ -1,192 +0,0 @@
%# -*- 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}
}

@ -1,23 +0,0 @@
%# -*- coding: utf-8-unix -*-
%======================================================================
%% Book Configurations
%======================================================================
\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

@ -1,425 +0,0 @@
%# -*- 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}
\usepackage{lscape}
% \usepackage{makecell}
%======================================================================
% 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}}
%======================================================================
%
\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}
\numberwithin{table}{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.95\linewidth,
listing only,
breakable=true,
minted language=#1,
% frame empty,
extras={frame empty},
% minted style=colorful,
fontupper=\small,
minted options={ %4mathhe||
breaksymbol=,
autogobble,
tabsize=4,
startinline,
breaklines,
mathescape
}
}
%======================================================================
\renewcommand{\baselinestretch}{1.5}
\endinput

@ -1,128 +0,0 @@
%# -*- coding: utf-8-unix -*-
%=========================================================================
% instructions.tex for Computer Network Assigenment & Project Instructions
%=========================================================================
% 双面打印
% \documentclass[fontset=fandol]{../format/instructions}
\documentclass[]{instructions}
\addbibresource{../bib/main.bib} % 导入参考文献数据库
\begin{document}
\pagestyle{empty}
\input{../data/cover} % 载入封面
%=========================================================================
% 版本声明
\clearpage
\begin{center}
\Large{Version 1.0$\alpha$} \\ \vspace{2em}
\Large{发布日期: {\number\year\number\month\number\day}}
% \\ \vspace{1em}
\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}
\input{../data/preface}
%=========================================================================
% 目录
\cleardoublepage
\pagestyle{empty}
\tableofcontents
\mainmatter % 对正文用阿拉伯数字作为页码
%======================================================================
% 正文内容
\pagestyle{fancy}
\setcounter{page}{1}
% “网络抓包与协议分析”
\graphicspath{{../figure/chapters/wireshark/}}
\input{../data/ch_wireshark/preface}
\input{../data/ch_wireshark/sec_arp}
\input{../data/ch_wireshark/sec_ip}
\input{../data/ch_wireshark/sec_tcp}
% “基于套接字的网络程序设计”
\graphicspath{{../figure/chapters/socket/}}
\input{../data/ch_socket/preface}
\input{../data/ch_socket/sec_udp}
\input{../data/ch_socket/sec_web}
\input{../data/ch_socket/sec_smtp}
% “组网基础”
\graphicspath{{../figure/chapters/ensp/}}
\input{../data/ch_ensp/preface}
\input{../data/ch_ensp/sec_static}
\input{../data/ch_ensp/sec_rip}
\input{../data/ch_ensp/sec_ospf}
% “路由器实现”
\graphicspath{{../figure/chapters/router-openbox/}}
\input{../data/ch_router-openbox/preface}
\input{../data/ch_router-openbox/sec_switch}
\input{../data/ch_router-openbox/sec_router}
\input{../data/ch_router-openbox/sec_networking}
% “软件定义网络与网络测量”
\graphicspath{{../figure/chapters/sdn-openbox/}}
\input{../data/ch_sdn-openbox/preface}
\input{../data/ch_sdn-openbox/sec_sdn}
\input{../data/ch_sdn-openbox/sec_topo}
\input{../data/ch_sdn-openbox/sec_ns}
%=========================================================================
% 附录
\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/appendixes/cheat_sheet/}}
\input{../data/appendix/cheat_sheet}
% 华为网络仿真平台eNSP简介
\graphicspath{{../figure/appendixes/ensp/}}
\input{../data/appendix/ensp}
% 可编程网络平台-操作手册
\graphicspath{{../figure/appendixes/openbox/}}
\input{../data/appendix/openbox}
% FAST软件编程入门指南
\graphicspath{{../figure/appendixes/fast/}}
\input{../data/appendix/fast}
\backmatter
%======================================================================
% 参考文献
% \printbibliography[heading=bibintoc]
% \makeatletter
% \makeatother
\end{document}

@ -42,19 +42,27 @@ goto :EOF
:instr
echo Compile...
latexmk -xelatex -shell-escape --halt-on-error -silent books\instructions >nul 2>nul
latexmk -xelatex -shell-escape --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
del instructions.bbl >nul 2>nul
del instructions.listing >nul 2>nul
del instructions.xdv >nul 2>nul
del instructions.run.xml >nul 2>nul
rmdir /S /Q _minted-instructions >nul 2>nul
goto :EOF
:cleanall
echo Clean files...
latexmk -C -silent 2>nul
del tex\*.aux >nul 2>nul
del instructions.bbl >nul 2>nul
del instructions.listing >nul 2>nul
del instructions.xdv >nul 2>nul
del instructions.run.xml >nul 2>nul
rmdir /S /Q _minted-instructions >nul 2>nul
if exist instructions.pdf (
echo Close the file: instructions.pdf!
pause

@ -0,0 +1,192 @@
%# -*- coding: utf-8-unix -*-
%============================================================================
% 基本库
\usepackage{longtable}
\usepackage{multirow}
\usepackage{array}
\usepackage{caption}
\usepackage{lscape}
\usepackage{fancyhdr}
\usepackage{newtxtext}
\usepackage{amsmath,mathtools,amsthm,amsfonts,amssymb,bm}
\usepackage{titlesec}
\usepackage[colorlinks,bookmarksnumbered,urlcolor=blue,
linkcolor=purple,citecolor=red,plainpages=false]{hyperref}
\usepackage[centering,a4paper,body={16cm,22cm}]{geometry}
%============================================================================
% 配制全局字体
% \setmonofont{inconsolata} % 使用 inconsolata 等宽字体
% % 使用方正系列字体
% \setCJKmainfont[BoldFont={FZHei-B01},ItalicFont={FZKai-Z03}]{FZShuSong-Z01}
% \setCJKsansfont{FZHei-B01}
% \setCJKfamilyfont{zhsong}{FZShuSong-Z01}
% \setCJKfamilyfont{zhhei}{FZHei-B01}
% \setCJKfamilyfont{zhkai}{FZKai-Z03}
% \setCJKfamilyfont{zhfs}{FZFangSong-Z02}
% \setCJKfamilyfont{zhli}{FZLiShu-S01}
% \renewcommand*{\songti}{\CJKfamily{zhsong}} % 宋体
% \renewcommand*{\heiti}{\CJKfamily{zhhei}} % 黑体
% \renewcommand*{\kaishu}{\CJKfamily{zhkai}} % 楷体
% \renewcommand*{\fangsong}{\CJKfamily{zhfs}} % 仿宋
% \renewcommand*{\lishu}{\CJKfamily{zhli}} % 隶书
%============================================================================
% 配制列表环境
\usepackage{enumitem}
\setlist{nosep} % 紧凑间距
\setlist*{leftmargin=*} % 列表和段落头对齐
\setlist[1]{labelindent=\parindent} % Only the level 1
%============================================================================
% 绘图支持
\usepackage{tikz}
\definecolor{c1}{RGB}{116, 52, 129} %清华紫
\definecolor{c2}{RGB}{130, 80, 140}
\definecolor{c3}{RGB}{230, 180, 240}
%============================================================================
% 定制代码框
\usepackage[breakable,minted]{tcolorbox}
\newtcblisting{code}[1][]{
center,
width=0.95\linewidth,
listing only,
breakable=true,
minted language=#1,
extras={frame empty},
fontupper=\small,
% minted style=colorful,
minted options={ %自动移除前置空白、制表为4字符、mathhe和||内的不处理
fontfamily=tt,
breaksymbol=,
autogobble,
tabsize=4,
startinline,
breaklines,
mathescape
}
}
%============================================================================
% 设置 PDF 文件信息
\hypersetup{
pdfauthor = {计算机网络教案社区},
pdftitle = {实验指导书},
pdfkeywords = {计算机网络}}
%============================================================================
% 文档风格
\ctexset{today=small}
\ctexset{contentsname=目~~~~录}
\setcounter{secnumdepth}{4} % 章节编号深度 (part 对应 -1)
\setcounter{tocdepth}{1} % 目录深度 (part 对应 -1)
%============================================================================
% 每节单独起一页
\newcommand{\sectionbreak}{\clearpage}
%============================================================================
% 居中章节标题
\newenvironment{pre}{
\titleformat{\chapter}[display]{\centering}{}{-3mm}{\Huge\heiti}
\titlespacing{\chapter}{0pt}{0pt}{2\baselineskip}
\chapter{前~~~~言}{}
}{}
%============================================================================
% chapter级样式设置
\ctexset{chapter/name = {第,单元}}
\titleformat{\chapter}[display]{\flushleft}{
\begin{tikzpicture}
\node[anchor=south west] (chap) at (0,1.3){
\Large\heiti {\chaptername}};
\path[left color=c1,right color=c3]
(0,-0.3)rectangle(\textwidth,-0.5);
\end{tikzpicture}
}{-30mm}{\Huge\heiti}
\titlespacing{\chapter}{0pt}{0pt}{2\baselineskip}
%============================================================================
% section级样式设置
\ctexset{section/break = \Needspace{\textheight}}
\ctexset{section={
name={实验},
format={\Large\heiti\centering},
afterskip={1.0ex \@plus .2ex},
}
}
%============================================================================
% subection级样式设置
\ctexset{subsection={
format={\bfseries\heiti\normalsize},
indent={0\ccwd},
afterskip={1.0ex \@plus .2ex},
number={\chinese{subsection}~.}
}
}
%============================================================================
% subsubection级样式设置
\ctexset{subsubsection={
format={\bfseries\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}}
}
}
%============================================================================
% 设置页眉与页脚样式
\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{\small\kaishu\rightmark}} % 在奇数页的左侧显示小节名
\fancyhead[RE]{\nouppercase{\small\kaishu\leftmark}} % 在偶数页的右侧显示章名
\renewcommand{\headrulewidth}{0.5pt}
\addtolength{\headheight}{2.5pt}
\renewcommand{\footrulewidth}{0pt}
\fancypagestyle{plain}{\fancyhead{}\renewcommand{\headrulewidth}{0pt}}
%============================================================================
% 设置图片的标题样式
\DeclareCaptionFont{heiti}{\heiti}
\captionsetup{format=plain,labelformat=simple,
labelsep=space,justification=centering,
font={small,heiti}}
\captionsetup[sub]{font=footnotesize}
%============================================================================
% 设置图、表的号
\numberwithin{figure}{section}
\numberwithin{table}{section}
\renewcommand{\thefigure}{\arabic{chapter}.\arabic{section}--\arabic{figure}}
\renewcommand{\thetable}{\arabic{chapter}.\arabic{section}--\arabic{table}}
%============================================================================
% 设置目录格式
\makeatletter
\renewcommand\tableofcontents{%
\cleardoublepage
\pdfbookmark[0]{\contentsname}{toc}
\chapter*{\centerline{\Huge\heiti\contentsname}}
\@mkboth{\MakeUppercase\contentsname}{\MakeUppercase\contentsname}%
\@starttoc{toc}%
}
\addtocontents{toc}{\let\string\CTEX@spaceChar\relax}
\makeatother
%============================================================================
% 行距缩放
\linespread{1.5}
\renewcommand{\arraystretch}{1}
%============================================================================
% 调整附录格式
\let\stdappendix\appendix
\renewcommand{\appendix}{
\stdappendix
\renewcommand{\thefigure}{\Alph{chapter}--\arabic{figure}}
\renewcommand{\thetable}{\Alph{chapter}--\arabic{table}}
\renewcommand{\chaptername}{附录\Alph{chapter}}
}

@ -21,7 +21,7 @@
各实验如有特殊要求,还在正文中指出了各自的细节评分标准。
\end{itemize}
\renewcommand{\arraystretch}{1.5}
% \renewcommand{\arraystretch}{1.5}
\begin{table}[!ht]
\small
@ -157,7 +157,7 @@
\begin{landscape}
\renewcommand{\arraystretch}{1.5}
% \renewcommand{\arraystretch}{1.5}
\small
\begin{longtable}{|m{1.5cm}<{\centering}
|m{2cm}<{\centering}

@ -17,7 +17,7 @@
eNSP的正常实验依赖与WinPcap、Wireshark和VirtualBox三款软件
支持的版本如下表。
\renewcommand{\arraystretch}{1.5}
% \renewcommand{\arraystretch}{1.5}
\begin{table}[!ht]
\small
\centering
@ -66,7 +66,7 @@ eNSP的正常实验依赖与WinPcap、Wireshark和VirtualBox三款软件
系统的所有命令都注册在某个(或某些)命令视图下,
只有在相应的视图下才能执行该视图下的命令。
\renewcommand{\arraystretch}{1.5}
% \renewcommand{\arraystretch}{1.5}
\begin{table}[!ht]
\small
\centering
@ -137,7 +137,7 @@ Tab键的功用完成一个命令的输入。在超级终端中可能不
\item 命令行错误信息
\end{itemize}
\renewcommand{\arraystretch}{1.5}
% \renewcommand{\arraystretch}{1.5}
\begin{table}[!ht]
\small
\centering

File diff suppressed because it is too large Load Diff

@ -1,458 +0,0 @@
%# -*- coding: utf-8-unix -*-
\chapter{可编程网络平台-操作手册}
\label{app:openbox}
\subsection{FAST简介}
针对近年来关于工业控制网络创新技术、创新网络结构、
时间敏感网络、SDN网络、FPGA硬件加速技术及下一代网络技术的研究需求
由国防科大与湖南新实共同发起的开源项目
——FASTFPGA Accelerated Switcing plaTform于2016年创建。
FAST平台的架构是一种通用多核CPU加FPGA形态的网络处理架构
该平台架构主要由硬件逻辑和软件逻辑两部分组成,
实现软硬件耦合通信与支持软硬件可编程的网络创新实验系统。
其中硬件包括平台相关的数据IO和FAST硬件逻辑。
软件部分包括通用操作系统与FAST软件逻辑。
FAST软件逻辑包括FAST软件开发环境和FAST UA程序。
在FAST平台不仅支持FAST的UA编程开发同时也支持通用APP的运行。
\subsection{设备简介}
OpenBox-S4是一款软硬件全可编程网络实验平台
基于多核CPU加FPGA异构模型的FAST处理架构实现
软件在CPU上使用C语言编程硬件在FPGA芯片上使用Verilog语言编程。
全系统根据FAST架构搭建其软硬件基础运行环境
内部软硬件用户逻辑支持所有FAST架构开发的应用、
标准的网络协议栈与通用网络应用。
平台软硬件逻辑代码开源免费,支持用户二次开发。
\subsection{设备上电检测}
当我们拿到设备后,并不知道这个设备有没有故障。
所以在使用设备进行实验前,我们尽量简单并全面的对设备进行一次上电检测,
以确认设备是否没有故障。
\subsubsection{设备外部接口及其配件说明}
\begin{enumerate}
\item 设备外部接口,如下图所示。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f01}
\caption{正面外部接口}
\label{fig:a:ob_f01}
\end{figure}
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f02}
\caption{反面外部接口}
\label{fig:a:ob_f02}
\end{figure}
\item 12V-1A电源线如下图所示。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f03}
\caption{设备电源线}
\label{fig:a:ob_f03}
\end{figure}
\item 串口线,如下图所示。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f04}
\caption{设备串口线}
\label{fig:a:ob_f04}
\end{figure}
\item 设备烧录线,如下图所示。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f05}
\caption{设备烧录线}
\label{fig:a:ob_f05}
\end{figure}
\end{enumerate}
\subsubsection{检测准备}
\begin{enumerate}
\item 物品准备
\begin{table}[!htp]
\small
\centering
\caption{所需实验物品}
\label{tab:a:openbox_items}
\begin{tabular}{|c|c|} \hline
\heiti 测试项 & \heiti 所需物品 \\ \hline
上电检测 & 一台设备及电源\\ \hline
串口检测 & 一台设备及电源、一台电脑、一个micro usb 串口线\\ \hline
管理网口MGMT & 一台设备及电源、一台电脑、一个网线\\ \hline
\end{tabular}
\end{table}
\end{enumerate}
\subsubsection{上电检测}
\begin{enumerate}
\item 连接电源将电源开关拨到ON向右
\item 观察电源指示灯变化情况:
\item 电源开关拨到ON向右CFG电源指示灯会亮一下
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f06}
\caption{电源指示灯(刚接入电源)}
\label{fig:a:ob_f06}
\end{figure}
\item CFG电源指示灯过几秒后就灭了
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f07}
\caption{电源指示灯(系统配置)}
\label{fig:a:ob_f07}
\end{figure}
图 7 电源指示灯(系统配置)
\item 等待15秒左右RUN电源指示灯常亮。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f08}
\caption{电源指示灯(系统运行)}
\label{fig:a:ob_f08}
\end{figure}
\end{enumerate}
\subsubsection{串口检测}
\begin{enumerate}
\item 确保micro usb串口线正确连接到设备上并且设备已上电。
\item 确保调试电脑已按照《01\_常用软件的安装使用手册.pdf》
文档进行了PUTTY串口终端工具的安装。
\item 确保调试电脑已按照《01\_常用软件的安装使用手册.pdf》
文档进行了CP2102驱动的安装。
\item 在电脑的设备管理器查看设备的COM口数值。
如下图设备成的COM口数值为COM4不同的电脑显示的COM口数值会不同
\item 打开PUTTY工具界面。
\begin{enumerate}
\item 先点击左边“category”栏的 “serial”选项
\item 在“Serial line to connect to ”栏填写设备管理器中看到的COM数值
\item 在“Speed”栏填写串口的波特率为“115200”
\item 在 “Data bits”栏。填写数据位宽为“8”
\item 在“Flow control”栏选择“None”。
\item 如下所示调试电脑的COM数值为COM3所以“serial line”栏填写为“COM3”。
不同电脑的COM数值可能不同请填写实际的COM数值
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f09}
\caption{putty软件串口配置参数}
\label{fig:a:ob_f09}
\end{figure}
\end{enumerate}
\item 点击 “open” 进入设备系统则串口测试OK。
\end{enumerate}
\subsubsection{管理网口检测}
\begin{enumerate}
\item 使用一根网线将调试电脑与设备的obx0口连接。
\item
\item 设备的eth0网口的默认ip地址为192.168.50.5
所以需要将调试电脑的ip地址设置成与设备eth0网口的ip地址在同一个网段下
也就是192.168.50网段)。
\item 在调试电脑的 控制面板->网络和Internet->网络设备中。
点击以太网->属性->internet协议版本4TCP/IPV4进行ip地址的配置。如下所示。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f10}
\caption{配置以太网的ip地址}
\label{fig:a:ob_f10}
\end{figure}
图 10 配置以太网的ip地址
\item 在调试电脑的 控制面板>系统和安全>Windows Defender 防火墙>自定义设置中。
关闭调试电脑的防火墙功能。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f11}
\caption{关闭防火墙功能}
\label{fig:a:ob_f11}
\end{figure}
\item 在调试电脑的CMD终端下使用ping命令能正常与eth0网口通讯
则说明管理网络检测OK。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f12}
\caption{ping 命令测试网络连通性}
\label{fig:a:ob_f12}
\end{figure}
\end{enumerate}
\subsection{搭建环境}
OpenBox-S4是一款软硬件全可编程网络实验平台
根据FAST架构搭建其软硬件基础运行环境
内部软硬件用户逻辑支持所有FAST架构开发的应用
是一款专业的网络实验与研究验证平台。
\subsubsection{连接二层交换拓扑}
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f13}
\caption{二层交换连接拓扑示意图}
\label{fig:a:ob_f13}
\end{figure}
其中PC1的IP地址设置为“192.168.1.20”PC2的IP地址设置为“192.168.1.21”
\subsubsection{在OpenBox-S4上运行二层交换程序}
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f14}
\caption{二层交换命令启动输出图}
\label{fig:a:ob_f14}
\end{figure}
在串口登录界面或网络登录界面输入命令l2switch
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f15}
\caption{二层交换命令运行输出图}
\label{fig:a:ob_f15}
\end{figure}
\subsubsection{在PC两端进行PING测试}
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f16}
\caption{端主机PING通结果图}
\label{fig:a:ob_f16}
\end{figure}
\subsection{常用软件安装与使用}
\subsubsection{Wireshark抓包工具的安装使用}
\begin{enumerate}
\item 安装教程
\begin{enumerate}
\item 进入“\\06\_软件包及工具\\抓包工具”目录。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f17}
\caption{Wireshark安装包路径}
\label{fig:a:ob_f17}
\end{figure}
\item 鼠标双击Wireshark-win64-3.2.5.exe文件
进入到下图中的安装界面。直接点击“agree”进行下一步。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f18}
\caption{Wireshark许可协议}
\label{fig:a:ob_f18}
\end{figure}
\item 选择软件的安装路径。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f19}
\caption{更改Wireshark安装路径}
\label{fig:a:ob_f19}
\end{figure}
\item 点击 “install”进行安装。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f20}
\caption{Wireshark 开始安装}
\label{fig:a:ob_f20}
\end{figure}
\item 弹出Npacp组件安装窗口点击 “install”进行安装。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f21}
\caption{Wireshark 安装Npacp组件}
\label{fig:a:ob_f21}
\end{figure}
\end{enumerate}
\item 使用教程
\begin{enumerate}
\item 捕获网络接口
\begin{enumerate}
\item 打开安装好的wireshark会进入如下所示界面。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f22}
\caption{Wireshark启动界面说明}
\label{fig:a:ob_f22}
\end{figure}
\item 这里以有线网口为例,则点击选择 “以太网”,
就可以捕获有线网口的所有数据报文。如下所示。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f23}
\caption{以太网接口捕获数据报文情况}
\label{fig:a:ob_f23}
\end{figure}
\end{enumerate}
\item wireshark 窗口介绍
wireshark主要分为这几个窗口如下所示。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f24}
\caption{Wireshark窗口说明}
\label{fig:a:ob_f24}
\end{figure}
\begin{enumerate}
\item Display Filter(显示过滤器):用于设置过滤条件进行数据包列表过滤。
\item Packet List Pane(封包列表):简要地显示捕获到的数据包,
每个数据包包含编号,时间戳,源地址,目标地址,协议,长度,以及数据包信息。
不同协议的数据包使用了不同的颜色区分显示。。
\item Packet Details Pane(封包详细信息):在数据包列表中选择指定数据包,
在数据包详细信息中会显示数据包的所有详细信息内容。
数据包详细信息面板是最重要的,用来查看协议中的每一个字段。
\item Packet Bytes Pane(16进制数据)以十六进制和ASCII码的形式显示数据包的内容。
这里显 示了一个数据包未经处理的原始样子,也就是在链路上传播时的数据形式。
\item Miscellanous(状态栏)包含有专家信息、注释、包的数量和Profile。
\end{enumerate}
\item 过滤报文
\begin{enumerate}
\item 在显示过滤器栏中,输入指定地过滤条件即可过滤报文。
\item 如过滤ip地址为“192.168.1.1”的报文,
则输入过滤条件“ip.addr == 192.168.1.1”。如下所示。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f25}
\caption{过滤指定ip地址报文}
\label{fig:a:ob_f25}
\end{figure}
\item 如过滤mac地址为“01:00:5e:7f:ff:fa”的报文
则输入过滤条件 “eth.addr == 01:00:5e:7f:ff:fa”如下所示。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f26}
\caption{过滤指定mac地址报文}
\label{fig:a:ob_f26}
\end{figure}
\item 由于篇幅的原因wireshark的其他使用在本文档就不再说明了。
\end{enumerate}
\end{enumerate}
\end{enumerate}
\subsubsection{CP2102串口驱动的安装使用}
\begin{enumerate}
\item 在“06\_软件包及工具/CP2102串口驱动”目录下
根据电脑的操作系统选择对应的软件包。
\item 如以windows~10操作系统的电脑为例
则选择 “06\_软件包及工具/CP2102串口驱动/win10版/CP210x\_Windows10\_Driver.zip”。
如下所示。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f27}
\caption{CP2102串口驱动压缩包}
\label{fig:a:ob_f27}
\end{figure}
\item 解压软件包若根据系统为64位则双击“CP210xVCPInstaller\_x64.exe”运行安装。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f28}
\caption{解压CP2102串口驱动压缩包}
\label{fig:a:ob_f28}
\end{figure}
\item 如下所示,完成安装。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f29}
\caption{CP2102串口驱动完成安装}
\label{fig:a:ob_f29}
\end{figure}
\end{enumerate}
\subsection{系统更新}
\subsubsection{系统组成}
OpenBox-S4的系统架构为通用多核CPU加FPGA
使用的是Xilinx公司的ZYNQ系列芯片提供的整体封装解决方案。
在ZYNQ芯片中包含CPU系统与FPGA系统两部分其内部通过高速总线连接。
在OpenBox-S4的设备中其管理接口MGMT由CPU引出其他4个标准网口则由FPGA引出。
整个系统的逻辑运行是从SD卡中的几个文件开始
主要包括BOOT.bin、devicetree.dtb、uImage和uramdisk.image.gz四个部分。
其中BOOT.bin定义的整个芯片的物理系统构成、连接关系和FPGA的功能逻辑
devicetree.dtb文件则定义了系统的硬件资源定义在CPU运行系统内核镜像时
提供外设硬件及资源定义参数uImage是CPU运行的系统内核镜像文件
提供linux的内核运行环境及外设驱动uramdisk.image.gz是linux系统的根文件系统
包含内核引导起来后所使用的存储根文件系统、
系统配置信息、系统命令工具和用户命令等。
在所有的OpenBox-S4设备的系统中BOOT.bin与devicetree.dtb是匹配成套生成的
uImage和uramdisk.image.gz是所有系统通用匹配使用的。
用户如果要修改芯片系统架构、连接以及硬件逻辑,
则需要重新生成BOOT.bin和devicetree.dtb文件替换原来系统的这两件文件
即可重新定义设备的硬件逻辑功能。如果需要重新定义系统内核功能,
则需要重新编译生成uImage文件进行替换。如果是用户软件逻辑或工具命令
则可随时通过网络、U盘等上传至系统/mnt/openbox/目录即可使用。
\subsubsection{系统更新}
如上节所述更新系统最多是替换该设备环境中的4个核心文件
通常用户只修改硬件逻辑就不需要替换uImage和uramdisk.image.gz文件
如果不调修改原有接口的地址资源配置地址也无需devicetree.dtb文件
仅需要更新替换Boot.bin文件即可。此文档主要描述一下
如何更新整个系统运行环境即替换系统的4个核心文件。
\begin{enumerate}
\item 备份系统原有系统核心文件
通过设备的管理接口连接到用户操作主机,
通过SCP远程复制的方法将OpenBox-S4的系统备份到用户主机本地保存。
Windows主机请使用putty配套的pscp命令工具用法相同。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f30}
\caption{下载备份原有系统}
\label{fig:a:ob_f30}
\end{figure}
\item 上传用户新的系统核心文件
将用户修改系统硬件逻辑后生成的BOOT.bin和devicetree.dtb
文件保存在本地update目录中
将备份目录中的uImage和uramdisk.image.gz文件复制到update目录
确保update更新目录中包含OpenBox-S4系统运行环境的4个核心文件
其中BOOT.bin和devicetree.dtb是用户最新生成的。执行如下命令
将更新目录的4个核心文件上传替换原来OpenBox-S4上面的核心文件。
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f31}
\caption{上传更新用户系统}
\label{fig:a:ob_f31}
\end{figure}
\item 断电后重启设备验证系统
确认更新文件已经上传后,即可关机、断电和重新加电进行测试。
重新加电进入系统后,使用系统自带工具读取硬件系统版本号。
如果其版本号读出与你的硬件逻辑定义一致,则说明系统更新成功。
如果不同说明系统更新没有替换原来的文件,请检查上传操作是否与上述截图一致,
是否有报错信息。系统自带标准五级流水线版本号为0x2020181108
如下图所示,即说明系统更新成功
当前运行系统的硬件版本号为用户更新版本号0x2020191231
\begin{figure}[!htp]
\centering
\includegraphics[width=11cm]{f32}
\caption{读硬件版本号验证}
\label{fig:a:ob_f32}
\end{figure}
\end{enumerate}

@ -3,16 +3,8 @@
\chapter{路由器实现}
\label{chap:router-ob}
本单元实验使学生能初步使用可编程网络设备开发平台进行路由器基本功能的设计与实现,
通过程序来实现路由器中最基本的三个功能:
包括二层交换功能、三层路由功能及组网功能。
深入理解路由器的基本工作原理与分组处理流程,
从而培养学生对网络设备使用和研发的能力。
本单元实验使学生能初步使用可编程网络设备开发平台进行路由器基本功能的设计与实现,通过程序来实现路由器中最基本的三个功能:包括二层交换功能、三层路由功能及组网功能。深入理解路由器的基本工作原理与分组处理流程,从而培养学生对网络设备使用和研发的能力。
可编程网络设备开发平台是一款基于FAST架构的软硬件
软件在CPU上使用C语言编程硬件在FPGA芯片上使用Verilog语言编程
全可编程的网络实验教学平台,平台的软硬件逻辑代码开源免费,支持用户二次开发。
其基本使用方法与编程开发方法见附录\ref{app:openbox}:《可编程网络平台-操作手册》
和附录\ref{app:fast}《FAST编程入门指南》。
可编程网络设备开发平台在后文简称为“可编程网络平台”图标LOGO为FAST节点名称为OpenBox-S4。
可编程网络设备开发平台是一款基于FAST架构的软硬件软件在CPU上使用C语言编程硬件在FPGA芯片上使用Verilog语言编程全可编程的网络实验教学平台平台的软硬件逻辑代码开源免费支持用户二次开发。其基本使用方法见附录\ref{app:openbox}《FAST平台介绍与操作说明手册》。
基于FAST架构的可编程网络设备开发平台的具体设备型号为OpenBox-S4在案例文档中简称为“可编程网络平台”在实验图中的图标LOGO为FAST节点名称为OpenBox-S4。

@ -6,28 +6,19 @@
\subsection{实验目的}
\label{subsec:c:router-ob:s:networking_object}
本实验的主要目的是让学生将自己开发的路由器进行组网实验,
引入路由协议的配置与学习,实现多网段主机间的相互通信。
熟悉Quagga软件的安装与使用和两种基本路由协议RIP与OSPF的配置与使用。
本实验的主要目的是让学生将自己开发的路由器进行组网实验引入路由协议的配置与学习实现多网段主机间的相互通信。熟悉Quagga软件的安装与使用和两种基本路由协议RIP与OSPF的配置与使用。
\subsection{实验内容}
\label{subsec:c:router-ob:s:networking_content}
使用学生开发的路由器平台,搭建至少跨两跳路由器的复杂路由组网环境,
验证多网段主机的相互连通性。主要完成以下内容:
使用学生开发的路由器平台,搭建至少跨两跳路由器的复杂路由组网环境,验证多网段主机的相互连通性。主要完成以下内容:
\begin{enumerate}
\item \textbf{搭建自研路由器环境:}使用学生自己研发的路由器组建网络,
搭建不少于3台路由器和2台测试主机的网络环境进行验证
\item \textbf{安装并配置路由协议学习环境:}运行Quagga环境
分配配置RIP路由协议与OSPF路由协议并将两种协议启动运行
\item \textbf{验证组网功能:}验证不同路由协议下组网运行功能,
验证不同网段内主机的相互通信功能
\item \textbf{观察分析路由器工作流程:}观察各路由节点学习非互联网段的路由转发表,
打印输出各路由节点的FIB表
\item \textbf{观察分析内核FIB的变化}在网络正常运行状态下,
断开中间某个路由器间的链路观察断开链路两端路由器的内核FIB表变化情况
同时验证路由器内FIB表同步情况
\item \textbf{搭建自研路由器环境:}使用学生自己研发的路由器组建网络搭建不少于2台路由器和2台测试主机的网络环境进行验证
\item \textbf{安装并配置路由协议学习环境:}运行Quagga环境分别配置RIP路由协议与OSPF路由协议并将两种协议启动运行
\item \textbf{验证组网功能:}验证不同路由协议下组网运行功能,验证不同网段内主机的相互通信功能;
\item \textbf{观察分析路由器工作流程:}观察各路由节点学习非互联网段的路由转发表打印输出各路由节点的FIB表
\item \textbf{观察分析内核FIB的变化}在网络正常运行状态下断开中间某个路由器间的链路观察断开链路两端路由器的内核FIB表变化情况同时验证路由器内FIB表同步情况。
\end{enumerate}
\subsection{实验原理、方法和手段}
@ -35,30 +26,21 @@
\subsubsection{路由协议及基本工作原理}
路由协议工作在路由器的控制平面,创建了路由表,描述了网络拓扑结构。
通过在路由器之间共享路由信息来相互学习总个网络可达区域内可到达的路由网段信息。
路由信息在相邻路由器之间传递,确保所有路由器知道到其它路由器的路径。
路由协议工作在路由器的控制平面,创建了路由表,描述了网络拓扑结构。通过在路由器之间共享路由信息来相互学习整个网络可达区域内路由网段信息。路由信息在相邻路由器之间传递,确保所有路由器知道到其它路由器的路径。
路由协议主要包括RIP、OSPF、ISIS和BGP等。
RIP、OSPF、IS-IS是内部网关协议IGP
适用于单个ISP的统一路由协议的运行
一般由一个ISP运营的网络位于一个AS自治系统
有统一的AS number自治系统号
BGP是自治系统间的路由协议是一种外部网关协议
多用于不同ISP之间交换路由信息以及大型企业、政府等具有较大规模的私有网络。
路由协议主要包括RIP、OSPF、IS-IS和BGP等。RIP、OSPF、IS-IS是内部网关协议IGP适用于单个ISP的统一路由协议的运行一般由一个ISP运营的网络位于一个AS自治系统有统一的AS number自治系统号。BGP是自治系统间的路由协议是一种外部网关协议多用于不同ISP之间交换路由信息以及大型企业、政府等具有较大规模的私有网络。
\subsubsection{路由组网环境}
本实验建议采用学生自研的路由器进行组网测试,
组网测试通过的组可以在中间穿插商用路由器一起验证。
本实验建议采用学生自研的路由器进行组网测试,组网测试通过的组可以在中间穿插商用路由器一起验证。
\subsection{实验条件}
\label{subsec:c:router-ob:s:networking_requirement}
\begin{itemize}
\item 可编程网络平台两个,交换测试主机两台,
网络配置与连接拓扑如\ref{fig:c:router-ob_networking-topo}所示;
\item 串口线根,网线三根;
\item 可编程网络平台两个,交换测试主机两台,网络配置与连接拓扑如
\ref{fig:c:router-ob_networking-topo}所示;
\item 串口线根,网线三根;
\item 学生自研路由器程序。
\end{itemize}
@ -78,37 +60,13 @@ BGP是自治系统间的路由协议是一种外部网关协议
\begin{itemize}
\item Quagga安装
\begin{code}[console]
root@HNXS-FAST:/home/hnxs# apt-get install quagga
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
建议安装:
snmpd
下列【新】软件包将被安装:
quagga
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 1 个软件包未被升级。
有 1 个软件包没有被完全安装或卸载。
需要下载 1,154 kB 的归档。
解压缩后会消耗 4,605 kB 的额外空间。
获取:1 https://mirrors.ustc.edu.cn/ubuntu-ports xenial-updates/main armhf quagga armhf 0.99.24.1-2ubuntu1.4 [1,154 kB]
已下载 1,154 kB耗时 1秒 (997 kB/s)
正在预设定软件包 ...
正在选中未选择的软件包 quagga。
(正在读取数据库 ... 系统当前共安装有 21814 个文件和目录。)
正准备解包 .../quagga_0.99.24.1-2ubuntu1.4_armhf.deb ...
正在解包 quagga (0.99.24.1-2ubuntu1.4) ...
正在处理用于 libc-bin (2.23-0ubuntu3) 的触发器 ...
正在处理用于 ureadahead (0.100.0-19) 的触发器 ...
正在处理用于 systemd (229-4ubuntu4) 的触发器 ...
正在设置 quagga (0.99.24.1-2ubuntu1.4) ...
正在处理用于 libc-bin (2.23-0ubuntu3) 的触发器 ...
正在处理用于 ureadahead (0.100.0-19) 的触发器 ...
正在处理用于 systemd (229-4ubuntu4) 的触发器 ...
root@HNXS-FAST:/home/hnxs# apt-get install quagga
\end{code}
\item Quagga启动配置
\begin{code}[console]
root@HNXS-FAST:/home/hnxs# vim /etc/quagga/daemons
修改Quagga的启动模块配置文件/etc/quagga/daemons主要内容如下
\begin{code}[text]
zebra=yes
bgpd=no
ospfd= yes
@ -122,96 +80,43 @@ BGP是自治系统间的路由协议是一种外部网关协议
将上述文件内容中的3个no修改为yes表示启动该功能模块。
\item RIP协议启动配置
\begin{code}[console]
root@HNXS:/home/hnxs# vim /etc/quagga/ripd.conf
\end{code}
ripd.conf配置文件示例如下
修改RIP协议模块配置文件/etc/quagga/ripd.conf在空行处添加网段信息与邻居信息。原文件其他所有内容均无需修改。ripd.conf添加内容如下
\begin{code}[text]
! -*- rip -*-
!
! RIPd sample configuration file
!
! $Id: ripd.conf.sample,v 1.1 2002/12/13 20:15:30 paul Exp $
!
hostname ripd
password zebra
!
! debug rip events
! debug rip packet
!
router rip
! network 11.0.0.0/8
! network eth0
! route 10.0.0.0/8
! distribute-list private-only in eth0
network obx0
network obx1
network obx2
network obx3
neighbor 192.168.3.1
!
!access-list private-only permit 10.0.0.0/8
!access-list private-only deny any
!
!log file /var/log/quagga/ripd.log
!
log stdout
\end{code}
上述文件是S4-A路由器的rip配置文件另一台配置文件与上述基本相同
只是其neighbor的地址是192.168.3.2。
这两台路由器是通过S4-A的一个端口IP为192.168.3.1
故其neighbor为192.168.3.2和S4-B的一个端口IP为192.168.3.2)连接起来的。
上述文件是S4-A路由器的rip配置文件另一台配置文件与上述基本相同只是其neighbor的地址是192.168.3.2。这两台路由器是通过S4-A的一个端口IP为192.168.3.1故其neighbor为192.168.3.2和S4-B的一个端口IP为192.168.3.2)连接。
\item OSPF协议启动配置
\begin{code}[console]
root@HNXS:/home/hnxs# vim /etc/quagga/ospfd.conf
\end{code}
ospfd.conf配置文件示例如下
修改OSPF协议模块配置文件/etc/quagga/ospfd.conf添加网段与ID信息。原文件其他所有内容均无需修改。ospfd.conf添加内容如下
\begin{code}[text]
! -*- ospf -*-
!
! OSPFd sample configuration file
!
!
hostname ospfd
password zebra
!enable password please-set-at-here
!
!router ospf
! network 192.168.1.0/24 area 0
!
ospf router-id 192.168.3.1
network 192.168.0.0/24 area 0
network 192.168.1.0/24 area 0
network 192.168.2.0/24 area 0
network 192.168.3.0/24 area 0
log stdout
\end{code}
上述为S4-A路由器的配置文件另一台路由器配置文件
上述为S4-A路由器的配置文件另一台路由器配置文件添加内容如下
\begin{code}[text]
! -*- ospf -*-
!
! OSPFd sample configuration file
!
!
hostname ospfd
password zebra
!enable password please-set-at-here
!
!router ospf
! network 192.168.1.0/24 area 0
!
ospf router-id 192.168.3.2
network 192.168.4.0/24 area 0
network 192.168.5.0/24 area 0
network 192.168.6.0/24 area 0
network 192.168.3.0/24 area 0
log stdout
\end{code}
\end{itemize}
@ -220,15 +125,16 @@ BGP是自治系统间的路由协议是一种外部网关协议
root@HNXS:/home/hnxs# systemctl start quagga
\end{code}
\item 将自研路由器和测试主机组网路由节点不少于2个,连线可以组成环状
\item 将自研路由器和测试主机组网路由节点不少于2个
\item 运行自研路由器并在两个测试主机上分别ping对方主机IP地址
请参考实验\ref{sec:c:router-ob:s:router}内容。
\item 观察某个节点路由器分组处理流程,
从打印消息上观察控制平面与数据平面的分组处理情况;
请参考实验\ref{sec:c:router-ob:s:router}内容。
\item 观察某个节点路由器分组处理流程,从打印消息上观察控制平面与数据平面的分组处理情况;
\item 观察每个节点上内核FIB表内容
\begin{code}[console]
root@HNXS-FAST:/mnt/openbox# route -n
\end{code}
\begin{code}[text]
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 obx0
@ -239,9 +145,8 @@ BGP是自治系统间的路由协议是一种外部网关协议
192.168.5.0 192.168.3.2 255.255.255.0 UG 2 0 0 obx3
192.168.6.0 192.168.3.2 255.255.255.0 UG 2 0 0 obx3
\end{code}
观察新增加的表项内容,最后三条是非本地路由可直达的网段,
其均需要通过192.168.3.2网送才可达。
\item 观察路由器FIB表的更新情况判断是否检测到内核FIB变化是否已经同步更新
观察新增加的表项内容最后三条是非本地路由可直达的网段均需要通过192.168.3.2网关才可达。
\item 观察路由器FIB表的更新情况判断是否检测到内核FIB变化是否已经同步更新。
\end{enumerate}
\subsection{思考题}
@ -264,11 +169,11 @@ BGP是自治系统间的路由协议是一种外部网关协议
\subsection{考核方法}
\label{subsec:c:router-ob:s:networking_criterion}
完成本次实验,需要提交一份实验报告和一程序输出日志。
完成本次实验,需要提交一份实验报告和一程序输出日志。
\begin{enumerate}
\item 20分在规定时间内完成实验并提交实验成果
\item 30分实验报告内容详细有关键步骤截图与分析说明
\item 20分所有节点正常运行不同网段的主机可以相互ping通
\item 20分Quagga安装配置正确RIP和OSPF配置正确工作正常
\item 10分实验报告与源代码内容完整、格式整洁
\item 10分实验报告与源代码内容完整、格式规范
\end{enumerate}

@ -6,27 +6,17 @@
\subsection{实验目的}
\label{subsec:c:router-ob:s:router_object}
本实验的主要目的是让学生掌握二层以太网帧、ARP协议和三层IP协议等的数据结构
熟悉各协议的解析与封装过程,
掌握三层路由器的工作原理、分组处理流程、FIB表和邻接表生成与使用。
熟悉路由器数据平面与控制平面的切分及不同的工作处理流程。
本实验的主要目的是让学生掌握二层以太网帧、ARP协议和三层IP协议等的数据结构熟悉各协议的解析与封装过程掌握三层路由器的工作原理、分组处理流程、FIB表和邻接表生成与使用。熟悉路由器数据平面与控制平面的切分及不同的工作处理流程。
\subsection{实验内容}
\label{subsec:c:router-ob:s:router_content}
使用可编程网络平台及三层路由器示例框架源码,
设计完成一个三层路由器原型系统。主要完成以下内容:
使用可编程网络平台及三层路由器示例框架源码,设计完成一个三层路由器原型系统。主要完成以下内容:
\begin{enumerate}
\item \textbf{系统路由验证:}搭建测试环境,
验证系统自带三层路由原型系统的功能,实现不同网段主机的相互通信功能;
\item \textbf{逻辑设计与实现:}基于路由器示例框架代码,
分别设计完成路由器的分组解析、FIB同步与查表、
二层与三层数据更新、ARP请求与响应等模块功能
\item \textbf{功能调试与验证:}根据路由器分组处理流程,
分别调试每一类分组的处理逻辑。如ARP请求类分组、
ARP响应类分组、控制平面分组和数据平面分组
组网测试路由器功能,实现不同网段内主机之间的相互通信功能。
\item \textbf{系统路由验证:}搭建测试环境,验证系统自带三层路由原型系统的功能,实现不同网段主机的相互通信功能;
\item \textbf{逻辑设计与实现:}基于路由器示例框架代码分别设计完成路由器的分组解析、FIB同步与查表、二层与三层数据更新、ARP请求与响应等模块功能
\item \textbf{功能调试与验证:}根据路由器分组处理流程分别调试每一类分组的处理逻辑。如ARP请求类分组、ARP响应类分组、控制平面分组和数据平面分组组网测试路由器功能实现不同网段内主机之间的相互通信功能。
\end{enumerate}
\subsection{实验原理、方法和手段}
@ -34,44 +24,30 @@
\subsubsection{系统路由验证}
请参考附件《可编程网络平台-操作手册》完成。
请参考附\ref{app:openbox}《FAST平台介绍与操作说明手册》完成。
\subsubsection{三层路由器工作原理}
三层路由器工作于OSI模型的第3层网络层根据网络层中的目的IP地址进行查表
获得分组转发的下一跳输出端口及下一跳的IP地址。更新网络层的TTL值与CSUM值
并在输出端口对二层数据进行重新封装二层数据后转发。
路由器还具备ARP响应与请求功能
支持响应请求自己IP的MAC信息与请求路由下一跳IP的MAC信息。
三层路由器工作于OSI模型的第3层网络层根据网络层中的目的IP地址进行查表获得分组转发的下一跳输出端口及下一跳的IP地址。更新IP层的ttl值与checksum值并在输出端口对二层数据进行重新封装二层数据后转发。路由器还具备ARP响应与请求功能支持响应请求自己IP的MAC信息与请求路由下一跳IP的MAC信息。
\subsubsection{路由器分组处理流程}
\begin{enumerate}
\item \textbf{线程同步系统FIB表}通过一个独立线程读取内核FIB表信息
保存到路由器的FIB表结构中循环不断的获取内核FIB表
一但有更新则刷新自己的FIB表内容
\item \textbf{输入分组解析:}接收各端口输入分组信息,并进行分组解析处理,
根据MAC地址信息和目的IP地址信息判断分组为控制平面分组还是数据平面分组
\item \textbf{控制平面与数据平面分流:}将控制平面数据转发到协议栈进行处理,
将数据平台数据转发到路由器数据转发逻辑中处理。
若是本机MAC的ARP请求则构造ARP响应进行回复
\item \textbf{提取目的IP并查表}路由器数据转发逻辑进一步解析数据,
解析提取目的IP地址送入FIB查表引擎进行匹配
获取分组的下一跳IP地址及输出端口信息
\item \textbf{更新三层数据:}更新分组TTL值与CSUM值根据FIB表结果
将分组转发至对应端口输出队列;
\item \textbf{更新二层数据:}更新FIB查表下一跳IP的MAC地址信息
查表无结果则启动ARP请求模块若查到对应MAC信息则更新二层数据后直接转发
\item \textbf{ARP请求}根据请求的IP地址与发送端口信息构造ARP协议的请求报文
发送到端口进行学习,并将学习结果保存到该端口的邻接表中;
\item \textbf{端口队列输出:}抽取端口输出队列内的发送分组,
更新二层数据后由端口直接发送。
保存到路由器的FIB表结构中循环不断的获取内核FIB表一旦有更新
则刷新自己的FIB表内容
\item \textbf{输入分组解析:}接收各端口输入分组信息并进行分组解析处理根据目的MAC和目的IP地址信息判断分组为控制平面分组还是数据平面分组
\item \textbf{控制平面与数据平面分流:}将控制平面数据转发到协议栈进行处理将数据平台数据转发到路由器数据转发逻辑中处理。若是本机MAC的ARP请求则构造ARP响应进行回复
\item \textbf{提取目的IP并查表}路由器数据转发逻辑进一步解析数据解析提取目的IP地址送入FIB查表引擎进行匹配获取分组的下一跳IP地址及输出端口信息
\item \textbf{更新三层数据:}更新分组ttl值与checksum值根据FIB表结果将分组转发至对应端口输出队列
\item \textbf{更新二层数据:}更新FIB查表下一跳IP的MAC地址信息查表无结果则启动ARP请求模块若查到对应MAC信息则更新二层数据后直接转发
\item \textbf{ARP请求}根据请求的IP地址与发送端口信息构造ARP协议的请求报文发送到端口进行学习并将学习结果保存到该端口的邻接表中
\item \textbf{端口队列输出:}抽取端口输出队列内的发送分组,更新二层数据后由端口直接发送。
\end{enumerate}
\subsection{实验条件}
\label{subsec:c:router-ob:s:router_requirement}
\begin{itemize}
\item 可编程网络平台一个,路由测试主机两台,
IP配置及连接拓扑如图\ref{fig:c:router-ob_router-topo}所示;
\item 可编程网络平台一个路由测试主机两台IP配置及连接拓扑如图\ref{fig:c:router-ob_router-topo}所示;
\item 串口线一根,网线两根;
\item 三层路由器框架源代码(开发环境与编译工具系统自带)。
\end{itemize}
@ -87,37 +63,13 @@
\label{subsec:c:router-ob:s:router_procedure}
\subsubsection{系统路由验证}
1. 登录可编程网络平台,启动系统自带三层路由器命令,
系统输出如下信息说明已正常启动且进入工作模式
\begin{enumerate}
\item 登录可编程网络平台,启动系统自带三层路由器命令,系统输出如下信息说明已正常启动且进入工作模式,已省略部分模块输出信息。
\begin{code}[console]
root@HNXS-FAST:/mnt/openbox# l3router
Port[0]->obx0,MAC->00:0A:35:01:00:5B,IPv4->192.168.0.1,
IPv6->0000:0000:0000:0000:0000:0000:0000:0000
Port[1]->obx1,MAC->00:0A:35:00:00:02,IPv4->192.168.1.1,
IPv6->0000:0000:0000:0000:0000:0000:0000:0000
Port[2]->obx2,MAC->00:0A:35:00:00:03,IPv4->192.168.2.1,
IPv6->0000:0000:0000:0000:0000:0000:0000:0000
Port[3]->obx3,MAC->00:0A:35:00:00:04,IPv4->192.168.3.1,
IPv6->0000:0000:0000:0000:0000:0000:0000:0000
Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT Port
obx0 0000A8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 0
obx1 0001A8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 1
obx2 0002A8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 2
obx3 0003A8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 3
Create update_fib4_thread OK!
Create handle_queue_packet on Port[0] thread OK!
handle_queue_packet on port[0]
handle_queue_packet[0]->Wait pkt INQUEUE...
Create handle_queue_packet on Port[1] thread OK!
handle_queue_packet on port[1]
handle_queue_packet[1]->Wait pkt INQUEUE...
Create handle_queue_packet on Port[2] thread OK!
handle_queue_packet on port[2]
handle_queue_packet[2]->Wait pkt INQUEUE...
Create handle_queue_packet on Port[3] thread OK!
handle_queue_packet on port[3]
handle_queue_packet[3]->Wait pkt INQUEUE...
\end{code}
\begin{code}[text]
fastU->REG Version:20180827,OpenBox HW Version:2030200722
FAST UA REG->from pid:907,state:21,mid:132
fastU->Register UA to FAST Kernel! Wait Reply......
@ -125,18 +77,18 @@
fastU->libua version:20180827
fastU->fast_ua_recv......
\end{code}
\end{enumerate}
\subsubsection{设计开发三层路由器}
\begin{enumerate}
\item 阅读三层路由器框架源代码文件,
根据三层路由工作原理及分组处理流程设计完成框架源代码中的TODO部分内容
\item 编译自己的三层路由器源码生成相应的路由器系统命令user\_l3router
\item 阅读三层路由器框架源代码文件根据三层路由工作原理及分组处理流程设计完成框架源代码中的TODO部分内容
\item 编译自己的三层路由器源码生成相应的路由器系统命令user\_l3router。
\end{enumerate}
\subsubsection{调试与验证}
\begin{enumerate}
\item 运行自己的三层路由器代码,验证路由器的功能;
\item 路由器正常工作后,可以显示如下信息;
\item 运行自己的三层路由器程序,验证路由器的功能;
\item 路由器正常工作后,显示如下信息;
\begin{itemize}
\item 加载路由器接口地址信息
\begin{code}[text]
@ -261,8 +213,7 @@
\label{subsec:c:router-ob:s:router_notice}
\begin{enumerate}
\item 可编程网络平台的路由器只是一个基础的路由器原型,
分组处理方法与流程设计并不是规范,学生可根据自己理解创新实现;
\item 可编程网络平台的路由器只是一个基础的路由器原型,分组处理方法与流程设计并不是必须严格遵守的规范,学生可根据自己理解创新实现;
\item 控制平面的数据是通过平台开发环境重新导入到了系统内核处理,
目的是为了支持该系统上的其他正常SOCKET应用如Quagga路由软件。
\end{enumerate}
@ -270,8 +221,7 @@
\subsection{考核方法}
\label{subsec:c:router-ob:s:router_criterion}
完成本次实验,需要提交一份实验报告、一份程序源代码和一分程序输出日志。
程序源代码中用户添加的代码需要有详细的注释说明。
完成本次实验,需要提交一份实验报告、一份程序源代码和一份程序输出日志。程序源代码中用户添加的代码需要有详细的注释说明。
\begin{enumerate}
\item 20分在规定时间内完成实验并提交实验成果
@ -279,5 +229,5 @@
\item 10分程序正常运行测试主机可以ping通或抓包接收到对端报文
\item 10分ARP请求与响应功能正常工作
\item 10分测试主机可以ping通路由器端口的IP地址
\item 10分实验报告与源代码内容完整、格式整洁
\item 10分实验报告与源代码内容完整、格式规范
\end{enumerate}

@ -6,25 +6,17 @@
\subsection{实验目的}
\label{subsec:c:router-ob:s:switch_object}
本实验的主要目的是让学生掌握可编程网络平台的二层以太网数据收发方法,
熟悉二层以太网帧的数据结构掌握MAC地址的解析与使用。
熟悉二层交换机的分组交换原理、
设计完成二层交换的分组处理流程和转发表的老化功能与处理方法。
本实验的主要目的是让学生掌握可编程网络平台的二层以太网数据收发方法熟悉二层以太网帧的数据结构掌握MAC地址的解析与使用。熟悉二层交换机的分组交换原理、设计完成二层交换的分组处理流程和转发表的老化功能与处理方法。
\subsection{实验内容}
\label{subsec:c:router-ob:s:switch_content}
使用可编程网络平台及二层交换机示例框架源码,
设计完成一个二层以太网交换机原型系统。主要完成以下内容:
使用可编程网络平台及二层交换机示例框架源码,设计完成一个二层以太网交换机原型系统。主要完成以下内容:
\begin{enumerate}
\item \textbf{平台使用与验证:}掌握可编程网络平台及示例开发代码的修改、
编译和运行操作,验证系统自带二层交换机的功能;
\item \textbf{逻辑设计与实现:}设计满足二层交换功能的分组处理流程和逻辑,
如源MAC学习功能、目的MAC查表功能、
端口输出单播与泛洪功能和MAC转发表老化功能
\item \textbf{功能调试与验证:}验证自己开发的二层交换机功能,
是否满足各端口间相互通信功能;
\item \textbf{平台使用与验证:}掌握可编程网络平台及示例开发代码的修改、编译和运行操作,验证系统自带二层交换机的功能;
\item \textbf{逻辑设计与实现:}设计满足二层交换功能的分组处理流程和逻辑如源MAC学习功能、目的MAC查表功能、端口输出单播与泛洪功能和MAC转发表老化功能
\item \textbf{功能调试与验证:}调试自己开发的二层交换机逻辑,验证是否满足各端口间的交换通信功能。
\end{enumerate}
\subsection{实验原理、方法和手段}
@ -32,50 +24,33 @@
\subsubsection{平台基本使用}
请参考附录\ref{app:openbox}:《可编程网络平台-操作手册》完成。
请参考附录\ref{app:openbox}:《FAST平台介绍与操作说明手册》完成。
\subsubsection{二层交换工作原理}
二层交换机工作于OSI模型的第2层数据链路层
可以识别数据帧中的源MAC地址与输入端口信息
并将这些MAC地址与对应的端口记录在自己内部的一个地址表交换表中。
然后根据目的MAC地址进行交换表的查找获得目的MAC的输出端口然后进行转发。
根据目的MAC地址的不同转发方式还分为单端口转发、多端口转发和泛洪转发。
二层交换机工作于OSI模型的第2层数据链路层可以识别数据帧中的源MAC地址与输入端口信息并将这些MAC地址与对应的端口记录在自己内部的一个地址表交换表中。然后根据目的MAC地址进行交换表的查找获得目的MAC的输出端口然后进行转发。根据目的MAC地址的不同转发方式还分为单端口转发单播、多端口转发多播和泛洪转发广播
\subsubsection{二层交换分组处理流程}
\begin{enumerate}
\item \textbf{源MAC学习}当交换机从某个端口收到一个数据帧,
它先读取包头中的源MAC地址和输入端口号
这样就知道源MAC地址的机器是连在交换机的哪个端口上。
以此做为MAC转发表的核心数据结构学习或更新到转发表中
\item \textbf{目的MAC查表}读取数据帧头中的目的MAC地址
并在MAC转发表中查找找到相同MAC的匹配项后
获取该表项相应的端口信息(返回-1表示查表不命中
\item \textbf{转发输出:}根据目的MAC的查表结果判断输出端口号
若端口号为-1表示查不到目的MAC表项则进行泛洪转发
否则把数据帧直接复制到查表返回的端口上进行转发;
\item \textbf{MAC表老化}每次源MAC学习时都更新该MAC表项的使用时间
单独启动一个线程逐项比较MAC表项的最新使用时间与系统当前时间的差值
如果超过指定老化时长如3分钟则将该表项删除。
表项删除可将其有效位置无效,提高处理效率。
\item \textbf{源MAC学习}当交换机从某个端口收到一个数据帧它先读取包头中的源MAC地址和输入端口号这样就知道源MAC地址的机器是连在交换机的哪个端口上。以此做为MAC转发表的核心数据结构学习或更新到转发表中
\item \textbf{目的MAC查表}读取数据帧头中的目的MAC地址并在MAC转发表中查找找到相同MAC的匹配项后获取该表项相应的端口信息返回-1表示查表不命中
\item \textbf{转发输出:}根据目的MAC的查表结果判断输出端口号若端口号为-1表示查不到目的MAC表项则进行泛洪转发否则把数据帧直接复制到查表返回的端口上进行转发
\item \textbf{MAC表老化}每次源MAC学习时都更新该MAC表项的使用时间单独启动一个线程逐项比较MAC表项的最新使用时间与系统当前时间的差值如果超过指定老化时长如3分钟则将该表项删除。表项删除可将其有效位置无效提高处理效率。
\end{enumerate}
\subsubsection{实验方法及手段}
可编程网络平台提供了完整软硬件开发环境和网络功能
(交换或路由等)的示例应用程序及相应框架源代码。
学生使用挖空了部分逻辑功能的示例框架源码版本完成网络功能的设计与调试工作。
可编程网络平台提供了完整软硬件开发环境和网络功能(交换或路由等)的示例应用程序及相应框架源代码。学生使用挖空了部分逻辑功能的示例框架源码版本完成网络功能的设计与调试工作。
\subsection{实验条件}
\label{subsec:c:router-ob:s:switch_requirement}
\begin{itemize}
\item 可编程网络平台一台,交换测试主机两台,
连接拓扑及网络配置如上\ref{fig:c:router-ob_switch-topo}所示;
\item 可编程网络平台一个,交换测试主机两台,连接拓扑及网络配置
如下\ref{fig:c:router-ob_switch-topo}所示;
\item 串口线一根,网线两根;
\item 网络创新实验平台使用手册和二层交换机框架源代码
(开发环境与编译工具系统自带)。
\item 可编程网络平台使用手册和二层交换机框架源代码(开发环境与编译工具系统自带)。
\end{itemize}
\begin{figure}[!ht]
@ -91,11 +66,12 @@
\subsubsection{平台搭建与系统交换验证}
\begin{enumerate}
\item 参考附件《可编程网络平台-操作手册》搭建可编程网络平台的运行环境;
\item 在串口登录界面输入如下命令,启动系统自带二层交换机命令。
系统输出如下信息说明已正常启动且进入工作模式;
\item 请参考附录\ref{app:openbox}《FAST平台介绍与操作说明手册》完成
\item 在串口登录界面输入如下命令,启动系统自带二层交换机命令。系统输出如下信息说明已正常启动且进入工作模式。
\begin{code}[console]
root@HNXS-FAST:/mnt/openbox# l2switch
\end{code}
\begin{code}[text]
fastU->REG Version:20180827,OpenBox HW Version:2030200722
FAST UA REG->from pid:902,state:21,mid:129
fastU->Register UA to FAST Kernel! Wait Reply......
@ -125,30 +101,20 @@
以下为main\_l2switch.c文件的具体内容
\begin{code}[c]
/**
* @brief
*
* @param inport
* @param src_mac
*/
/*地址学习过程将报文的源MAC学习到对应端口MAC表中*/
void learn_smac(u8 inport,u8 *src_mac)
{
/*更新之前查找空白存储MAC位置*/
int i = 0,j = -1;
xprintf("learn_smac->\n");
//TODO User add code
xprintf("learn_smac->add new MAC,port:%d,index:%d\n",inport,j);
/*更新之前查找空白存储MAC位置*/
int i = 0,j = -1;
xprintf("learn_smac->\n");
//TODO User add code
xprintf("learn_smac->add new MAC,port:%d,index:%d\n",inport,j);
}
\end{code}
上述框架代码需要实现的主要功能是源MAC地址的学习
参数输入为分组数据的输入端口号和源MAC地址的指针。
通过对系统MAC转发表的查找判断原MAC转发表中是否存在该表项
若存在,则更新该表项的使用时间;
若不存在,则找一个空闲的表项位置存储该条表项,并更新表项使用时间。
上述框架代码需要实现的主要功能是源MAC地址的学习参数输入为分组数据的输入端口号和源MAC地址的指针。通过对系统MAC转发表的查找判断源MAC转发表中是否存在该表项若存在则更新该表项的使用时间若不存在则找一个空闲的表项位置存储该条表项并更新表项使用时间。
\item 编译自己的二层交换机源码生成相应的交换机系统命令user\_l2switch
\item 编译自己的二层交换机源码生成相应的交换机系统命令user\_l2switch。
\begin{code}[console]
root@HNXS-FAST:/home/hnxs/l2switch# make
gcc o user_l2switch main_l2switch lreg lrule lua -lthread
@ -161,9 +127,9 @@
\subsubsection{调试与验证}
\begin{enumerate}
\item 运行自己的二层交换机代码,验证交换机的功能;
\item 运行自己的二层交换机程序,验证交换机的功能;
\begin{code}[console]
\begin{code}[text]
root@HNXS-FAST:/home/hnxs/l2switch# ./user_l2switch
fastU->REG Version:20180827,OpenBox HW Version:2030200722
FAST UA REG->from pid:902,state:21,mid:129
@ -173,12 +139,12 @@
Create nm08_mac_aging thread OK!
aging[0]->invalid mac:0
fastU->fast_ua_recv......
后面打印以学生代码为准……
// 后面打印以学生代码为准……
\end{code}
运行当前目录下用户的可执行文件,必须在前面加上”./”
\item 二层交换机正常工作后,可以显示如下信息;
\begin{code}[console]
\item 二层交换机正常工作后,显示如下信息;
\begin{code}[text]
root@HNXS-FAST:/mnt/openbox# l2switch
fastU->REG Version:20180827,OpenBox HW Version:2030200722
FAST UA REG->from pid:902,state:21,mid:129
@ -198,27 +164,27 @@
pkt_send_normal->0xb4c00468,outport:1,len:102
pkt_send_normal->0xb4c00468,outport:2,len:102
pkt_send_normal->0xb4c00468,outport:3,len:102
ID PORT0 PORT1 PORT2 PORT3
0 B8:27:EB:04:FC:F0 B8:27:EB:76:8F:DA . .
1 . . . .
ID PORT0 PORT1 PORT2 PORT3
0 B8:27:EB:04:FC:F0 B8:27:EB:76:8F:DA . .
1 . . . .
\end{code}
\begin{itemize}
\item 有端口接收到报文显示输入端口及源目的MAC地址内容
\item 其中端口接收到报文时终端会显示输入端口及源目的MAC地址内容
\begin{code}[text]
inport:0,dstmid:129,len:102,dmac:33:33:00:00:00:02,
smac:B8:27:EB:04:FC:F0
\end{code}
\item 进入源MAC学习阶段并更新MAC时间
\item 然后进入源MAC学习阶段并更新MAC时间
\begin{code}[text]
learn_smac->
update_mac_time->port:0,index:0
learn_smac->add new MAC,port:0,index:0
\end{code}
\item 进入目的MAC查表阶段输出查表结果
\item 然后进入目的MAC查表阶段输出查表结果
\begin{code}[text]
find_dmac->ret = -1
\end{code}
\item 进行报文转发
\item 然后进行报文转发
\begin{code}[text]
//泛洪发送
------pkt_send_flood------
@ -228,7 +194,7 @@
//单播发送
pkt_send_normal->0xb4c00468,outport:3,len:102
\end{code}
\item 实时输出端口MAC地址信息如下表示在端口0和端口1上分别学习到了两个MAC地址信息
\item 最后实时输出端口MAC地址信息终端输出如下信息表示在端口0和端口1上分别学习到了两个MAC地址信息
\begin{code}[text]
ID PORT0 PORT1 PORT2 PORT3
0 B8:27:EB:04:FC:F0 B8:27:EB:76:8F:DA . .
@ -236,11 +202,9 @@
\end{code}
\end{itemize}
\item 交换机工作不正确时开启xprintf函数打印调试
重返步骤3仔细阅读二层交换框架代码、交换机的工作原理及分组处理流程
\item 交换机工作不正确时开启xprintf函数打印调试。仔细阅读二层交换框架代码、交换机的工作原理及分组处理流程
\item 交换机正常工作后,尝试不断切换连两根网线连接交换机的端口,
观察测试主机的ping丢包观察交换机工作界面的输出显示。
\item 交换机正常工作后尝试切换测试主机连接在交换机的端口位置观察测试主机的ping丢包观察交换机工作界面的输出显示。
\end{enumerate}
\subsection{思考题}
@ -248,8 +212,7 @@
\begin{enumerate}
\item 交换机区分IPv4和IPv6协议吗区分TCP和UDP吗
\item 广播风暴broadcast storm是如何产生的如何避免
在不同的应用环境中分别采取的什么方法?
\item 广播风暴broadcast storm是如何产生的如何避免在不同的应用环境中分别采取的什么方法
\item 广播与组播报文如何判断?组播报文如何转发?
\item MAC转发表的老化时间与哪些因素相关网络规模、MAC表项大小
\end{enumerate}
@ -260,20 +223,19 @@
\begin{enumerate}
\item 可编程网络平台的使用手册需要仔细阅读,严格参照文档说明搭建和运行该平台系统;
\item 代码修改若不习惯vim命令可将其文件通过网络方式下载到自己电脑编辑修改完成后再上传到实验平台进行验证。Windows平台的上传下载工具为pscp.exe
\item 二层交换机框架代码只完成了基本的二层数据收发功能,交换机的其他功能逻辑需要自己完成,注意一定要紧扣二层交换机的实验原理完成;
\item 二层交换机框架代码只完成了基本的二层数据收发功能,交换机的其他功能逻辑需要自己完成,根据二层交换机的实验原理与分组处理流程完成;
\item 系统命令运行直接输入命令名称,当前目录的可执行文件运行需要在前面加上“./”。
\end{enumerate}
\subsection{考核方法}
\label{subsec:c:router-ob:s:switch_criterion}
完成本次实验,需要提交一份实验报告、一份程序源代码和一分程序输出日志。
程序源代码中用户添加的代码需要有详细的注释说明。
完成本次实验,需要提交一份实验报告、一份程序源代码和一份程序输出日志。程序源代码中用户添加的代码需要有详细的注释说明。
\begin{enumerate}
\item 20分在规定时间内完成实验并提交实验成果
\item 40分实验报告中有详细的交换逻辑设计分析与实现说明
\item 10分程序正常运行测试主机可以ping通或抓包接收到对端报文
\item 10分MAC转发表在设定时间后可以老化
\item 10分测试主机切换端口连接后仍能ping通
\item 10分实验报告与源代码内容完整、格式整洁
\item 10分实验报告与源代码内容完整、格式规范
\end{enumerate}

@ -3,9 +3,4 @@
\chapter{软件定义网络与网络测量}
\label{chap:sdn-ob}
本单元实验使学生能初步使用SDN平台进行网络功能的设计与实现
通过实验来掌握OpenFlow协议的基本功能与应用
以及网络拓扑构建的基本实现。初步掌握网络测试的常用原理及方法,
了解在测试过程中影响测量精度的原因及如何提高测量精度。
能通过实验理解软硬件协同测量的方法与特点。
本单元实验使学生能初步使用Software Defined Network简称SDN平台进行网络功能的设计与实现通过实验来掌握OpenFlow协议的基本功能与应用以及网络拓扑构建的基本实现。初步掌握网络测试的常用原理及方法了解在测试过程中影响测量精度的原因及如何提高测量精度。能通过实验理解软硬件协同测量的方法与特点。

@ -6,28 +6,18 @@
\subsection{实验目的}
\label{subsec:c:sdn-ob:s:ns_object}
本实验的主要目的是让学生掌握网络测试的常用原理及方法,
了解在测试过程中影响测量精度的原因及如何提高测量精度。
了解软硬件结果的测量方法与优势。
本实验的主要目的是让学生掌握网络测试的常用原理及方法,了解在测试过程中影响测量精度的原因及如何提高测量精度。了解软硬件结合的测量方法与优势。
\subsection{实验内容}
\label{subsec:c:sdn-ob:s:ns_content}
使用可编程网络平台及用户应用AMS自动测量系统软件源代码
对网络远端的服务器进行RTT延时测量和带宽测量
测量不同长度网线的数据传输时长。主要完成以下内容:
使用可编程网络平台及用户应用AMS自动测量系统软件源代码对网络远端的服务器进行RTT延时测量和带宽测量测量不同长度网线的数据传输时长。主要完成以下内容
\begin{enumerate}
\item 测量RTT时长使用AMS软件测量一台校园网内服务器的RTT时间
测量报文使用ping协议文本
\item 测量带宽:在测量网络中添加一台可编程网络平台,
配置为带宽响应测量模式,测量这两个节点之间的实时网络流量,
并用不同测量报文大小来验证测量结果;
\item 测量网线时延:测量不同长度网线的数据传输时延,
根据测量结果分析本系统的测量优势与局限;
\item 添加软件计时测量:修改测量报文代码,
在开始发送时取系统时间做为软件发送时间,
在接收到报文后为每个报文设置系统接收时间计算软件的RTT时间。
\item \textbf{测量RTT时长}使用AMS软件测量一台校园网内服务器的RTT时间测量报文使用ping协议文本
\item \textbf{测量带宽:}在测量网络中添加一台可编程网络平台,配置为带宽响应测量模式,测量这两个节点之间的实时网络流量,并用不同测量报文大小来验证测量结果;
\item \textbf{测量网线时延:}测量不同长度网线的数据传输时延,根据测量结果分析本系统的测量优势与局限;
\item \textbf{添加软件计时测量:}修改测量报文代码在开始发送时取系统时间做为软件发送时间在接收到报文后为每个报文设置系统接收时间计算软件的RTT时间。
\end{enumerate}
\subsection{实验原理、方法和手段}
@ -51,7 +41,7 @@
计算测量结果。硬件的时间控制精度为8ns
故测量数据的收发时间均控制在8ns误差范围内。
根据时间的精准控制,扩展出硬件背靠背发包测试网络带宽,
精准周期发包测量精准抖动。
精准周期发包测量网络抖动。
\subsubsection{测量流程}
@ -83,10 +73,10 @@
\label{subsec:c:sdn-ob:s:ns_requirement}
\begin{itemize}
\item 可编程网络平台两个,被测试服务器一台;
\item 可编程网络平台两个,被测试主机一台;
连接拓扑如图\ref{fig:c:sdn-ob_ns-topo}所示;
\item 串口线一根,网线多根;
\item AMS软件源代码
\item AMS软件源代码
\end{itemize}
\begin{figure}[!ht]
@ -99,9 +89,11 @@
\subsection{实验步骤}
\label{subsec:c:sdn-ob:s:ns_procedure}
\begin{enumerate}
\item 测试平台与被测量主机间的连接性,在平台\texttt{ping 192.168.1.111}
\item 测试测量平台与被测量主机间的连接性,在测量平台\texttt{ping 192.168.1.111}
\begin{code}[console]
root@HNXS-FAST:/home/hnxs/ams# ping 192.168.1.111
\end{code}
\begin{code}[text]
PING 192.168.1.111 (192.168.1.111) 56(84) bytes of data.
64 bytes from 192.168.1.111: icmp_seq=1 ttl=64 time=1.57 ms
64 bytes from 192.168.1.111: icmp_seq=2 ttl=64 time=1.60 ms
@ -112,9 +104,11 @@
rtt min/avg/max/mdev = 1.576/1.640/1.746/0.088 ms
\end{code}
\item 运行AMS测量命令测量服务RTT的命令如下
\item 运行AMS测量命令测量服务RTT的命令如下
\begin{code}[console]
root@HNXS-FAST:/home/hnxs/ams# ams 192.168.1.111 5 70 1000000000
\end{code}
\begin{code}[text]
fastU->REG Version:20180827,OpenBox HW Version:2030200722
FAST UA REG->from pid:1068,state:21,mid:131
fastU->Register UA to FAST Kernel! Wait Reply......
@ -125,7 +119,7 @@
fastU->fast_ua_recv......
\end{code}
系统输出如上信息说明AMS运行成功并发送5个70字节大小的ping报文出去默认间隔为1秒。等待ping响应回来。
\item 观察RTT测量结果
\item 观察RTT测量结果
\begin{code}[text]
AMS ID PKT_SIZE TS(ns)
0, 70, 1583184
@ -136,9 +130,11 @@
\end{code}
观察测量结果计算结果在1.5ms左右与之前的ping测试结果相差不大。
\item 测试两个测量平台之间的实时网络带宽
\item 测试两个测量平台之间的实时网络带宽
\begin{code}[console]
root@HNXS-FAST:/home/hnxs/ams# ams 192.168.1.111 5 100 0
\end{code}
\begin{code}[text]
fastU->REG Version:20180827,OpenBox HW Version:2030200722
FAST UA REG->from pid:1068,state:21,mid:131
fastU->Register UA to FAST Kernel! Wait Reply......
@ -150,21 +146,22 @@
\end{code}
测试之前要在此链路中间增加一个背景流使用iperf的UDP流大小为600Mbps
系统给服务器发送5个100字节大小的ping报文出去默认间隔为1秒。
\item 观察带宽测试结果
系统给测试主机发送5个100字节大小的ping报文出去默认间隔为1秒。
\item 观察带宽测试结果;
\begin{code}[text]
AMS ID PKT_SIZE BW(bps)
0, 70, 341467254
\end{code}
Iperf的背景流设置参数为600M时其实际带宽会跑到648Mbps左右。
iperf的背景流设置参数为600M时其实际带宽会跑到648Mbps左右。
链路上只有两种数据流,该测量值只是某个测量小时段的带宽反馈,
UDP流也存在不稳定性故其结果相加不可能完全是1000Mbps。
其相加结果与千兆带宽基本相等。
\item 测量网线传输延时
\item 测量网线传输延时
\begin{code}[console]
root@HNXS-FAST:/home/hnxs/ams# ams
\end{code}
\begin{code}[text]
fastU->REG Version:20180827,OpenBox HW Version:2030200722
FAST UA REG->from pid:1068,state:21,mid:131
fastU->Register UA to FAST Kernel! Wait Reply......
@ -175,7 +172,7 @@
fastU->fast_ua_recv......
\end{code}
网络测量时需要连接在设备的0和1号端口上默认测量32组数据
网络测量时需要连接在设备的0和1号端口上。
\item 观察网线测量结果
\begin{code}[text]
@ -187,10 +184,9 @@
4, 100, 20202
\end{code}
从数据分析每组测量结果有些误差,但基本
\item 分析测量数据的差异
\item 分析测量数据的差异。
\begin{enumerate}
\item 对相同测试案例进行多组测量,观察数据变化
\item 对相同测试案例进行多组测量,观察数据变化
\item 分析RTT测量时软件计时测量与硬件计时测量的差异。
\end{enumerate}
\end{enumerate}
@ -208,9 +204,9 @@
\label{subsec:c:sdn-ob:s:ns_notice}
\begin{enumerate}
\item 测量服务器的PING延时需要修改发包内容为正确的PING报文内容。
\item 测量其他网络节点的ping延时需要修改发包内容为正确的ping报文内容;
\item 测量报文的间隔可以设置为零,但真正发包时的发包时刻计算却不是零,
是因为硬件报文是逐个逐个发送的,且每个报文发送时间长短与其报文长度相关
是因为硬件报文是逐个逐个发送的,且每个报文发送时间长短与其报文长度相关;
\item 时间计算与带宽计算中均用到了除法,引入了误差。
硬件时钟本身是存在误差(时钟飘移)的,也会引入计数的误差。
\end{enumerate}
@ -218,12 +214,12 @@
\subsection{考核方法}
\label{subsec:c:sdn-ob:s:ns_criterion}
完成本次实验,需要提交一份实验报告和一程序输出日志。
完成本次实验,需要提交一份实验报告和一程序输出日志。
\begin{enumerate}
\item 20分在规定时间内完成实验并提交实验成果
\item 25分实现软件计时测量与硬件测量对比
\item 25分将多线测量结果以图形曲线形式汇总并做分析总结;
\item 25分将多测量结果以图形曲线形式汇总并做分析总结;
\item 20分完成网络抖动测量并做图形化汇总统计
\item 10分实验报告与源代码内容完整、格式整洁
\item 10分实验报告与源代码内容完整、格式规范
\end{enumerate}

@ -6,48 +6,39 @@
\subsection{实验目的}
\label{subsec:c:sdn-ob:s:sdn_object}
本实验的主要目的是让学生了解SDN的概念及三层结构原理
掌握OpenFlow协议格式、内容、工作流程及对应功能作用。
掌握SDN控制器北向API使用方法可通过API编程获取和设置交换机数据。
本实验的主要目的是让学生了解SDN的概念及架构原理掌握OpenFlow协议格式、内容、工作流程及对应功能作用。掌握SDN控制器北向API使用方法可通过API编程获取和设置交换机数据。
\subsection{实验内容}
\label{subsec:c:sdn-ob:s:sdn_content}
使用可编程网络平台及SDN交换机示例框架代码完成OpenFlow协议的部分功能逻辑。
验证并分析SDN交换机的工作原理与处理流程。主要完成以下内容
使用可编程网络平台及SDN交换机示例框架代码完成OpenFlow协议的部分功能逻辑。验证并分析SDN交换机的工作原理与处理流程。主要完成以下内容
\begin{enumerate}
\item \textbf{阅读协议:}阅读OpenFlow 1.3版本协议白皮书,
掌握其协议内容及对应功能;
\item \textbf{设计实现协议功能:}基于SDN交换机示例框架代码
选择开发OpenFlow协议的部分功能完成逻辑设计与实现
\item \textbf{验证交换机功能:}运行自己的SDN交换机控制器建立连接,
\item \textbf{验证交换机功能:}运行自己的SDN交换机控制器建立连接,
在控制器查询其工作状态与相关协议功能展示。
如交换机基本信息描述、交换机流表状态、
交换机端口状态及计数统计、网络拓扑展示效果;
\item \textbf{检验流表:}验证SDN交换机连接主机间的通信功能
并观察流表内容及变化情况;
\item \textbf{REST API应用}使用实验提供的北向REST~API接口查询控制器
\item \textbf{REST API应用}使用实验提供的北向REST API接口查询控制器
获取或设置交换机的不同功能数据;
\item \textbf{定义流表:}使用REST API接口修改流表内容
观察主机的通信情况是否受到影响
观察主机的通信情况是否受到影响
\end{enumerate}
\subsection{实验原理、方法和手段}
\label{subsec:c:sdn-ob:s:sdn_principle}
\subsection{SDN交换机工作原理}
SDN即Software Defined Network软件定义网络
是一种新型网络创新架构,用于解决传统网络架构中对于网络虚拟化、
各类自动化部署以及新型网络协议的问题。
\subsubsection{SDN交换机工作原理}
SDN是一种新型网络创新架构用于解决传统网络架构中对于网络虚拟化、各类自动化部署以及新型网络协议的问题。
SDN将传统的紧耦合网络设备被拆分成了应用、控制、转发三层
其中应用和控制层面能够控制网络中数据的流向以及协议控制,
而底层的网络设备被抽象为了可自定义的转发逻辑实体,
可被上层应用定义为不同类型的转发设备。
SDN将传统的紧耦合网络设备拆分成了应用、控制和转发三层其中应用和控制层面能够控制网络中数据的流向以及协议控制而底层的网络设备被抽象为了可自定义的转发逻辑实体可被上层应用定义为不同类型的转发设备。
在应用层用户可通过通用、简单的API获取网络信息
并可修改转发设备的工作逻辑,达到动态改变网络架构的目的。
在应用层用户可通过通用、简单的API获取网络信息并可修改转发设备的工作逻辑达到动态改变网络架构与功能的目的。
\subsection{SDN交换机分组处理流程}
\begin{enumerate}
@ -55,40 +46,39 @@ SDN将传统的紧耦合网络设备被拆分成了应用、控制、转发三
SDN交换机运行OpenFlow协议代理程序与上层控制器建立通信连接。
交换机解析处理OpenFlow协议
根据协议要求完成协议功能的相关数据收集和配置功能,
构造相应的OpenFlow协议应答控制器
构造相应的OpenFlow协议应答控制器
\item \textbf{建立连接:}OpenFlow协议代理运行时
交换机首先和控制器建立连接,
并发送OFP\_HELLO消息用以确认双方都支持的OFP协议版本信息
\item \textbf{查询或设置数据:}
控制器通过OpenFlow的具体消息协议查询或设置交换机其他相关功能的数据
如OFPT\_HELLO、OFPT\_ECHO\_REQUEST、OFPT\_PACKET\_IN、OFPT\_PACKET\_OUT、
OFPT\_FLOW\_MOD、OFPT\_PORT\_MOD、OFPMP\_DESC、OFPMP\_FLOW、OFPMP\_PORT\_STATS等
如OFPT\_HELLO、OFPT\_ECHO\_REQUEST、OFPT\_PACKET\_IN、OFPMP\_DESC、OFPT\_PACKET\_OUT、OFPT\_FLOW\_MOD、OFPT\_PORT\_MOD、OFPMP\_FLOW、OFPMP\_PORT\_STATS等
\item \textbf{处理转发分组:}当交换机接收到一个数据转发分组时,
提取分组数据中的相关字段组成查表关键字,然后在本地进行流表匹配。
如果匹配成功,则根据流表的动作处理该分组,如从其他端口转发出去;
如果匹配不成功,则会命中默认动作,将分组打包送到控制器;
如果匹配不成功,则会执行默认动作,将分组打包送到控制器;
\item \textbf{PACKET\_IN分组上传}交换机查表不命中或是接收到链路探测报文,
则将该数据封装在OpenFlow的PACKET\_IN消息中上传给控制器
\item \textbf{PACKET\_OUT分组下发}通过PACKET\_IN上传的分组
经过控制器分析处理后会将其封装在OpenFlow协议的PACKET\_OUT消息中
并携带输出端口信息下发到交换机。交换机接收到该消息数据后,
根据输出信息指示,将该分组从指定端口输出。
通过PACKET\_OUT发送的分组数据还包括链路探测协议报文
通过PACKET\_OUT发送的分组数据还包括链路探测协议报文
\item \textbf{FLOW\_MOD消息处理}
控制器通过下发FLOW\_MOD消息给交换机的流表设置转发表项内容
FLOW\_MOD消息中包括分组特征元组信息和动作执行列表。
特征元组通常包括常用的MAC信息、帧类型和五元组信息等
动作通常包括输出端口或丢弃信息等
动作通常包括输出端口或丢弃信息等
\end{enumerate}
\subsection{实验条件}
\label{subsec:c:sdn-ob:s:sdn_requirement}
\begin{itemize}
\item 可编程网络平台一个,交换测试主机两台,
SDN控制器安装SDN控制器软件Floodlight一台。
网络配置及连接拓扑如图\ref{fig:c:sdn-ob_sdn-topo}所示;
\item 可编程网络平台一个,测试主机两台,
SDN控制器安装SDN控制器软件Floodlight一台。控制器主机没有两个网口时,中间加一个普通交换机;
\item 测试主机与控制器主机的网络配置及连接拓扑如图\ref{fig:c:sdn-ob_sdn-topo}所示;
\item 串口线一根,网线三根;
\item SDN交换机框架开发源代码、流表配置Python脚本。
\end{itemize}
@ -105,7 +95,7 @@ SDN将传统的紧耦合网络设备被拆分成了应用、控制、转发三
\subsubsection{编译运行SDN交换机验证交换机基本功能}
请参考附\ref{app:openbox}:《可编程网络平台-操作手册》完成。
请参考附\ref{app:openbox}《FAST平台介绍与操作说明手册》完成。
\subsubsection{基于SDN交换机源码选择实现自己的协议功能}
@ -116,7 +106,6 @@ SDN将传统的紧耦合网络设备被拆分成了应用、控制、转发三
{
int oftype = ofpbuf->header.type;
SHOW_FUN(0);
LOG_DBG("ofpbuf->header.type=%d\n",ofpbuf->header.type);
switch(oftype)
{
@ -134,8 +123,7 @@ SDN将传统的紧耦合网络设备被拆分成了应用、控制、转发三
return CONTINUE;
}
\end{code}
用户可以根据自己能力选择实现OpenFlow协议的部分消息功能
一旦处理了该消息一定要返回HANDLE否则直接break即可。
用户可以根据自己的需求选择实现OpenFlow协议的部分消息功能一旦处理了该消息一定要返回消息处理标识HANDLE否则直接break即可。
\item 编译源代码
\begin{code}[console]
root@HNXS-FAST:/home/hnxs/sdn# make
@ -148,9 +136,11 @@ SDN将传统的紧耦合网络设备被拆分成了应用、控制、转发三
\subsubsection{运行修改后的交换机再次验证SDN交换机的功能}
\begin{enumerate}
\item 运行SDN交换机交换机正常工作后输出如下
\item 运行SDN交换机交换机正常工作后输出如下
\begin{code}[console]
root@HNXS-FAST:/home/hnxs/sdn# ./ user_openflow -4 192.168.1.3 -i obx0,obx1,obx2,obx3
\end{code}
\begin{code}[text]
fastU->REG Version:20180827,OpenBox HW Version:2030200722
port_name:eth0,port:0
port_name:obx0,port:0
@ -172,38 +162,42 @@ SDN将传统的紧耦合网络设备被拆分成了应用、控制、转发三
obx3 ADD!
\end{code}
\item 查看控制器界面基本信息,
在浏览器打开控制器WEB网站\url{http://192.168.1.3/ui/index.html}
控制界面如图\ref{fig:c:sdn-ob_sdn-switch}所示:
\begin{figure}[!htp]
\item 查看控制器界面基本信息在浏览器打开控制器WEB网站http://192.168.1.3/ui/index.html控制界面如图\ref{fig:c:sdn-ob_sdn-main}所示:
\begin{figure}[H]
\centering
\includegraphics[width=14cm]{sdn-switch}
\includegraphics[width=12cm]{sdn-main}
\caption{SDN主界面信息}
\label{fig:c:sdn-ob_sdn-main}
\end{figure}
\item 查看连接交换机信息,如图\ref{fig:c:sdn-ob_sdn-switch}所示:
\begin{figure}[H]
\centering
\includegraphics[width=12cm]{sdn-switch}
\caption{SDN交换机信息}
\label{fig:c:sdn-ob_sdn-switch}
\end{figure}
\item 查看连接测试主机信息,
SDN主机及连接信息如图\ref{fig:c:sdn-ob_sdn-host}所示:
\begin{figure}[!htp]
\item 查看连接测试主机信息SDN主机及连接信息如图\ref{fig:c:sdn-ob_sdn-host}所示:
\begin{figure}[H]
\centering
\includegraphics[width=14cm]{sdn-host}
\includegraphics[width=12cm]{sdn-host}
\caption{SDN主机信息}
\label{fig:c:sdn-ob_sdn-host}
\end{figure}
\item 查看端口状态与计数信息与流表信息,
端口状态与流表计数信息如图\ref{fig:c:sdn-ob_port-flowtable}所示:
\begin{figure}[!htp]
\item 查看端口状态与计数信息与流表信息,端口与流表信息如图\ref{fig:c:sdn-ob_port-flowtable}所示:
\begin{figure}[H]
\centering
\includegraphics[width=14cm]{port-flowtable}
\includegraphics[width=12cm]{port-flowtable}
\caption{端口状态与流表计数信息}
\label{fig:c:sdn-ob_port-flowtable}
\end{figure}
\item 查看网络拓扑信息,如图\ref{fig:c:sdn-ob_sdn-test-topo}所示:
\begin{figure}[!htp]
\item 查看网络拓扑信息,网络拓扑信息如图\ref{fig:c:sdn-ob_sdn-test-topo}所示:
\begin{figure}[H]
\centering
\includegraphics[width=14cm]{sdn-test-topo}
\includegraphics[width=12cm]{sdn-test-topo}
\caption{SDN网络拓扑信息}
\label{fig:c:sdn-ob_sdn-test-topo}
\end{figure}
@ -211,34 +205,32 @@ SDN将传统的紧耦合网络设备被拆分成了应用、控制、转发三
\subsubsection{在测试主机ping的前后分别观察流表变化}
\begin{enumerate}
\item ping之前的流表信息使用REST API方式获取其json数据
如图\ref{fig:c:sdn-ob_empty-flowtable}所示:
\begin{figure}[!htp]
\item ping之前的流表信息为空如图\ref{fig:c:sdn-ob_empty-flowtable}所示:
\begin{figure}[H]
\centering
\includegraphics[width=14cm]{empty-flowtable}
\includegraphics[width=12cm]{empty-flowtable}
\caption{空流表信息}
\label{fig:c:sdn-ob_empty-flowtable}
\end{figure}
\item ping之后的流表信息如图\ref{fig:c:sdn-ob_flowtable-ping}所示:
\begin{figure}[!htp]
\begin{figure}[H]
\centering
\includegraphics[width=14cm]{flowtable-ping}
\includegraphics[width=12cm]{flowtable-ping}
\caption{ping通后流表信息}
\label{fig:c:sdn-ob_flowtable-ping}
\end{figure}
Ping通之后在SDN交换机的流表里多了4条转发流表
分别是两个方向的ARP应答报文转发表和两个方向的IP报文转发表
具体内容在后面的REST~API数据中查验
由此可以说明控制器向SDN交换机注入了四条转发流表才让两边的主机ping通了。
ping通之后在SDN交换机的流表里多了4条转发流表分别是两个方向的ARP应答报文转发表和两个方向的IP报文转发表具体内容在后面的REST API数据中查验。由此可以说明控制器向SDN交换机注入了四条转发流表允许两边的主机相互ping通。
\end{enumerate}
\subsubsection{使用REST API接口查询交换机的相关功能数据}
\begin{enumerate}
\item 查询交换机基本信息
使用curl命令和对应的REST API地址查询交换机的对应信息。在命令行终端输入如下命令即可查询返回交换机的基本信息数据内容。
\begin{code}[console]
# curl http://192.168.1.3:8080/wm/core/switch/\
00:00:00:0a:00:00:08:01/desc/json
# curl http://192.168.1.3:8080/wm/core/switch/all/desc/json
\end{code}
\begin{code}[json]
{
@ -254,8 +246,7 @@ SDN将传统的紧耦合网络设备被拆分成了应用、控制、转发三
\end{code}
\item 查询端口计数信息
\begin{code}[console]
# curl http://192.168.1.3:8080/wm/core/switch/\
00:00:00:0a:00:00:08:01/port/json
# curl http://192.168.1.3:8080/wm/core/switch/all/port/json
\end{code}
\begin{code}[json]
{
@ -277,105 +268,21 @@ SDN将传统的紧耦合网络设备被拆分成了应用、控制、转发三
"collisions": "0",
"duration_sec": "4294966827",
"duration_nsec": "573987"
}, {
"port_number": "1",
"receive_packets": "86",
"transmit_packets": "205",
"receive_bytes": "11427",
"transmit_bytes": "22632",
"receive_dropped": "0",
"transmit_dropped": "0",
"receive_errors": "0",
"transmit_errors": "0",
"receive_frame_errors": "0",
"receive_overrun_errors": "0",
"receive_CRC_errors": "0",
"collisions": "0",
"duration_sec": "4294966827",
"duration_nsec": "573991"
}, {
"port_number": "2",
"receive_packets": "0",
"transmit_packets": "0",
"receive_bytes": "0",
"transmit_bytes": "0",
"receive_dropped": "0",
"transmit_dropped": "0",
"receive_errors": "0",
"transmit_errors": "0",
"receive_frame_errors": "0",
"receive_overrun_errors": "0",
"receive_CRC_errors": "0",
"collisions": "0",
"duration_sec": "4294966827",
"duration_nsec": "573992"
}, {
"port_number": "3",
"receive_packets": "616",
"transmit_packets": "220",
"receive_bytes": "56948",
"transmit_bytes": "24659",
"receive_dropped": "0",
"transmit_dropped": "0",
"receive_errors": "0",
"transmit_errors": "0",
"receive_frame_errors": "0",
"receive_overrun_errors": "0",
"receive_CRC_errors": "0",
"collisions": "0",
"duration_sec": "4294966827",
"duration_nsec": "573994"
}, {
"port_number": "4",
"receive_packets": "0",
"transmit_packets": "0",
"receive_bytes": "0",
"transmit_bytes": "0",
"receive_dropped": "0",
"transmit_dropped": "0",
"receive_errors": "0",
"transmit_errors": "0",
"receive_frame_errors": "0",
"receive_overrun_errors": "0",
"receive_CRC_errors": "0",
"collisions": "0",
"duration_sec": "4294966827",
"duration_nsec": "573995"
}]
},
]
}]
}
}
\end{code}
端口计数统计信息返回的内容中只摘取显示了一个端口的数据显示,其他端口数据内容已经省略。
\item 查询交换机流表信息
\begin{code}[console]
# curl http://192.168.1.3:8080/wm/core/switch/\
00:00:00:0a:00:00:08:01/flow/json
# curl http://192.168.1.3:8080/wm/core/switch/all/flow/json
\end{code}
\begin{code}[json]
{
"flows": [{
"version": "OF_13",
"cookie": "9007199254740992",
"table_id": "0x0",
"packet_count": "5",
"byte_count": "571392",
"duration_sec": "0",
"duration_nsec": "0",
"priority": "1",
"idle_timeout_s": "5",
"hard_timeout_s": "0",
"flags": [],
"match": {
"in_port": "1",
"eth_dst": "b8:27:eb:c1:d1:39",
"eth_src": "b8:27:eb:d8:83:20",
"eth_type": "0x806"
},
"instructions": {
"instruction_apply_actions": {
"actions": "output=3"
}
}
}, {
"version": "OF_13",
"cookie": "9007199271518208",
"table_id": "0x0",
@ -400,103 +307,21 @@ SDN将传统的紧耦合网络设备被拆分成了应用、控制、转发三
"actions": "output=1"
}
}
}, {
"version": "OF_13",
"cookie": "9007199288295424",
"table_id": "0x0",
"packet_count": "161",
"byte_count": "571408",
"duration_sec": "0",
"duration_nsec": "0",
"priority": "1",
"idle_timeout_s": "5",
"hard_timeout_s": "0",
"flags": [],
"match": {
"in_port": "1",
"eth_dst": "b8:27:eb:c1:d1:39",
"eth_src": "b8:27:eb:d8:83:20",
"eth_type": "0x800",
"ipv4_src": "192.168.2.111",
"ipv4_dst": "192.168.2.119"
},
"instructions": {
"instruction_apply_actions": {
"actions": "output=3"
}
}
}, {
"version": "OF_13",
"cookie": "9007199305072640",
"table_id": "0x0",
"packet_count": "2",
"byte_count": "571416",
"duration_sec": "0",
"duration_nsec": "0",
"priority": "1",
"idle_timeout_s": "5",
"hard_timeout_s": "0",
"flags": [],
"match": {
"in_port": "3",
"eth_dst": "b8:27:eb:d8:83:20",
"eth_src": "b8:27:eb:c1:d1:39",
"eth_type": "0x806"
},
"instructions": {
"instruction_apply_actions": {
"actions": "output=1"
}
}
}]
},
]
}
\end{code}
交换机流表信息返回的内容中只摘取显示了一条流表的数据显示,其他流表数据内容已经省略。
\end{enumerate}
\subsubsection*{修改Python脚本手动配置流表观察测试主机的通信变化}
\subsubsection{修改Python脚本手动配置流表观察测试主机的通信变化}
\begin{enumerate}
\item 修改流表脚本,使其转发端口错误
\begin{code}[console]
#vim openflow_flow-test.py
\end{code}
\begin{code}[python]
import httplib
import json
class StaticFlowPusher(object):
def __init__(self, server):
self.server = server
def get(self, data):
ret = self.rest_call({}, 'GET')
return json.loads(ret[2])
def set(self, data):
ret = self.rest_call(data, 'POST')
return ret[0] == 200
def remove(self, objtype, data):
ret = self.rest_call(data, 'DELETE')
return ret[0] == 200
def rest_call(self, data, action):
path = '/wm/staticflowpusher/json'
headers = {
'Content-type': 'application/json',
'Accept': 'application/json',
}
body = json.dumps(data)
conn = httplib.HTTPConnection(self.server, 8080)
conn.request(action, path, body, headers)
response = conn.getresponse()
ret = (response.status, response.reason, response.read())
print ret
conn.close()
return ret
pusher = StaticFlowPusher('192.168.1.3')
\item 修改流表脚本,使其转发端口错误;
修改openflow\_flow-test.py主要修改其流表定义内容其他位置代码无需修改。流表定义内容如下
\begin{code}[python]
flowbe0 = {
'switch':"00:00:00:0a:00:00:08:01",
"table":"0",
@ -507,17 +332,14 @@ SDN将传统的紧耦合网络设备被拆分成了应用、控制、转发三
"eth_dst":" b8:27:eb:c1:d1:39", #dmac
"eth_src":" b8:27:eb:d8:83:20", #smac
"eth_type":"0x800", #type
#"ip_proto":"0x11", #proto
"in_port":"1", #inport
"ipv4_src":"192.168.2.111", #sip
"ipv4_dst":"192.168.2.119", #dip
#"tp_src":"50001", #sport
#"tp_dst":"50001", #dport
"actions":"output=2" #正确值应该为3
"actions":"output=2" #执行动作输出端口为2
}
flowbe1 = {
'switch':"00:00:00:0a:00:00:08:01",
"table":"1",
"table":"0",
"name":"flow-1",
"cookie":"61",
"priority":"1",
@ -525,32 +347,24 @@ SDN将传统的紧耦合网络设备被拆分成了应用、控制、转发三
"eth_dst":"b8:27:eb:d8:83:20", #dmac
"eth_src":"b8:27:eb:c1:d1:39", #smac
"eth_type":"0x800", #type
#"ip_proto":"0x11", #proto
"in_port":"3", #inport
"ipv4_src":"192.168.2.119", #sip
"ipv4_dst":"192.168.2.111", #dip
#"tp_src":"50001", #sport
#"tp_dst":"50001", #dport
"actions":"output=2" #正确值应该为1
}
pusher.set(flowbe0)
pusher.set(flowbe1)
"actions":"output=2" #执行动作输出端口为2
}
\end{code}
脚本执行命令如下:
\item 重启SDN控制器并停止测试主机的ping操作
\item 配置用户流表,脚本执行命令如下:
\begin{code}[console]
# python openflow_flow-test.py
(200, 'OK', '{"status" : "Entry pushed"}')
(200, 'OK', '{"status" : "Entry pushed"}')
\end{code}
脚本执行成功两条流表添加成功在测试主机两边进行ping测试
是否发现已经ping不通了
\item 修改流表脚本,使其转发端口正确,再次验证;
脚本执行成功两条流表添加成功在测试主机两边进行ping测试观察是否能够ping通
\item 修改流表脚本,使其转发端口正确,再次验证。
\begin{enumerate}
\item 两种动作分别修改为1进3出和3进1出。
添加流表后再重新ping测试是否发现又可以ping通了
\item 两种动作分别修改为1进3出和3进1出。添加流表后再重新ping测试观察是否能够ping通
\item 由此说明对于SDN交换机
可以通过用户修改流表的方式来定义某一条具体流的转发行为。
\end{enumerate}
@ -569,24 +383,20 @@ SDN将传统的紧耦合网络设备被拆分成了应用、控制、转发三
\label{subsec:c:sdn-ob:s:sdn_notice}
\begin{enumerate}
\item SDN控制器为JAVA实现有时候WEB存在缓存
导致数据显示不及时,在流表更新显示(两次实验对比)时,
先清空历史缓存数据后再显示。
\item Python脚本为一个http协议的客户端脚本程序
通过http协议及REST API的路径请求或设置SDN控制器WEB的对应功能模块
获取或设置该模块的返回数据或输入参数传输数据类型为json格式。
\item SDN控制器为JAVA实现有时候WEB存在缓存导致数据显示不及时在流表更新显示两次实验对比先清空历史缓存数据后再显示
\item Python脚本实现了一个http协议的客户端脚本程序通过http协议及REST API的路径请求或设置SDN控制器WEB的对应功能模块获取或设置该模块的返回数据或输入参数传输数据类型为json格式。
\end{enumerate}
\subsection{考核方法}
\label{subsec:c:sdn-ob:s:sdn_criterion}
完成本次实验,需要提交一份实验报告和一分程序输出日志。
完成本次实验,需要提交一份实验报告、一份程序源代码和一份程序输出日志。
\begin{enumerate}
\item 20分在规定时间内完成实验并提交实验成果
\item 40分根据实现OpenFlow消息类型的多少计分简单类型5分复杂类型10分
\item 20分通过脚本设置可以实现两个测试主机ping能和不能ping通
\item 40分根据实现OpenFlow消息类型的多少计分简单类型5分复杂类型10分
\item 10分通过脚本设置可以实现两个测试主机ping通和不能ping通
\item 20分通过网上搜索学习
使用其他多个REST~API查询到了交换机更多的数据内容
\item 10分实验报告与源代码内容完整、格式整洁
使用其他多个REST API查询到了交换机更多的数据内容
\item 10分实验报告与源代码内容完整、格式规范
\end{enumerate}

@ -17,16 +17,9 @@
掌握网络拓扑的构建方法。主要完成以下内容:
\begin{enumerate}
\item \textbf{打印连接主机信息:}基于SDN交换机源码
在端口分组接收回调函数中添加相关逻辑,
解析输入分组数据提取设备MAC与IP信息打印显示其内容
\item \textbf{打印接收LLDP消息}基于SDN交换机源码
在端口分组接收回调函数中添加相关逻辑,
解析输入分组数据打印LLDP分组的相关协议字段
\item \textbf{打印发送LLDP消息}基于SDN交换机源码
在OpenFlow协议回调函数中添加相关逻辑
提取SDN控制器下发的PACKET\_OUT消息且消息封装的分组协议为LLDP格式
打印输出LLDP分组中的相关协议字段
\item \textbf{打印连接主机信息:}基于SDN交换机源码在端口分组接收回调函数中添加相关逻辑解析输入分组数据提取设备MAC与IP信息打印显示其内容
\item \textbf{打印接收LLDP消息}基于SDN交换机源码在端口分组接收回调函数中添加相关逻辑解析输入分组数据打印LLDP分组的相关协议字段
\item \textbf{打印发送LLDP消息}基于SDN交换机源码在OpenFlow协议回调函数中添加相关逻辑提取SDN控制器下发的PACKET\_OUT消息且消息封装的分组协议为LLDP格式打印输出LLDP分组中的相关协议字段
\item \textbf{提取控制器链路与设备信息:}
使用REST~API接口获取SDN控制器的网络链路信息和设备连接信息
\item \textbf{构建拓扑图:}以WEB形式展示网络拓扑结构图
@ -39,16 +32,9 @@
\subsubsection{LLDP工作原理}
LLDP是一个用于信息通告和获取的协议但是需要注意的一点是
LLDP发送的信息通告不需要确认不能发送一个请求来请求获取某些信息
也就是说LLDP是一个单向的协议只有主动通告一种工作方式
无需确认,不能查询、请求。
LLDP是一个用于信息通告和获取的协议发送的信息通告不需要确认不能发送一个请求来请求获取某些信息也就是说LLDP是一个单向的协议只有主动通告一种工作方式无需确认不能查询、请求。LLDP帧的发送有两种触发方式一是定时器到期触发二是设备状态发生了变化触发。
LLDP协议主要完成的功能有初始化并维护本地MIB 库中的信息;
从本地MIB 库中提取信息并将信息封装到LLDP帧中。
LLDP帧的发送有两种触发方式一是定时器到期触发一是设备状态发生了变化触发
识别并处理接收到的LLDPDU帧维护远端设备LLDP MIB 信息库;
当本地或远端设备MIB信息库中有信息发生变化时发出通告事件。
LLDP协议主要完成的功能包括初始化并维护本地MIB 库中的信息从本地MIB库中提取信息并将信息封装到LLDP帧中识别并处理接收到的LLDPDU帧维护远端设备LLDP MIB 信息库当本地或远端设备MIB信息库中有信息发生变化时发出通告事件。
网络拓扑的测量是通过一些链路探测协议在各交换节点中相互收发来完成的链路的拓扑测量功能。
SDN交换机使用LLDP链路探测协议主要是通过PACKET\_OUT消息发送LLDP分组
@ -79,14 +65,13 @@ SDN交换机使用LLDP链路探测协议主要是通过PACKET\_OUT消息发送LL
\label{subsec:c:sdn-ob:s:topo_requirement}
\begin{itemize}
\item 网络创新实验平台两个,交换测试主机两台SDN控制器一台。
\item 可编程网络平台两个测试主机两台SDN控制器一台。
连接拓扑如图\ref{fig:c:sdn-ob_openflow-topo}所示;
\item 串口线一根,网线五根;
\item 网络创新实验平台使用手册、开发环境;
\item OpenFlow拓扑实验环境配置手册
\item 串口线两根,网线五根;
\item SDN交换机框架源码。
\end{itemize}
\begin{figure}[!ht]
\begin{figure}[H]
\centering
\includegraphics[width=10cm]{openflow-topo}
\caption{OpenFlow拓扑测量实验拓扑图}
@ -97,9 +82,9 @@ SDN交换机使用LLDP链路探测协议主要是通过PACKET\_OUT消息发送LL
\label{subsec:c:sdn-ob:s:topo_procedure}
\begin{enumerate}
\item 运行SDN交换机
\item 运行SDN交换机
请参考附件《可编程网络平台-操作手册》完成。
请参考附\ref{app:openbox}《FAST平台介绍与操作说明手册》完成。
\item 基于SDN交换机开源代码在端口分组接收回调函数中添加相应逻辑
\begin{code}[c]
int port_recv_callback(int inport,struct fast_packet *pkt,int pkt_len)
@ -113,16 +98,16 @@ SDN交换机使用LLDP链路探测协议主要是通过PACKET\_OUT消息发送LL
\item 解析接收数据,判断以太网帧类型,
如果帧类型为0x88CC则说明是LLDP协议分组根据LLDP协议打印相关协议字段内容
\item 解析分组提取输入帧类型为0x0800的分组
打印输出其源MAC地址与源IP地址仅输出IP地址为单播类型的条目
打印输出其源MAC地址与源IP地址仅输出IP地址为单播类型的条目
\end{enumerate}
\item 编译SDN交换机验证添加逻辑功能观察是否正确打印需要的消息内容
\item 分析端口接收回调函数中打印的消息内容;
\begin{enumerate}
\item 从LLDP分组中可解析得知对端交换机的某个端口发送到本交换机的某个端口
\item 从LLDP分组中可解析得知对端交换机的某个端口发送到本交换机的某个端口
\item 从普通IPv4报文中可以获得连接到该交换机上的主机节点信息
MAC地址和IPv4地址
MAC地址和IPv4地址
\end{enumerate}
\item 验证并观察SDN控制器自带的拓扑展示界面
\item 验证并观察SDN控制器自带的拓扑展示界面
\begin{enumerate}
\item 在控制器主机打开WEB界面输入地址
\texttt{127.0.0.1/ui/index.html}。查看浏览器界面数据;
@ -133,8 +118,8 @@ SDN交换机使用LLDP链路探测协议主要是通过PACKET\_OUT消息发送LL
\item 再连接上另一台主机,刷新拓扑界面,
查看到界面又新增了一台主机并显示其IP地址信息
\item 断开两台交换机之间的网线,新拓扑界面,
查看两个交换机之间的连线消失
\item 断开一台测试主机,新拓扑界面,查看其对应的主机从界面消失
查看两个交换机之间的连线消失;
\item 断开一台测试主机,新拓扑界面,查看其对应的主机从界面消失
\end{enumerate}
\item 使用控制器的北向REST API接口查询网络的所有链路连接关系数据
API接口为\texttt{/wm/topology/links/json}
@ -148,7 +133,7 @@ SDN交换机使用LLDP链路探测协议主要是通过PACKET\_OUT消息发送LL
\label{subsec:c:sdn-ob:s:topo_rethink}
\begin{enumerate}
\item 网络拓扑中的设备节点信息学习,使用广播报文中的信息会带来哪些影响
\item 在网络拓扑的探测学习中,主机节点信息通过哪种协议分组学习效果最好
\item OpenFlow交换机之间用一台普通交换机连接能学习到全网的拓扑结构信息吗
分析原因。
\end{enumerate}
@ -156,18 +141,18 @@ SDN交换机使用LLDP链路探测协议主要是通过PACKET\_OUT消息发送LL
\subsection{注意事项及有关说明}
\label{subsec:c:sdn-ob:s:topo_notice}
\begin{enumerate}
\item JAVA的WEB程序显示的缓存每新刷新操作前请清理浏览器历史缓存数据
\item SDN控制器的WEB界面有缓存每次物理拓扑更新后要先清理浏览器历史缓存数据再刷新WEB界面
\end{enumerate}
\subsection{考核方法}
\label{subsec:c:sdn-ob:s:topo_criterion}
完成本次实验,需要提交一份实验报告和一分程序输出日志。
完成本次实验,需要提交一份实验报告、一份程序源代码和一份程序输出日志。
\begin{enumerate}
\item 20分在规定时间内完成实验并提交实验成果
\item 20分正确打印输入与输出LLDP消息内容和连接主机信息
\item 20分正确打印输入与输出LLDP消息内容和连接主机信息
\item 20分通过REST API编程获取链路状态信息与设备信息并能生成拓扑关系图
\item 20分以图形界面形式展示拓扑图
\item 10分动态修改物理拓扑后程序可以及时刷新出正确拓扑图状态
\item 10分实验报告与源代码内容完整、格式整洁
\item 10分实验报告与源代码内容完整、格式规范
\end{enumerate}

@ -55,7 +55,7 @@ Wireshark可以在Windows、Linux和macOS操作系统中运行
它由IEEE分配
而后3个字节的16进制数AE-3C-40代表该制造商所生产的某个网络产品(如网卡)的系列号。
\renewcommand{\arraystretch}{1.5}
% \renewcommand{\arraystretch}{1.5}
\begin{table}[!ht]
\small
\centering

@ -118,7 +118,7 @@ ICMP询问报文有回送请求和应答、时间戳请求和应答、
\label{c:wireshark_icmp-structure}
\end{figure}
\renewcommand{\arraystretch}{1.5}
% \renewcommand{\arraystretch}{1.5}
\begin{table}[!ht]
\small
\centering

@ -50,6 +50,7 @@ TCP协议基于“尽力而为”的网络层为应用层提供可靠的进程
TCP 报文段结构如图\ref{fig:c:wireshark_TCP-structure}所示,
采用20字节的报文段头并有最长40字节的可选项。
\small
\begin{figure}[!ht]
\centering
\includegraphics[width=10cm]{TCP-structure}
@ -219,7 +220,7 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion-
\label{fig:c:wireshark_VM-advance-setup}
\end{figure}
\renewcommand{\arraystretch}{1.5}
% \renewcommand{\arraystretch}{1.5}
\begin{table}[!ht]
\small
\centering

@ -0,0 +1,20 @@
%=========================================================================
% 版本声明
\clearpage
\begin{center}
\Large{Version 1.0$\alpha$} \\ \vspace{2em}
\Large{发布日期: \today}%{\number\year\number\month\number\day}}
% \\ \vspace{1em}
\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*}

@ -1,48 +1,11 @@
%# -*- 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);
\path[clip,postaction={fill=c2}]
([xshift=2cm,yshift=2cm]current page.center) rectangle ++ (4.2,7.7);
\end{scope}
\fill[c1] ([xshift=2cm,yshift=2cm]current page.center) rectangle ++ (-13.7,7.7);

@ -30,7 +30,7 @@
\begin{itemize}
\item 第一单元:谢怡、陈建发、洪劼超、雷蕴奇,厦门大学
\item 第二单元:吴荻、周丽涛,国防科技大学
\item 第二单元:吴荻、夏竟,国防科技大学
\item 第三单元:张晓丽,昆明理工大学
\item 第四单元:胡罡、孙志刚,国防科技大学
\item 第五单元:夏竟、蔡志平、徐明,国防科技大学

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Before

Width:  |  Height:  |  Size: 255 KiB

After

Width:  |  Height:  |  Size: 255 KiB

Before

Width:  |  Height:  |  Size: 226 KiB

After

Width:  |  Height:  |  Size: 226 KiB

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Before

Width:  |  Height:  |  Size: 241 KiB

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 735 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

@ -0,0 +1,83 @@
%# -*- coding: utf-8-unix -*-
\documentclass[zihao=-4]{ctexbook}
\input{config/main}
\begin{document}
\pagestyle{empty} % 前导页无页眉页脚
%============================================================
% 封面
\input{data/cover}
%============================================================
% 版权页
\input{data/copyright}
\frontmatter % 从前言开始用罗马数字作为页码
%============================================================
% 前言
\input{data/preface}
%============================================================
% 目录
\cleardoublepage
\tableofcontents
\mainmatter % 从正文开始用阿拉伯数字作为页码
\pagestyle{fancy} % 正文有页眉页脚
\setcounter{page}{1} % 正文页码从1开始
%============================================================
% 正文内容
% “网络抓包与协议分析”
\graphicspath{{figure/chapters/wireshark/}}
\input{data/ch_wireshark/preface}
\input{data/ch_wireshark/sec_arp}
\input{data/ch_wireshark/sec_ip}
\input{data/ch_wireshark/sec_tcp}
% “基于套接字的网络程序设计”
\graphicspath{{figure/chapters/socket/}}
\input{data/ch_socket/preface}
\input{data/ch_socket/sec_udp}
\input{data/ch_socket/sec_web}
\input{data/ch_socket/sec_smtp}
% “组网基础”
\graphicspath{{figure/chapters/ensp/}}
\input{data/ch_ensp/preface}
\input{data/ch_ensp/sec_static}
\input{data/ch_ensp/sec_rip}
\input{data/ch_ensp/sec_ospf}
% “路由器实现”
\graphicspath{{figure/chapters/router-openbox/}}
\input{data/ch_router-openbox/preface}
\input{data/ch_router-openbox/sec_switch}
\input{data/ch_router-openbox/sec_router}
\input{data/ch_router-openbox/sec_networking}
% “软件定义网络与网络测量”
\graphicspath{{figure/chapters/sdn-openbox/}}
\input{data/ch_sdn-openbox/preface}
\input{data/ch_sdn-openbox/sec_sdn}
\input{data/ch_sdn-openbox/sec_topo}
\input{data/ch_sdn-openbox/sec_ns}
%============================================================
% 附录
\appendix
% 速查手册
\graphicspath{{figure/appendixes/cheat_sheet/}}
\input{data/appendix/cheat_sheet}
% 华为网络仿真平台eNSP简介
\graphicspath{{figure/appendixes/ensp/}}
\input{data/appendix/ensp}
% FAST平台介绍与操作说明手册
\graphicspath{{figure/appendixes/fast/}}
\input{data/appendix/fast}
\end{document}
Loading…
Cancel
Save