diff --git a/Readme.md b/Readme.md index 0a65d4e..6547d85 100644 --- a/Readme.md +++ b/Readme.md @@ -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书籍模板”的早期版本。 diff --git a/bib/main.bib b/bib/main.bib deleted file mode 100644 index 11f6c7a..0000000 --- a/bib/main.bib +++ /dev/null @@ -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} -} - - diff --git a/book/instructions.cfg b/book/instructions.cfg deleted file mode 100644 index 27a6315..0000000 --- a/book/instructions.cfg +++ /dev/null @@ -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 \ No newline at end of file diff --git a/book/instructions.cls b/book/instructions.cls deleted file mode 100644 index b186e68..0000000 --- a/book/instructions.cls +++ /dev/null @@ -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}} - } -} -%====================================================================== -% 设置item条目的索引符号为bullet -\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={ %自动移除前置空白、制表为4字符、mathhe和||内的不处理 - breaksymbol=, - autogobble, - tabsize=4, - startinline, - breaklines, - mathescape - } -} -%====================================================================== -\renewcommand{\baselinestretch}{1.5} -\endinput \ No newline at end of file diff --git a/book/instructions.tex b/book/instructions.tex deleted file mode 100644 index bcd3883..0000000 --- a/book/instructions.tex +++ /dev/null @@ -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} \ No newline at end of file diff --git a/compile.bat b/compile.bat index 6759aad..0e53ac7 100644 --- a/compile.bat +++ b/compile.bat @@ -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 diff --git a/config/main.tex b/config/main.tex new file mode 100644 index 0000000..8dfa539 --- /dev/null +++ b/config/main.tex @@ -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}} +} \ No newline at end of file diff --git a/data/appendix/cheat_sheet.tex b/data/appendix/cheat_sheet.tex index a85b30e..f31b9c8 100644 --- a/data/appendix/cheat_sheet.tex +++ b/data/appendix/cheat_sheet.tex @@ -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} diff --git a/data/appendix/ensp.tex b/data/appendix/ensp.tex index 1e67cba..907c96c 100644 --- a/data/appendix/ensp.tex +++ b/data/appendix/ensp.tex @@ -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 diff --git a/data/appendix/fast.tex b/data/appendix/fast.tex index f116ec9..ea6bb2f 100644 --- a/data/appendix/fast.tex +++ b/data/appendix/fast.tex @@ -1,836 +1,268 @@ %# -*- coding: utf-8-unix -*- -\chapter{FAST软件编程入门指南} -\label{app:fast} - -\subsection{前言} - -本文档的主要阅读对象是首次使用FAST平台进行软件开发的工作人员。 -文档主要描述了FAST架构软件的主要功能、如何获取软件代码、 -介绍软件架构与对应代码结构、编译运行FAST代码。 -详细介绍了FAST开发的主要使用函数, -描述了用户如何使用开发函数进行自己代码的开发流程, -最后提供一个完整的开发示例说明,供初学者学习使用。 - -\subsection{FAST能做什么} - -FAST平台的主要功能是软硬件配合的网络分组处理功能, -硬件的主要作用是解析报文,对报文进行查表匹配, -进行指定的动作处理,然后分发报文。 -报文分发可以直接转发到硬件端口,也可以送到CPU端的UA进程再处理, -UA处理完成后可以再通过硬件转发从端口输出。 -软件的主要功能有两点: -一是对硬件的流表与对应动作进行配置,指定报文从硬件端口转发或送到CPU端的UA; -二是处理硬件无法处理的报文,处理完成后再转发到硬件输出。 - -FAST软件的编程主要包括UA编程、规则管理编程和寄存器访问控制编程。 -UA编程主要处理硬件送到指定软件的分组数据; -规则管理编程主要是对硬件流表的读写管理; -寄存器访问控制编程主要是对硬件各寄存器资源的访问控制。 -对硬件规则的读写与对硬件其他寄存器的读写需要了解FAST架构的虚拟地址空间定义。 - -\subsection{FAST软件获取} -\label{subsec:app:fast_get-soft} - -FAST的软硬件代码和相关工具下载请查看文章结尾的百度网盘链接。 - -\subsection{FAST代码结构} - -\subsubsection{目录结构} - -\renewcommand{\arraystretch}{1.5} -\begin{table}[!ht] - \small - \centering - \caption{FAST代码目录结构} - \label{tab:a:fast_dir-structure} - \begin{tabular}{|c|c|c|} \hline - \heiti 序号 & \heiti 目录名称 & \heiti 说明\\ \hline - 1 & include & 开发所用头文件目录\\ \hline - 2 & lib & ua、寄存器读写库目录\\ \hline - 4 & app & fast应用工具\\ \hline - 6 & tools & 调试测试示例工具\\ \hline - 7 & src & 综合示例代码测试\\ \hline - \end{tabular} -\end{table} - -\subsubsection{头文件} +\chapter{FAST平台介绍与操作说明手册} +\label{app:openbox} -\begin{enumerate} - \item Fast\_vaddr.h:FAST平台硬件资源访问对应的虚拟地址空间定义 - \item Fast\_type.h:FAST平台所用数据类型定义 - \item Fast\_err.h:FAST平台错误号定义 - \item Fast\_struct.h:FAST平台数据结构类型定义 - \item Fast.h:FAST平台所有开发函数定义,包含上述所有头文件 - \item 其他:不同平台的适配头文件 -\end{enumerate} - -\subsubsection{开发示例} +\subsection{FAST简介} -开发示例提供了一个基于FAST架构的2层交换机实例, -综合使用了libreg和libua两个库实现了一个全软件的2层交换机功能。 +针对近年来关于工业控制网络创新技术、创新网络结构、时间敏感网络、SDN网络、FPGA硬件加速技术及下一代网络技术的研究需求,由国防科大与湖南新实共同发起的开源项目——FAST(FPGA Accelerated Switcing plaTform)于2016年创建。截止到目前,该开源项目已经服务全国多所高校和科研院所的网络教学实验建设和科研项目。 +FAST开源项目的诞生与发展深受斯坦福大学Nick Mckeown教授在NetFPGA项目、OpenFlow项目和P4等项目的影响,其目标是为计算机网络的科研与教学提供一个开源和开放的软硬件全功能可编程交换平台。其主要特点如下: \begin{enumerate} - \item L2switch - - L2switch是基于FAST架构开发一个2层以太网交换机原型, - 通过对流表默认规则的设置,将硬件所有的分组重定向到UA程序, - 然后在UA的分组处理回调函数中实现对分组的2层交换, - 然后将分组从指定端口发送或泛洪发送。 - 该示例主要演示了UA编程开发的主要方法与流程、使用的相关函数, - 硬件寄存器地址的操作,以及2层交换机的实现原理。 - -\item xofp - - xofp是基于FAST架构开发一个SDN交换机原型, - 通过OpenFlow协议连接SDN控制器,SDN交换机默认规则是送往SDN控制器, - SDN控制器根据报文数据,配置流表转发下发给硬件,下次进来的报文直接转发输出。 - 该示例主要演示了SDN交换机OpenFLow协议、处理OpenFLow消息、 - 使用的相关函数,硬件寄存器地址的操作,以及SDN交换机的实现原理。 -\end{enumerate} +\item \textbf{FPGA:}FAST实现的核心载体是可编程FPGA,是用Verilog语言编程实现的硬件功能。FPGA的现场可编程特性为实现用户创新的网络架构、算法、实现机制提供了极大的灵活性,而且可以获得较高的性能,支持在实际网络中部署运行; -\subsubsection{工具} +\item \textbf{Accelerated:}PGA实现的不是网络处理的全部功能,而是部分需要硬件加速的分组处理功能。FAST的核心是一套软硬件协同的分组处理模型,用户可以通过Verilog编程实现的硬件功能的加速,也可以在现有的FAST硬件平台的CPU上编程实现特定的分组处理功能; -示例程序的另一种表现就是FAST提供的一些小工具,包括单独的寄存器读写命令、规则输出命令、端口状态显示命令和端口分组计数命令。 +\item \textbf{Switching:}AST面向的领域是网络交换领域,支持各种新型交换技术,如软件定义网络(SDN)、时间敏感网络(TSN)、网络安全一体化网络甚至是智能网卡的实现研究,而不是支持以人工智能(AI)为代表的应用加速; -\begin{enumerate} - \item Reg\_rw +\item \textbf{plaTform:}与目前其他开源项目一样,FAST提供的是一个硬件平台无关的,支持用户通过软硬件编程实现其特定分组处理功能的环境。FAST通过提供标准的规范、开源的平台软硬件实现代码和demo应用,支持用户基于平台进行创新的应用开发和设备原型的快速实现。 +\end{enumerate} - 该工具主要是使用libreg库实现一个对用户指定的寄存器进行读写访问操作,展示了用户如何调用libreg的相关库函数进行寄存器访问操作的方法。 - \item Rule\_hw +\subsection{FAST架构} +FAST平台的架构是一种通用多核CPU加FPGA形态的网络处理架构。通常对处理性能要求较高的分组处理功能由FPGA实现,对处理性能要求较低,实现复杂的功能可由CPU实现。用户既可通过扩展FPGA硬件流水线功能也可以通过CPU上编程实现对分组交换功能的扩充。该平台架构主要由硬件逻辑和软件逻辑两部分组成,实现软硬件耦合通信与支持软硬件可编程的网络创新实验系统。其中硬件包括平台相关的数据IO和FAST硬件逻辑。软件部分包括通用操作系统与FAST软件逻辑。FAST软件逻辑包括软件开发环境和UA程序。该平台,不仅支持FAST的UA编程开发,同时也支持通用Socket APP的开发与运行。 - 该工具主要是使用libreg库和librule库实现对硬件流表的获取并分组输出操作,展示了用户如何调用librule库的相关库函数进行规则操作。该工具目前只使用了硬件规则的读取操作,更多规则的功能操作可参考综合测试程序 - \item Port\_status +FAST交换平台的实现不依赖特定的CPU与FPGA型号,但为了更好地提供交换功能扩充能力,保证软硬件协同分组处理的基本性能,FAST的交换平台必须具有如下两个特点: +\begin{enumerate} + \item \textbf{所有网络接口均与FPGA相连;} + +进入交换平台的分组首先送FPGA处理,离开交换平台的分组最后由FPGA发出。这样有两个优点。一是交换平台可精确获取分组接收时间以及控制发送时间,实现类似1588透明时钟的控制,支持时间敏感交换;二是平台可以支持各种新型的分组格式,支持内容中心网络(ICN)等非IP交换。 + \item \textbf{FPGA通过高带宽总线与CPU连接。} + +与传统交换芯片通过低带宽的SPI总线、以太网或是单Lane的PCIE总线与控制CPU连接不同,FAST平台中FPGA通过高带宽的总线与CPU连接,提升软硬件协同分组处理的性能,支持通过CPU软件对数据平面处理功能进行扩展。 +\end{enumerate} - 该工具主要使用libreg库实现了对各端口的协商状态、链路状态等寄存器的访问并进行各状态值的解释。主要展示了不同端口状态的寄存器地址如何计算,各状态寄存器值返回如何解释,示例代码中包含了目前支持的所有状态寄存器及对应功能说明 - \item Port\_counts - 该工具主要使用libreg库实现了对各端口分组计数的统计显示,主要展示了不同功能计数统计的寄存器虚拟地址空间定义,各端口对应功能寄存器的计算方法。示例代码中包含了目前支持的所有功能计数统计寄存器定义与说明 +FAST交换平台的实现架构如图\ref{fig:a:ob_FAST-Ac}所示。 +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{FAST-Ac} +\caption{FAST平台实现架构图} +\label{fig:a:ob_FAST-Ac} +\end{figure} + +平台硬件逻辑分为两部分:一部分是平台相关的外围接口和与平台CPU互联的高速总线接口逻辑,统称为FPGA OS。其主要实现平台相关,交换功能无关的分组处理,如网络接口的接收与发送、CPU的DMA引擎以及FPGA片外或片内实现的TCAM查表功能等;另一部分是用户模块逻辑UM,其主要实现交换相关的网络功能,每一个小的流水线模块称为硬件应用(HA),如分组解析、关键字提取、转发查表、动作执行和输出控制等。用户可在UM模块中扩展HA流水线实现不同的分组处理功能。 + +平台软件逻辑分为三部分:一是平台相关驱动,由厂商实现其具体平台的硬件数据IO驱动,一般包含PCIe驱动、DMA驱动和以太网驱动;二是FAST分组分派模块,主要实现内核应用模块、协议栈模块和用户应用(UA)和底层驱动的数据分派功能;三是FAST分组应用,主要包括在通过标准内核协议栈支持的通用SOCKET应用(CA)、内核编程开发的内核应用(KA)和基于FAST快速IO编程开发的用户应用。 + +FAST平台的分组处理功能分布在硬件HA和软件的KA、CA及UA,各功能模块之间的转发和连接关系可由模块的ID号与下一组模块ID号关联配置,实现分组数据在FAST平台的处理流水线模块排列如图\ref{fig:a:ob_FAST-Pkt-Proc}所示效果。 +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{FAST-Pkt-Proc} +\caption{FAST分组处理流水线排列图} +\label{fig:a:ob_FAST-Pkt-Proc} +\end{figure} + +\subsection{平台应用} +由于FAST平台架构的特征,其应用开发可以是软件开发、硬件开发或软硬件结合开发,具体根据平台应用场景和用户具体需求而定。 +FAST项目自创立至今,已经在传统网络应用、工业互联网和创新网络架构设计等方面得到了广泛应用。通过在不同领域的应用积累了大量网络教学实验案例,如网络协议分析与编程、协议攻击与防护、路由器系统设计与实现、SDN交换机设计与实现、网络高精度测量、时间敏感网络设计与实现、高性能网络IO和网络应用的硬件卸载加速等。 + +\subsection{平台使用} +FAST是一个与平台无关的开源架构,根据FAST原理和规范实现的CPU+FPGA异构网络设备形态都属于FAST平台。FAST平台的CPU支持国产与非国产多种型号,FPGA也可以支持国产和非国产的多种型号。下面以下湖南新实的一款专业网络实验教学设备型号OpenBox-S4为例,说明如何使用FAST平台。 +\subsubsection{搭建环境} +使用FAST平台开发和验证网络功能,需要搭建FAST环境。FAST环境包括以下三个部分: +\begin{enumerate} +\item \textbf{用户操作设备:}一般是一台标准的电脑,可以是台式机或笔记本,除了基本操作IO设备外,电脑还要求至少拥有一个网口或一个USB口。该设备供用户编辑和编译软硬件逻辑代码,通过网口或串口上传和下载逻辑程序和运行结果; +\item \textbf{FAST平台设备:}一台符合FAST规范的可编程网络开发平台。平台支持FAST开源示例应用,可供用户基于平台进行软硬件逻辑功能的二次开发。平台至少提供一个串口和一个管理网口,用于支持用户网络远程或本地串口线登录平台进行操作; +\item \textbf{网络测试主机:}测试主机一般为支持网络功能的主机或嵌入式小型设备,如笔记本或树莓派。根据实验内容的不同,需要的网络测试主机数量及主机网络配置各不相同,具体参考相应的实验案例内容要求。 \end{enumerate} -\subsubsection{综合测试} +\subsubsection{FAST平台设备} +OpenBox-S4设备是一款严格遵照FAST原理与架构设计的通用多核CPU+FPGA的软硬件全功能可编程网络开发平台。适合本科和研究生的计算机网络教学和新型网络交换机制的验证。 -综合测试程序包含了libreg、librule和libua库的综合开发示例功能。 -首先,用户可以通过此程序了解各功能库的主要使用函数及调用顺序; -其次,用户可以通过此程序的编译参数了解不同功能库如何添加对应库功能支持 +该设备采用Zynq-7000 SOC芯片,内嵌双核Cortex-A9 处理器,512MB DDR3内存;支持4个千兆以太网数据接口,1个千兆管理以太网接口和一个管理串口。设备外观与接口说明如图\ref{fig:a:ob_f01}和图\ref{fig:a:ob_f02}所示: -subsection{FAST代码运行} +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{f01} +\caption{OpenBox-S4设备前端图} +\label{fig:a:ob_f01} +\end{figure} -\subsubsection{软硬件环境} -FAST平台由湖南新实网络科技有限公司提供销售、售后与技术支持。 -该平台可通过采购或免费申请试用获取,用户拿到FAST平台后, -默认系统环境均已支持FAST硬件基础版本与FAST软件基础版本。 -FAST硬件基础版本是指基于FAST的标准5组流水线功能; -FAST软件基础版本是指FAST-XXX软件版本。 +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{f02} +\caption{OpenBox-S4设备后端图} +\label{fig:a:ob_f02} +\end{figure} -如果用户只需要了解软件功能,可以不用FAST设备, -FAST软件可在通用Linux系统中进行编译与测试, -没有硬件平台的软件代码,不能进行硬件寄存器读写、规则配置与报文收发功能。 +在实验过程中,测试主机设备通常连接在设备的数据接口位置,用户操作管理设备时通过管理网口或串口连接。 -\subsubsection{代码获取} -参考第\ref{subsec:app:fast_get-soft}节 - -\subsubsection{代码编译} +\subsubsection{登录设备平台} \begin{enumerate} - \item 解压代码 - \begin{code}[console] - openbox@OpenBox~/hnxs$ tar –zxf fast-0.4.5.tar.gz - openbox@OpenBox~/hnxs$ cd fast-0.4.5 - openbox@OpenBox~/hnxs/fast-0.4.5$ ls - aclocal.m4 config.guess config.sub include ltmain.sh NEWS - app config.h configure INSTALL Makefile README - AUTHORS config.h.in configure.ac install-sh Makefile.am src - ChangeLog config.log COPYING lib Makefile.in stamp-h1 - compile config.status depcomp libtool missing tools - \end{code} - \item 配置环境 - \begin{code}[console] - openbox@OpenBox~/hnxs/fast-0.4.5$ ./configure - checking for a BSD-compatible install... /usr/bin/install -c - checking whether build environment is sane... yes - checking for a thread-safe mkdir -p... /bin/mkdir -p - checking for gawk... gawk - checking whether make sets $(MAKE)... yes - checking whether make supports nested variables... yes - checking whether make supports nested variables... (cached) yes - checking for gcc... gcc - checking whether the C compiler works... yes - checking for C compiler default output file name... a.out - checking for suffix of executables... - checking whether we are cross compiling... no - checking for suffix of object files... o - checking whether we are using the GNU C compiler... yes - checking whether gcc accepts -g... yes - checking for gcc option to accept ISO C89... none needed - checking whether gcc understands -c and -o together... yes - checking for style of include used by make... GNU - checking dependency style of gcc... gcc3 - checking whether NLS is requested... yes - checking for intltool >= 0.35.0... 0.50.2 found - checking for intltool-update... /usr/bin/intltool-update - checking for intltool-merge... /usr/bin/intltool-merge - checking for intltool-extract... /usr/bin/intltool-extract - checking for xgettext... /usr/bin/xgettext - checking for msgmerge... /usr/bin/msgmerge - checking for msgfmt... /usr/bin/msgfmt - checking for gmsgfmt... /usr/bin/msgfmt - checking for perl... /usr/bin/perl - checking for perl >= 5.8.1... 5.18.2 - checking for XML::Parser... ok - checking how to run the C preprocessor... gcc -E - checking for grep that handles long lines and -e... /bin/grep - checking for egrep... /bin/grep -E - checking for ANSI C header files... yes - checking for sys/types.h... yes - checking for sys/stat.h... yes - checking for stdlib.h... yes - checking for string.h... yes - checking for memory.h... yes - checking for strings.h... yes - checking for inttypes.h... yes - checking for stdint.h... yes - checking for unistd.h... yes - checking locale.h usability... yes - checking locale.h presence... yes - checking for locale.h... yes - checking for LC_MESSAGES... yes - checking libintl.h usability... yes - checking libintl.h presence... yes - checking for libintl.h... yes - checking for ngettext in libc... yes - checking for dgettext in libc... yes - checking for bind_textdomain_codeset... yes - checking for msgfmt... (cached) /usr/bin/msgfmt - checking for dcgettext... yes - checking if msgfmt accepts -c... yes - checking for gmsgfmt... (cached) /usr/bin/msgfmt - checking for xgettext... (cached) /usr/bin/xgettext - checking build system type... x86_64-unknown-linux-gnu - checking host system type... x86_64-unknown-linux-gnu - checking how to print strings... printf - checking for a sed that does not truncate output... /bin/sed - checking for fgrep... /bin/grep -F - checking for ld used by gcc... /usr/bin/ld - checking if the linker (/usr/bin/ld) is GNU ld... yes - checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B - checking the name lister (/usr/bin/nm -B) interface... BSD nm - checking whether ln -s works... yes - checking the maximum length of command line arguments... 1572864 - checking whether the shell understands some XSI constructs... yes - checking whether the shell understands "+="... yes - checking how to convert x86_64-unknown-linux-gnu file names to x86_64-unknown-linux-gnu format... func_convert_file_noop - checking how to convert x86_64-unknown-linux-gnu file names to toolchain format... func_convert_file_noop - checking for /usr/bin/ld option to reload object files... -r - checking for objdump... objdump - checking how to recognize dependent libraries... pass_all - checking for dlltool... no - checking how to associate runtime and link libraries... printf %s\n - checking for ar... ar - checking for archiver @FILE support... @ - checking for strip... strip - checking for ranlib... ranlib - checking command to parse /usr/bin/nm -B output from gcc object... ok - checking for sysroot... no - checking for mt... mt - checking if mt is a manifest tool... no - checking for dlfcn.h... yes - checking for objdir... .libs - checking if gcc supports -fno-rtti -fno-exceptions... no - checking for gcc option to produce PIC... -fPIC -DPIC - checking if gcc PIC flag -fPIC -DPIC works... yes - checking if gcc static flag -static works... yes - checking if gcc supports -c -o file.o... yes - checking if gcc supports -c -o file.o... (cached) yes - checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes - checking whether -lc should be explicitly linked in... no - checking dynamic linker characteristics... GNU/Linux ld.so - checking how to hardcode library paths into programs... immediate - checking whether stripping libraries is possible... yes - checking if libtool supports shared libraries... yes - checking whether to build shared libraries... yes - checking whether to build static libraries... yes - checking that generated files are newer than configure... done - configure: creating ./config.status - config.status: creating Makefile - config.status: creating include/Makefile - config.status: creating libreg/Makefile - config.status: creating libua/Makefile - config.status: creating librule/Makefile - config.status: creating po/Makefile.in - config.status: creating src/Makefile - config.status: creating tools/Makefile - config.status: creating tools/port_counts/Makefile - config.status: creating tools/port_status/Makefile - config.status: creating tools/rule/Makefile - config.status: creating tools/reg_rw/Makefile - config.status: creating tools/debug/Makefile - config.status: creating examples/Makefile - config.status: creating examples/l2switch/Makefile - config.status: creating config.h - config.status: executing depfiles commands - config.status: executing default-1 commands - config.status: executing libtool commands - config.status: executing po/stamp-it commands - \end{code} - \item 编译 - \begin{code}[console] - openbox@OpenBox~/hnxs/fast-0.4.5$ make - make all-recursive - make[1]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5' - Making all in include - make[2]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/include' - make[2]: 没有什么可以做的为 `all'。 - make[2]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/include' - Making all in libreg - make[2]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/libreg' - CC main_libreg.o - AR libreg.a - make[2]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/libreg' - Making all in libua - make[2]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/libua' - CC main_libua.o - AR libua.a - make[2]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/libua' - Making all in librule - make[2]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/librule' - CC main_librule.o - AR librule.a - make[2]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/librule' - Making all in tools - make[2]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/tools' - Making all in port_counts - make[3]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/tools/port_counts' - CC main_port_counts.o - CCLD port_counts - make[3]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/tools/port_counts' - Making all in port_status - make[3]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/tools/port_status' - CC main_port_status.o - CCLD port_status - make[3]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/tools/port_status' - Making all in rule - make[3]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/tools/rule' - CC main_rule.o - CCLD rule - make[3]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/tools/rule' - Making all in reg_rw - make[3]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/tools/reg_rw' - CC main_reg_rw.o - CCLD reg_rw - make[3]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/tools/reg_rw' - Making all in debug - make[3]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/tools/debug' - CC main_debug.o - CCLD debug - make[3]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/tools/debug' - make[3]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/tools' - make[3]: 没有什么可以做的为 `all-am'。 - make[3]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/tools' - make[2]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/tools' - Making all in po - make[2]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/po' - make[2]: 没有什么可以做的为 `all'。 - make[2]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/po' - Making all in src - make[2]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/src' - CC fast-main.o - CCLD fast - make[2]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/src' - Making all in examples - make[2]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/examples' - Making all in l2switch - make[3]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/examples/l2switch' - CC main_l2switch.o - CCLD l2switch - make[3]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/examples/l2switch' - make[3]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5/examples' - make[3]: 没有什么可以做的为 `all-am'。 - make[3]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/examples' - make[2]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5/examples' - make[2]: 正在进入目录 `/home/openbox/hnxs/fast-0.4.5' - make[2]: 没有什么可以做的为 `all-am'。 - make[2]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5' - make[1]:正在离开目录 `/home/openbox/hnxs/fast-0.4.5' - \end{code} -\end{enumerate} - -\subsubsection{代码执行} +\item 串口方式 \begin{enumerate} - \item 读硬件版本号 - \begin{code}[console] - openbox@OpenBox~/hnxs/fast-0.4.5$ reg_rw rd 0 - \end{code} +\item 连接串口线; + +设备使用标准USB口和Micro USB接口的线作为串口连接线,标准USB口连接在用户操作设备上,Mirco USB接口与设备对应串口连接。 +\item 打开并配置串口工具。 + +在用户操作设备上打开串口工具,配置好相应串口参数后打开串口,即可通过串口管理设备。以putty为例,其配置参数如图\ref{fig:a:ob_f11}所示: +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{f11} +\caption{串口工具参数配置图} +\label{fig:a:ob_f11} +\end{figure} \end{enumerate} -\subsection{FAST数据结构} -\subsubsection{UM数据结构} -\begin{code}[c] - struct um_metadata{ - #if defined(__LITTLE_ENDIAN) /*INTER*/ - #ifdef FAST_10 - u64 ts:32, /**< @brief 报文接收的时间戳 @note 如果用户需要使用表示更大的时间,建议存储在第二拍数据中(user[2]字段)*/ - ts2:12, - flowID:14, /**< @brief 流ID号*/ - priority:3, /**< @brief 报文优先级*/ - discard:1, /**< @brief 指示报文是否丢弃 @note 默认为0,表示不丢弃,置1时表示丢弃*/ - pktdst:1, /**< @brief 报文的输出目的方向 @note 0表示输出到网络端口,1表示输出到CPU*/ - pktsrc:1; /**< @brief 报文的输入源方向 @note 0表示网络端口输入,1表示从CPU输入*/ - u64 outport:16, /**< @brief 报文输出端口号 @note 以bitmap形式表示,1表示从0号端口输出;8表示从3号端口输出*/ - seq:12, /**< @brief 报文接收时的序列号 @note 每个端口独立维护一个编号*/ - dstmid:8, /**< @brief 报文下次处理的目的模块编号*/ - srcmid:8, /**< @brief 报文上次处理时的模块编号*/ - len:12, /**< @brief 报文长度 @note 最大可表示4095字节,但FAST平台报文缓存区最大为2048,完整以太网报文的MTU不要超过1500*/ - inport:4, /**< @brief 输入端口号 @note 取值:0——15,最多表示16个输入端口*/ - ttl:4; /**< @brief 报文通过模块的TTL值,每过一个处理模块减1*/ - #elif FAST_20 - u64 ts:32, /**< @brief 时间戳*/ - reserve:17, /**< @brief 保留*/ - pktsrc:1, /**< @brief 分组的来源,0为网络接口输入,1为CPU输入,此比特位在进入硬件时会交换到pkttype位置,保留位为18位*/ - flowID:14; /**< @brief 流ID*/ - u64 seq:8, /**< @brief 分组接收序列号*/ - pst:8, /**< @brief 标准协议类型(参考硬件定义)*/ - dstmid:8, /**< @brief 下一个处理分组的模块ID*/ - srcmid:8, /**< @brief 最近一次处理分组的模块ID*/ - len:12, /**< @brief 报文长度*/ - discard:1, /**< @brief 丢弃位*/ - priority:3, /**< @brief 分组优先级*/ - outport:6, /**< @brief 单播:分组输出端口ID,组播/泛洪:组播/泛洪表地址索引*/ - outtype:2, /**< @brief 输出类型,00:单播,01:组播,10:泛洪,11:从输入接口输出*/ - inport:6, /**< @brief 分组的输入端口号*/ - pktdst:1, /**< @brief 分组目的,0为网络接口输出,1为送CPU*/ - pkttype:1; /**< @brief 报文类型,0:数据报文,1:控制报文。硬件识别报文类别后,会将pktsrc位交换到此,恢复硬件数据格式*/ - #endif - u64 user[2]; /**< @brief 用户自定义metadata数据格式与内容 @remarks 此字段由可用户改写,但需要保证数据大小严格限定在16字节*/ - #elif defined(__BIG_ENDIAN) /**/ - #error "(__BIG_ENDIAN)Please fix " - #else - #error "Please fix " - #endif - }; -\end{code} -\subsubsection{FAST报文数据结构} -\begin{code}[c] - struct fast_packet - { - union - { - struct um_metadata um; /**< @brief UM模块数据格式定义 @see ::um_metadata */ - struct ctl_metadata cm; /**< 控制报文格式定义*/ - struct common_metadata md; /**< 公共控制信息,报文类型(0:数据,1:控制)*/ - }; - #ifdef OPENBOX_S28 - u16 flag; /**< @brief 2字节对齐标志,主要是为了IP地址的对齐 @note 此标志在内核会用来标记是一个FAST类型报文,建议用户不使用些字段*/ - #endif - u8 data[1514]; /**< @brief 完整以太网报文数据,暂时不含CRC数据*/ - }; -\end{code} -\subsubsection{流关键字数据结构} -\begin{code}[c] - struct flow /*2017/06/01开始启用,支持IPv6*/ - { - u8 dmac[ETH_ALEN]; /**< @brief Ethernet source address. */ - u8 smac[ETH_ALEN]; /**< @brief Ethernet destination address. */ - u16 tci; /**< @brief 0 if no VLAN, VLAN_TAG_PRESENT set otherwise. */ - u16 type; /**< @brief Ethernet frame type. */ - //eth-16; - - u8 proto; /**< @brief IP protocol or lower 8 bits of ARP opcode. */ - u8 tos; /**< @brief IP ToS. */ - u8 ttl; /**< @brief IP TTL/hop limit. */ - u8 port:6, /**< @brief Input Port*/ - frag:2; /**< @brief One of OVS_FRAG_TYPE_*. */ - //ip=16+4; - - union { - struct { - u32 src; /**< @brief IP source address. */ - u32 dst; /**< @brief IP destination address. */ - //addr; - - union { - struct { - u16 sport; /**< @brief TCP/UDP/SCTP source port. */ - u16 dport; /**< @brief TCP/UDP/SCTP destination port. */ - u16 flags; /**< @brief TCP flags. */ - } tp; /**< @brief IPv4的传输层端口与标志信息*/ - struct { - u8 sha[ETH_ALEN]; /**< @brief ARP source hardware address. */ - u8 tha[ETH_ALEN]; /**< @brief ARP target hardware address. */ - } arp; /**< @brief ARP的MAC地址信息*/ - }; /**< @brief IPv4传输层信息与ARP信息共用体,二者互斥存在*/ - } ipv4; /**< @brief IPv4协议相关字段*/ - struct { - struct in6_addr src; /**< @brief IPv6 source address. */ - struct in6_addr dst; /**< @brief IPv6 destination address. */ - //addr; - - u32 label; /**< @brief IPv6 flow label. */ - union { - struct { - u16 sport; /**< @brief TCP/UDP/SCTP source port. */ - u16 dport; /**< @brief TCP/UDP/SCTP destination port. */ - u16 flags; /**< @brief TCP flags. */ - } tp; /**< @brief IPv6的传输层端口与标志信息*/ - /*512位宽表项不够,暂不使用ND协议中的targetIP!!!为方便以后扩展,将其移至末尾*/ - #if 0 - struct { - u8 sll[ETH_ALEN]; /**< @brief ND source link layer address. */ - u8 tll[ETH_ALEN]; /**< @brief ND target link layer address. */ - struct in6_xaddr target; /**< @brief ND target address. */ - } nd; - #endif - }; /**< @brief IPv6传输层信息与ND信息共用体,二者互斥存在*/ - u16 nil; - } ipv6; /**< @brief IPv6协议相关字段*/ - }; - }; -\end{code} -\subsubsection{流数据结构} -\begin{code}[c] - struct fast_rule{ - struct flow key; /**< @brief 规则内容存储结构 @see ::flow*/ - struct flow mask; /**< @brief 规则掩码设置结构,与key一一对应 @see ::flow*/ - u32 priority; /**< @brief 规则的优先级设置*/ - u32 valid; /**< @brief 规则的有效标志设置,要删除一条规则只需要将此标记置0,并更新到硬件*/ - u32 action; /**< @brief 规则所对应的执行动作,动作由两部分组成,高4位为ACTION枚举类型,低28位不此类型对应的值 @see ::ACTION*/ - /*此前数据必须要写入到硬件*/ - u32 flow_stats_len; /**< @brief 流表信息长度*/ - u64 *flow_stats_info; /**< @brief 流表信息存储指针位置*/ - #ifdef OPENBOX_S4 - u32 *tmp; /*在S4系统中,上面变量指针大小为32*/ - #endif - u64 cookie; /**< @brief 用来存储流的cookie信息,软件使用*/ - u64 cookie_mask; /**< @brief 用来存储流cookie的掩码信息,软件使用*/ - u32 md5[4]; /**< @brief MD5值 @note 用来区分规则的唯一性,软件生成规则时即会判断是否规则重复*/ - u32 pad[18]; /**< @brief 总长256B,此为确保数据结构大小做的填充*/ - }; -\end{code} - -\subsection{FAST开发函数} - -\subsubsection{硬件资源与寄存器} +\item 管理网口方式 \begin{enumerate} - \item int fast\_init\_hw(u64 addr,u64 len); - 硬件资源初始化。所有涉及到需要操作硬件寄存器、流表和动作等均需要先调用此函数, - 实例化硬件资源,使软件具体访问硬件的能力。 - - 参数:addr,在PCIe标准设备中表示硬件资源的内存映射地址, - 通常情况下,用户可以直接填写0。 - - 参数:len,在PCIe标准调和中表示硬件资源的内存地址空间大小, - 通常情况下,用户可以直接填写0。 - - 返回值:0表示硬件资源实例化正常,非零表示失败, - 如果失败将无法对硬件进行任何操作,程序将自动退出。 - \item void fast\_distroy\_hw(void); - 硬件资源销毁。PCIe设备主要是撤销对硬件资源的映射, - OpenBox-S4主要是对设备发送关闭报文。 - 一般情况下,用户程序退出时应该调用此函数,释放资源。 - 但是我们内部并没有做特殊的资源处理,均为系统可自动回收功能, - 即使用户不调用此函数,当程序正常退出时,系统也能正常回收资源, - 不影响程序再次运行使用。 - \item u64 fast\_reg\_rd(u64 regaddr); - 寄存器读函数。读取用户指定寄存器位置的值返回。 - 该函数内部会根据平台的不同使用不同的方法去访问硬件寄存器。 - PCIe的平台以正常寄存器方式访问,而NetMagic~08需要使用NMAC报文进行交互获取。 - 这些不同的操作方式均已对用户屏蔽,用户无需关心该函数底层如何交互与实现, - 仅需调用此函数接口来操作寄存器读操作即可。 - - 参数:regaddr,表示用户将要读取的寄存器地址, - 该地址即FAST平台所定义的虚拟地址空间,该值均使用相对偏移值的方式使用, - 即FAST平台定义的值,对PCIe平台设备访问需要使用绝对地址访问才可以正常访问寄存器, - 相对地址转绝对地址已经封装在函数内部, - 用户对所有寄存器的操作均可只用相对值访问即可。 - - 返回值:返回该寄存器对应的值。该值的位宽是64位, - 在所有FAST平台寄存器的位宽均为64位。 - \item void fast\_reg\_wr(u64 regaddr,u64 regvalue); - 寄存器写函数。将指定值写对硬件对应的寄存器位置。 - 该函数内部会根据平台的不同使用不同的方法去操作硬件寄存器。 - PCIe的平台以正常寄存器方式访问,而NetMagic~08需要使用NMAC报文进行交互获取。 - 这些不同的操作方式均已对用户屏蔽,用户无需关心该函数底层如何交互与实现, - 仅需调用此函数接口来操作寄存器写操作即可。 - - 参数:regaddr,表示用户将要写入的寄存器地址, - 该地址即FAST平台所定义的虚拟地址空间,该值均使用相对偏移值的方式使用, - 即FAST平台定义的值, - 对PCIe平台设备访问需要使用绝对地址访问才可以正常访问寄存器, - 相对地址转绝对地址已经封装在函数内部, - 用户对所有寄存器的操作均可只用相对值访问即可。 - - 参数:regvalue,表示要写入上述参数寄存器位置的值。该值的位宽为64位。 +\item 连接网线; + +使用一根RJ45端口的网线,分别连接在用户操作主机端与设备的管理网口(MGMT),网口出现指示灯闪烁说明连接正常。 +\item 配置主机端IP信息。 + +通过网连接连接设备,必须确保用户操作主机与设备管理网口在相同的网段,如不记得管理网口的IP,可以通过串口方式查看。设备默认网段为192.168.50.0网段,故用户操作主机的IP地址配置信息参考如图\ref{fig:a:ob_f12}所示: +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{f12} +\caption{网口连接的主机IP配置图} +\label{fig:a:ob_f12} +\end{figure} \end{enumerate} -\subsubsection{流表操作} -\begin{enumerate} - \item void init\_rule(u32 default\_action); - 初始化规则。初始化规则函数的主要功能是在软件分配软件规则空间, - 将硬件规则空间清零,设置硬件规则的默认动作。 - 该函数只在进行流表操作的应用中进行调用,而且只能被调用一次。 - 如果有多个应用需要操作规则, - 整个系统在关机或重启前所有的应用中也只能由一个应用来调用一次。 - 主要是该函数会将硬件所有存在流表清空。用户需要自己非常清楚对流表的操作, - 在一次流表清空后才可以对流表进行其他操作。 - - 参数:default\_action,默认动作。当所有的流表均不能匹配时, - 硬件需要执行一个默认的动作来完成这个分组的处理, - 流表可以为空,但默认动作必须要有。详细的动作含义可以参考动作说明。 - - \item int fast\_add\_rule(struct fast\_rule *rule); - 添加一条规则。添加规则函数,先将用户的规则添加在软件流表中, - 经过各种比较判断后,看是否能正常添加,有无冲突或是否存在, - 如果可以正常添加,则先将规则存储在软件, - 然后将此条软件规则数据通过寄存器方式下发到硬件对应规则的存储位置。 - - 参数:rule,规则对象,内部具体字段参考流规则数据结构定义 - - 返回值:返回当前添加规则成功后此条规则所在的索引号 - \item int fast\_modify\_rule(struct fast\_rule *rule,int idx); - 修改一条已经存在的规则。此函数主要是用来修改已经存在的规则, - 对其关键字、掩码、动作和优先级等进行修改。 - 该函数的索引值参数如果指向一条空规则,其操作流程将类似于添加规则函数。 - - 参数:rule,新规则对象,内部具体字段参考流规则数据结构定义 - - 参数:idx,旧规则所在索引号 - - 返回值:返回输入参数的idx值说明操作成功,其他值说明操作失败 - \item int fast\_del\_rule(int idx); - 删除一条已经存储的规则,或将一条规则置为无效。 - 只需要提供规则所在的索引号,软件可通过索引号定位到对应硬件存储规则位置, - 将规则的有效位置为无效,实现一条规则的删除。 - 删除硬件成功后,将其对应的软件规则进行清除。 - - 参数:idx,删除规则所在索引号 - - 返回值:返回输入参数的idx值说明操作成功,其他值说明操作失败 - \item int read\_hw\_rule(struct fast\_rule *rule,int index); - 读取一条硬件规则。将存储在硬件规则内对应索引的数据读取出来, - 还原为一条软件规则数据,存储在用户提供的指针位置。 - - 参数:rule,将要存储规则的内存指针 - - 参数:idx,将要读取规则所在硬件的索引号 - - 返回值:返回输入参数的idx值说明操作成功,其他值说明操作失败 - \item void print\_hw\_rule(void); - 打印硬件所有规则信息。此函数是上一个读取硬件规则条目信息的集合操作, - 将所有硬件流规则信息一一读出,并打印输出在屏幕上。 \end{enumerate} -\subsubsection{UA编程} + +\subsubsection{测试二层交换功能} \begin{enumerate} - \item int fast\_ua\_init(int mid,fast\_ua\_recv\_callback callback); - UA编程初始化函数。 - \item void fast\_ua\_destroy(void); - UA编程注销函数。 - \item int fast\_ua\_send(struct fast\_packet *pkt,int pkt\_len); - UA程序发送报文函数 - \item void fast\_ua\_recv(); - 启动UA接收用户特征流程序函数 +\item 搭建二层交换拓扑 + + +二层交换实验的两台测试主机可以随意连接到设备的数据接口位置(网口0到网口4均可)。测试主机的IP地址配置及连接拓扑如图\ref{fig:a:ob_f15}所示: +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{f15} +\caption{二层交换连接拓扑示意图} +\label{fig:a:ob_f15} +\end{figure} + +\item 在OpenBox-S4上运行二层交换程序 + + 用串口或网线连接用户操作主机与设备,通过串口登录界面或网络登录界面控制设备,在界面终端输入命令:l2switch,如图\ref{fig:a:ob_f16}所示: + +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{f16} +\caption{二层交换命令启动输出图} +\label{fig:a:ob_f16} +\end{figure} + +\item 在PC两端进行PING测试 + +在主机B的CMD (命令提示符) 程序中。输入并执行命令ping 192.168.1.111 即可测试两台主机之间的联通性。测试结果如图\ref{fig:a:ob_f17}所示: + +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{f17} +\caption{二端主机PING通结果图(二层交换)} +\label{fig:a:ob_f17} +\end{figure} + \end{enumerate} -\subsection{FAST虚拟地址空间定义} - -\subsubsection{debug um} -\begin{code}[c] - #define FAST_DEBUG_UM_DC FAST_HW_UM+0x0000 - #define FAST_DEBUG_UM_GPP FAST_HW_UM+0x2000 - #define FAST_DEBUG_UM_GKE FAST_HW_UM+0x4000 - #define FAST_DEBUG_UM_GME FAST_HW_UM+0x6000 - #define FAST_DEBUG_UM_GAC FAST_HW_UM+0x8400 - #define FAST_DEBUG_UM_GOE FAST_HW_UM+0xA000 - - /*GPP模块*/ - #define FAST_DEBUG_GPP_GPP_STATUS FAST_DEBUG_UM_GPP+0x00 - #define FAST_DEBUG_GPP_IN_GPP_DATA_COUNT FAST_DEBUG_UM_GPP+0x08 - #define FAST_DEBUG_GPP_OUT_GPP_MD_COUNT FAST_DEBUG_UM_GPP+0x10 - #define FAST_DEBUG_GPP_OUT_GPP_PHY_COUNT FAST_DEBUG_UM_GPP+0x18 - #define FAST_DEBUG_GPP_OUT_GPP_CACHE_COUNT FAST_DEBUG_UM_GPP+0x20 - - /*GKE模块*/ - #define FAST_DEBUG_GKE_GKE_STATUS FAST_DEBUG_UM_GKE+0x00 - #define FAST_DEBUG_GKE_IN_GKE_MD_COUNT FAST_DEBUG_UM_GKE+0x08 - #define FAST_DEBUG_GKE_IN_GKE_PHY_COUNT FAST_DEBUG_UM_GKE+0x10 - #define FAST_DEBUG_GKE_OUT_GKE_MD_COUNT FAST_DEBUG_UM_GKE+0x18 - #define FAST_DEBUG_GKE_OUT_GKE_PHY_COUNT FAST_DEBUG_UM_GKE+0x20 - #define FAST_DEBUG_GKE_OUT_GKE_KEY_COUNT FAST_DEBUG_UM_GKE+0x28 - - /*GME*/ - #define FAST_DEBUG_GME_GME_STATUS FAST_DEBUG_UM_GME+0x00 - #define FAST_DEBUG_GME_IN_GME_MD_COUNT FAST_DEBUG_UM_GME+0x08 - #define FAST_DEBUG_GME_IN_GME_PHY_COUNT FAST_DEBUG_UM_GME+0x10 - #define FAST_DEBUG_GME_IN_GME_KEY_COUNT FAST_DEBUG_UM_GME+0x18 - #define FAST_DEBUG_GME_IN_GME_INDEX_COUNT FAST_DEBUG_UM_GME+0x20 - #define FAST_DEBUG_GME_OUT_GME_MD_COUNT FAST_DEBUG_UM_GME+0x28 - #define FAST_DEBUG_GME_OUT_GME_PHY_COUNT FAST_DEBUG_UM_GME+0x30 - #define FAST_DEBUG_GME_OUT_GME_KEY_COUNT FAST_DEBUG_UM_GME+0x38 - - /*GAC*/ - #define FAST_DEBUG_GAC_GAC_STATUS FAST_DEBUG_UM_GAC+0x00 - #define FAST_DEBUG_GAC_IN_GAC_DATA_COUNT FAST_DEBUG_UM_GAC+0x08 - #define FAST_DEBUG_GAC_IN_GAC_MD_COUNT FAST_DEBUG_UM_GAC+0x10 - #define FAST_DEBUG_GAC_IN_GAC_PHY_COUNT FAST_DEBUG_UM_GAC+0x18 - #define FAST_DEBUG_GAC_OUT_GAC_DATA_COUNT FAST_DEBUG_UM_GAC+0x20 - #define FAST_DEBUG_GAC_OUT_GAC_PHY_COUNT FAST_DEBUG_UM_GAC+0x28 - - /*GOE*/ - #define FAST_DEBUG_GOE_GOE_STATUS FAST_DEBUG_UM_GOE+0x00 - #define FAST_DEBUG_GOE_IN_GOE_DATA_COUNT FAST_DEBUG_UM_GOE+0x08 - #define FAST_DEBUG_GOE_IN_GOE_PHY_COUNT FAST_DEBUG_UM_GOE+0x10 - #define FAST_DEBUG_GOE_OUT_GOE_DATA_COUNT FAST_DEBUG_UM_GOE+0x18 - - - #define FAST_DEBUG_DC_DATA_CACHE_STATUS FAST_DEBUG_UM_DC+0x00 - #define FAST_DEBUG_DC_IN_DATA_CACHE_COUNT FAST_DEBUG_UM_DC+0x08 - #define FAST_DEBUG_DC_OUT_DATA_CACHE_COUNT FAST_DEBUG_UM_DC+0x10 -\end{code} -\subsubsection{端口计数} -\begin{code}[c] - #define FAST_COUNTS_RECV_BYTE_L 0x200 /**< 计数寄存器:成功接收字节数低位计数*/ - #define FAST_COUNTS_RECV_BYTE_H 0x204 /**< 计数寄存器:成功接收字节数高位计数*/ - #define FAST_COUNTS_SEND_BYTE_L 0x208 /**< 计数寄存器:成功发送字节数低位计数*/ - #define FAST_COUNTS_SEND_BYTE_H 0x20C /**< 计数寄存器:成功发送字节数高位计数*/ - - #define FAST_COUNTS_RECV_PKT_L 0x290 /**< 计数寄存器:接收成功的计数*/ - #define FAST_COUNTS_RECV_PKT_H 0x294 /**< 计数寄存器:接收成功的计数*/ - #define FAST_COUNTS_SEND_PKT_L 0x2D8 /**< 计数寄存器:发送成功的计数*/ - #define FAST_COUNTS_SEND_PKT_H 0x2DC /**< 计数寄存器:发送成功的计数*/ -\end{code} -\subsubsection{硬件流表} -\begin{code}[c] - #define FAST_OFP_FLOW_STATS_PKTS 0x8B000 /*流表报文计数*/ - #define FAST_OFP_FLOW_STATS_BYTES 0x8B800 /*流表字节计数*/ -\end{code} -\subsubsection{硬件动作} -\begin{code}[c] - #define BASE_ADDR 0x43C00000 /**< 硬件资源起始地址*/ - #define REG_LEN 0x01000000 /**< 硬件资源可用空间*/ - #define FAST_ACTION_REG_ADDR 0x88000 /**< 写动作寄存器*/ - #define FAST_DEFAULT_RULE_ADDR 0x1F8 /**< 默认动作(匹配不到规则时执行默认动作)地址*/ -\end{code} - -\subsection{FAST开发流程} -基于FAST的软件代码开发有三种方式: -第一种是基于FAS的源代码进行修改,整个代码结构不变, -可以直接使用原工程中的所有Makefile文件, -修改完成后,直接make即可得到用户所需要的可执行文件; -第二种是用户根据自己需要,选择需要的开发库与头文件, -自己重新组织新的代码目录与结构进行开发, -原工程中的Makefile文件均不可再用,需要自己重写Makefile文件。 - -\subsubsection{修改源码开发} +\subsubsection{测试三层路由功能} \begin{enumerate} - \item 已FAST的rule\_rw工具作为修改示例, - 修改fast/tools/rule\_rw/目录下main\_rule.c文件 - \item 修改main\_rule\_test函数, - 将两个端口互转硬件规则改为根据以太网类型来转发 - \begin{code}[c] - void main_rule_test(int argc,char *argv[]) - { - int i = 0,p1 = 1,p2 = 2,idx1 = 0,idx2 = 1; - struct fast_rule rule[2] = {{0},{0}};//初始化两条全空的规则 - - if(argc == 3) - { - p1 = atoi(argv[1]); - p2 = atoi(argv[2]); - } - else if(argc == 4) - { - p1 = atoi(argv[1]); - p2 = atoi(argv[2]); - idx1 = atoi(argv[3]); - } - else if(argc == 5) - { - p1 = atoi(argv[1]); - p2 = atoi(argv[2]); - idx1 = atoi(argv[3]); - idx2 = atoi(argv[4]); - } - - //给规则的各字段赋值 - rule[i].key.type = htole16(0x0800); //以太网类型 - rule[i].key.port = p1; - rule[i].priority =0xA; - rule[i].action = ACTION_PORT<<28|p2;//动作字段的涵义请参考fast_type.h - rule[i].md5[0] = i+1; - - //给规则对应字段设置掩码,掩码为1表示使用,为0表示忽略 - rule[i].mask.type = 0xFFFF; - rule[i].mask.port = 0x3F;/*6bit*/ - - //fast_add_rule(&rule[i]); - //fast_modify_rule(&rule[i],0); - - i++; - - rule[i].key.type = htole16(0x0800); - rule[i].key.port = p2; - rule[i].priority =0xB; - rule[i].action = ACTION_PORT<<28|p1;//动作字段的涵义请参考fast_type.h - rule[i].md5[0] = i+1; - - //给规则对应字段设置掩码,掩码为1表示使用,为0表示忽略 - rule[i].mask.type = 0xFFFF; - rule[i].mask.port = 0x3F; - - //fast_add_rule(&rule[i]); - //fast_modify_rule(&rule[i],1); - - - if(argc == 3 || argc == 1) - { - fast_modify_rule(&rule[i-1],idx1); - fast_modify_rule(&rule[i],idx2); - printf("Row[%d],Port[%d]----->Port[%d]\n",idx1,p1,p2); - printf("Row[%d],Port[%d]----->Port[%d]\n",idx2,p2,p1); - } - else if(argc == 4) - { - p1 = atoi(argv[1]); - p2 = atoi(argv[2]); - idx1 = atoi(argv[3]); - fast_modify_rule(&rule[i-1],idx1); - printf("Row[%d],Port[%d]----->Port[%d]\n",idx1,p1,p2); - } - else if(argc == 5) - { - p1 = atoi(argv[1]); - p2 = atoi(argv[2]); - idx1 = atoi(argv[3]); - idx2 = atoi(argv[4]); - fast_modify_rule(&rule[i-1],idx1); - fast_modify_rule(&rule[i],idx2); - printf("Row[%d],Port[%d]----->Port[%d]\n",idx1,p1,p2); - printf("Row[%d],Port[%d]----->Port[%d]\n",idx2,p2,p1); - } - } - \end{code} - - 修改保存退出,打开命令终端,跳到fast目录下,执行交叉编译 - - \begin{code}[console] - # cd fast-0.4.5 - # make - \end{code} - - 编译完成后将把tools/rule\_hw目录下rule\_hw工具放到OpenBox-S4设备, - 执行修改过的rule\_hw工具 - \begin{code}[console] - # ./rule_hw 0 1 - \end{code} +\item 搭建三层路由拓扑 + + +三层路由实验的两台测试主机要根据主机端IP地址配置和网关配置,分别连接到主机对应网关的接口上。连错线会导致实现失败。测试主机的IP地址配置及连接拓扑如图\ref{fig:a:ob_f18}所示: +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{f18} +\caption{三层路由拓扑} +\label{fig:a:ob_f18} +\end{figure} + +\item OpenBox-S4上运行三层路由程序 + + 用串口或网线连接用户操作主机与设备,通过串口登录界面或网络登录界面控制设备,在界面终端输入命令:l3router,如图\ref{fig:a:ob_f19}所示: + +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{f19} +\caption{运行三层路由程序} +\label{fig:a:ob_f19} +\end{figure} + +\item 在PC两端进行PING测试 + +在主机A的CMD (命令提示符) 程序中。输入并执行命令ping 192.168.2.119 即可测试跨路由功能。测试结果如图\ref{fig:a:ob_f20}所示: + +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{f20} +\caption{端主机PING通结果图(三层路由)} +\label{fig:a:ob_f20} +\end{figure} \end{enumerate} -\subsubsection{新增代码开发} -用户基于FAST架构代码增加自己的软件代码, -建议按照完整项目工程管理的方法进行, -使用Anjuta开发软件进行修改和配置, -具体请参考《OpenBox-S4开发环境搭建手册》第三章anjuta 部署fast源代码。 +\subsubsection{测试SDN交换功能} +\begin{enumerate} +\item 搭建SDN交换拓扑 + + +SDN交换实验的两台测试主机可以随意连接到设备的数据接口位置(网口0到网口4均可),SDN控制器主机的网线一定要连接在设备的管理网口(MGMT)。控制器主机和测试主机的IP地址配置及连接拓扑如图\ref{fig:a:ob_f21}所示: +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{f21} +\caption{SDN交换拓扑} +\label{fig:a:ob_f21} +\end{figure} + +\item 在SDN控制器主机中启动SDN控制器 + + 在终端命令行下输入 java –jar target/floodlight.jar,即启动floodlight控制器。如图\ref{fig:a:ob_f22}所示: + +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{f22} +\caption{启动floodlight控制器} +\label{fig:a:ob_f22} +\end{figure} + +\item 在设备平台上运行SDN交换程序 + + 在串口登录界面或网络登录界面输入命令:xofp -4 192.168.1.3 –i obx0,obx1,obx2,obx3 , 连接Floodlight控制器。如图\ref{fig:a:ob_f23}所示: + +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{f23} +\caption{运行SDN交换程序} +\label{fig:a:ob_f23} +\end{figure} + +\item 访问floodlight控制器首页 + + 在控制器主机打开浏览器,在浏览器地址栏输入:127.0.0.1:8080/ui/index.html ,访问floodlight控制器首页。界面如图\ref{fig:a:ob_f24}所示: + +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{f24} +\caption{访问floodlight控制器首页} +\label{fig:a:ob_f24} +\end{figure} + +\item 在PC两端进行PING测试 + +在主机A的CMD (命令提示符) 程序中。输入并执行命令ping 192.168.2.119 即可测试两台主机之间的联通性。测试结果如图\ref{fig:a:ob_f25}所示: + +\begin{figure}[!ht] +\centering +\includegraphics[width=11cm]{f25} +\caption{端主机PING通结果图(SDN交换)} +\label{fig:a:ob_f25} +\end{figure} + +\end{enumerate} -\subsubsection{交叉编译代码} -OpenBox-S4平台为ARM嵌入式平台, -所运行软件需要通过交叉编译后才可放入平台运行。 -软件代码的交叉编译请参考《OpenBox-S4开发环境搭建手册》第二章的2.4节测试交叉编译。 \ No newline at end of file +\subsection{FAST开源社区} +由于FAST架构设计的独特优势,用户无需关心平台的分组网络IO、存储和加速方法,只专注于创新架构的设计和核心技术研究,极大的加快网络创新技术的落地与应用。来自全国的近100家的高校、科研院所和设备厂商单位都加入的FAST开源社区。FAST开源社区致力于网络领域的基础网络技术分析与实现,热门网络技术跟踪研究与原型实现和未来网络技术探索与研究。更多的网络前沿技术及FAST的实现方法以及FAST的编程开发方法请关注FAST社区公众号及相关服务网站。 +\begin{figure}[H] +\centering +\includegraphics[width=5cm]{fast-w} +\caption{FAST公众号} +\label{fig:a:ob_fast-w} +\end{figure} +FAST官网:http://www.fastswitch.org diff --git a/data/appendix/openbox.tex b/data/appendix/openbox.tex deleted file mode 100644 index e5ce51d..0000000 --- a/data/appendix/openbox.tex +++ /dev/null @@ -1,458 +0,0 @@ -%# -*- coding: utf-8-unix -*- - -\chapter{可编程网络平台-操作手册} -\label{app:openbox} - -\subsection{FAST简介} - -针对近年来关于工业控制网络创新技术、创新网络结构、 -时间敏感网络、SDN网络、FPGA硬件加速技术及下一代网络技术的研究需求, -由国防科大与湖南新实共同发起的开源项目 -——FAST(FPGA 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协议版本4(TCP/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} diff --git a/data/ch_router-openbox/preface.tex b/data/ch_router-openbox/preface.tex index 853cb0f..81eb2eb 100644 --- a/data/ch_router-openbox/preface.tex +++ b/data/ch_router-openbox/preface.tex @@ -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。 diff --git a/data/ch_router-openbox/sec_networking.tex b/data/ch_router-openbox/sec_networking.tex index 04d5746..17035ba 100644 --- a/data/ch_router-openbox/sec_networking.tex +++ b/data/ch_router-openbox/sec_networking.tex @@ -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、IS-IS和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} diff --git a/data/ch_router-openbox/sec_router.tex b/data/ch_router-openbox/sec_router.tex index fae5866..5e8f64e 100644 --- a/data/ch_router-openbox/sec_router.tex +++ b/data/ch_router-openbox/sec_router.tex @@ -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} diff --git a/data/ch_router-openbox/sec_switch.tex b/data/ch_router-openbox/sec_switch.tex index 4e9a3cf..f0b120c 100644 --- a/data/ch_router-openbox/sec_switch.tex +++ b/data/ch_router-openbox/sec_switch.tex @@ -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} diff --git a/data/ch_sdn-openbox/preface.tex b/data/ch_sdn-openbox/preface.tex index a923b63..3097966 100644 --- a/data/ch_sdn-openbox/preface.tex +++ b/data/ch_sdn-openbox/preface.tex @@ -3,9 +3,4 @@ \chapter{软件定义网络与网络测量} \label{chap:sdn-ob} -本单元实验使学生能初步使用SDN平台进行网络功能的设计与实现, -通过实验来掌握OpenFlow协议的基本功能与应用, -以及网络拓扑构建的基本实现。初步掌握网络测试的常用原理及方法, -了解在测试过程中影响测量精度的原因及如何提高测量精度。 -能通过实验理解软硬件协同测量的方法与特点。 - +本单元实验使学生能初步使用Software Defined Network(简称SDN)平台进行网络功能的设计与实现,通过实验来掌握OpenFlow协议的基本功能与应用,以及网络拓扑构建的基本实现。初步掌握网络测试的常用原理及方法,了解在测试过程中影响测量精度的原因及如何提高测量精度。能通过实验理解软硬件协同测量的方法与特点。 diff --git a/data/ch_sdn-openbox/sec_ns.tex b/data/ch_sdn-openbox/sec_ns.tex index 2ef32f8..261c473 100644 --- a/data/ch_sdn-openbox/sec_ns.tex +++ b/data/ch_sdn-openbox/sec_ns.tex @@ -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} diff --git a/data/ch_sdn-openbox/sec_sdn.tex b/data/ch_sdn-openbox/sec_sdn.tex index 98dca17..e692e7f 100644 --- a/data/ch_sdn-openbox/sec_sdn.tex +++ b/data/ch_sdn-openbox/sec_sdn.tex @@ -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} diff --git a/data/ch_sdn-openbox/sec_topo.tex b/data/ch_sdn-openbox/sec_topo.tex index 184f9b5..8b5d4ad 100644 --- a/data/ch_sdn-openbox/sec_topo.tex +++ b/data/ch_sdn-openbox/sec_topo.tex @@ -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} diff --git a/data/ch_wireshark/sec_arp.tex b/data/ch_wireshark/sec_arp.tex index cd3bd4f..25d56ea 100644 --- a/data/ch_wireshark/sec_arp.tex +++ b/data/ch_wireshark/sec_arp.tex @@ -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 diff --git a/data/ch_wireshark/sec_ip.tex b/data/ch_wireshark/sec_ip.tex index 486e655..2247c87 100644 --- a/data/ch_wireshark/sec_ip.tex +++ b/data/ch_wireshark/sec_ip.tex @@ -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 diff --git a/data/ch_wireshark/sec_tcp.tex b/data/ch_wireshark/sec_tcp.tex index 14a3540..cf5b75b 100644 --- a/data/ch_wireshark/sec_tcp.tex +++ b/data/ch_wireshark/sec_tcp.tex @@ -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 diff --git a/data/copyright.tex b/data/copyright.tex new file mode 100644 index 0000000..f202516 --- /dev/null +++ b/data/copyright.tex @@ -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*} diff --git a/data/cover.tex b/data/cover.tex index 5999843..e8859bb 100644 --- a/data/cover.tex +++ b/data/cover.tex @@ -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); diff --git a/data/preface.tex b/data/preface.tex index d849068..6cb717c 100644 --- a/data/preface.tex +++ b/data/preface.tex @@ -30,7 +30,7 @@ \begin{itemize} \item 第一单元:谢怡、陈建发、洪劼超、雷蕴奇,厦门大学 - \item 第二单元:吴荻、周丽涛,国防科技大学 + \item 第二单元:吴荻、夏竟,国防科技大学 \item 第三单元:张晓丽,昆明理工大学 \item 第四单元:胡罡、孙志刚,国防科技大学 \item 第五单元:夏竟、蔡志平、徐明,国防科技大学 diff --git a/figure/appendixes/fast/FAST-Ac.png b/figure/appendixes/fast/FAST-Ac.png new file mode 100644 index 0000000..2f04abb Binary files /dev/null and b/figure/appendixes/fast/FAST-Ac.png differ diff --git a/figure/appendixes/fast/FAST-Pkt-Proc.png b/figure/appendixes/fast/FAST-Pkt-Proc.png new file mode 100644 index 0000000..79eacf8 Binary files /dev/null and b/figure/appendixes/fast/FAST-Pkt-Proc.png differ diff --git a/figure/appendixes/openbox/f01.png b/figure/appendixes/fast/f01.png similarity index 100% rename from figure/appendixes/openbox/f01.png rename to figure/appendixes/fast/f01.png diff --git a/figure/appendixes/openbox/f02.png b/figure/appendixes/fast/f02.png similarity index 100% rename from figure/appendixes/openbox/f02.png rename to figure/appendixes/fast/f02.png diff --git a/figure/appendixes/openbox/f09.png b/figure/appendixes/fast/f11.png similarity index 100% rename from figure/appendixes/openbox/f09.png rename to figure/appendixes/fast/f11.png diff --git a/figure/appendixes/openbox/f10.png b/figure/appendixes/fast/f12.png similarity index 100% rename from figure/appendixes/openbox/f10.png rename to figure/appendixes/fast/f12.png diff --git a/figure/appendixes/fast/f15.png b/figure/appendixes/fast/f15.png new file mode 100644 index 0000000..fd21a4c Binary files /dev/null and b/figure/appendixes/fast/f15.png differ diff --git a/figure/appendixes/fast/f16.png b/figure/appendixes/fast/f16.png new file mode 100644 index 0000000..a73edb7 Binary files /dev/null and b/figure/appendixes/fast/f16.png differ diff --git a/figure/appendixes/fast/f17.png b/figure/appendixes/fast/f17.png new file mode 100644 index 0000000..35bd796 Binary files /dev/null and b/figure/appendixes/fast/f17.png differ diff --git a/figure/appendixes/fast/f18.png b/figure/appendixes/fast/f18.png new file mode 100644 index 0000000..5151580 Binary files /dev/null and b/figure/appendixes/fast/f18.png differ diff --git a/figure/appendixes/fast/f19.png b/figure/appendixes/fast/f19.png new file mode 100644 index 0000000..2e4cd20 Binary files /dev/null and b/figure/appendixes/fast/f19.png differ diff --git a/figure/appendixes/fast/f20.png b/figure/appendixes/fast/f20.png new file mode 100644 index 0000000..026c71b Binary files /dev/null and b/figure/appendixes/fast/f20.png differ diff --git a/figure/appendixes/fast/f21.png b/figure/appendixes/fast/f21.png new file mode 100644 index 0000000..50f4d6d Binary files /dev/null and b/figure/appendixes/fast/f21.png differ diff --git a/figure/appendixes/fast/f22.png b/figure/appendixes/fast/f22.png new file mode 100644 index 0000000..4458c0c Binary files /dev/null and b/figure/appendixes/fast/f22.png differ diff --git a/figure/appendixes/fast/f23.png b/figure/appendixes/fast/f23.png new file mode 100644 index 0000000..7cb3031 Binary files /dev/null and b/figure/appendixes/fast/f23.png differ diff --git a/figure/appendixes/fast/f24.png b/figure/appendixes/fast/f24.png new file mode 100644 index 0000000..aeb92e8 Binary files /dev/null and b/figure/appendixes/fast/f24.png differ diff --git a/figure/appendixes/fast/f25.png b/figure/appendixes/fast/f25.png new file mode 100644 index 0000000..8aa0de1 Binary files /dev/null and b/figure/appendixes/fast/f25.png differ diff --git a/figure/appendixes/fast/fast-w.png b/figure/appendixes/fast/fast-w.png new file mode 100644 index 0000000..87a8a5a Binary files /dev/null and b/figure/appendixes/fast/fast-w.png differ diff --git a/figure/appendixes/openbox/f03.png b/figure/appendixes/openbox/f03.png deleted file mode 100644 index 2360ba9..0000000 Binary files a/figure/appendixes/openbox/f03.png and /dev/null differ diff --git a/figure/appendixes/openbox/f04.png b/figure/appendixes/openbox/f04.png deleted file mode 100644 index 149bb7d..0000000 Binary files a/figure/appendixes/openbox/f04.png and /dev/null differ diff --git a/figure/appendixes/openbox/f05.png b/figure/appendixes/openbox/f05.png deleted file mode 100644 index 6c9bab7..0000000 Binary files a/figure/appendixes/openbox/f05.png and /dev/null differ diff --git a/figure/appendixes/openbox/f06.png b/figure/appendixes/openbox/f06.png deleted file mode 100644 index cea7720..0000000 Binary files a/figure/appendixes/openbox/f06.png and /dev/null differ diff --git a/figure/appendixes/openbox/f07.png b/figure/appendixes/openbox/f07.png deleted file mode 100644 index b9d20a5..0000000 Binary files a/figure/appendixes/openbox/f07.png and /dev/null differ diff --git a/figure/appendixes/openbox/f08.png b/figure/appendixes/openbox/f08.png deleted file mode 100644 index c67efbe..0000000 Binary files a/figure/appendixes/openbox/f08.png and /dev/null differ diff --git a/figure/appendixes/openbox/f11.png b/figure/appendixes/openbox/f11.png deleted file mode 100644 index ee5a310..0000000 Binary files a/figure/appendixes/openbox/f11.png and /dev/null differ diff --git a/figure/appendixes/openbox/f12.png b/figure/appendixes/openbox/f12.png deleted file mode 100644 index ddd98f8..0000000 Binary files a/figure/appendixes/openbox/f12.png and /dev/null differ diff --git a/figure/appendixes/openbox/f13.png b/figure/appendixes/openbox/f13.png deleted file mode 100644 index 315c25b..0000000 Binary files a/figure/appendixes/openbox/f13.png and /dev/null differ diff --git a/figure/appendixes/openbox/f14.png b/figure/appendixes/openbox/f14.png deleted file mode 100644 index fb2fdd2..0000000 Binary files a/figure/appendixes/openbox/f14.png and /dev/null differ diff --git a/figure/appendixes/openbox/f15.png b/figure/appendixes/openbox/f15.png deleted file mode 100644 index 1d46ca8..0000000 Binary files a/figure/appendixes/openbox/f15.png and /dev/null differ diff --git a/figure/appendixes/openbox/f16.png b/figure/appendixes/openbox/f16.png deleted file mode 100644 index 408ed26..0000000 Binary files a/figure/appendixes/openbox/f16.png and /dev/null differ diff --git a/figure/appendixes/openbox/f17.png b/figure/appendixes/openbox/f17.png deleted file mode 100644 index f8604e9..0000000 Binary files a/figure/appendixes/openbox/f17.png and /dev/null differ diff --git a/figure/appendixes/openbox/f18.png b/figure/appendixes/openbox/f18.png deleted file mode 100644 index ed563b7..0000000 Binary files a/figure/appendixes/openbox/f18.png and /dev/null differ diff --git a/figure/appendixes/openbox/f19.png b/figure/appendixes/openbox/f19.png deleted file mode 100644 index 0468a3a..0000000 Binary files a/figure/appendixes/openbox/f19.png and /dev/null differ diff --git a/figure/appendixes/openbox/f20.png b/figure/appendixes/openbox/f20.png deleted file mode 100644 index b3ee7a7..0000000 Binary files a/figure/appendixes/openbox/f20.png and /dev/null differ diff --git a/figure/appendixes/openbox/f21.png b/figure/appendixes/openbox/f21.png deleted file mode 100644 index 3866bbf..0000000 Binary files a/figure/appendixes/openbox/f21.png and /dev/null differ diff --git a/figure/appendixes/openbox/f22.png b/figure/appendixes/openbox/f22.png deleted file mode 100644 index 7ae9490..0000000 Binary files a/figure/appendixes/openbox/f22.png and /dev/null differ diff --git a/figure/appendixes/openbox/f23.png b/figure/appendixes/openbox/f23.png deleted file mode 100644 index 241deaf..0000000 Binary files a/figure/appendixes/openbox/f23.png and /dev/null differ diff --git a/figure/appendixes/openbox/f24.png b/figure/appendixes/openbox/f24.png deleted file mode 100644 index b30dccc..0000000 Binary files a/figure/appendixes/openbox/f24.png and /dev/null differ diff --git a/figure/appendixes/openbox/f25.png b/figure/appendixes/openbox/f25.png deleted file mode 100644 index 40e1eb6..0000000 Binary files a/figure/appendixes/openbox/f25.png and /dev/null differ diff --git a/figure/appendixes/openbox/f26.png b/figure/appendixes/openbox/f26.png deleted file mode 100644 index a21459b..0000000 Binary files a/figure/appendixes/openbox/f26.png and /dev/null differ diff --git a/figure/appendixes/openbox/f27.png b/figure/appendixes/openbox/f27.png deleted file mode 100644 index 83ba863..0000000 Binary files a/figure/appendixes/openbox/f27.png and /dev/null differ diff --git a/figure/appendixes/openbox/f28.png b/figure/appendixes/openbox/f28.png deleted file mode 100644 index 4aa8f2a..0000000 Binary files a/figure/appendixes/openbox/f28.png and /dev/null differ diff --git a/figure/appendixes/openbox/f29.png b/figure/appendixes/openbox/f29.png deleted file mode 100644 index f6a713b..0000000 Binary files a/figure/appendixes/openbox/f29.png and /dev/null differ diff --git a/figure/appendixes/openbox/f30.png b/figure/appendixes/openbox/f30.png deleted file mode 100644 index 0c26214..0000000 Binary files a/figure/appendixes/openbox/f30.png and /dev/null differ diff --git a/figure/appendixes/openbox/f31.png b/figure/appendixes/openbox/f31.png deleted file mode 100644 index 1cce3d1..0000000 Binary files a/figure/appendixes/openbox/f31.png and /dev/null differ diff --git a/figure/appendixes/openbox/f32.png b/figure/appendixes/openbox/f32.png deleted file mode 100644 index ec5dcdd..0000000 Binary files a/figure/appendixes/openbox/f32.png and /dev/null differ diff --git a/figure/chapters/sdn-openbox/empty-flowtable.jpg b/figure/chapters/sdn-openbox/empty-flowtable.jpg deleted file mode 100644 index 49c76a9..0000000 Binary files a/figure/chapters/sdn-openbox/empty-flowtable.jpg and /dev/null differ diff --git a/figure/chapters/sdn-openbox/empty-flowtable.png b/figure/chapters/sdn-openbox/empty-flowtable.png new file mode 100644 index 0000000..c49ae43 Binary files /dev/null and b/figure/chapters/sdn-openbox/empty-flowtable.png differ diff --git a/figure/chapters/sdn-openbox/flowtable-ping.jpg b/figure/chapters/sdn-openbox/flowtable-ping.jpg deleted file mode 100644 index 4978088..0000000 Binary files a/figure/chapters/sdn-openbox/flowtable-ping.jpg and /dev/null differ diff --git a/figure/chapters/sdn-openbox/flowtable-ping.png b/figure/chapters/sdn-openbox/flowtable-ping.png new file mode 100644 index 0000000..dc1fb47 Binary files /dev/null and b/figure/chapters/sdn-openbox/flowtable-ping.png differ diff --git a/figure/chapters/sdn-openbox/port-flowtable.jpg b/figure/chapters/sdn-openbox/port-flowtable.jpg deleted file mode 100644 index 360c1bd..0000000 Binary files a/figure/chapters/sdn-openbox/port-flowtable.jpg and /dev/null differ diff --git a/figure/chapters/sdn-openbox/port-flowtable.png b/figure/chapters/sdn-openbox/port-flowtable.png new file mode 100644 index 0000000..96a65fa Binary files /dev/null and b/figure/chapters/sdn-openbox/port-flowtable.png differ diff --git a/figure/chapters/sdn-openbox/sdn-host.jpg b/figure/chapters/sdn-openbox/sdn-host.jpg deleted file mode 100644 index 332c95d..0000000 Binary files a/figure/chapters/sdn-openbox/sdn-host.jpg and /dev/null differ diff --git a/figure/chapters/sdn-openbox/sdn-host.png b/figure/chapters/sdn-openbox/sdn-host.png new file mode 100644 index 0000000..22e9d2e Binary files /dev/null and b/figure/chapters/sdn-openbox/sdn-host.png differ diff --git a/figure/chapters/sdn-openbox/sdn-main.png b/figure/chapters/sdn-openbox/sdn-main.png new file mode 100644 index 0000000..551914f Binary files /dev/null and b/figure/chapters/sdn-openbox/sdn-main.png differ diff --git a/figure/chapters/sdn-openbox/sdn-switch.jpg b/figure/chapters/sdn-openbox/sdn-switch.jpg deleted file mode 100644 index 88decd6..0000000 Binary files a/figure/chapters/sdn-openbox/sdn-switch.jpg and /dev/null differ diff --git a/figure/chapters/sdn-openbox/sdn-switch.png b/figure/chapters/sdn-openbox/sdn-switch.png new file mode 100644 index 0000000..b3789f4 Binary files /dev/null and b/figure/chapters/sdn-openbox/sdn-switch.png differ diff --git a/figure/chapters/sdn-openbox/sdn-test-topo.jpg b/figure/chapters/sdn-openbox/sdn-test-topo.jpg deleted file mode 100644 index 444d449..0000000 Binary files a/figure/chapters/sdn-openbox/sdn-test-topo.jpg and /dev/null differ diff --git a/figure/chapters/sdn-openbox/sdn-test-topo.png b/figure/chapters/sdn-openbox/sdn-test-topo.png new file mode 100644 index 0000000..0ff6613 Binary files /dev/null and b/figure/chapters/sdn-openbox/sdn-test-topo.png differ diff --git a/instructions.tex b/instructions.tex new file mode 100644 index 0000000..37d122b --- /dev/null +++ b/instructions.tex @@ -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} \ No newline at end of file