From 9f071eb5a022911e98b893751839e51353c86429 Mon Sep 17 00:00:00 2001
From: freedomlove <335946148@qq.com>
Date: Sun, 21 Feb 2021 20:06:18 +0800
Subject: [PATCH 01/12] =?UTF-8?q?=E5=8D=95=E5=85=83=E4=BA=8C+code?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CODE/chapter2/SMTPClient.py | 66 ++++++++++++++++++++++++++++++
CODE/chapter2/UDP_Pinger_Client.py | 19 +++++++++
CODE/chapter2/UDP_Pinger_Server.py | 11 +++++
CODE/chapter2/Websever.py | 62 ++++++++++++++++++++++++++++
data/chapter2/section1.tex | 7 ++++
data/chapter2/section2.tex | 6 +++
data/chapter2/section3.tex | 6 +++
data/preface.tex | 2 +-
8 files changed, 178 insertions(+), 1 deletion(-)
create mode 100644 CODE/chapter2/SMTPClient.py
create mode 100644 CODE/chapter2/UDP_Pinger_Client.py
create mode 100644 CODE/chapter2/UDP_Pinger_Server.py
create mode 100644 CODE/chapter2/Websever.py
diff --git a/CODE/chapter2/SMTPClient.py b/CODE/chapter2/SMTPClient.py
new file mode 100644
index 0000000..dd332d2
--- /dev/null
+++ b/CODE/chapter2/SMTPClient.py
@@ -0,0 +1,66 @@
+from socket import *
+from base64 import *
+
+mailfrom = "mail from:2@test.com\r\n"
+rcptto = "rcpt to:1@test.com\r\n"
+data = "data\r\n"
+quitmsg = "quit\r\n"
+
+msg = "\r\n I love computer networks!"
+endmsg = "\r\n.\r\n"
+#此处使用易邮邮件服务器软件搭建了一个内网邮件服务器
+mailserver = '10.130.82.62'
+mailport = 25
+connectaddress = (mailserver, mailport)
+# Create socket called clientSocket and establish a TCP connection with mailserver
+clientSocket = socket(AF_INET, SOCK_STREAM)
+clientSocket.connect(connectaddress)
+
+recv = clientSocket.recv(1024)
+print (recv)
+if recv[:3] != '220':
+ print ('220 reply not received from server.')
+# Send HELO command and print server response.
+heloCommand = 'HELO Alice\r\n'
+clientSocket.send(bytes(heloCommand.encode()))
+recv1 = clientSocket.recv(1024)
+print (recv1.decode())
+if recv1[:3] != '250':
+ print ('250 reply not received from server.')
+
+#print('000000000000000')
+#从命令和打印服务器响应发送邮件。
+login = b'auth login\r\n'
+clientSocket.send(login)
+recv2 = clientSocket.recv(1024).decode('utf-8')
+print ('222+',recv2)
+
+userCommand = b64encode('2@test.com'.encode('utf-8'))
+clientSocket.send((str(userCommand,encoding='utf-8')+'\r\n').encode())
+recv3 = clientSocket.recv(1024).decode('utf-8')
+print ('333+',recv3)
+
+password = b64encode('2'.encode('utf-8'))
+clientSocket.send((str(password,encoding='utf-8')+'\r\n').encode())
+recv4 = clientSocket.recv(1024).decode('utf-8')
+print ('444+',recv4)
+
+#print('0000000000000000')
+
+clientSocket.send(bytes(mailfrom.encode()))
+check = clientSocket.recv(1024)
+print(check)
+clientSocket.send(bytes(rcptto.encode()))#将RCPT发送到命令和打印服务器响应。
+check1 = clientSocket.recv(1024)
+print(check1)
+clientSocket.send(bytes(data.encode()))#发送数据命令和打印服务器响应。
+check2 = clientSocket.recv(1024)
+print(check2)
+clientSocket.send(bytes((mailfrom+msg+endmsg).encode()))#发送消息数据。
+check3 = clientSocket.recv(1024)
+print(check3)
+#发送退出命令并获得服务器响应。
+clientSocket.send(bytes(quitmsg.encode()))
+check4 = clientSocket.recv(1024)
+print(check4)
+clientSocket.close()
diff --git a/CODE/chapter2/UDP_Pinger_Client.py b/CODE/chapter2/UDP_Pinger_Client.py
new file mode 100644
index 0000000..db005cf
--- /dev/null
+++ b/CODE/chapter2/UDP_Pinger_Client.py
@@ -0,0 +1,19 @@
+from socket import *
+import time
+serverName = 'localhost'
+serverPort = 12000
+clientSocket = socket(AF_INET, SOCK_DGRAM)
+clientSocket.settimeout(1)
+
+for i in range(0, 10):
+ sendTime = time.time()
+ message = ('Ping %d %s' % (i + 1, sendTime)).encode()
+ try:
+ clientSocket.sendto(message, (serverName, serverPort))
+ modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
+ rtt = time.time() - sendTime
+ print('Sequence %d: Reply from %s RTT = %.3fs' % (i + 1, serverName, rtt))
+ except Exception as e:
+ print('Sequence %d: Request timed out' % (i + 1))
+
+clientSocket.close()
diff --git a/CODE/chapter2/UDP_Pinger_Server.py b/CODE/chapter2/UDP_Pinger_Server.py
new file mode 100644
index 0000000..25bda49
--- /dev/null
+++ b/CODE/chapter2/UDP_Pinger_Server.py
@@ -0,0 +1,11 @@
+import random
+from socket import *
+serverSocket = socket(AF_INET, SOCK_DGRAM)
+serverSocket.bind(('', 12000))
+while True:
+ rand = random.randint(0, 10)
+ message, address = serverSocket.recvfrom(1024)
+ message = message.upper()
+ if (rand < 4):
+ continue
+ serverSocket.sendto(message, address)
diff --git a/CODE/chapter2/Websever.py b/CODE/chapter2/Websever.py
new file mode 100644
index 0000000..1d72b0d
--- /dev/null
+++ b/CODE/chapter2/Websever.py
@@ -0,0 +1,62 @@
+# Import socket module
+from socket import *
+import sys # In order to terminate the program
+
+# Create a TCP server socket
+#(AF_INET is used for IPv4 protocols)
+#(SOCK_STREAM is used for TCP)
+
+serverSocket = socket(AF_INET, SOCK_STREAM)
+
+# Assign a port number
+serverPort = 80
+
+# Bind the socket to server address and server port
+serverSocket.bind(("", serverPort))
+
+# Listen to at most 1 connection at a time
+serverSocket.listen(1)
+
+# Server should be up and running and listening to the incoming connections
+
+while True:
+ print('The server is ready to receive')
+
+ # Set up a new connection from the client
+ connectionSocket, addr = serverSocket.accept()
+
+ # If an exception occurs during the execution of try clause
+ # the rest of the clause is skipped
+ # If the exception type matches the word after except
+ # the except clause is executed
+ try:
+ # Receives the request message from the client
+ message = connectionSocket.recv(1024).decode()
+ # Extract the path of the requested object from the message
+ # The path is the second part of HTTP header, identified by [1]
+ filename = message.split()[1]
+ # Because the extracted path of the HTTP request includes
+ # a character '\', we read the path from the second character
+ f = open(filename[1:])
+ # Store the entire contenet of the requested file in a temporary buffer
+ outputdata = f.read()
+ # Send the HTTP response header line to the connection socket
+ connectionSocket.send("HTTP/1.1 200 OK\r\n\r\n".encode())
+
+ # Send the content of the requested file to the connection socket
+ for i in range(0, len(outputdata)):
+ connectionSocket.send(outputdata[i].encode())
+ connectionSocket.send("\r\n".encode())
+
+ # Close the client connection socket
+ connectionSocket.close()
+
+ except IOError:
+ # Send HTTP response message for file not found
+ connectionSocket.send("HTTP/1.1 404 Not Found\r\n\r\n".encode())
+ connectionSocket.send("
404 Not Found
\r\n".encode())
+ # Close the client connection socket
+ connectionSocket.close()
+
+serverSocket.close()
+sys.exit()#Terminate the program after sending the corresponding data
diff --git a/data/chapter2/section1.tex b/data/chapter2/section1.tex
index a2cc234..5022c15 100644
--- a/data/chapter2/section1.tex
+++ b/data/chapter2/section1.tex
@@ -60,6 +60,13 @@ UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠
\item 服务器程序(实验步骤中已给出)。
\end{itemize}
+
+参考资料:
+
+\begin{itemize}
+ \item {J.F Kurose and K.W. Ross, 计算机网络自顶向下方法(第7版)}
+\end{itemize}
+
\subsection{实验步骤}
\label{subsec:c2_s1_procedure}
diff --git a/data/chapter2/section2.tex b/data/chapter2/section2.tex
index 6c7b08f..59801ec 100644
--- a/data/chapter2/section2.tex
+++ b/data/chapter2/section2.tex
@@ -47,6 +47,12 @@ Web服务器接受并解析HTTP请求,从服务器的文件系统中获取请
\item 部分代码(实验步骤中已给出)。
\end{itemize}
+参考资料:
+
+\begin{itemize}
+ \item {J.F Kurose and K.W. Ross, 计算机网络自顶向下方法(第7版)}
+\end{itemize}
+
\subsection{实验步骤}
\label{subsec:c2_s2_procedure}
diff --git a/data/chapter2/section3.tex b/data/chapter2/section3.tex
index ecb3db5..5b53105 100644
--- a/data/chapter2/section3.tex
+++ b/data/chapter2/section3.tex
@@ -76,6 +76,12 @@ RFC5321给出了SMTP的定义。SMTP有众多出色的性质,
\item 部分代码(实验步骤中已给出)。
\end{itemize}
+参考资料:
+
+\begin{itemize}
+ \item {J.F Kurose and K.W. Ross, 计算机网络自顶向下方法(第7版)}
+\end{itemize}
+
\subsection{实验步骤}
\label{subsec:c2_s3_procedure}
diff --git a/data/preface.tex b/data/preface.tex
index 3a80219..f0942cc 100644
--- a/data/preface.tex
+++ b/data/preface.tex
@@ -22,7 +22,7 @@
\begin{itemize}
\item 第一单元:谢怡、陈建发、洪劼超、雷蕴奇,厦门大学
- \item 第二单元:吴荻,国防科技大学
+ \item 第二单元:吴荻、徐明、夏竟、胡罡,国防科技大学
\item 第三单元:张晓丽,昆明理工大学
\end{itemize}
From 120d0bd993a95c47146e9d751888dc36359e2ff4 Mon Sep 17 00:00:00 2001
From: xphi
Date: Mon, 22 Feb 2021 18:39:55 +0800
Subject: [PATCH 02/12] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BA=86=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=E5=9D=97=E7=9A=84=E7=8E=AF=E5=A2=83=EF=BC=8C=E6=8D=A2?=
=?UTF-8?q?=E7=94=A8=E4=BA=86tcolorbox=20+=20minted=E7=8E=AF=E5=A2=83?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
data/chapter1/section3.tex | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/data/chapter1/section3.tex b/data/chapter1/section3.tex
index bb5ebcf..cae6bfe 100644
--- a/data/chapter1/section3.tex
+++ b/data/chapter1/section3.tex
@@ -471,9 +471,9 @@ CUBIC的关键特征是:cwnd窗口的增长依赖两次丢包的时间。
\subsection{附件}
\label{subsec:c1_s3_additionalprg}
1. Python3 TCP socket通信程序。
+
\ 服务端 server.py
-\lstset{language=python3}
-\begin{lstlisting}
+\begin{code}[python]
import socket
import time
def recv_data(sock,length):
@@ -499,11 +499,10 @@ CUBIC的关键特征是:cwnd窗口的增长依赖两次丢包的时间。
finally:
sc.close()
s.close()
-\end{lstlisting}
-\\
-\ 客户端 client.py
-\lstset{language=python3}
-\begin{lstlisting}
+\end{code}
+
+客户端 client.py
+\begin{code}[python]
import socket
import time
ip_port = ("192.168.100.144", 9999)
@@ -522,4 +521,4 @@ CUBIC的关键特征是:cwnd窗口的增长依赖两次丢包的时间。
print("Sent. Waiting....")
while True:
time.sleep(0.001)
-\end{lstlisting}
\ No newline at end of file
+\end{code}
\ No newline at end of file
From 8aabbe730386771bc0c6aa2326dc1c68e15bdc06 Mon Sep 17 00:00:00 2001
From: xphi
Date: Tue, 23 Feb 2021 15:49:07 +0800
Subject: [PATCH 03/12] =?UTF-8?q?=E7=BF=BB=E6=96=B0=E9=A1=B9=E7=9B=AE?=
=?UTF-8?q?=E7=9B=AE=E5=BD=95=E7=BB=93=E6=9E=84=EF=BC=8C=E4=BF=AE=E6=AD=A3?=
=?UTF-8?q?=E9=83=A8=E5=88=86=E9=94=99=E8=AF=AF=20=09=E8=B0=83=E6=95=B4?=
=?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=BB=93=E6=9E=84=EF=BC=8C=E4=B8=8D=E5=86=8D?=
=?UTF-8?q?=E4=BB=A5=E5=BA=8F=E5=8F=B7=E4=B8=BA=E7=AB=A0=E8=8A=82=E5=91=BD?=
=?UTF-8?q?=E5=90=8D=EF=BC=8C=E6=96=B9=E4=BE=BF=E7=AB=A0=E8=8A=82=E9=A1=BA?=
=?UTF-8?q?=E5=BA=8F=E7=9A=84=E8=B0=83=E6=95=B4=20=09=E8=B0=83=E6=95=B4?=
=?UTF-8?q?=E7=AB=A0=E8=8A=82=E6=A0=87=E7=AD=BE=E7=BC=96=E5=8F=B7=E6=96=B9?=
=?UTF-8?q?=E5=BC=8F=EF=BC=8C=E9=85=8D=E5=90=88=E7=AB=A0=E8=8A=82=E5=91=BD?=
=?UTF-8?q?=E5=90=8D=E6=96=B9=E5=BC=8F=E7=9A=84=E5=8F=98=E5=8C=96=20=09?=
=?UTF-8?q?=E8=B0=83=E6=95=B4=E8=A1=A8=E6=A0=BC=E6=A0=BC=E5=BC=8F=EF=BC=8C?=
=?UTF-8?q?=E4=B8=8D=E5=86=8D=E4=BD=BF=E7=94=A8=E4=B8=89=E7=BA=BF=E8=A1=A8?=
=?UTF-8?q?=E6=A8=A1=E5=BC=8F=20=09=E8=B0=83=E6=95=B4=E9=83=A8=E5=88=86?=
=?UTF-8?q?=E5=AD=97=E4=BD=93=20=09=E4=BF=AE=E6=95=B4=E9=83=A8=E5=88=86?=
=?UTF-8?q?=E5=9B=BE=E8=A1=A8=E6=A0=87=E7=AD=BE=E5=8F=8A=E5=BC=95=E7=94=A8?=
=?UTF-8?q?=E9=94=99=E8=AF=AF=20=09=E4=BF=AE=E6=AD=A3=E8=A1=A8=E5=BA=8F?=
=?UTF-8?q?=E5=8F=B7=E6=B2=A1=E6=9C=89=E6=8C=89=E8=8A=82=E7=BC=96=E5=8F=B7?=
=?UTF-8?q?=E7=9A=84=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Readme.md | 17 +-
instructions.cfg => book/instructions.cfg | 2 +-
instructions.cls => book/instructions.cls | 11 +-
instructions.tex => book/instructions.tex | 61 ++++---
compile.bat | 2 +-
data/appendix/ensp.tex | 26 +--
data/{chapter3 => ch_ensp}/preface.tex | 0
.../section3.tex => ch_ensp/sec_ospf.tex} | 38 ++---
.../section2.tex => ch_ensp/sec_rip.tex} | 32 ++--
.../section1.tex => ch_ensp/sec_static.tex} | 34 ++--
data/{chapter2 => ch_socket}/preface.tex | 0
.../section3.tex => ch_socket/sec_smtp.tex} | 20 +--
.../section1.tex => ch_socket/sec_udp.tex} | 22 +--
.../section2.tex => ch_socket/sec_web.tex} | 27 ++--
data/{chapter1 => ch_wireshark}/preface.tex | 2 +-
.../section1.tex => ch_wireshark/sec_arp.tex} | 133 +++++++--------
.../section2.tex => ch_wireshark/sec_ip.tex} | 153 ++++++++++--------
.../section3.tex => ch_wireshark/sec_tcp.tex} | 115 ++++++-------
data/preface.tex | 1 +
.../ensp/OSPF-topo.png} | Bin
.../ensp/RIP-topo.png} | Bin
.../ensp/confirm.jpg} | Bin
.../ensp/ping_1.png} | Bin
.../ensp/ping_2.jpg} | Bin
.../ensp/static-topo.png} | Bin
.../ensp/sysname-R1_1.png} | Bin
.../ensp/sysname-R1_2.jpg} | Bin
.../ensp/sysname-R1_3.jpg} | Bin
.../ensp/sysname-R2_1.png} | Bin
.../ensp/sysname-R2_2.jpg} | Bin
.../ensp/sysname-R2_3.jpg} | Bin
.../socket/tcp-flow.png} | Bin
.../socket/udp-flow.png} | Bin
.../wireshark/TCP-status-machine.png} | Bin
.../wireshark/TCP-structure.png} | Bin
.../wireshark/TCP-time-line.png} | Bin
.../wireshark/TCP-topo.png} | Bin
.../wireshark/VM-advance-setup.png} | Bin
.../wireshark/arp-format.png} | Bin
.../wireshark/echo-request.png} | Bin
.../wireshark/eth-frame-detail.png} | Bin
.../wireshark/icmp-structure.png} | Bin
.../wireshark/io-graphs.png} | Bin
.../wireshark/ip-structure.png} | Bin
.../wireshark/ip-view.png} | Bin
.../wireshark/ping-exec.png} | Bin
.../wireshark/traceroute-exec.png} | Bin
.../wireshark/wireshark-boot-ui.png} | Bin
.../wireshark/wireshark-filter-setup.png} | Bin
.../wireshark/wireshark-filters.png} | Bin
.../wireshark/wireshark-main-ui.png} | Bin
.../wireshark/wireshark-monitor.png} | Bin
.../wireshark/wireshark-save.png} | Bin
.../wireshark/wireshark-setup-ui.png} | Bin
.../wireshark/wireshark-special-type.png} | Bin
.../wireshark/wireshark-statistic.png} | Bin
56 files changed, 370 insertions(+), 326 deletions(-)
rename instructions.cfg => book/instructions.cfg (94%)
rename instructions.cls => book/instructions.cls (98%)
rename instructions.tex => book/instructions.tex (60%)
rename data/{chapter3 => ch_ensp}/preface.tex (100%)
rename data/{chapter3/section3.tex => ch_ensp/sec_ospf.tex} (88%)
rename data/{chapter3/section2.tex => ch_ensp/sec_rip.tex} (91%)
rename data/{chapter3/section1.tex => ch_ensp/sec_static.tex} (90%)
rename data/{chapter2 => ch_socket}/preface.tex (100%)
rename data/{chapter2/section3.tex => ch_socket/sec_smtp.tex} (93%)
rename data/{chapter2/section1.tex => ch_socket/sec_udp.tex} (91%)
rename data/{chapter2/section2.tex => ch_socket/sec_web.tex} (88%)
rename data/{chapter1 => ch_wireshark}/preface.tex (86%)
rename data/{chapter1/section1.tex => ch_wireshark/sec_arp.tex} (78%)
rename data/{chapter1/section2.tex => ch_wireshark/sec_ip.tex} (79%)
rename data/{chapter1/section3.tex => ch_wireshark/sec_tcp.tex} (91%)
rename figure/{chapter3/c3_OSPF-topo.png => chapters/ensp/OSPF-topo.png} (100%)
rename figure/{chapter3/c3_RIP-topo.png => chapters/ensp/RIP-topo.png} (100%)
rename figure/{chapter3/c3_confirm.jpg => chapters/ensp/confirm.jpg} (100%)
rename figure/{chapter3/c3_ping_1.png => chapters/ensp/ping_1.png} (100%)
rename figure/{chapter3/c3_ping_2.jpg => chapters/ensp/ping_2.jpg} (100%)
rename figure/{chapter3/c3_static-topo.png => chapters/ensp/static-topo.png} (100%)
rename figure/{chapter3/c3_sysname-R1_1.png => chapters/ensp/sysname-R1_1.png} (100%)
rename figure/{chapter3/c3_sysname-R1_2.jpg => chapters/ensp/sysname-R1_2.jpg} (100%)
rename figure/{chapter3/c3_sysname-R1_3.jpg => chapters/ensp/sysname-R1_3.jpg} (100%)
rename figure/{chapter3/c3_sysname-R2_1.png => chapters/ensp/sysname-R2_1.png} (100%)
rename figure/{chapter3/c3_sysname-R2_2.jpg => chapters/ensp/sysname-R2_2.jpg} (100%)
rename figure/{chapter3/c3_sysname-R2_3.jpg => chapters/ensp/sysname-R2_3.jpg} (100%)
rename figure/{chapter2/c2_tcp-flow.png => chapters/socket/tcp-flow.png} (100%)
rename figure/{chapter2/c2_udp-flow.png => chapters/socket/udp-flow.png} (100%)
rename figure/{chapter1/c1_TCP-status-machine.png => chapters/wireshark/TCP-status-machine.png} (100%)
rename figure/{chapter1/c1_TCP-structure.png => chapters/wireshark/TCP-structure.png} (100%)
rename figure/{chapter1/c1_TCP-time-line.png => chapters/wireshark/TCP-time-line.png} (100%)
rename figure/{chapter1/c1_TCP-topo.png => chapters/wireshark/TCP-topo.png} (100%)
rename figure/{chapter1/c1_VM-advance-setup.png => chapters/wireshark/VM-advance-setup.png} (100%)
rename figure/{chapter1/c1_arp-format.png => chapters/wireshark/arp-format.png} (100%)
rename figure/{chapter1/c1_echo-request.png => chapters/wireshark/echo-request.png} (100%)
rename figure/{chapter1/c1_eth-frame-detail.png => chapters/wireshark/eth-frame-detail.png} (100%)
rename figure/{chapter1/c1_icmp-structure.png => chapters/wireshark/icmp-structure.png} (100%)
rename figure/{chapter1/c1_io-graphs.png => chapters/wireshark/io-graphs.png} (100%)
rename figure/{chapter1/c1_ip-structure.png => chapters/wireshark/ip-structure.png} (100%)
rename figure/{chapter1/c1_ip-view.png => chapters/wireshark/ip-view.png} (100%)
rename figure/{chapter1/c1_ping-exec.png => chapters/wireshark/ping-exec.png} (100%)
rename figure/{chapter1/c1_traceroute-exec.png => chapters/wireshark/traceroute-exec.png} (100%)
rename figure/{chapter1/c1_wireshark-boot-ui.png => chapters/wireshark/wireshark-boot-ui.png} (100%)
rename figure/{chapter1/c1_wireshark-filter-setup.png => chapters/wireshark/wireshark-filter-setup.png} (100%)
rename figure/{chapter1/c1_wireshark-filters.png => chapters/wireshark/wireshark-filters.png} (100%)
rename figure/{chapter1/c1_wireshark-main-ui.png => chapters/wireshark/wireshark-main-ui.png} (100%)
rename figure/{chapter1/c1_wireshark-monitor.png => chapters/wireshark/wireshark-monitor.png} (100%)
rename figure/{chapter1/c1_wireshark-save.png => chapters/wireshark/wireshark-save.png} (100%)
rename figure/{chapter1/c1_wireshark-setup-ui.png => chapters/wireshark/wireshark-setup-ui.png} (100%)
rename figure/{chapter1/c1_wireshark-special-type.png => chapters/wireshark/wireshark-special-type.png} (100%)
rename figure/{chapter1/c1_wireshark-statistic.png => chapters/wireshark/wireshark-statistic.png} (100%)
diff --git a/Readme.md b/Readme.md
index ad7bd80..97cb99f 100644
--- a/Readme.md
+++ b/Readme.md
@@ -11,21 +11,30 @@
项目根目录下的目录功能如下:
+* book:实验指导书主文件
* data:实验指导书分章节内容
+* code:参考代码
* figure:用到的图片
* bib:参考文献
## 3. 编译
-1. Windows 环境下,需要安装最新版texlive套件,然后在工程目录下运行以下命令编译:
+因为使用minted宏包对文中的代码进行语法高亮,因此在编译代码前需要安装minted的依赖Pygments。
+建议使用Python的包管理工具进行安装。Pygments可以在各种操作系统下运行。
- ```shell
+``` shell
+$ pip install Pygments
+```
+
+1. Windows 环境下,推荐使用最新版TeX Live套件,然后在工程目录下运行以下命令编译:
+
+ ``` shell
compile.bat
```
-2. MacOS 环境下,需要安装MacTex套件,然后编译。
+2. MacOS 环境下,推荐使用MacTex套件,然后编译。
-3. Linux 环境下,需要安装texlive套件,然后编译。
+3. Linux 环境下,推荐使用最新版TeX Live套件,然后编译。
## 4. 说明
diff --git a/instructions.cfg b/book/instructions.cfg
similarity index 94%
rename from instructions.cfg
rename to book/instructions.cfg
index 0795729..27a6315 100644
--- a/instructions.cfg
+++ b/book/instructions.cfg
@@ -1,6 +1,6 @@
%# -*- coding: utf-8-unix -*-
%======================================================================
-%% qbook.cfg for Qbook Template
+%% Book Configurations
%======================================================================
\ProvidesFile{qbook.cfg}[2019/03/19 v1.00 Qbook configuration file]
\def\q@contentsname{目~~~~录}
diff --git a/instructions.cls b/book/instructions.cls
similarity index 98%
rename from instructions.cls
rename to book/instructions.cls
index de237c3..aa142bc 100644
--- a/instructions.cls
+++ b/book/instructions.cls
@@ -30,7 +30,7 @@
\RequirePackage{fancyhdr}
\RequirePackage{lastpage}
\RequirePackage{amsmath,mathtools,amsthm,amsfonts,amssymb,bm}
-\RequirePackage{sourcecodepro}
+% \RequirePackage{sourcecodepro}
\RequirePackage{upgreek}
\RequirePackage{wasysym}
\RequirePackage{anyfontsize}
@@ -66,6 +66,7 @@
\newcommand{\sectionbreak}{\clearpage}
\usepackage{setspace}
+% \usepackage{makecell}
%======================================================================
% 导入tikz库
@@ -196,8 +197,7 @@
% 设置item条目的索引符号为bullet
\renewcommand{\labelitemi}{\ensuremath{\RHD}}
%======================================================================
-% 设置图片载入路径及扩展名
-\graphicspath{{fig/}{figure/}{figures/}{logo/}{logos/}{graph/}{graphs}}
+% 设置图片扩展名
\DeclareGraphicsExtensions{.pdf,.eps,.png,.jpg,.jpeg}
%======================================================================
% 设置图片的标题样式
@@ -227,6 +227,7 @@
%======================================================================
% 定理、公式、图、表的编号为"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}
@@ -405,10 +406,10 @@
listing only,
breakable=true,
minted language=#1,
- frame empty,
+ % frame empty,
extras={frame empty},
% minted style=colorful,
- fontupper=\footnotesize,
+ fontupper=\small,
minted options={ %自动移除前置空白、制表为4字符、mathhe和||内的不处理
breaksymbol=,
autogobble,
diff --git a/instructions.tex b/book/instructions.tex
similarity index 60%
rename from instructions.tex
rename to book/instructions.tex
index fd8aee7..c39aa3e 100644
--- a/instructions.tex
+++ b/book/instructions.tex
@@ -3,18 +3,21 @@
% instructions.tex for Computer Network Assigenment & Project Instructions
%=========================================================================
% 双面打印
-\documentclass{instructions}
-\addbibresource{bib/main.bib} % 导入参考文献数据库
+% \documentclass[fontset=fandol]{../format/instructions}
+\documentclass[]{instructions}
+\addbibresource{../bib/main.bib} % 导入参考文献数据库
\begin{document}
\pagestyle{empty}
-\include{data/cover} % 载入封面
+\input{../data/cover} % 载入封面
+%=========================================================================
+% 版本声明
+\clearpage
\begin{center}
\Large{\sffamily\bfseries\heiti Version 0.4} \\ \vspace{2em}
\Large{\sffamily\bfseries\heiti 发布日期: \today} \\ \vspace{1em}
- % \Large{\sffamily\bfseries\heiti 任何建议及错误信息请发送至邮箱} \\
- % \texttt{jey74165@163.com}
\end{center}
+
% \vfill
% \vspace{30em}
% \begin{tabular*}{\textwidth}{ccc}
@@ -26,15 +29,18 @@
% \end{minipage}
% \end{tabular*}
+%=========================================================================
+% 前言
\thispagestyle{empty}
\frontmatter % 对前言和概览用罗马数字作为页码
\pagestyle{empty}
-\include{data/preface}
+\input{../data/preface}
+
+%=========================================================================
+% 目录
\cleardoublepage
\pagestyle{empty}
\tableofcontents
-% \cleardoublepage
-% \include{tex/overview}
\mainmatter % 对正文用阿拉伯数字作为页码
%======================================================================
@@ -42,24 +48,26 @@
\pagestyle{fancy}
\setcounter{page}{1}
-\graphicspath{{figure/chapter1/}}
-\include{data/chapter1/preface}
-\include{data/chapter1/section1}
-\include{data/chapter1/section2}
-\include{data/chapter1/section3}
+\graphicspath{{../figure/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/chapter2/}}
-\include{data/chapter2/preface}
-\include{data/chapter2/section1}
-\include{data/chapter2/section2}
-\include{data/chapter2/section3}
+\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/chapter3/}}
-\include{data/chapter3/preface}
-\include{data/chapter3/section1}
-\include{data/chapter3/section2}
-\include{data/chapter3/section3}
+\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}
+%=========================================================================
+% 附录
\appendix
\titleformat{\chapter}[display]{\flushleft}{
\begin{tikzpicture}
@@ -74,13 +82,14 @@
\renewcommand{\thetable}{\Alph{chapter}--\arabic{table}}
\renewcommand{\chaptername}{附录\Alph{chapter}}
-\graphicspath{{figure/appendixes/ensp/}}
-\include{data/appendix/ensp}
+\graphicspath{{../figure/appendixes/ensp/}}
+\input{../data/appendix/ensp}
\backmatter
%======================================================================
-% 打印参考文献
+% 参考文献
% \printbibliography[heading=bibintoc]
% \makeatletter
% \makeatother
+
\end{document}
\ No newline at end of file
diff --git a/compile.bat b/compile.bat
index 846faf9..6759aad 100644
--- a/compile.bat
+++ b/compile.bat
@@ -42,7 +42,7 @@ goto :EOF
:instr
echo Compile...
- latexmk -xelatex -halt-on-error -silent instructions >nul 2>nul
+ latexmk -xelatex -shell-escape --halt-on-error -silent books\instructions >nul 2>nul
goto :EOF
:clean
diff --git a/data/appendix/ensp.tex b/data/appendix/ensp.tex
index 6fc1459..e8d5378 100644
--- a/data/appendix/ensp.tex
+++ b/data/appendix/ensp.tex
@@ -13,10 +13,10 @@
如选择的是华为ENSP最新版即19年的版本,
在安装之前须自行下载安装以下3款软件且最好版本号一致:
-\begin{figure}[!htp]
+\begin{figure}[!ht]
\centering
\includegraphics[width=11cm]{a1_ENSP-version}
- \caption{TCP连接示意时序}
+ \caption{ENSP版本}
\label{fig:a1_ENSP-version}
\end{figure}
@@ -26,18 +26,18 @@
\subsection{华为ENSP操作和使用}
华为ENSP的操作和使用,强烈建议查看其帮助,并不断实践,如图:
-\begin{figure}[!htp]
+\begin{figure}[!ht]
\centering
\includegraphics[width=13cm]{a1_ENSP-UI}
\caption{华为ENSP界面}
- \label{fig:a1_ENSP-version}
+ \label{fig:a1_ENSP-ui}
\end{figure}
-\begin{figure}[!htp]
+\begin{figure}[!ht]
\centering
\includegraphics[width=13cm]{a1_ENSP-help}
\caption{华为ENSP帮助界面}
- \label{fig:a1_ENSP-version}
+ \label{fig:a1_ENSP-help}
\end{figure}
\subsection{华为模拟设备的基本配置及其配置命令}
@@ -55,10 +55,10 @@
系统的所有命令都注册在某个(或某些)命令视图下,
只有在相应的视图下才能执行该视图下的命令。
-\begin{table}[!htp]
+\begin{table}[!ht]
\centering
\caption{命令视图分类表}
- \label{tab:c1_tools-command}
+ \label{tab:a:ensp_command_ui}
\begin{tabular}{m{5cm}<{\centering}m{6cm}<{\centering}} \toprule
视图 & 表现形式\\ \midrule
用户视图(缺省配置) & \texttt{}\\
@@ -124,10 +124,10 @@ Tab键的功用:完成一个命令的输入。在超级终端中,可能不
\item 命令行错误信息
\end{itemize}
-\begin{table}[!htp]
+\begin{table}[!ht]
\centering
\caption{帮助类型与对应命令表}
- \label{tab:c1_tools-command}
+ \label{tab:tab:a:ensp_help}
\begin{tabular}{m{2cm}<{\centering}m{5cm}<{\centering}m{6cm}<{\centering}} \toprule
帮助类型 & 表现形式 & 备注\\ \midrule
\multirow{2}{*}{完全帮助} & \texttt{?} & 相应命令模式下\\
@@ -215,10 +215,10 @@ Tab键的功用:完成一个命令的输入。在超级终端中,可能不
所有用户键入的命令,如果通过语法检查,则正确执行,
否则系统将会向用户报告错误信息。常见错误信息参见下表:
- \begin{table}[!htp]
+ \begin{table}[!ht]
\centering
\caption{命令行常见错误信息表}
- \label{tab:c1_tools-command}
+ \label{tab:tab:a:ensp_error}
\begin{tabular}{m{4cm}<{\centering}m{5cm}<{\centering}} \toprule
英文错误信息 & 错误原因\\ \midrule
\multirow{2}{*}{Unrecognized command} & 没有查找到命令\\
@@ -240,7 +240,7 @@ Tab键的功用:完成一个命令的输入。在超级终端中,可能不
模拟器毕竟是模拟的,有问题是难免的,如下图令人崩溃的设备启动后进入命令配置界面的等待。如长时间都不能正常工作,建议新建一台设备,如正常后替代失常设备,重新连线。就本人多年指导经验,各种问题会小概率出现,默认重装,更换版本则解决地较为彻底。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
\includegraphics[width=10cm]{a1_error}
\caption{令人崩溃的等待}
diff --git a/data/chapter3/preface.tex b/data/ch_ensp/preface.tex
similarity index 100%
rename from data/chapter3/preface.tex
rename to data/ch_ensp/preface.tex
diff --git a/data/chapter3/section3.tex b/data/ch_ensp/sec_ospf.tex
similarity index 88%
rename from data/chapter3/section3.tex
rename to data/ch_ensp/sec_ospf.tex
index b869c0f..d36cf6b 100644
--- a/data/chapter3/section3.tex
+++ b/data/ch_ensp/sec_ospf.tex
@@ -1,16 +1,16 @@
%# -*- coding: utf-8-unix -*-
\section{动态路由(OSPF)}
-\label{sec:c3_s3}
+\label{sec:c:ensp:s:ospf}
\subsection{实验目的}
-\label{subsec:c3_s3_object}
+\label{subsec:c:ensp:s:ospf_object}
理解动态路由协议OSPF的工作原理;
掌握采用动态路由协议OSPF进行网络设计的基本原则和方法。
\subsection{实验内容}
-\label{subsec:c3_s3_content}
+\label{subsec:c:ensp:s:ospf_content}
\begin{itemize}
\item 华为路由器IP地址的配置;
@@ -21,7 +21,7 @@
\end{itemize}
\subsection{实验原理、方法和手段}
-\label{subsec:c3_s3_principle}
+\label{subsec:c:ensp:s:ospf_principle}
简要说明OSPF工作原理和适用范围;
可设计至少包括3个由OSPF协议互连起来的网络;
@@ -29,17 +29,17 @@
分析说明相对于RIP协议,OSPF做了哪些改进。
解释说明与路由协议、路由表的相关性。
-可参考图\ref{fig:c3_OSPF-topo}连线,具体联线情况请自行标注。
+可参考图\ref{fig:c:ensp_OSPF-topo}连线,具体联线情况请自行标注。
\begin{figure}[!htp]
\centering
- \includegraphics[width=8cm]{c3_OSPF-topo}
+ \includegraphics[width=8cm]{OSPF-topo}
\caption{选中特定的捕获类型}
- \label{fig:c3_OSPF-topo}
+ \label{fig:c:ensp_OSPF-topo}
\end{figure}
\subsection{实验条件}
-\label{subsec:c3_s3_requirement}
+\label{subsec:c:ensp:s:ospf_requirement}
\begin{itemize}
\item 华为ENSP仿真平台中:2台PC,两台路由器;
@@ -47,7 +47,7 @@
\end{itemize}
\subsection{实验步骤}
-\label{subsec:c3_s3_procedure}
+\label{subsec:c:ensp:s:ospf_procedure}
实验说明:路由器端口以具体选用的设备为准,
如果是实际设备,请观察路由器前面板和后面板的端口名称,
@@ -72,12 +72,12 @@
[Huawei]sysname zhangsanR1
\end{code}
- 输出结果如图\ref{fig:c3_sysname-R1_3}所示。
+ 输出结果如图\ref{fig:c:ensp_sysname-R1_3}所示。
\begin{figure}[!htp]
\centering
- \includegraphics[width=10cm]{c3_sysname-R1_3}
+ \includegraphics[width=10cm]{sysname-R1_3}
\caption{R1的sys配置图}
- \label{fig:c3_sysname-R1_3}
+ \label{fig:c:ensp_sysname-R1_3}
\end{figure}
R2上的重命名命令如下例:
@@ -86,12 +86,12 @@
[Huawei]sysname zhangsanR2
\end{code}
- 输出结果如图\ref{fig:c3_sysname-R2_3}所示。
+ 输出结果如图\ref{fig:c:ensp_sysname-R2_3}所示。
\begin{figure}[!htp]
\centering
- \includegraphics[width=10cm]{c3_sysname-R2_3}
+ \includegraphics[width=10cm]{sysname-R2_3}
\caption{R2的sys配置图}
- \label{fig:c3_sysname-R2_3}
+ \label{fig:c:ensp_sysname-R2_3}
\end{figure}
\item 为路由器R1的 GE0接口配置IP地址。
@@ -152,8 +152,8 @@
\begin{figure}[!htp]
\centering
- \includegraphics[width=12cm]{c3_confirm}
- \label{fig:c3_confirm}
+ \includegraphics[width=12cm]{confirm}
+ \label{fig:c:ensp_confirm}
\end{figure}
确认删除?Y
@@ -193,12 +193,12 @@
\end{enumerate}
\subsection{思考题}
-\label{subsec:c3_s3_rethink}
+\label{subsec:c:ensp:s:ospf_rethink}
Rip和OSPF协议的区别是什么?请对比路由表,收敛速度等。
\subsection{注意事项及有关说明}
-\label{subsec:c3_s3_notice}
+\label{subsec:c:ensp:s:ospf_notice}
\begin{enumerate}
\item 路由器端口以具体选用的设备为准,
diff --git a/data/chapter3/section2.tex b/data/ch_ensp/sec_rip.tex
similarity index 91%
rename from data/chapter3/section2.tex
rename to data/ch_ensp/sec_rip.tex
index 85d1b16..47916a0 100644
--- a/data/chapter3/section2.tex
+++ b/data/ch_ensp/sec_rip.tex
@@ -1,16 +1,16 @@
%# -*- coding: utf-8-unix -*-
\section{动态路由(RIP)}
-\label{sec:c3_s2}
+\label{sec:c:ensp:s:rip}
\subsection{实验目的}
-\label{subsec:c3_s2_object}
+\label{subsec:c:ensp:s:rip_object}
理解动态路由协议RIP的工作原理;
掌握采用动态路由协议RIP进行网络设计的基本原则和方法。
\subsection{实验内容}
-\label{subsec:c3_s2_content}
+\label{subsec:c:ensp:s:rip_content}
\begin{itemize}
\item 华为路由器IP地址的配置;
@@ -21,7 +21,7 @@
\end{itemize}
\subsection{实验原理、方法和手段}
-\label{subsec:c3_s2_principle}
+\label{subsec:c:ensp:s:rip_principle}
简要说明RIP工作原理和适用范围;设计至少包括3个网络由RIP协议互连起来;
观察并记录各设备状态变化情况,特别留意路由信息的交换和路由表。
@@ -31,13 +31,13 @@
\begin{figure}[!htp]
\centering
- \includegraphics[width=8cm]{c3_RIP-topo}
+ \includegraphics[width=8cm]{RIP-topo}
\caption{实验拓扑图}
- \label{fig:c3_RIP-topo}
+ \label{fig:c:ensp_RIP-topo}
\end{figure}
\subsection{实验条件}
-\label{subsec:c3_s2_requirement}
+\label{subsec:c:ensp:s:rip_requirement}
\begin{itemize}
\item 华为ENSP仿真平台中:2台PC,两台路由器;
@@ -45,7 +45,7 @@
\end{itemize}
\subsection{实验步骤}
-\label{subsec:c3_s2_procedure}
+\label{subsec:c:ensp:s:rip_procedure}
实验说明:路由器端口以具体选用的设备为准。
如果是实际设备,请观察路由器前面板和后面板的端口名称,
@@ -70,9 +70,9 @@
\begin{figure}[!htp]
\centering
- \includegraphics[width=10cm]{c3_sysname-R1_2}
+ \includegraphics[width=10cm]{sysname-R1_2}
\caption{R1配置图}
- \label{fig:c3_sysname-R1_1}
+ \label{fig:c:ensp_sysname-R1_2}
\end{figure}
R2上的命令:
@@ -83,9 +83,9 @@
\begin{figure}[!htp]
\centering
- \includegraphics[width=10cm]{c3_sysname-R2_2}
+ \includegraphics[width=10cm]{sysname-R2_2}
\caption{R2配置图}
- \label{fig:c3_sysname-R2_1}
+ \label{fig:c:ensp_sysname-R2_2}
\end{figure}
\item 为路由器R1的 GE0接口配置IP地址。
@@ -111,9 +111,9 @@
\begin{figure}[!htp]
\centering
- \includegraphics[width=10cm]{c3_ping_2}
+ \includegraphics[width=10cm]{ping_2}
\caption{Ping通效果图}
- \label{fig:c3_ping_2}
+ \label{fig:c:ensp_ping_2}
\end{figure}
R2上的命令:
@@ -183,7 +183,7 @@
\end{enumerate}
\subsection{思考题}
-\label{subsec:c3_s2_rethink}
+\label{subsec:c:ensp:s:rip_rethink}
\begin{enumerate}
\item 在完成rip动态路由配置后,最远两端能够ping通,
@@ -192,7 +192,7 @@
\end{enumerate}
\subsection{注意事项及有关说明}
-\label{subsec:c3_s2_notice}
+\label{subsec:c:ensp:s:rip_notice}
路由器端口以具体选用的设备为准,请将E0口和E1口对应到实际设备上的端口名称,接口名由实际使用的路由器型号确定,可能有Ethernet0/0/0;或GigabitEthernet0/0/x;或FastEthernet0/0/x。如果是实际设备,请观察路由器前面板和后面板的端口名称,并使用disp int或者disp cur命令查看端口的实际名称。在对路由器进行配置时,可使用disp cur命令来检查当前路由器上生效的配置命令。
diff --git a/data/chapter3/section1.tex b/data/ch_ensp/sec_static.tex
similarity index 90%
rename from data/chapter3/section1.tex
rename to data/ch_ensp/sec_static.tex
index 138303a..f931ba9 100644
--- a/data/chapter3/section1.tex
+++ b/data/ch_ensp/sec_static.tex
@@ -1,15 +1,15 @@
%# -*- coding: utf-8-unix -*-
\section{静态路由}
-\label{sec:c3_s1}
+\label{sec:c:ensp:s:static}
\subsection{实验目的}
-\label{subsec:c3_s1_object}
+\label{subsec:c:ensp:s:static_object}
掌握静态路由协议,理解路由器工作原理,掌握路由器相关的配置、检测操作。
\subsection{实验内容}
-\label{subsec:c3_s1_content}
+\label{subsec:c:ensp:s:static_content}
\begin{itemize}
\item 华为网络设备常用配置命令;
@@ -22,13 +22,13 @@
\end{itemize}
\subsection{实验原理、方法和手段}
-\label{subsec:c3_s1_principle}
+\label{subsec:c:ensp:s:static_principle}
\begin{figure}[!htp]
\centering
- \includegraphics[width=8cm]{c3_static-topo}
+ \includegraphics[width=8cm]{static-topo}
\caption{实验拓扑图}
- \label{fig:c3_static-topo}
+ \label{fig:c:ensp_static-topo}
\end{figure}
\begin{enumerate}
@@ -42,7 +42,7 @@
\end{enumerate}
\subsection{实验条件}
-\label{subsec:c3_s1_requirement}
+\label{subsec:c:ensp:s:static_requirement}
\begin{itemize}
\item 华为ENSP仿真平台中:2台PC,两台路由器;
@@ -50,7 +50,7 @@
\end{itemize}
\subsection{实验步骤}
-\label{subsec:c3_s1_procedure}
+\label{subsec:c:ensp:s:static_procedure}
实验说明:路由器端口以具体选用的设备为准
(如路由器型号为AR2240以上,端口为千兆以太网口GE0/0/0;
@@ -80,9 +80,9 @@
\begin{figure}[!htp]
\centering
- \includegraphics[width=10cm]{c3_sysname-R1_1}
+ \includegraphics[width=10cm]{sysname-R1_1}
\caption{R1配置图}
- \label{fig:c3_sysname-R1_1}
+ \label{fig:c:ensp_sysname-R1_1}
\end{figure}
R2上的命令:
@@ -93,9 +93,9 @@
\begin{figure}[!htp]
\centering
- \includegraphics[width=10cm]{c3_sysname-R2_1}
+ \includegraphics[width=10cm]{sysname-R2_1}
\caption{R1配置图}
- \label{fig:c3_sysname-R2_1}
+ \label{fig:c:ensp_sysname-R2_1}
\end{figure}
\item 为路由器R1的 GE0接口配置IP地址。
@@ -116,11 +116,11 @@
PC1>ping 192.168.1.1
\end{code}
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=10cm]{c3_ping_1}
+ \includegraphics[width=10cm]{ping_1}
\caption{Ping通效果图}
- \label{fig:c3_ping_1}
+ \label{fig:c:ensp_ping_1}
\end{figure}
R2上的命令:
@@ -171,13 +171,13 @@
\end{enumerate}
\subsection{思考题}
-\label{subsec:c3_s1_rethink}
+\label{subsec:c:ensp:s:static_rethink}
如未达到网络收敛状态时,最远两端能够ping通,
请问网络中间的任意两点间也能ping通吗?为什么?
\subsection{注意事项及有关说明}
-\label{subsec:c3_s1_notice}
+\label{subsec:c:ensp:s:static_notice}
路由器端口以具体选用的设备为准,
请将E0口和E1口对应到实际设备上的端口名称,
diff --git a/data/chapter2/preface.tex b/data/ch_socket/preface.tex
similarity index 100%
rename from data/chapter2/preface.tex
rename to data/ch_socket/preface.tex
diff --git a/data/chapter2/section3.tex b/data/ch_socket/sec_smtp.tex
similarity index 93%
rename from data/chapter2/section3.tex
rename to data/ch_socket/sec_smtp.tex
index ecb3db5..c2d3bfc 100644
--- a/data/chapter2/section3.tex
+++ b/data/ch_socket/sec_smtp.tex
@@ -1,23 +1,23 @@
%# -*- coding: utf-8-unix -*-
\section{SMTP客户端实现}
-\label{sec:c1_s2}
+\label{sec:c:socket_s2}
\subsection{实验目的}
-\label{subsec:c2_s3_object}
+\label{subsec:c:socket_s3_object}
进一步理解和掌握Python中TCP套接字编程的基础知识,
理解SMTP报文格式,了解开发一个简单应用程序的流程。
\subsection{实验内容}
-\label{subsec:c2_s3_content}
+\label{subsec:c:socket_s3_content}
创建一个可以向任何接收方发送电子邮件的简单邮件客户端。
通过Python编写代码与邮件服务器创建一个TCP连接,
使用SMTP协议与邮件服务器交谈并发送邮件报文,最后关闭连接。
\subsection{实验原理、方法和手段}
-\label{subsec:c2_s3_principle}
+\label{subsec:c:socket_s3_principle}
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,
是因特网电子邮件中主要的应用层协议,它使用TCP可靠数据传输服务,
@@ -68,7 +68,7 @@ RFC5321给出了SMTP的定义。SMTP有众多出色的性质,
用一个独立的句点指示该邮件的结束,并且仅当所有邮件发送完后才发送QUIT。
\subsection{实验条件}
-\label{subsec:c2_s3_requirement}
+\label{subsec:c:socket_s3_requirement}
\begin{itemize}
\item 下列装有python环境的电脑一台;
@@ -77,7 +77,7 @@ RFC5321给出了SMTP的定义。SMTP有众多出色的性质,
\end{itemize}
\subsection{实验步骤}
-\label{subsec:c2_s3_procedure}
+\label{subsec:c:socket_s3_procedure}
通过Python开发一个简单的SMTP客户端发送邮件。
补充完善下面的代码并通过向不同的账号发送电子邮件测试程序。
@@ -111,16 +111,16 @@ RFC5321给出了SMTP的定义。SMTP有众多出色的性质,
\end{code}
\subsection{思考题}
-\label{subsec:c2_s3_rethink}
+\label{subsec:c:socket_s3_rethink}
修改代码使程序发送的邮件中不仅包含文本还能够包含图片。
\subsection{注意事项及有关说明}
-\label{subsec:c2_s3_notice}
+\label{subsec:c:socket_s3_notice}
注意部分邮件服务器默认关闭SMTP,需进入设置手动开启SMTP协议。
\subsection{考核方法}
-\label{subsec:c2_s3_criterion}
+\label{subsec:c:socket_s3_criterion}
-同实验\ref{sec:c2_s1}。
+同实验\ref{sec:c:socket:s:udp}。
diff --git a/data/chapter2/section1.tex b/data/ch_socket/sec_udp.tex
similarity index 91%
rename from data/chapter2/section1.tex
rename to data/ch_socket/sec_udp.tex
index a2cc234..aac2375 100644
--- a/data/chapter2/section1.tex
+++ b/data/ch_socket/sec_udp.tex
@@ -1,17 +1,17 @@
%# -*- coding: utf-8-unix -*-
\section{套接字基础与UDP通信}
-\label{sec:c2_s1}
+\label{sec:c:socket:s:udp}
\subsection{实验目的}
-\label{subsec:c2_s1_object}
+\label{subsec:c:socket:s:udp_object}
熟悉Python中UDP套接字编程的基础知识,掌握使用UDP套接字发送和接收数据包,
以及设置正确的套接字超时,
了解Ping应用程序及其在计算数据包丢失率等统计数据方面的有用性。
\subsection{实验内容}
-\label{subsec:c2_s1_content}
+\label{subsec:c:socket:s:udp_content}
标准的ping使用ICMP,该实验创建一个简单的,
非标准的基于UDP的ping程序。用Python编写一个客户ping程序。
@@ -23,7 +23,7 @@
要求考虑分组丢失情况,客户端最多等待1秒,超过该时长则打印丢失报文。
\subsection{实验原理、方法和手段}
-\label{subsec:c2_s1_principle}
+\label{subsec:c:socket:s:udp_principle}
UDP提供了无连接通信,且不对传送数据包进行可靠性保证,
适合于一次传输少量数据,UDP传输的可靠性由应用层负责。
@@ -42,17 +42,17 @@ UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠
服务器接收到客户发来数据后,调用sendto( )向客户发送应答数据,
客户调用recvfrom接收服务器发来的应答数据。
一旦数据传输结束,服务器和客户通过调用close( )来关闭套接字。
-具体流程如图\ref{fig:c2_udp-flow}所示。
+具体流程如图\ref{fig:c:socket_udp-flow}所示。
\begin{figure}[!htp]
\centering
- \includegraphics[width=8cm]{c2_udp-flow}
+ \includegraphics[width=8cm]{udp-flow}
\caption{无连接客户/服务器流程图}
- \label{fig:c2_udp-flow}
+ \label{fig:c:socket_udp-flow}
\end{figure}
\subsection{实验条件}
-\label{subsec:c2_s1_requirement}
+\label{subsec:c:socket:s:udp_requirement}
\begin{itemize}
\item 装有python环境的电脑两台;
@@ -61,7 +61,7 @@ UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠
\end{itemize}
\subsection{实验步骤}
-\label{subsec:c2_s1_procedure}
+\label{subsec:c:socket:s:udp_procedure}
下面的服务器代码中30\%的客户端数据包被模拟为丢失。
请参考该代码,按照实验任务完成ping客户端代码。
@@ -97,13 +97,13 @@ UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠
\end{code}
\subsection{思考题}
-\label{subsec:c2_s1_rethink}
+\label{subsec:c:socket:s:udp_rethink}
尝试修改代码计算所有ping结束时报告最小、最大、平均rtt和计算丢包率(百分比)
以符合标准ping程序的工作方式。
\subsection{考核方法}
-\label{subsec:c2_s1_criterion}
+\label{subsec:c:socket:s:udp_criterion}
本次实验需提交一份实验报告和代码文件。报告内容应当包括以下三个部分:
\begin{itemize}
diff --git a/data/chapter2/section2.tex b/data/ch_socket/sec_web.tex
similarity index 88%
rename from data/chapter2/section2.tex
rename to data/ch_socket/sec_web.tex
index 6c7b08f..b71533e 100644
--- a/data/chapter2/section2.tex
+++ b/data/ch_socket/sec_web.tex
@@ -1,16 +1,16 @@
%# -*- coding: utf-8-unix -*-
\section{TCP通信与Web服务器}
-\label{sec:c2_s2}
+\label{sec:c:socket:s:web}
\subsection{实验目的}
-\label{subsec:c2_s2_object}
+\label{subsec:c:socket:s:web_object}
掌握Python中TCP套接字编程的基础知识,理解HTTP报文格式,
了解开发一个简单Web服务器的流程。
\subsection{实验内容}
-\label{subsec:c2_s2_content}
+\label{subsec:c:socket:s:web_content}
使用Python开发一个一次处理一个HTTP请求的Web服务器。
Web服务器接受并解析HTTP请求,从服务器的文件系统中获取请求的文件,
@@ -19,7 +19,7 @@ Web服务器接受并解析HTTP请求,从服务器的文件系统中获取请
则服务器将发送HTTP“404 not Found”的消息给客户端。
\subsection{实验原理、方法和手段}
-\label{subsec:c2_s2_principle}
+\label{subsec:c:socket:s:web_principle}
基于TCP协议的面向客户/服务器的工作流程是:
在服务器端首先启动服务器调用socket( )创建套接字;
@@ -29,17 +29,18 @@ Web服务器接受并解析HTTP请求,从服务器的文件系统中获取请
最后通过accept( )来接收连接请求,并获得客户的socket地址。
在客户端,客户调用socket( )创建套接字,然后调用connect( )和服务器建立连接。
连接建立成功后,客户和服务器之间就可以通过调用read( )和write( )来接收和发送数据。
-一旦数据传输结束,服务器和客户通过调用close( )来关闭套接字。具体流程图如下图所示。
+一旦数据传输结束,服务器和客户通过调用close( )来关闭套接字。
+具体流程图\ref{fig:c:socket_tcp-flow}所示。
\begin{figure}[!htp]
\centering
- \includegraphics[width=6cm]{c2_tcp-flow}
+ \includegraphics[width=6cm]{tcp-flow}
\caption{面向连接客户/服务器流程图}
- \label{fig:c2_udp-flow}
+ \label{fig:c:socket_tcp-flow}
\end{figure}
\subsection{实验条件}
-\label{subsec:c2_s2_requirement}
+\label{subsec:c:socket:s:web_requirement}
\begin{itemize}
\item 装有python环境的电脑两台;
@@ -48,7 +49,7 @@ Web服务器接受并解析HTTP请求,从服务器的文件系统中获取请
\end{itemize}
\subsection{实验步骤}
-\label{subsec:c2_s2_procedure}
+\label{subsec:c:socket:s:web_procedure}
开发一个简单的Web服务器,一次处理一个请求,具体要求如下:
\begin{enumerate}
@@ -91,13 +92,13 @@ Web服务器接受并解析HTTP请求,从服务器的文件系统中获取请
\end{code}
\subsection{思考题}
-\label{subsec:c2_s2_rethink}
+\label{subsec:c:socket:s:web_rethink}
本实验中的Web服务器一次只能处理一个HTTP请求,请自行查阅线程知识,
修改代码,实现一个能够同时处理多个请求的多线程服务器。
\subsection{注意事项及有关说明}
-\label{subsec:c2_s2_notice}
+\label{subsec:c:socket:s:web_notice}
将HTML文件放在服务器代码同一目录中。运行服务器程序。
确定运行服务器的主机的IP地址(例如,128.238.251.26)。
@@ -109,6 +110,6 @@ Web服务器接受并解析HTTP请求,从服务器的文件系统中获取请
6789为端口号,如果省略则使用默认端口号80。
\subsection{考核方法}
-\label{subsec:c2_s2_criterion}
+\label{subsec:c:socket:s:web_criterion}
-同实验\ref{sec:c2_s1}。
+同实验\ref{sec:c:socket:s:udp}。
diff --git a/data/chapter1/preface.tex b/data/ch_wireshark/preface.tex
similarity index 86%
rename from data/chapter1/preface.tex
rename to data/ch_wireshark/preface.tex
index 6f84f35..4e66711 100644
--- a/data/chapter1/preface.tex
+++ b/data/ch_wireshark/preface.tex
@@ -7,4 +7,4 @@
掌握以太网、802.11、ARP、IP、ICMP和TCP等重要协议传输单元结构,
深入理解相关网络命令和重要协议算法的工作原理,
从而培养网络故障检测、网络性能改进和网络安全分析的能力。
-(备注:第二版将增补实验1.4: IEEE 802.11协议分析。)
\ No newline at end of file
+% (备注:第二版将增补实验1.4: IEEE 802.11协议分析。)
\ No newline at end of file
diff --git a/data/chapter1/section1.tex b/data/ch_wireshark/sec_arp.tex
similarity index 78%
rename from data/chapter1/section1.tex
rename to data/ch_wireshark/sec_arp.tex
index 7110eae..4b31da1 100644
--- a/data/chapter1/section1.tex
+++ b/data/ch_wireshark/sec_arp.tex
@@ -1,16 +1,16 @@
%# -*- coding: utf-8-unix -*-
\section{Wireshark软件使用与ARP分析}
-\label{sec:c1_s1}
+\label{sec:c:wireshark:s:arp}
\subsection{实验目的}
-\label{subsec:c1_s1_object}
+\label{subsec:c:wireshark:s:arp_object}
本实验旨在让学生掌握Wireshark的基本操作,使用捕获过滤器和显示过滤器,
抓取和分析有线局域网的数据包;掌握以太网MAC帧的基本结构,掌握ARP协议的特点及工作过程。
\subsection{实验内容}
-\label{subsec:c1_s1_content}
+\label{subsec:c:wireshark:s:arp_content}
练习使用Wireshark抓取相关有线局域网的数据包并进行分析。
@@ -27,7 +27,7 @@
\end{enumerate}
\subsection{实验原理}
-\label{subsec:c1_s1_principle}
+\label{subsec:c:wireshark:s:arp_principle}
\subsubsection{Wireshark简介}
@@ -46,7 +46,7 @@ Wireshark可以在Windows、Linux和MacOS操作系统中运行,
\subsubsection{以太网MAC帧格式}
本实验基于使用最广泛的有线局域网(以太网Ethernet II),
-以太网的帧结构如表\ref{tab:c1_eth-format}所示。
+以太网的帧结构如表\ref{tab:c:wireshark_eth-format}所示。
其中,MAC地址(Media Access Control Address,媒体存取控制位址)或称物理地址(Physical Address),
用于在网络中标识网卡。MAC地址的长度为48位(6个字节),
通常表示为12个16进制数,如:00-16-EA-AE-3C-40。
@@ -54,13 +54,16 @@ Wireshark可以在Windows、Linux和MacOS操作系统中运行,
它由IEEE分配;
而后3个字节的16进制数AE-3C-40代表该制造商所生产的某个网络产品(如网卡)的系列号。
-\begin{table}[!hpb]
+\renewcommand{\arraystretch}{1.5}
+\begin{table}[!ht]
+ \small
\centering
\caption{以太网帧格式}
- \label{tab:c1_eth-format}
- \begin{tabular}{cccccc} \toprule
- 前导字符 & 目的MAC地址 & 源MAC地址 & 类型 & IP数据报 & 帧校验\\ \midrule
- 8字节 & 6字节 & 6字节 & 2字节 & & 4字节 \\ \bottomrule
+ \label{tab:c:wireshark_eth-format}
+ \begin{tabular}{|c|c|c|c|c|c|} \hline
+ \heiti 前导字符 & \heiti 目的MAC地址 & \heiti 源MAC地址 &
+ \heiti 类型 & \heiti IP数据报 & \heiti 帧校验\\ \hline
+ 8字节 & 6字节 & 6字节 & 2字节 & - & 4字节 \\ \hline
\end{tabular}
\end{table}
@@ -90,7 +93,7 @@ ARP解析的过程(主机A和B不在同一网段的情况请参阅课本相关
同时将IP数据报进行封装后发送出去。
\end{enumerate}
-ARP报文结构如图\ref{fig:c1_arp-format}所示,
+ARP报文结构如图\ref{fig:c:wireshark_arp-format}所示,
ARP报文总长度为28字节,MAC地址长度为6字节,
IP地址长度为4字节。每个字段的含义如下:
@@ -103,11 +106,11 @@ IP地址长度为4字节。每个字段的含义如下:
ARP 请求为1,ARP 响应为2,RARP 请求为3,RARP 响应为4。
\end{itemize}
-\begin{figure}[!htp]
+\begin{figure}[!ht]
\centering
- \includegraphics[width=9cm]{c1_arp-format}
+ \includegraphics[width=9cm]{arp-format}
\caption{ARP报文结构示意图}
- \label{fig:c1_arp-format}
+ \label{fig:c:wireshark_arp-format}
\end{figure}
\subsubsection{实验方法及手段}
@@ -117,7 +120,7 @@ IP地址长度为4字节。每个字段的含义如下:
掌握以太网MAC帧和IP数据报的结构以及ARP协议的工作过程。
\subsection{实验条件}
-\label{subsec:c1_s1_requirement}
+\label{subsec:c:wireshark:s:arp_requirement}
\begin{itemize}
\item 装有Wireshark软件的PC机一台(Windows或Linux操作系统);
@@ -125,7 +128,7 @@ IP地址长度为4字节。每个字段的含义如下:
\end{itemize}
\subsection{实验步骤}
-\label{subsec:c1_s1_procedure}
+\label{subsec:c:wireshark:s:arp_procedure}
\subsubsection{WireShark基本使用}
@@ -133,39 +136,39 @@ IP地址长度为4字节。每个字段的含义如下:
\item 通过Wireshark官网下载最新版软件,按默认选项安装。
\item 运行Wireshark软件,程序界面会显示当前的网络接口列表,
选择要抓取的网络接口,双击开始抓包,
- Wireshark软件选择网络接口的界面如图\ref{fig:c1_wireshark-boot-ui}所示。
+ Wireshark软件选择网络接口的界面如图\ref{fig:c:wireshark_wireshark-boot-ui}所示。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=16cm]{c1_wireshark-boot-ui}
+ \includegraphics[width=12cm]{wireshark-boot-ui}
\caption{Wireshark软件启动界面}
- \label{fig:c1_wireshark-boot-ui}
+ \label{fig:c:wireshark_wireshark-boot-ui}
\end{figure}
\item 点击工具栏上红色的stop按钮停止抓包。
- \item 菜单、工具栏、状态栏和主窗口如图\ref{fig:c1_wireshark-main-ui}所示,
+ \item 菜单、工具栏、状态栏和主窗口如图\ref{fig:c:wireshark_wireshark-main-ui}所示,
可以根据自己需要通过菜单“视图”以及“编辑/首选项/外观”的相关选项对基本设置进行更改。
- 例如图\ref{fig:c1_wireshark-setup-ui}中的语言、字体缩放、颜色、布局等项目。
+ 例如图\ref{fig:c:wireshark_wireshark-setup-ui}中的语言、字体缩放、颜色、布局等项目。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=16cm]{c1_wireshark-main-ui}
+ \includegraphics[width=12cm]{wireshark-main-ui}
\caption{Wireshark主窗口界面}
- \label{fig:c1_wireshark-main-ui}
+ \label{fig:c:wireshark_wireshark-main-ui}
\end{figure}
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=16cm]{c1_wireshark-setup-ui}
+ \includegraphics[width=12cm]{wireshark-setup-ui}
\caption{Wireshark的设置界面}
- \label{fig:c1_wireshark-setup-ui}
+ \label{fig:c:wireshark_wireshark-setup-ui}
\end{figure}
\item 使用“显示过滤器”可以方便地从捕获的数据包中筛选出我们想要观察的某些数据包信息。
显示过滤器支持若干的过滤选项:
源MAC、目的MAC、源IP、目的IP、TCP/UDP传输协议、
应用层协议(HTTP, DHCP)、源端口Port、目的端口Port等。
- 在显示过滤器栏中输入过滤表达式(图\ref{fig:c1_wireshark-filters}),
+ 在显示过滤器栏中输入过滤表达式(图\ref{fig:c:wireshark_wireshark-filters}),
例如下面的命令:
更详细的显示过滤语法可以查看WireShark的官方文档
\footnote{
@@ -174,67 +177,67 @@ IP地址长度为4字节。每个字段的含义如下:
}。
\begin{itemize}
- \item \texttt{arp} \hfill \textit{//显示arp协议报文}
- \item \texttt{ip.src == a.b.c.d \&\& icmp} \hfill \textit{//显示源地址为a.b.c.d的icmp报文}
+ \item \texttt{arp~~~~~~~~~~~~~~~~~~~~~~~~//显示arp协议报文}
+ \item \texttt{ip.src == a.b.c.d \&\& icmp~~//显示源地址为a.b.c.d的icmp报文}
\end{itemize}
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=16cm]{c1_wireshark-filters}
+ \includegraphics[width=12cm]{wireshark-filters}
\caption{显示过滤规则的示例}
- \label{fig:c1_wireshark-filters}
+ \label{fig:c:wireshark_wireshark-filters}
\end{figure}
- \item 通过主菜单“文件”/“导出特定分组”(如图\ref{fig:c1_wireshark-save}),
+ \item 通过主菜单“文件”/“导出特定分组”(如图\ref{fig:c:wireshark_wireshark-save}),
可以保存抓取的网络数据(也可以先选中某个包,只保存部分数据)。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=16cm]{c1_wireshark-save}
+ \includegraphics[width=12cm]{wireshark-save}
\caption{操作主菜单保存数据文件}
- \label{fig:c1_wireshark-save}
+ \label{fig:c:wireshark_wireshark-save}
\end{figure}
\item 如果只抓取特定的数据包,
可以使用菜单“捕获”/”捕获过滤器”选定想要的类型
- (如图\ref{fig:c1_wireshark-special-type})。
+ (如图\ref{fig:c:wireshark_wireshark-special-type})。
例如,选择“IPv4 only”,Wireshark只抓取ipv4类型的数据包。
Wireshark过滤器官方文档提供了更加全面详细的语法和常用示例
\footnote{\href{https://wiki.wireshark.org/CaptureFilters/\#Useful_Filters}
{WireShark常用过滤器语法}}。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=16cm]{c1_wireshark-special-type}
+ \includegraphics[width=12cm]{wireshark-special-type}
\caption{选中特定的捕获类型}
- \label{fig:c1_wireshark-special-type}
+ \label{fig:c:wireshark_wireshark-special-type}
\end{figure}
\item Wireshark还提供了丰富的统计功能供用户选用,
- 如图\ref{fig:c1_wireshark-statistic}。
+ 如图\ref{fig:c:wireshark_wireshark-statistic}。
更多文档可以查询Wireshark使用帮助
\footnote{\href{https://www.wireshark.org/\#learnWS}{WireShark学习手册}}。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=16cm]{c1_wireshark-statistic}
+ \includegraphics[width=12cm]{wireshark-statistic}
\caption{统计功能}
- \label{fig:c1_wireshark-statistic}
+ \label{fig:c:wireshark_wireshark-statistic}
\end{figure}
\end{enumerate}
\subsubsection{查看OUI信息}
查看本机MAC地址字段,查看OUI信息,搜索各厂商的OUI进行验证。
\subsubsection{分析以太网的帧结构}
-选择其中一个数据包,点击Ethernet II展开(图\ref{fig:c1_eth-frame-detail}),
+选择其中一个数据包,点击Ethernet II展开(图\ref{fig:c:wireshark_eth-frame-detail}),
查看MAC帧的各个字段。计算帧的长度,并与Wireshark的分析结果比较。
同时查看比较广播帧和单播帧的异同。
-\begin{figure}[!htp]
+\begin{figure}[!ht]
\centering
- \includegraphics[width=16cm]{c1_eth-frame-detail}
+ \includegraphics[width=12cm]{eth-frame-detail}
\caption{以太网帧结构展开界面}
- \label{fig:c1_eth-frame-detail}
+ \label{fig:c:wireshark_eth-frame-detail}
\end{figure}
\subsubsection{差错检测,FCS计算检验}
@@ -244,20 +247,20 @@ IP地址长度为4字节。每个字段的含义如下:
\item 使用\texttt{arp –d}命令(其语法见图\ref{fig:arp-cmd}),清空本机已有的ARP缓存,
开启Wireshark,ping本机的同网段地址,在显示过滤器条框中输入“\texttt{arp}”,
观察捕获的ARP报文的各个字段,分析请求/响应的过程。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \begin{code}[text]
-arp [-a [InetAddr] [-N IfaceAddr]] [-g [InetAddr] [-N IfaceAddr]]
- [-d InetAddr [IfaceAddr]] [-s InetAddr EtherAddr [IfaceAddr]]
-
- -a显示所有接口/特定接口的当前 ARP 缓存表。
- -g 同-a。
- -d删除所有/指定的IP地址项。
- -s向ARP 缓存添加可将IP地址InetAddr解析成物理地址EtherAddr的静态项。
- \end{code}
- \caption{arp命令语法及参数}
- \label{fig:arp-cmd}
-\end{figure}
+ \begin{code}[text]
+ arp [-a [InetAddr] [-N IfaceAddr]] [-g [InetAddr] [-N IfaceAddr]]
+ [-d InetAddr [IfaceAddr]] [-s InetAddr EtherAddr [IfaceAddr]]
+
+ -a 显示所有接口/特定接口的当前 ARP 缓存表
+ -g 同-a
+ -d 删除所有/指定的IP地址项
+ -s 在ARP缓存中添加对应InetAddr地址的EtherAddr地址静态项
+ \end{code}
+ \caption{arp命令语法及参数}
+ \label{fig:arp-cmd}
+ \end{figure}
\item 使用\texttt{arp –d}命令,清空本机已有的ARP缓存。开启Wireshark,
ping本机的不同网段地址或域名,观察捕获的ARP报文的各个字段,
@@ -265,7 +268,7 @@ arp [-a [InetAddr] [-N IfaceAddr]] [-g [InetAddr] [-N IfaceAddr]]
\end{enumerate}
\subsection{思考题}
-\label{subsec:c1_s1_rethink}
+\label{subsec:c:wireshark:s:arp_rethink}
\begin{enumerate}
\item 使用了显示过滤器后,Wireshark的抓包工作量会减少吗?
@@ -282,7 +285,7 @@ arp [-a [InetAddr] [-N IfaceAddr]] [-g [InetAddr] [-N IfaceAddr]]
\end{enumerate}
\subsection{考核方法}
-\label{subsec:c1_s1_criterion}
+\label{subsec:c:wireshark:s:arp_criterion}
考核分为现场考核和实验报告两个部分,具体如下。
报告内容应包含以下内容,相关的分析解释都需要截图证明,
diff --git a/data/chapter1/section2.tex b/data/ch_wireshark/sec_ip.tex
similarity index 79%
rename from data/chapter1/section2.tex
rename to data/ch_wireshark/sec_ip.tex
index 6cf8ccb..c9afed8 100644
--- a/data/chapter1/section2.tex
+++ b/data/ch_wireshark/sec_ip.tex
@@ -1,10 +1,10 @@
%# -*- coding: utf-8-unix -*-
\section{IP与ICMP分析}
-\label{sec:c1_s2}
+\label{sec:c:wireshark:s:ip}
\subsection{实验目的}
-\label{subsec:c1_s2_object}
+\label{subsec:c:wireshark:s:ip_object}
IP和ICMP协议是TCP/IP协议簇中的网络层协议,
在网络寻址定位、数据分组转发和路由选择等任务中发挥了重要作用。
@@ -12,7 +12,7 @@ IP和ICMP协议是TCP/IP协议簇中的网络层协议,
分析数据报的分片;掌握基于ICMP协议的ping和traceroute命令及其工作过程。
\subsection{实验内容}
-\label{subsec:c1_s2_content}
+\label{subsec:c:wireshark:s:ip_content}
启动Wireshark,捕捉网络命令执行过程中本机接受和发送的数据报。
@@ -31,31 +31,31 @@ IP和ICMP协议是TCP/IP协议簇中的网络层协议,
\end{enumerate}
\subsection{实验原理、方法和手段}
-\label{subsec:c1_s2_principle}
+\label{subsec:c:wireshark:s:ip_principle}
\subsubsection{IP协议及数据报格式}
网际互连协议(Internet Protocol,IP),是TCP/IP体系中的网络层协议,
可实现大规模的异构网络互联互通,为主机提供无连接的、尽力而为的数据包传输服务。
在网际协议第4版(IPv4)中,IP数据报是一个可变长分组,
-包括首部和数据两部分(如图\ref{c1_ip-structure})。
+包括首部和数据两部分(如图\ref{c:wireshark_ip-structure})。
首部由20~60字节组成,包含与路由选择和传输有关的重要信息,其各字段意义如下:
-\begin{figure}[!htp]
+\begin{figure}[!ht]
\centering
- \includegraphics[width=10cm]{c1_ip-structure}
+ \includegraphics[width=12cm]{ip-structure}
\caption{IP数据报结构示意图}
- \label{c1_ip-structure}
+ \label{c:wireshark_ip-structure}
\end{figure}
\begin{enumerate}
\item \textbf{版本(4位):}该字段定义IP协议版本,
所有字段都要按照此版本的协议来解释。
\item \textbf{首部长度(4位):}该字段定义数据报协议头长度,
- 表示协议首部具有32位字长的数量,最小值为5,最大值为15。
+ 表示协议首部具有32位字长的数量,最小值为5,最大值为15。
\item \textbf{服务(8位):}该字段定义上层协议对处理当前数据报所期望的服务质量,
并对数据报按照重要性级别进行分配。前3位成为优先位,后面4位成为服务类型,
- 最后1位没有定义。这些8位字段可用于分配优先级、延迟、吞吐量以及可靠性。
+ 最后1位没有定义。这些8位字段可用于分配优先级、延迟、吞吐量以及可靠性。
\item \textbf{总长度(16位):}该字段定义整个IP数据报的字节长度,
包括协议首部和数据,其最大值为65535字节。
\item \textbf{标识(16位):}该字段包含一个整数,用于标识当前数据报。
@@ -74,7 +74,7 @@ IP和ICMP协议是TCP/IP协议簇中的网络层协议,
计算过程是先将校验和字段置为0,然后将整个头部每16位划分为一部分,
将个部分相加,再将计算结果取反码,插入到校验和字段中。
\item \textbf{源地址(32位):}源主机的IP地址。
- \item \textbf{目的地址(32位):}目标主机的IP地址。
+ \item \textbf{目的地址(32位):}目标主机的IP地址。
\end{enumerate}
一个IP包从源主机传输到目标主机可能需要经过多个传输媒介不同的网络。
@@ -105,31 +105,43 @@ IP和ICMP协议是TCP/IP协议簇中的网络层协议,
对网络正常运行起着重要的作用。
ICMP报文的类型可以分为ICMP差错报文和ICMP询问报文两种
-(其结构如图\ref{c1_icmp-structure})。
+(其结构如图\ref{c:wireshark_icmp-structure})。
ICMP差错报告报文主要有终点不可达、源站抑制、超时、参数问题和路由重定向5种。
ICMP询问报文有回送请求和应答、时间戳请求和应答、
地址掩码请求和应答以及路由器询问和通告4种。
-其常见的类型与代码如表\ref{tab:c1_icmp-format}所示。
+其常见的类型与代码如表\ref{tab:c:wireshark_icmp-format}所示。
-\begin{figure}[!htp]
+\begin{figure}[!ht]
\centering
- \includegraphics[width=12cm]{c1_icmp-structure}
+ \includegraphics[width=12cm]{icmp-structure}
\caption{ICMP报文结构示意图}
- \label{c1_icmp-structure}
+ \label{c:wireshark_icmp-structure}
\end{figure}
-\begin{table}[!htp]
+\renewcommand{\arraystretch}{1.5}
+\begin{table}[!ht]
+ \small
\centering
\caption{ICMP各类型报文的格式}
- \label{tab:c1_icmp-format}
- \begin{tabular}{m{1.4cm}<{\centering}m{1.4cm}<{\centering}m{8cm}<{\centering}m{1.4cm}<{\centering}m{1.4cm}<{\centering}} \toprule
- 类型(TYPE) & 代码(CODE) & 描述(Description) & 查询类(Query) & 差错类(Error)\\ \midrule
- 0 & 0 & Echo Reply——回显应答(Ping应答)& x & \\
- 3 & 1 & Host Unreachable——主机不可达 & & x\\
- 3 & 3 & Port Unreachable——端口不可达 & & x\\
- 3 & 4 & Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 & &x\\
- 8 & 0 & Echo request——回显请求(Ping请求)& x & \\
- 11& 0 & TTL equals 0 during transit——传输期间生存时间为0 & & x\\ \bottomrule
+ \label{tab:c:wireshark_icmp-format}
+ \begin{tabular}{|m{1.4cm}<{\centering}
+ |m{1.4cm}<{\centering}
+ |m{7cm}
+ |m{1.4cm}<{\centering}
+ |m{1.4cm}<{\centering}|}
+ \hline
+ \heiti 类型(TYPE) &\heiti 代码(CODE) &
+ \multicolumn{1}{|c|}{\heiti 描述(Description)} &
+ \heiti 查询类(Query) &\heiti 差错类(Error)\\ \hline
+
+ 0 & 0 & Echo Reply——回显应答(Ping应答)& $\checkmark$ & \\ \hline
+ 3 & 1 & Host Unreachable——主机不可达 & & $\checkmark$\\ \hline
+ 3 & 3 & Port Unreachable——端口不可达 & & $\checkmark$\\ \hline
+ 3 & 4 & Fragmentation needed but no frag. bit set \newline
+ ——需要进行分片但设置不分片比特 & &$\checkmark$\\ \hline
+ 8 & 0 & Echo request——回显请求(Ping请求)& $\checkmark$ & \\ \hline
+ 11& 0 & TTL equals 0 during transit \newline
+ ——传输期间生存时间为0 & & $\checkmark$\\ \hline
\end{tabular}
\end{table}
@@ -142,21 +154,22 @@ ICMP询问报文有回送请求和应答、时间戳请求和应答、
ping命令可以检测网络的连通性,简单估测数据报的往返时间(Round Trip Time),
确定是否有数据包丢失或损坏,从而帮助分析网络故障。
ping命令格式和常用参数如图\ref{fig:ping-cmd}所示。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \begin{code}[text]
- ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos]
- [-r count] [-s count] [-j computer-list] | [-k computer-list]
- [-w timeout] destination-list
-
- -a 将地址解析为计算机名。
- -n count 发送 count 指定的 ECHO 数据包数。默认值为 4。
- -l length 发送包含由 length 指定的数据量的 ECHO 数据包。默认为 32 字节;最大值是65,527。
- -f 在数据包中发送"不要分片"标志。数据包就不会被路由上的网关分片。
- -i ttl 将"生存时间"字段设置为 ttl 指定的值。 \end{code}
- \caption{ping命令语法及参数}
- \label{fig:ping-cmd}
-\end{figure}
+ \begin{code}[text]
+ ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos]
+ [-r count] [-s count] [-j computer-list] | [-k computer-list]
+ [-w timeout] destination-list
+
+ -a 将地址解析为计算机名。
+ -n count 发送 count 指定的 ECHO 数据包数。默认值为 4。
+ -l length 发送包含由 length 指定的数据量的 ECHO 数据包。默认为 32 字节;最大值是65,527。
+ -f 在数据包中发送"不要分片"标志。数据包就不会被路由上的网关分片。
+ -i ttl 将"生存时间"字段设置为 ttl 指定的值。
+ \end{code}
+ \caption{ping命令语法及参数}
+ \label{fig:ping-cmd}
+ \end{figure}
\item traceroute/tracert命令,利用TTL字段和ICMP差错类型报文,
查找IP数据报的路由转发路径(含路由器信息)。
@@ -174,7 +187,7 @@ ICMP询问报文有回送请求和应答、时间戳请求和应答、
至此,traceroute命令发起者已经获得了通向目标主机路径上的所有路由信息。
tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示。
-\begin{figure}[!htp]
+\begin{figure}[!ht]
\centering
\begin{code}[text]
tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] [-R]
@@ -205,7 +218,7 @@ tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示
\end{enumerate}
\subsection{实验条件}
-\label{subsec:c1_s2_requirement}
+\label{subsec:c:wireshark:s:ip_requirement}
装有Wireshark软件的PC机一台(Linux或OS 操作系统);局域网环境。
@@ -220,7 +233,7 @@ tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示
\end{itemize}
\subsection{实验步骤}
-\label{subsec:c1_s2_procedure}
+\label{subsec:c:wireshark:s:ip_procedure}
\subsubsection{ping命令}
@@ -230,46 +243,46 @@ tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示
\begin{enumerate}
\item 在Wireshark监视器中设置过滤条件。
- 例如图\ref{fig:c1_wireshark-monitor}设置过滤条件为icmp,
+ 例如图\ref{fig:c:wireshark_wireshark-monitor}设置过滤条件为icmp,
则显示出所捕获的ICMP数据包。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=16cm]{c1_wireshark-monitor}
+ \includegraphics[width=12cm]{wireshark-monitor}
\caption{Wireshark监视器界面}
- \label{fig:c1_wireshark-monitor}
+ \label{fig:c:wireshark_wireshark-monitor}
\end{figure}
- \item 点击Internet Protocol Version 4展开(如图\ref{fig:c1_ip-view}),
+ \item 点击Internet Protocol Version 4展开(如图\ref{fig:c:wireshark_ip-view}),
查看IP数据报,特别观察IP数据报的首部字段及其内容。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=16cm]{c1_ip-view}
+ \includegraphics[width=12cm]{ip-view}
\caption{查看IP数据报}
- \label{fig:c1_ip-view}
+ \label{fig:c:wireshark_ip-view}
\end{figure}
- \item 点击Internet Control Message Protocol展开(如图\ref{fig:c1_echo-request}),
+ \item 点击Internet Control Message Protocol展开(如图\ref{fig:c:wireshark_echo-request}),
查看ICMP报文,并解释回显(Echo Request和Echo Reply)报文的首部字段。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=16cm]{c1_echo-request}
+ \includegraphics[width=12cm]{echo-request}
\caption{Echo request示例}
- \label{fig:c1_echo-request}
+ \label{fig:c:wireshark_echo-request}
\end{figure}
- \item 清空Wireshark监控器,重新发起网络命令(如图\ref{c1_ping-exec}):
+ \item 清空Wireshark监控器,重新发起网络命令(如图\ref{fig:c:wireshark_ping-exec}):
ping IP地址/域名 –l \#length,并解释对比前后两次执行ping命令的结果。
其中,-l \#length确定echo数据报的长度为\#length,
其默认值为32字节,且小于65,527字节。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=11cm]{c1_ping-exec}
+ \includegraphics[width=10cm]{ping-exec}
\caption{ping命令执行示例}
- \label{fig:c1_ping-exec}
+ \label{fig:c:wireshark_ping-exec}
\end{figure}
\item 可以多次改变\#length的大小(例如1000字节、2000字节和4000字节),
@@ -285,23 +298,23 @@ tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示
\begin{enumerate}
\item 启动Wireshark软件,选择要监听的网络接口,设置过滤条件icmp
- (如图\ref{fig:c1_wireshark-filter-setup})。
+ (如图\ref{fig:c:wireshark_wireshark-filter-setup})。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=16cm]{c1_wireshark-filter-setup}
+ \includegraphics[width=12cm]{wireshark-filter-setup}
\caption{在Wireshark中设置过滤条件}
- \label{fig:c1_wireshark-filter-setup}
+ \label{fig:c:wireshark_wireshark-filter-setup}
\end{figure}
\item 在终端中使用traceroute命令,
- 目的主机是外网的一台设备(如图\ref{fig:c1_traceroute-exec},示例IP为210.34.0.12)。
+ 目的主机是外网的一台设备(如图\ref{fig:c:wireshark_traceroute-exec},示例IP为210.34.0.12)。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=16cm]{c1_traceroute-exec}
+ \includegraphics[width=10cm]{traceroute-exec}
\caption{在终端中执行traceroute命令示例}
- \label{fig:c1_traceroute-exec}
+ \label{fig:c:wireshark_traceroute-exec}
\end{figure}
\item 点击Internet Control Message Protocol展开,
@@ -311,7 +324,7 @@ tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示
\end{enumerate}
\subsection{思考题}
-\label{subsec:c1_s2_rethink}
+\label{subsec:c:wireshark:s:ip_rethink}
\begin{enumerate}
\item 在有线局域网中,PC1的IP地址为192.168.1.5/24,
@@ -319,7 +332,7 @@ tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示
PC2的IP地址为192.168.2.6/24,默认路由器的IP地址为192.168.2.1。
在PC1向PC2发送数据的传输过程中,
以太网数据帧的首部字段和IP数据报的首部字段是怎样变化的?
- 如果有条件,请搭建实验平台进行实验,并使用Wireshark软件验证你的答案。
+ 如果有条件,请搭建实验平台进行实验,并使用Wireshark软件验证你的答案。
\item 拒绝服务(Denial of Service,DoS)攻击,通过消耗目标主机设备的某种资源,
导致其网络服务不能被正常用户使用。
\begin{enumerate}
@@ -341,7 +354,7 @@ tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示
\end{enumerate}
\subsection{考核方法}
-\label{subsec:c1_s2_criterion}
+\label{subsec:c:wireshark:s:ip_criterion}
本次实验需提交一份实验报告和一组Wireshark数据存储文件。
报告内容应当包括以下三个部分,其中的分析解释都有对应的截图,
diff --git a/data/chapter1/section3.tex b/data/ch_wireshark/sec_tcp.tex
similarity index 91%
rename from data/chapter1/section3.tex
rename to data/ch_wireshark/sec_tcp.tex
index cae6bfe..60ca5fc 100644
--- a/data/chapter1/section3.tex
+++ b/data/ch_wireshark/sec_tcp.tex
@@ -1,10 +1,10 @@
%# -*- coding: utf-8-unix -*-
\section{TCP与拥塞控制}
-\label{sec:c1_s3}
+\label{sec:c:wireshark:s:tcp}
\subsection{实验目的}
-\label{subsec:c1_s3_object}
+\label{subsec:c:wireshark:s:tcp_object}
TCP(Transmission Control Protocol传输控制协议)是一种面向连接的、
可靠的、基于字节流的传输层通信协议。
@@ -14,7 +14,7 @@ TCP(Transmission Control Protocol传输控制协议)是一种面向连接的、
学会运用Wireshark分析TCP连接管理、流量控制和拥塞控制的过程,发现TCP的性能问题。
\subsection{实验内容}
-\label{subsec:c1_s3_content}
+\label{subsec:c:wireshark:s:tcp_content}
启动Wireshark,捕捉网络活动中的TCP报文并按要求分析。
\begin{enumerate}
@@ -33,7 +33,7 @@ TCP(Transmission Control Protocol传输控制协议)是一种面向连接的、
\end{enumerate}
\subsection{实验原理、方法和手段}
-\label{subsec:c1_s3_principle}
+\label{subsec:c:wireshark:s:tcp_principle}
\subsubsection{TCP协议}
@@ -49,14 +49,14 @@ TCP的连接管理、差错控制、流量控制和拥塞控制的原理。
\paragraph{TCP报文段(Segment)}~{}
\\
-TCP 报文段结构如图\ref{fig:c1_TCP-structure}所示,
+TCP 报文段结构如图\ref{fig:c:wireshark_TCP-structure}所示,
采用20字节的报文段头并有最长40字节的可选项。
-\begin{figure}[!htp]
+\begin{figure}[!ht]
\centering
- \includegraphics[width=10cm]{c1_TCP-structure}
+ \includegraphics[width=10cm]{TCP-structure}
\caption{TCP报文段结构标意图}
- \label{fig:c1_TCP-structure}
+ \label{fig:c:wireshark_TCP-structure}
\end{figure}
主要字段如下:
@@ -92,13 +92,13 @@ TCP 报文段结构如图\ref{fig:c1_TCP-structure}所示,
为维护一个可靠的端对端传输,TCP设计实现了完整的连接管理,
重点是三次握手的连接建立和四次挥手的连接释放过程,
-如图\ref{fig:c1_TCP-time-line}。
+如图\ref{fig:c:wireshark_TCP-time-line}。
-\begin{figure}[!htp]
+\begin{figure}[!ht]
\centering
- \includegraphics[width=9cm]{c1_TCP-time-line}
+ \includegraphics[width=9cm]{TCP-time-line}
\caption{TCP连接示意时序}
- \label{fig:c1_TCP-time-line}
+ \label{fig:c:wireshark_TCP-time-line}
\end{figure}
\textbf{建立过程:}TCP是面向连接的,数据传输之前必须在双方之间建立一条连接,
@@ -195,47 +195,50 @@ CUBIC的关键特征是:cwnd窗口的增长依赖两次丢包的时间。
\subsubsection{实验方法和手段}
-使用VMWare软件配置两台本地虚拟机,本地相互连接(如图\ref{fig:c1_TCP-topo})。
+使用VMWare软件配置两台本地虚拟机,本地相互连接(如图\ref{fig:c:wireshark_TCP-topo})。
在VMWare中的虚拟机设置->网络适配器->高级中虚拟机的网卡传入/传出带宽、
-传输速率、时延等,用来仿真不同的网络条件(如图\ref{fig:c1_VM-advance-setup})。
-本实验需要使用的命令和工具,如表\ref{tab:c1_tools-command}所列。
+传输速率、时延等,用来仿真不同的网络条件(如图\ref{fig:c:wireshark_VM-advance-setup})。
+本实验需要使用的命令和工具,如表\ref{tab:c:wireshark_tools-command}所列。
常用的Linux操作系统命令还包括:echo、cat、sysctl、ping、ftp。
-\begin{figure}[!htp]
+\begin{figure}[!ht]
\centering
- \includegraphics[width=9cm]{c1_TCP-topo}
+ \includegraphics[width=9cm]{TCP-topo}
\caption{实验拓扑图}
- \label{fig:c1_TCP-topo}
+ \label{fig:c:wireshark_TCP-topo}
\end{figure}
-\begin{figure}[!htp]
+\begin{figure}[!ht]
\centering
- \includegraphics[width=6cm]{c1_VM-advance-setup}
+ \includegraphics[width=6cm]{VM-advance-setup}
\caption{虚拟机网络适配器高级设置}
- \label{fig:c1_VM-advance-setup}
+ \label{fig:c:wireshark_VM-advance-setup}
\end{figure}
-\begin{table}[]
+\renewcommand{\arraystretch}{1.5}
+\begin{table}[!ht]
+ \small
\centering
\caption{主要工具及命令列表}
- \label{tab:c1_tools-command}
- \begin{tabular}{m{1.5cm}<{\centering}m{3cm}<{\centering}m{10cm}} \toprule
- 命令 & 作用 & 参考\\ \midrule
- \texttt{ifconfig} & 配置网络 & \url{https://man.linuxde.net/ifconfig}\\
- \texttt{nmap} & 网络扫描 & \url{https://nmap.org/man/zh/index.html}\\
- \texttt{curl} & 文本浏览器 & \url{https://man.linuxde.net/curl}\\
- \texttt{wget} & 下载Web文件 & \texttt{wget /}\\
- \texttt{tc} & 流量控制 & \href{https://man7.org/linux/man-pages/man8/tc.8.html}{TC命令手册} \\
- \texttt{iptables} & 防火墙配置 & \url{https://man.linuxde.net/iptables}\\
- \texttt{netwox} & 网络工具 & \url{https://sourceforge.net/projects/ntwox}/\\
- \texttt{ss} & Socket状态 & \texttt{ss –atn}\\
- \texttt{netstat} & 显示网络状态 & \texttt{netstat –atn}\\
- \texttt{iperf3} & 网络性能分析 & \url{https://iperf.fr/}\\ \bottomrule
+ \label{tab:c:wireshark_tools-command}
+ \begin{tabular}{|m{1.5cm}<{\centering}|m{3cm}<{\centering}|m{8.5cm}|}
+ \hline
+ \heiti 命令 & \heiti 作用 & \multicolumn{1}{c|}{\heiti 参考}\\ \hline
+ \texttt{ifconfig} & 配置网络 & \url{https://man.linuxde.net/ifconfig}\\ \hline
+ \texttt{nmap} & 网络扫描 & \url{https://nmap.org/man/zh/index.html}\\ \hline
+ \texttt{curl} & 文本浏览器 & \url{https://man.linuxde.net/curl}\\ \hline
+ \texttt{wget} & 下载Web文件 & \texttt{wget /}\\ \hline
+ \texttt{tc} & 流量控制 & \href{https://man7.org/linux/man-pages/man8/tc.8.html}{TC命令手册} \\ \hline
+ \texttt{iptables} & 防火墙配置 & \url{https://man.linuxde.net/iptables}\\ \hline
+ \texttt{netwox} & 网络工具 & \url{https://sourceforge.net/projects/ntwox/}\\ \hline
+ \texttt{ss} & Socket状态 & \texttt{ss –atn}\\ \hline
+ \texttt{netstat} & 显示网络状态 & \texttt{netstat –atn}\\ \hline
+ \texttt{iperf3} & 网络性能分析 & \url{https://iperf.fr/}\\ \hline
\end{tabular}
\end{table}
\subsection{实验条件}
-\label{subsec:c1_s3_requirement}
+\label{subsec:c:wireshark:s:tcp_requirement}
\begin{enumerate}
\item 硬件:每个学生一台物理实验机(8G以上内存,80G以上硬盘空间)。
@@ -261,7 +264,7 @@ CUBIC的关键特征是:cwnd窗口的增长依赖两次丢包的时间。
\end{itemize}
\subsection{实验步骤}
-\label{subsec:c1_s3_procedure}
+\label{subsec:c:wireshark:s:tcp_procedure}
\subsubsection{TCP正常连接观察}
@@ -358,7 +361,8 @@ CUBIC的关键特征是:cwnd窗口的增长依赖两次丢包的时间。
\begin{enumerate}
\item 编写一对简单的TCP连接程序,
- 也可以直接运行指导书提供的Python程序(见附件)。
+ 也可以直接运行指导书提供的Python程序
+ (源代码见\ref{subsec:c:wireshark:s:tcp_additionalprg}节中的附件)。
在客户端快速发送数据给服务端,而服务端则有意缓慢地接收数据,
观察TCP如何用窗口大小值进行流量控制。虚拟机两端分别运行
\texttt{python3 server.py}和\texttt{python3 client.py}。
@@ -375,14 +379,14 @@ CUBIC的关键特征是:cwnd窗口的增长依赖两次丢包的时间。
再启动应用(可以是http wget,也可以ftp下载/上传)传输大文件观察。
\item Wireshark抓取全部传输过程数据,找出该网络活动的拥塞点,
并结合Analyze$\rightarrow$Expert Information、Statistic$\rightarrow$IO Graphs、
- Statistic$\rightarrow$TCP Stream Graphs(如图\ref{fig:c1_io-graphs}),
+ Statistic$\rightarrow$TCP Stream Graphs(如图\ref{fig:c:wireshark_io-graphs}),
分析此传输过程中的慢启动、拥塞避免、快速恢复等阶段。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=10cm]{c1_io-graphs}
+ \includegraphics[width=8cm]{io-graphs}
\caption{IO Graphs}
- \label{fig:c1_io-graphs}
+ \label{fig:c:wireshark_io-graphs}
\end{figure}
\item TCP竞争观察:类似以上试验,我们在一个大文件传输过程中,
@@ -406,7 +410,7 @@ CUBIC的关键特征是:cwnd窗口的增长依赖两次丢包的时间。
\end{enumerate}
\subsection{思考题}
-\label{subsec:c1_s3_rethink}
+\label{subsec:c:wireshark:s:tcp_rethink}
\begin{enumerate}
\item TCP在不可靠的IP层上建立了可靠的端对端连接,
@@ -420,21 +424,21 @@ CUBIC的关键特征是:cwnd窗口的增长依赖两次丢包的时间。
\item TCP是封装单元为MSS,可是我们在抓包过程中常发现远大于此值的TCP包,
为什么TCP可以提交如此大的报文呢?
此类型的包远超出链路层的MTU,它是如何被处理的呢?请从两端同时抓包观察比对。
- \item 在TCP状态机(图\ref{fig:c1_TCP-status-machine})中,
+ \item 在TCP状态机(图\ref{fig:c:wireshark_TCP-status-machine})中,
有些状态停留时间较长,易观察到,有些状态很短暂不易观察到。
试列出不易观察到的状态,并考虑观察到它们的可能方法。
- \begin{figure}[!htp]
+ \begin{figure}[!ht]
\centering
- \includegraphics[width=11cm]{c1_TCP-status-machine}
+ \includegraphics[width=9cm]{TCP-status-machine}
\caption{TCP连接管理状态机}
- \label{fig:c1_TCP-status-machine}
+ \label{fig:c:wireshark_TCP-status-machine}
\end{figure}
\end{enumerate}
\subsection{注意事项及有关说明}
-\label{subsec:c1_s3_notice}
+\label{subsec:c:wireshark:s:tcp_notice}
\begin{enumerate}
\item Linux上运行wireshark抓包需要root权限,
@@ -452,7 +456,7 @@ CUBIC的关键特征是:cwnd窗口的增长依赖两次丢包的时间。
\end{enumerate}
\subsection{考核方法}
-\label{subsec:c1_s3_criterion}
+\label{subsec:c:wireshark:s:tcp_criterion}
完成本次实验,并提交一份实验报告和一组Wireshark数据存储文件。
报告内容应当包括以下部分,相关的分析解释都对应有截图证明,并与数据存储文件吻合。
@@ -469,10 +473,11 @@ CUBIC的关键特征是:cwnd窗口的增长依赖两次丢包的时间。
\end{enumerate}
\subsection{附件}
-\label{subsec:c1_s3_additionalprg}
-1. Python3 TCP socket通信程序。
+\label{subsec:c:wireshark:s:tcp_additionalprg}
-\ 服务端 server.py
+为了方便进行实验,提供一份Python3套接字通信作为附件,具体代码如下:
+\begin{itemize}
+ \item 服务端 server.py
\begin{code}[python]
import socket
import time
@@ -501,7 +506,7 @@ CUBIC的关键特征是:cwnd窗口的增长依赖两次丢包的时间。
s.close()
\end{code}
-客户端 client.py
+\item 客户端 client.py
\begin{code}[python]
import socket
import time
@@ -521,4 +526,6 @@ CUBIC的关键特征是:cwnd窗口的增长依赖两次丢包的时间。
print("Sent. Waiting....")
while True:
time.sleep(0.001)
-\end{code}
\ No newline at end of file
+\end{code}
+
+\end{itemize}
diff --git a/data/preface.tex b/data/preface.tex
index 3a80219..988fbe7 100644
--- a/data/preface.tex
+++ b/data/preface.tex
@@ -24,6 +24,7 @@
\item 第一单元:谢怡、陈建发、洪劼超、雷蕴奇,厦门大学
\item 第二单元:吴荻,国防科技大学
\item 第三单元:张晓丽,昆明理工大学
+ \item 统筹规划:徐明、夏竟,国防科技大学
\end{itemize}
\end{pre}
\ No newline at end of file
diff --git a/figure/chapter3/c3_OSPF-topo.png b/figure/chapters/ensp/OSPF-topo.png
similarity index 100%
rename from figure/chapter3/c3_OSPF-topo.png
rename to figure/chapters/ensp/OSPF-topo.png
diff --git a/figure/chapter3/c3_RIP-topo.png b/figure/chapters/ensp/RIP-topo.png
similarity index 100%
rename from figure/chapter3/c3_RIP-topo.png
rename to figure/chapters/ensp/RIP-topo.png
diff --git a/figure/chapter3/c3_confirm.jpg b/figure/chapters/ensp/confirm.jpg
similarity index 100%
rename from figure/chapter3/c3_confirm.jpg
rename to figure/chapters/ensp/confirm.jpg
diff --git a/figure/chapter3/c3_ping_1.png b/figure/chapters/ensp/ping_1.png
similarity index 100%
rename from figure/chapter3/c3_ping_1.png
rename to figure/chapters/ensp/ping_1.png
diff --git a/figure/chapter3/c3_ping_2.jpg b/figure/chapters/ensp/ping_2.jpg
similarity index 100%
rename from figure/chapter3/c3_ping_2.jpg
rename to figure/chapters/ensp/ping_2.jpg
diff --git a/figure/chapter3/c3_static-topo.png b/figure/chapters/ensp/static-topo.png
similarity index 100%
rename from figure/chapter3/c3_static-topo.png
rename to figure/chapters/ensp/static-topo.png
diff --git a/figure/chapter3/c3_sysname-R1_1.png b/figure/chapters/ensp/sysname-R1_1.png
similarity index 100%
rename from figure/chapter3/c3_sysname-R1_1.png
rename to figure/chapters/ensp/sysname-R1_1.png
diff --git a/figure/chapter3/c3_sysname-R1_2.jpg b/figure/chapters/ensp/sysname-R1_2.jpg
similarity index 100%
rename from figure/chapter3/c3_sysname-R1_2.jpg
rename to figure/chapters/ensp/sysname-R1_2.jpg
diff --git a/figure/chapter3/c3_sysname-R1_3.jpg b/figure/chapters/ensp/sysname-R1_3.jpg
similarity index 100%
rename from figure/chapter3/c3_sysname-R1_3.jpg
rename to figure/chapters/ensp/sysname-R1_3.jpg
diff --git a/figure/chapter3/c3_sysname-R2_1.png b/figure/chapters/ensp/sysname-R2_1.png
similarity index 100%
rename from figure/chapter3/c3_sysname-R2_1.png
rename to figure/chapters/ensp/sysname-R2_1.png
diff --git a/figure/chapter3/c3_sysname-R2_2.jpg b/figure/chapters/ensp/sysname-R2_2.jpg
similarity index 100%
rename from figure/chapter3/c3_sysname-R2_2.jpg
rename to figure/chapters/ensp/sysname-R2_2.jpg
diff --git a/figure/chapter3/c3_sysname-R2_3.jpg b/figure/chapters/ensp/sysname-R2_3.jpg
similarity index 100%
rename from figure/chapter3/c3_sysname-R2_3.jpg
rename to figure/chapters/ensp/sysname-R2_3.jpg
diff --git a/figure/chapter2/c2_tcp-flow.png b/figure/chapters/socket/tcp-flow.png
similarity index 100%
rename from figure/chapter2/c2_tcp-flow.png
rename to figure/chapters/socket/tcp-flow.png
diff --git a/figure/chapter2/c2_udp-flow.png b/figure/chapters/socket/udp-flow.png
similarity index 100%
rename from figure/chapter2/c2_udp-flow.png
rename to figure/chapters/socket/udp-flow.png
diff --git a/figure/chapter1/c1_TCP-status-machine.png b/figure/chapters/wireshark/TCP-status-machine.png
similarity index 100%
rename from figure/chapter1/c1_TCP-status-machine.png
rename to figure/chapters/wireshark/TCP-status-machine.png
diff --git a/figure/chapter1/c1_TCP-structure.png b/figure/chapters/wireshark/TCP-structure.png
similarity index 100%
rename from figure/chapter1/c1_TCP-structure.png
rename to figure/chapters/wireshark/TCP-structure.png
diff --git a/figure/chapter1/c1_TCP-time-line.png b/figure/chapters/wireshark/TCP-time-line.png
similarity index 100%
rename from figure/chapter1/c1_TCP-time-line.png
rename to figure/chapters/wireshark/TCP-time-line.png
diff --git a/figure/chapter1/c1_TCP-topo.png b/figure/chapters/wireshark/TCP-topo.png
similarity index 100%
rename from figure/chapter1/c1_TCP-topo.png
rename to figure/chapters/wireshark/TCP-topo.png
diff --git a/figure/chapter1/c1_VM-advance-setup.png b/figure/chapters/wireshark/VM-advance-setup.png
similarity index 100%
rename from figure/chapter1/c1_VM-advance-setup.png
rename to figure/chapters/wireshark/VM-advance-setup.png
diff --git a/figure/chapter1/c1_arp-format.png b/figure/chapters/wireshark/arp-format.png
similarity index 100%
rename from figure/chapter1/c1_arp-format.png
rename to figure/chapters/wireshark/arp-format.png
diff --git a/figure/chapter1/c1_echo-request.png b/figure/chapters/wireshark/echo-request.png
similarity index 100%
rename from figure/chapter1/c1_echo-request.png
rename to figure/chapters/wireshark/echo-request.png
diff --git a/figure/chapter1/c1_eth-frame-detail.png b/figure/chapters/wireshark/eth-frame-detail.png
similarity index 100%
rename from figure/chapter1/c1_eth-frame-detail.png
rename to figure/chapters/wireshark/eth-frame-detail.png
diff --git a/figure/chapter1/c1_icmp-structure.png b/figure/chapters/wireshark/icmp-structure.png
similarity index 100%
rename from figure/chapter1/c1_icmp-structure.png
rename to figure/chapters/wireshark/icmp-structure.png
diff --git a/figure/chapter1/c1_io-graphs.png b/figure/chapters/wireshark/io-graphs.png
similarity index 100%
rename from figure/chapter1/c1_io-graphs.png
rename to figure/chapters/wireshark/io-graphs.png
diff --git a/figure/chapter1/c1_ip-structure.png b/figure/chapters/wireshark/ip-structure.png
similarity index 100%
rename from figure/chapter1/c1_ip-structure.png
rename to figure/chapters/wireshark/ip-structure.png
diff --git a/figure/chapter1/c1_ip-view.png b/figure/chapters/wireshark/ip-view.png
similarity index 100%
rename from figure/chapter1/c1_ip-view.png
rename to figure/chapters/wireshark/ip-view.png
diff --git a/figure/chapter1/c1_ping-exec.png b/figure/chapters/wireshark/ping-exec.png
similarity index 100%
rename from figure/chapter1/c1_ping-exec.png
rename to figure/chapters/wireshark/ping-exec.png
diff --git a/figure/chapter1/c1_traceroute-exec.png b/figure/chapters/wireshark/traceroute-exec.png
similarity index 100%
rename from figure/chapter1/c1_traceroute-exec.png
rename to figure/chapters/wireshark/traceroute-exec.png
diff --git a/figure/chapter1/c1_wireshark-boot-ui.png b/figure/chapters/wireshark/wireshark-boot-ui.png
similarity index 100%
rename from figure/chapter1/c1_wireshark-boot-ui.png
rename to figure/chapters/wireshark/wireshark-boot-ui.png
diff --git a/figure/chapter1/c1_wireshark-filter-setup.png b/figure/chapters/wireshark/wireshark-filter-setup.png
similarity index 100%
rename from figure/chapter1/c1_wireshark-filter-setup.png
rename to figure/chapters/wireshark/wireshark-filter-setup.png
diff --git a/figure/chapter1/c1_wireshark-filters.png b/figure/chapters/wireshark/wireshark-filters.png
similarity index 100%
rename from figure/chapter1/c1_wireshark-filters.png
rename to figure/chapters/wireshark/wireshark-filters.png
diff --git a/figure/chapter1/c1_wireshark-main-ui.png b/figure/chapters/wireshark/wireshark-main-ui.png
similarity index 100%
rename from figure/chapter1/c1_wireshark-main-ui.png
rename to figure/chapters/wireshark/wireshark-main-ui.png
diff --git a/figure/chapter1/c1_wireshark-monitor.png b/figure/chapters/wireshark/wireshark-monitor.png
similarity index 100%
rename from figure/chapter1/c1_wireshark-monitor.png
rename to figure/chapters/wireshark/wireshark-monitor.png
diff --git a/figure/chapter1/c1_wireshark-save.png b/figure/chapters/wireshark/wireshark-save.png
similarity index 100%
rename from figure/chapter1/c1_wireshark-save.png
rename to figure/chapters/wireshark/wireshark-save.png
diff --git a/figure/chapter1/c1_wireshark-setup-ui.png b/figure/chapters/wireshark/wireshark-setup-ui.png
similarity index 100%
rename from figure/chapter1/c1_wireshark-setup-ui.png
rename to figure/chapters/wireshark/wireshark-setup-ui.png
diff --git a/figure/chapter1/c1_wireshark-special-type.png b/figure/chapters/wireshark/wireshark-special-type.png
similarity index 100%
rename from figure/chapter1/c1_wireshark-special-type.png
rename to figure/chapters/wireshark/wireshark-special-type.png
diff --git a/figure/chapter1/c1_wireshark-statistic.png b/figure/chapters/wireshark/wireshark-statistic.png
similarity index 100%
rename from figure/chapter1/c1_wireshark-statistic.png
rename to figure/chapters/wireshark/wireshark-statistic.png
From 4febba7f19740e2b748f011ee814033659f33bbe Mon Sep 17 00:00:00 2001
From: xphi
Date: Tue, 23 Feb 2021 18:23:15 +0800
Subject: [PATCH 04/12] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=AC=AC=E5=9B=9B?=
=?UTF-8?q?=E5=8D=95=E5=85=83?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
book/instructions.cls | 2 +-
book/instructions.tex | 25 ++
data/appendix/fast.tex | 30 ++
data/appendix/openbox.tex | 29 ++
data/ch_ensp/preface.tex | 2 +-
data/ch_router-openbox/preface.tex | 18 ++
data/ch_router-openbox/sec_networking.tex | 274 +++++++++++++++++
data/ch_router-openbox/sec_router.tex | 283 ++++++++++++++++++
data/ch_router-openbox/sec_switch.tex | 279 +++++++++++++++++
data/ch_sdn-openbox/preface.tex | 11 +
data/ch_sdn-openbox/sec_ns.tex | 28 ++
data/ch_sdn-openbox/sec_sdn.tex | 28 ++
data/ch_sdn-openbox/sec_topo.tex | 28 ++
data/ch_socket/sec_smtp.tex | 18 +-
data/ch_socket/sec_udp.tex | 2 +-
data/preface.tex | 4 +-
.../chapters/router-openbox/switch-topo.png | Bin 0 -> 23421 bytes
17 files changed, 1048 insertions(+), 13 deletions(-)
create mode 100644 data/appendix/fast.tex
create mode 100644 data/appendix/openbox.tex
create mode 100644 data/ch_router-openbox/preface.tex
create mode 100644 data/ch_router-openbox/sec_networking.tex
create mode 100644 data/ch_router-openbox/sec_router.tex
create mode 100644 data/ch_router-openbox/sec_switch.tex
create mode 100644 data/ch_sdn-openbox/preface.tex
create mode 100644 data/ch_sdn-openbox/sec_ns.tex
create mode 100644 data/ch_sdn-openbox/sec_sdn.tex
create mode 100644 data/ch_sdn-openbox/sec_topo.tex
create mode 100644 figure/chapters/router-openbox/switch-topo.png
diff --git a/book/instructions.cls b/book/instructions.cls
index aa142bc..ce7454d 100644
--- a/book/instructions.cls
+++ b/book/instructions.cls
@@ -402,7 +402,7 @@
%定制代码框
\newtcblisting{code}[1][]{
center,
- width=0.9\linewidth,
+ width=0.95\linewidth,
listing only,
breakable=true,
minted language=#1,
diff --git a/book/instructions.tex b/book/instructions.tex
index c39aa3e..cf4180a 100644
--- a/book/instructions.tex
+++ b/book/instructions.tex
@@ -48,24 +48,43 @@
\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
@@ -85,6 +104,12 @@
\graphicspath{{../figure/appendixes/ensp/}}
\input{../data/appendix/ensp}
+\graphicspath{{../figure/appendixes/openbox/}}
+\input{../data/appendix/openbox}
+
+\graphicspath{{../figure/appendixes/fast/}}
+\input{../data/appendix/fast}
+
\backmatter
%======================================================================
% 参考文献
diff --git a/data/appendix/fast.tex b/data/appendix/fast.tex
new file mode 100644
index 0000000..45d7641
--- /dev/null
+++ b/data/appendix/fast.tex
@@ -0,0 +1,30 @@
+%# -*- 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架构的虚拟地址空间定义。
\ No newline at end of file
diff --git a/data/appendix/openbox.tex b/data/appendix/openbox.tex
new file mode 100644
index 0000000..be601e1
--- /dev/null
+++ b/data/appendix/openbox.tex
@@ -0,0 +1,29 @@
+%# -*- 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架构开发的应用、
+标准的网络协议栈与通用网络应用。
+平台软硬件逻辑代码开源免费,支持用户二次开发。
diff --git a/data/ch_ensp/preface.tex b/data/ch_ensp/preface.tex
index dd6ae7d..1ae90af 100644
--- a/data/ch_ensp/preface.tex
+++ b/data/ch_ensp/preface.tex
@@ -6,6 +6,6 @@
掌握静态路由、动态路由RIP和OSPF协议的配置,并理解分析静态与动态路由的区别,
两种动态路由协议各自的适用环境,理解网络收敛的概念。
推荐使用华为ENSP模拟器,
-在附录\ref{app:ENSP}中有该软件的安装、操作和使用,
+在附录\ref{app:ENSP}:《华为网络仿真平台 ENSP 简介》中有该软件的安装、操作和使用,
以熟悉华为模拟设备的基本配置及其配置命令,
掌握软件安装常见问题的解决方法。
diff --git a/data/ch_router-openbox/preface.tex b/data/ch_router-openbox/preface.tex
new file mode 100644
index 0000000..853cb0f
--- /dev/null
+++ b/data/ch_router-openbox/preface.tex
@@ -0,0 +1,18 @@
+%# -*- coding: utf-8-unix -*-
+
+\chapter{路由器实现}
+\label{chap:router-ob}
+
+本单元实验使学生能初步使用可编程网络设备开发平台进行路由器基本功能的设计与实现,
+通过程序来实现路由器中最基本的三个功能:
+包括二层交换功能、三层路由功能及组网功能。
+深入理解路由器的基本工作原理与分组处理流程,
+从而培养学生对网络设备使用和研发的能力。
+
+可编程网络设备开发平台是一款基于FAST架构的软硬件
+(软件在CPU上使用C语言编程,硬件在FPGA芯片上使用Verilog语言编程)
+全可编程的网络实验教学平台,平台的软硬件逻辑代码开源免费,支持用户二次开发。
+其基本使用方法与编程开发方法见附录\ref{app:openbox}:《可编程网络平台-操作手册》
+和附录\ref{app:fast}:《FAST编程-入门指南》。
+可编程网络设备开发平台在后文简称为“可编程网络平台”,图标LOGO为FAST,节点名称为OpenBox-S4。
+
diff --git a/data/ch_router-openbox/sec_networking.tex b/data/ch_router-openbox/sec_networking.tex
new file mode 100644
index 0000000..3ed9b55
--- /dev/null
+++ b/data/ch_router-openbox/sec_networking.tex
@@ -0,0 +1,274 @@
+%# -*- coding: utf-8-unix -*-
+
+\section{三层路由器组网}
+\label{sec:c:router-ob:s:networking}
+
+\subsection{实验目的}
+\label{subsec:c:router-ob:s:networking_object}
+
+本实验的主要目的是让学生将自己开发的路由器进行组网实验,
+引入路由协议的配置与学习,实现多网段主机间的相互通信。
+熟悉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表同步情况
+\end{enumerate}
+
+\subsection{实验原理、方法和手段}
+\label{subsec:c:router-ob:s:networking_principle}
+
+\subsubsection{路由协议及基本工作原理}
+
+路由协议工作在路由器的控制平面,创建了路由表,描述了网络拓扑结构。
+通过在路由器之间共享路由信息来相互学习总个网络可达区域内可到达的路由网段信息。
+路由信息在相邻路由器之间传递,确保所有路由器知道到其它路由器的路径。
+
+路由协议主要包括: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 学生自研路由器程序。
+\end{itemize}
+
+\begin{figure}[!ht]
+ \centering
+ \includegraphics[width=8cm]{switch-topo}
+ \caption{三层路由组网实验拓扑图}
+ \label{fig:c:router-ob_networking-topo}
+\end{figure}
+
+\subsection{实验步骤}
+\label{subsec:c:router-ob:s:networking_procedure}
+
+\begin{enumerate}
+ \item 在每个路由器节点安装quagga软件,配置其正常工作。
+ 路由协议选择RIP和OSPF两种,每次测试只启动一种协议即可;
+ \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) 的触发器 ...
+ \end{code}
+
+ \item Quagga启动配置
+ \begin{code}[console]
+ root@HNXS-FAST:/home/hnxs# vim /etc/quagga/daemons
+ zebra=yes
+ bgpd=no
+ ospfd= yes
+ ospf6d=no
+ ripd= yes
+ ripngd=no
+ isisd=no
+ babeld=no
+ \end{code}
+
+ 将上述文件内容中的3个no修改为yes,表示启动该功能模块。
+
+ \item RIP协议启动配置
+ \begin{code}[console]
+ root@HNXS:/home/hnxs# vim /etc/quagga/ripd.conf
+ \end{code}
+
+ 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)连接起来的。
+
+ \item OSPF协议启动配置
+ \begin{code}[console]
+ root@HNXS:/home/hnxs# vim /etc/quagga/ospfd.conf
+ \end{code}
+
+ 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路由器的配置文件,另一台路由器配置文件为:
+ \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}
+
+ \item 启动路由协议
+ \begin{code}[console]
+ root@HNXS:/home/hnxs# systemctl start quagga
+ \end{code}
+
+ \item 将自研路由器和测试主机组网,路由节点不少于2个,连线可以组成环状;
+ \item 运行自研路由器,并在两个测试主机上分别ping对方主机IP地址;
+ 请参考实验\ref{sec:c:router-ob:s:router}内容。
+ \item 观察某个节点路由器分组处理流程,
+ 从打印消息上观察控制平面与数据平面的分组处理情况;
+ \item 观察每个节点上内核FIB表内容;
+
+ \begin{code}[console]
+ root@HNXS-FAST:/mnt/openbox# route -n
+ 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
+ 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 obx1
+ 192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 obx2
+ 192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 obx3
+ 192.168.4.0 192.168.3.2 255.255.255.0 UG 2 0 0 obx3
+ 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变化,是否已经同步更新;
+\end{enumerate}
+
+\subsection{思考题}
+\label{subsec:c:router-ob:s:networking_rethink}
+
+\begin{enumerate}
+ \item 路由协议的邻接信息学习后如何去重?如何收敛?
+ \item 默认网关的作用是什么?
+\end{enumerate}
+
+\subsection{注意事项及有关说明}
+\label{subsec:c:router-ob:s:networking_notice}
+
+\begin{enumerate}
+ \item RIP协议与OSPF协议一定要根据网络连接接口及相应IP地址配置网段信息,
+ 修改文件时注意不要使用中文符号;
+ \item 每次只启动一个协议,以更好验证其效果。
+\end{enumerate}
+
+\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分)实验报告与源代码内容完整、格式整洁。
+\end{enumerate}
diff --git a/data/ch_router-openbox/sec_router.tex b/data/ch_router-openbox/sec_router.tex
new file mode 100644
index 0000000..2deeef2
--- /dev/null
+++ b/data/ch_router-openbox/sec_router.tex
@@ -0,0 +1,283 @@
+%# -*- coding: utf-8-unix -*-
+
+\section{三层路由器实现}
+\label{sec:c:router-ob:s:router}
+
+\subsection{实验目的}
+\label{subsec:c:router-ob:s:router_object}
+
+本实验的主要目的是让学生掌握二层以太网帧、ARP协议和三层IP协议等的数据结构,
+熟悉各协议的解析与封装过程,
+掌握三层路由器的工作原理、分组处理流程、FIB表和邻接表生成与使用。
+熟悉路由器数据平面与控制平面的切分及不同的工作处理流程。
+
+\subsection{实验内容}
+\label{subsec:c:router-ob:s:router_content}
+
+使用可编程网络平台及三层路由器示例框架源码,
+设计完成一个三层路由器原型系统。主要完成以下内容:
+
+\begin{enumerate}
+ \item \textbf{系统路由验证:}搭建测试环境,
+ 验证系统自带三层路由原型系统的功能,实现不同网段主机的相互通信功能;
+ \item \textbf{逻辑设计与实现:}基于路由器示例框架代码,
+ 分别设计完成路由器的分组解析、FIB同步与查表、
+ 二层与三层数据更新、ARP请求与响应等模块功能;
+ \item \textbf{功能调试与验证:}根据路由器分组处理流程,
+ 分别调试每一类分组的处理逻辑。如ARP请求类分组、
+ ARP响应类分组、控制平面分组和数据平面分组;
+ 组网测试路由器功能,实现不同网段内主机之间的相互通信功能。
+\end{enumerate}
+
+\subsection{实验原理、方法和手段}
+\label{subsec:c:router-ob:s:router_principle}
+
+\subsubsection{系统路由验证}
+
+请参考附件《可编程网络平台-操作手册》完成。
+\subsubsection{三层路由器工作原理}
+三层路由器工作于OSI模型的第3层(网络层),根据网络层中的目的IP地址进行查表,
+获得分组转发的下一跳输出端口及下一跳的IP地址。更新网络层的TTL值与CSUM值,
+并在输出端口对二层数据进行重新封装二层数据后转发。
+路由器还具备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{端口队列输出:}抽取端口输出队列内的发送分组,
+ 更新二层数据后由端口直接发送。
+\end{enumerate}
+
+\subsection{实验条件}
+\label{subsec:c:router-ob:s:router_requirement}
+
+\begin{itemize}
+ \item 可编程网络平台一个,路由测试主机两台,
+ IP配置及连接拓扑如图\ref{fig:c:router-ob_router-topo}所示;
+ \item 串口线一根,网线两根;
+ \item 三层路由器框架源代码(开发环境与编译工具系统自带)。
+\end{itemize}
+
+\begin{figure}[!ht]
+ \centering
+ \includegraphics[width=8cm]{switch-topo}
+ \caption{三层路由器实验拓扑图}
+ \label{fig:c:router-ob_router-topo}
+\end{figure}
+
+\subsection{实验步骤}
+\label{subsec:c:router-ob:s:router_procedure}
+
+\subsubsection{系统路由验证}
+1. 登录可编程网络平台,启动系统自带三层路由器命令,
+系统输出如下信息说明已正常启动且进入工作模式;
+
+\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...
+ 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......
+ fastU->UA->pid:907,mid:132,Register OK!
+ fastU->libua version:20180827
+ fastU->fast_ua_recv......
+\end{code}
+
+\subsubsection{设计开发三层路由器}
+\begin{enumerate}
+ \item 阅读三层路由器框架源代码文件,
+ 根据三层路由工作原理及分组处理流程设计完成框架源代码中的TODO部分内容;
+ \item 编译自己的三层路由器源码,生成相应的路由器系统命令user\_l3router;
+\end{enumerate}
+
+\subsubsection{调试与验证}
+\begin{enumerate}
+ \item 运行自己的三层路由器代码,验证路由器的功能;
+ \item 路由器正常工作后,可以显示如下信息;
+ \begin{itemize}
+ \item 加载路由器接口地址信息
+ \begin{code}[text]
+ 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
+ \end{code}
+
+ \item 同步内核FIB表
+ \begin{code}[text]
+ 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
+ \end{code}
+
+ \item 启动端口输出队列线程
+ \begin{code}[text]
+ 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}
+
+ \item 开始接收分组处理
+ \begin{code}[text]
+ fastU->REG Version:20180827,OpenBox HW Version:2030200722
+ FAST UA REG->from pid:923,state:21,mid:132
+ fastU->Register UA to FAST Kernel! Wait Reply......
+ fastU->UA->pid:923,mid:132,Register OK!
+ fastU->libua version:20180827
+ fastU->fast_ua_recv......
+ \end{code}
+
+ \item 控制平面分组处理
+ \begin{code}[text]
+ UA Recv ptk 0xb2c00468,len:130,inport:0
+ Recv IPv4 Packet!
+ Recv Unicast Host Packet,Dispatch Packet!
+ Control Plane->Send to Protocol Stack[128]!
+ \end{code}
+
+ \item 数据平面分组处理
+ \begin{code}[text]
+ UA Recv ptk 0xb2c00468,len:130,inport:2
+ Recv IPv4 Packet!
+ Recv Unicast Host Packet,Dispatch Packet!
+ Data Plane->FIB(dst:192.168.0.111) tblidx:0
+ Data Plane->Next Hop:192.168.0.111,outport:0
+ //查不到MAC,入队后学习MAC
+ Data Plane->port[0],NEIGH[1],IN QUEUE[1]
+ Data Plane->Active Thread on Port[0],QUEUE[1] len:2
+ //查询到MAC,直接封闭二层数据后发送
+ Data Plane->port[2],NEIGH[0],DMAC->B8:27:EB:C1:D1:39
+ Pack L2 on Port[2]
+ pkt_send_normal->0xb2c00468,outport:2,len:130
+ \end{code}
+
+ \item ARP请求处理
+ \begin{code}[text]
+ send_arp_request 192.168.2.119 on Port[2]
+ pkt_send_normal->0xb2b00468,outport:2,len:74
+ pkt_send_normal->0xb2b00468,outport:2,len:74
+ pkt_send_normal->0xb2b00468,outport:2,len:74
+ \end{code}
+
+ \item ARP响应处理
+ \begin{code}[text]
+ UA Recv ptk 0xb2c00468,len:92,inport:0
+ Recv ARP Packet!
+ ARP->Host IPv4
+ ARP->Response,192.168.0.111[B8:27:EB:D8:83:20]--> 192.168.0.1[00:0A:35:01:00:5B]
+ Learn SMAC Port[0],B8:27:EB:D8:83:20
+ Learn SMAC Port[0],NEIGH[0],Update[B8:27:EB:D8:83:20]!
+ \end{code}
+
+ \item 路由不可达
+ \begin{code}[text]
+ ICMP Report and Drop!
+ \end{code}
+
+ \item FIB表刷新
+ \begin{code}[text]
+ FIB4 fresh...
+ \end{code}
+
+ \end{itemize}
+
+ \item 路由器工作不正确时,使用\texttt{xprintf}函数打印调试,
+ 建议根据不同类别数据流进行打印分析,调试某一些报文时,其他无关内容均不打印;
+ \item 在任意一台测试主机\texttt{ping 8.8.8.8},
+ 观察路由器分组处理流程及FIB表查找结果变化;
+ \item 路由器正常工作后,复制保留程序输出日志信息。
+\end{enumerate}
+
+\subsection{思考题}
+\label{subsec:c:router-ob:s:router_rethink}
+
+\begin{enumerate}
+ \item 系统内核的FIB表是如何生成的?生成FIB表的路由协议有哪些,各适应哪些环境?
+ \item 什么是静态路由表?什么是动态路由表?
+ \item FIB表查表不命中如何处理?
+ FIB表指示的下一跳IP的MAC地址不存在如何处理当前分组数据?
+ \item 本程序采用单核单线程处理多个端口的数据转发,如何改成多核多线程方式?
+\end{enumerate}
+
+\subsection{注意事项及有关说明}
+\label{subsec:c:router-ob:s:router_notice}
+
+\begin{enumerate}
+ \item 可编程网络平台的路由器只是一个基础的路由器原型,
+ 分组处理方法与流程设计并不是规范,学生可根据自己理解创新实现;
+ \item 控制平面的数据是通过平台开发环境重新导入到了系统内核处理,
+ 目的是为了支持该系统上的其他正常SOCKET应用,如Quagga路由软件。
+\end{enumerate}
+
+\subsection{考核方法}
+\label{subsec:c:router-ob:s:router_criterion}
+
+完成本次实验,需要提交一份实验报告、一份程序源代码和一分程序输出日志。
+程序源代码中用户添加的代码需要有详细的注释说明。
+
+\begin{enumerate}
+ \item (20分)在规定时间内完成实验,并提交实验成果;
+ \item (40分)实验报告中有详细的路由逻辑设计分析与实现说明;
+ \item (10分)程序正常运行,测试主机可以ping通或抓包接收到对端报文;
+ \item (10分)ARP请求与响应功能正常工作;
+ \item (10分)测试主机可以ping通路由器端口的IP地址;
+ \item (10分)实验报告与源代码内容完整、格式整洁。
+\end{enumerate}
diff --git a/data/ch_router-openbox/sec_switch.tex b/data/ch_router-openbox/sec_switch.tex
new file mode 100644
index 0000000..4e9a3cf
--- /dev/null
+++ b/data/ch_router-openbox/sec_switch.tex
@@ -0,0 +1,279 @@
+%# -*- coding: utf-8-unix -*-
+
+\section{二层交换机实现}
+\label{sec:c:router-ob:s:switch}
+
+\subsection{实验目的}
+\label{subsec:c:router-ob:s:switch_object}
+
+本实验的主要目的是让学生掌握可编程网络平台的二层以太网数据收发方法,
+熟悉二层以太网帧的数据结构,掌握MAC地址的解析与使用。
+熟悉二层交换机的分组交换原理、
+设计完成二层交换的分组处理流程和转发表的老化功能与处理方法。
+
+\subsection{实验内容}
+\label{subsec:c:router-ob:s:switch_content}
+
+使用可编程网络平台及二层交换机示例框架源码,
+设计完成一个二层以太网交换机原型系统。主要完成以下内容:
+
+\begin{enumerate}
+ \item \textbf{平台使用与验证:}掌握可编程网络平台及示例开发代码的修改、
+ 编译和运行操作,验证系统自带二层交换机的功能;
+ \item \textbf{逻辑设计与实现:}设计满足二层交换功能的分组处理流程和逻辑,
+ 如源MAC学习功能、目的MAC查表功能、
+ 端口输出(单播与泛洪)功能和MAC转发表老化功能;
+ \item \textbf{功能调试与验证:}验证自己开发的二层交换机功能,
+ 是否满足各端口间相互通信功能;
+\end{enumerate}
+
+\subsection{实验原理、方法和手段}
+\label{subsec:c:router-ob:s:switch_principle}
+
+\subsubsection{平台基本使用}
+
+请参考附录\ref{app:openbox}:《可编程网络平台-操作手册》完成。
+
+\subsubsection{二层交换工作原理}
+
+二层交换机工作于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分钟)则将该表项删除。
+ 表项删除可将其有效位置无效,提高处理效率。
+\end{enumerate}
+
+\subsubsection{实验方法及手段}
+
+可编程网络平台提供了完整软硬件开发环境和网络功能
+(交换或路由等)的示例应用程序及相应框架源代码。
+学生使用挖空了部分逻辑功能的示例框架源码版本完成网络功能的设计与调试工作。
+
+\subsection{实验条件}
+\label{subsec:c:router-ob:s:switch_requirement}
+
+\begin{itemize}
+ \item 可编程网络平台一台,交换测试主机两台,
+ 连接拓扑及网络配置如上图\ref{fig:c:router-ob_switch-topo}所示;
+ \item 串口线一根,网线两根;
+ \item 网络创新实验平台使用手册和二层交换机框架源代码
+ (开发环境与编译工具系统自带)。
+\end{itemize}
+
+\begin{figure}[!ht]
+ \centering
+ \includegraphics[width=8cm]{switch-topo}
+ \caption{二层交换机实验拓扑图}
+ \label{fig:c:router-ob_switch-topo}
+ \end{figure}
+
+\subsection{实验步骤}
+\label{subsec:c:router-ob:s:switch_procedure}
+
+\subsubsection{平台搭建与系统交换验证}
+
+\begin{enumerate}
+ \item 参考附件《可编程网络平台-操作手册》搭建可编程网络平台的运行环境;
+ \item 在串口登录界面输入如下命令,启动系统自带二层交换机命令。
+ 系统输出如下信息说明已正常启动且进入工作模式;
+ \begin{code}[console]
+ root@HNXS-FAST:/mnt/openbox# l2switch
+ 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......
+ fastU->UA->pid:902,mid:129,Register OK!
+ fastU->libua version:20180827
+ Create nm08_mac_aging thread OK!
+ aging[0]->invalid mac:0
+ fastU->fast_ua_recv......
+ ID PORT0 PORT1 PORT2 PORT3
+ 0 . . . .
+ aging[1]->invalid mac:0
+ ID PORT0 PORT1 PORT2 PORT3
+ 0 . . . .
+ aging[2]->invalid mac:0
+ \end{code}
+\end{enumerate}
+
+\subsubsection{设计开发二层交换机}
+
+\begin{enumerate}
+ \item 阅读二层交换机框架源代码文件,
+ 根据二层交换工作原理及分组处理流程设计完成框架源代码中的TODO部分内容;
+ \begin{code}[console]
+ root@HNXS-FAST:/# cd /home/hnxs/l2switch/
+ root@HNXS-FAST:/home/hnxs/l2switch# vim main_l2switch.c
+ \end{code}
+
+ 以下为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);
+ }
+ \end{code}
+
+ 上述框架代码需要实现的主要功能是源MAC地址的学习,
+ 参数输入为分组数据的输入端口号和源MAC地址的指针。
+ 通过对系统MAC转发表的查找,判断原MAC转发表中是否存在该表项,
+ 若存在,则更新该表项的使用时间;
+ 若不存在,则找一个空闲的表项位置存储该条表项,并更新表项使用时间。
+
+ \item 编译自己的二层交换机源码,生成相应的交换机系统命令user\_l2switch;
+ \begin{code}[console]
+ root@HNXS-FAST:/home/hnxs/l2switch# make
+ gcc –o user_l2switch main_l2switch –lreg –lrule –lua -lthread
+ root@HNXS-FAST:/home/hnxs/l2switch# ls
+ main_l2switch.c Makefile user_l2switch
+ \end{code}
+ user\_l2switch为用户代码编译输出的可执行文件。
+\end{enumerate}
+
+\subsubsection{调试与验证}
+
+\begin{enumerate}
+ \item 运行自己的二层交换机代码,验证交换机的功能;
+
+ \begin{code}[console]
+ 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
+ fastU->Register UA to FAST Kernel! Wait Reply......
+ fastU->UA->pid:902,mid:129,Register OK!
+ fastU->libua version:20180827
+ Create nm08_mac_aging thread OK!
+ aging[0]->invalid mac:0
+ fastU->fast_ua_recv......
+ 后面打印以学生代码为准……
+ \end{code}
+ 运行当前目录下用户的可执行文件,必须在前面加上”./”
+
+ \item 二层交换机正常工作后,可以显示如下信息;
+ \begin{code}[console]
+ root@HNXS-FAST:/mnt/openbox# l2switch
+ 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......
+ fastU->UA->pid:902,mid:129,Register OK!
+ fastU->libua version:20180827
+ Create nm08_mac_aging thread OK!
+ aging[0]->invalid mac:0
+ fastU->fast_ua_recv......
+ inport:0,dstmid:129,len:102,dmac:33:33:00:00:00:02,
+ smac:B8:27:EB:04:FC:F0
+ learn_smac->
+ update_mac_time->port:0,index:0
+ learn_smac->add new MAC,port:0,index:0
+ find_dmac->ret = -1
+ ------pkt_send_flood------
+ 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 . . . .
+ \end{code}
+ \begin{itemize}
+ \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时间
+ \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查表阶段,输出查表结果
+ \begin{code}[text]
+ find_dmac->ret = -1
+ \end{code}
+ \item 进行报文转发
+ \begin{code}[text]
+ //泛洪发送
+ ------pkt_send_flood------
+ pkt_send_normal->0xb4c00468,outport:1,len:102
+ pkt_send_normal->0xb4c00468,outport:2,len:102
+ pkt_send_normal->0xb4c00468,outport:3,len:102
+ //单播发送
+ pkt_send_normal->0xb4c00468,outport:3,len:102
+ \end{code}
+ \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 . .
+ 1 . . . .
+ \end{code}
+ \end{itemize}
+
+ \item 交换机工作不正确时,开启xprintf函数打印调试;
+ 重返步骤3,仔细阅读二层交换框架代码、交换机的工作原理及分组处理流程;
+
+ \item 交换机正常工作后,尝试不断切换连两根网线连接交换机的端口,
+ 观察测试主机的ping丢包,观察交换机工作界面的输出显示。
+\end{enumerate}
+
+\subsection{思考题}
+\label{subsec:c:router-ob:s:switch_rethink}
+
+\begin{enumerate}
+ \item 交换机区分IPv4和IPv6协议吗?区分TCP和UDP吗?
+ \item 广播风暴(broadcast storm)是如何产生的?如何避免?
+ 在不同的应用环境中分别采取的什么方法?
+ \item 广播与组播报文如何判断?组播报文如何转发?
+ \item MAC转发表的老化时间与哪些因素相关?网络规模、MAC表项大小?
+\end{enumerate}
+
+\subsection{注意事项及有关说明}
+\label{subsec:c:router-ob:s:switch_notice}
+
+\begin{enumerate}
+ \item 可编程网络平台的使用手册需要仔细阅读,严格参照文档说明搭建和运行该平台系统;
+ \item 代码修改若不习惯vim命令,可将其文件通过网络方式下载到自己电脑,编辑修改完成后,再上传到实验平台进行验证。Windows平台的上传下载工具为pscp.exe;
+ \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分)实验报告与源代码内容完整、格式整洁。
+\end{enumerate}
diff --git a/data/ch_sdn-openbox/preface.tex b/data/ch_sdn-openbox/preface.tex
new file mode 100644
index 0000000..a923b63
--- /dev/null
+++ b/data/ch_sdn-openbox/preface.tex
@@ -0,0 +1,11 @@
+%# -*- coding: utf-8-unix -*-
+
+\chapter{软件定义网络与网络测量}
+\label{chap:sdn-ob}
+
+本单元实验使学生能初步使用SDN平台进行网络功能的设计与实现,
+通过实验来掌握OpenFlow协议的基本功能与应用,
+以及网络拓扑构建的基本实现。初步掌握网络测试的常用原理及方法,
+了解在测试过程中影响测量精度的原因及如何提高测量精度。
+能通过实验理解软硬件协同测量的方法与特点。
+
diff --git a/data/ch_sdn-openbox/sec_ns.tex b/data/ch_sdn-openbox/sec_ns.tex
new file mode 100644
index 0000000..3c44e3a
--- /dev/null
+++ b/data/ch_sdn-openbox/sec_ns.tex
@@ -0,0 +1,28 @@
+%# -*- coding: utf-8-unix -*-
+
+\section{纳秒级高精度硬件测量}
+\label{sec:c:sdn-ob:s:ns}
+
+\subsection{实验目的}
+\label{subsec:c:sdn-ob:s:ns_object}
+
+\subsection{实验内容}
+\label{subsec:c:sdn-ob:s:ns_content}
+
+\subsection{实验原理、方法和手段}
+\label{subsec:c:sdn-ob:s:ns_principle}
+
+\subsection{实验条件}
+\label{subsec:c:sdn-ob:s:ns_requirement}
+
+\subsection{实验步骤}
+\label{subsec:c:sdn-ob:s:ns_procedure}
+
+\subsection{思考题}
+\label{subsec:c:sdn-ob:s:ns_rethink}
+
+\subsection{注意事项及有关说明}
+\label{subsec:c:sdn-ob:s:ns_notice}
+
+\subsection{考核方法}
+\label{subsec:c:sdn-ob:s:ns_criterion}
diff --git a/data/ch_sdn-openbox/sec_sdn.tex b/data/ch_sdn-openbox/sec_sdn.tex
new file mode 100644
index 0000000..adab807
--- /dev/null
+++ b/data/ch_sdn-openbox/sec_sdn.tex
@@ -0,0 +1,28 @@
+%# -*- coding: utf-8-unix -*-
+
+\section{基于OpenFlow的SDN交换机}
+\label{sec:c:sdn-ob:s:sdn}
+
+\subsection{实验目的}
+\label{subsec:c:sdn-ob:s:sdn_object}
+
+\subsection{实验内容}
+\label{subsec:c:sdn-ob:s:sdn_content}
+
+\subsection{实验原理、方法和手段}
+\label{subsec:c:sdn-ob:s:sdn_principle}
+
+\subsection{实验条件}
+\label{subsec:c:sdn-ob:s:sdn_requirement}
+
+\subsection{实验步骤}
+\label{subsec:c:sdn-ob:s:sdn_procedure}
+
+\subsection{思考题}
+\label{subsec:c:sdn-ob:s:sdn_rethink}
+
+\subsection{注意事项及有关说明}
+\label{subsec:c:sdn-ob:s:sdn_notice}
+
+\subsection{考核方法}
+\label{subsec:c:sdn-ob:s:sdn_criterion}
diff --git a/data/ch_sdn-openbox/sec_topo.tex b/data/ch_sdn-openbox/sec_topo.tex
new file mode 100644
index 0000000..c61cacc
--- /dev/null
+++ b/data/ch_sdn-openbox/sec_topo.tex
@@ -0,0 +1,28 @@
+%# -*- coding: utf-8-unix -*-
+
+\section{基于OpenFlow的拓扑测量}
+\label{sec:c:sdn-ob:s:topo}
+
+\subsection{实验目的}
+\label{subsec:c:sdn-ob:s:topo_object}
+
+\subsection{实验内容}
+\label{subsec:c:sdn-ob:s:topo_content}
+
+\subsection{实验原理、方法和手段}
+\label{subsec:c:sdn-ob:s:topo_principle}
+
+\subsection{实验条件}
+\label{subsec:c:sdn-ob:s:topo_requirement}
+
+\subsection{实验步骤}
+\label{subsec:c:sdn-ob:s:topo_procedure}
+
+\subsection{思考题}
+\label{subsec:c:sdn-ob:s:topo_rethink}
+
+\subsection{注意事项及有关说明}
+\label{subsec:c:sdn-ob:s:topo_notice}
+
+\subsection{考核方法}
+\label{subsec:c:sdn-ob:s:topo_criterion}
diff --git a/data/ch_socket/sec_smtp.tex b/data/ch_socket/sec_smtp.tex
index c2d3bfc..acfe608 100644
--- a/data/ch_socket/sec_smtp.tex
+++ b/data/ch_socket/sec_smtp.tex
@@ -1,23 +1,23 @@
%# -*- coding: utf-8-unix -*-
\section{SMTP客户端实现}
-\label{sec:c:socket_s2}
+\label{sec:c:socket:s:smtp}
\subsection{实验目的}
-\label{subsec:c:socket_s3_object}
+\label{subsec:c:socket:s:smtp_object}
进一步理解和掌握Python中TCP套接字编程的基础知识,
理解SMTP报文格式,了解开发一个简单应用程序的流程。
\subsection{实验内容}
-\label{subsec:c:socket_s3_content}
+\label{subsec:c:socket:s:smtp_content}
创建一个可以向任何接收方发送电子邮件的简单邮件客户端。
通过Python编写代码与邮件服务器创建一个TCP连接,
使用SMTP协议与邮件服务器交谈并发送邮件报文,最后关闭连接。
\subsection{实验原理、方法和手段}
-\label{subsec:c:socket_s3_principle}
+\label{subsec:c:socket:s:smtp_principle}
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,
是因特网电子邮件中主要的应用层协议,它使用TCP可靠数据传输服务,
@@ -68,7 +68,7 @@ RFC5321给出了SMTP的定义。SMTP有众多出色的性质,
用一个独立的句点指示该邮件的结束,并且仅当所有邮件发送完后才发送QUIT。
\subsection{实验条件}
-\label{subsec:c:socket_s3_requirement}
+\label{subsec:c:socket:s:smtp_requirement}
\begin{itemize}
\item 下列装有python环境的电脑一台;
@@ -77,7 +77,7 @@ RFC5321给出了SMTP的定义。SMTP有众多出色的性质,
\end{itemize}
\subsection{实验步骤}
-\label{subsec:c:socket_s3_procedure}
+\label{subsec:c:socket:s:smtp_procedure}
通过Python开发一个简单的SMTP客户端发送邮件。
补充完善下面的代码并通过向不同的账号发送电子邮件测试程序。
@@ -111,16 +111,16 @@ RFC5321给出了SMTP的定义。SMTP有众多出色的性质,
\end{code}
\subsection{思考题}
-\label{subsec:c:socket_s3_rethink}
+\label{subsec:c:socket:s:smtp_rethink}
修改代码使程序发送的邮件中不仅包含文本还能够包含图片。
\subsection{注意事项及有关说明}
-\label{subsec:c:socket_s3_notice}
+\label{subsec:c:socket:s:smtp_notice}
注意部分邮件服务器默认关闭SMTP,需进入设置手动开启SMTP协议。
\subsection{考核方法}
-\label{subsec:c:socket_s3_criterion}
+\label{subsec:c:socket:s:smtp_criterion}
同实验\ref{sec:c:socket:s:udp}。
diff --git a/data/ch_socket/sec_udp.tex b/data/ch_socket/sec_udp.tex
index aac2375..1b0e3f0 100644
--- a/data/ch_socket/sec_udp.tex
+++ b/data/ch_socket/sec_udp.tex
@@ -44,7 +44,7 @@ UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠
一旦数据传输结束,服务器和客户通过调用close( )来关闭套接字。
具体流程如图\ref{fig:c:socket_udp-flow}所示。
-\begin{figure}[!htp]
+\begin{figure}[!ht]
\centering
\includegraphics[width=8cm]{udp-flow}
\caption{无连接客户/服务器流程图}
diff --git a/data/preface.tex b/data/preface.tex
index 988fbe7..e25cf20 100644
--- a/data/preface.tex
+++ b/data/preface.tex
@@ -22,8 +22,10 @@
\begin{itemize}
\item 第一单元:谢怡、陈建发、洪劼超、雷蕴奇,厦门大学
- \item 第二单元:吴荻,国防科技大学
+ \item 第二单元:吴荻、周丽涛,国防科技大学
\item 第三单元:张晓丽,昆明理工大学
+ \item 第四单元:胡罡、徐东来、徐明、夏竟,国防科技大学
+ \item 第五单元:胡罡、徐东来、蔡志平、徐明、夏竟,国防科技大学
\item 统筹规划:徐明、夏竟,国防科技大学
\end{itemize}
diff --git a/figure/chapters/router-openbox/switch-topo.png b/figure/chapters/router-openbox/switch-topo.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e9a6ad677fbf96189911eea5ef9211928709a50
GIT binary patch
literal 23421
zcmZ^LWmHvL*zO_(q*1y>3F(q<2?az-Kw7sb-6bVTr-u>|kP-oDk#3L@Dd`632I;;p
z-#6~KzwQ}F7;ZOf&$Z^9&-=tX2~k&5BEY4_MG%DG;RAV1_h&p8VSV=99y=`k1ee4&|P{h*3D8h|4r1@t+|5
zPk}x7JI*f_M)t()!gtvUKgn8jQ-gy!q_ySMv){cFl#xwMh<$Qk%P1beV$;thS}z@a
zy-AUpJ0&evf_9C=|LCv%O|8H9KXEinmHUkb_6!Aro4C0fmz~&Lng5@-5~lB|t>(0KB7I1%aL(gyk8wL3Unj!v
zN*p_4v}&b_2=Ssl=Ov4aqPVE*<)c;1JkcMtjw91gt`E;>GvV6N*kkXqA{ouaS-CS}
zbR4ouPC@6Uqh$=fRB`qMgiB=&e8U*N@6obtz6+bR1z{YKHI$T{V?X0+okoQjw7E|3
zwfXcN7$6OpGu-1BWJn9Yc%-N4mKjA`k60ylTPIts4U&av()h^=4_R!FJiNwBDNK9s
zx{M8CW8=_qfH(Tu2F>fbDJv4U@sVnXwyeyC2KkDn$5cIJKq!_vYXcRcoIcUMKs9;1)Z}K#S+(23GyZ*rJFwCxnge9`3gR*;Y761=0^_1
z8&?g9(6e8S7Z5St9O`@KhgO4Fskq-9cTsE@`wt7zLiXO3nyVpGT+Q8Ig=ml&Dugy=L?;CQi0M%4Os4%ykq>Sa{7+Zv^Q0@;&95dFYP`y
zCN_3_a7tWU!2JA+vz;~uk=OrTT&E&&8Ljj7{Fh&xq%~;YRuIVBI)%0U=?4P^MNoG3
zzn*4BrkedBgWeVAKXqoO2OG*qig*%BEHjZtUFx}mFJ*~Ik?oE0X(oRD@0xootgNW1
zn%949^K^0_*;AyzEF-c^w(N|
zx3N4>J5SUJGet}=vg=<9(0gq+I<8RNvm`|qvX;3o>@eniA*xeoOn~s1mySJVH|Gy(
zcECpcZlcVXm@piJg?3IrjHZpL-t$@VuCQ>q;Vmw%h_9p0B6yXRl|L*8*`J4#psZhw
zk~?}4d`6v$SeANxV#GW2`uZp_a9}_i6BE<_;&>^AEV;UC)_$J1)m5OCjfbblqP?RdjrE174PFCxwc`S=
zBvvo&DBo*ybMaTVWh6cJQnSoF=6AYNq#tYE^VRa+4xqYEJ1o)r<>AeExd6Ghaj##S
zzZjRkK9eUh*mxcC1*L
z(~{a}D_sHi$c>Eog@qPj>k;C2jP9hGT3X3MAH(Uy$=@-izUuibVo*r`6@!xBofpQu
zrQP%D_&77tWz(7==T}O+CHiHC7pW{Ui)xZcUq%J%HYE#t3}-lqq2a;pmYI*DQ#ATg}^GAw+@>eZi7n{H2Tn2x+;&2lZ63ogfQbZik5yME+xg+|C
zV(*X1;%@2pg9tNe35tB2t@aP6QD!m-|FiR?#SuP~{cO`Ue}DhjP-%*WFCjNIw6*;^
zVpwibG>jvbW!51cXlS-{r*)^ByWIpc+LTv!XXG{+kaj=lUHksXe|Hfd>>|%`p*+JC
zFMB;3#6dwpugsbXVU&`h$9COl>Om~gDsUOQrx`3PEHb+vsi`R{EC1?Z32+LVjog^~
zohVF%_MLW+>JY>IaMI0av4SEjOoeW3td!$99xiY1*Et&`DqsKEzxj>>k?}H{=H9gX
z4wvVL;`CCj~O7=QZv?WWu#bph)hWgArs9c+vTwYNVY
z6;HVDT>_AT%M}(@Y~IHdPA@rT;hm`EJ)^K=DQ|AhhKq}vRjOd
z$fHk!jUTuS*q;b54K>qMQ#&62GouxA#$k!Mp08gj_u|E!8#ixCe!k9vgZ}%az~|SC
zR7Y@sfZhla)8XIfM<*TN?N?J%V-P3b{irGI?;vHSW=L}okza6;&$)-7#UIR9-AQld
z(tH&&WUE~_h^eST($kr~WM$pHcaQAN<+(6odUmv<_rsiooM+KV%vPxaHO(S%vYbK5
z{{kntot~2%FI@5V+4(sMDe1i6(&EHt`?k7>sK8W5?7H0<7i+>LA%Ah9ASaq8y78cn
zo*p+23VD*Zva;K6E?#2}6`IJA|Ecp1IWJO-NIg4#g}J{)gy2Mm%d6Y-qMsZp$!tye
z_UTo&I@RF1Su-f+I8S5BmGM}Ua~Xx6?JlXblM-U6;$}To+CjZ<{P7F}VdUY!Lrm$V
z=>y)JKY7aH$Et@{r*j7<~$8;N`X)ss#@7^XsMx*KET~5w;
zuHD71=HxZQ0V;FHtAPBuB&MfnS5Ux_lmc
z=JSh-?}ERh85Vx|;_!`9>P`-I17!vp2A1hi-qVBGbVM1S!DS*I+hRT;_xdfz1g~nl
z={f|-*TF;1k+atv{araC5^V)o#2ST<5`~@|^-GY+I<5xbQJ^=l*k={!Y|~bM>dnr+CIOie1_C7u_vrDTk$p65@@7Bgz{Gv_
z+TO-^`GlyekB^kG~E;uV2Spu(7b7!z{EQb=S7{^3`av9AU2#JPVH+wf0&48FDiW
zc!7Zd_gY^D_Ga~#)DOF9dID;}BJr}07f=@|{!2;0hkwN^{5sd)3o!@0Ph6;*TLwk6r299T}JS3?loue
zmnBrFw#a}zg3a0HAl67KftTk{Ajkz;ab!N~pM`_1^
z=2>mR1?Ms~tD!t9?3oPd%d_3bh%|DPnwo0L>&vh7A7ASy{?=c@2eHkwu|%yO`B+$5
z_v6vOArXotpOz+Q)yNttX?{|w9Q-NG${w`rqZwYbx3#KCw&HK)HW#EW6}Fj)C6bb9
zX?qr~ku2t-J@rF2cW~%76PG&=Zje(yPB>p^SlDhte4&26kU;C|>v2NDtg+`DKBtC+
zD;t(*Z312_!ZQ=Td{(QQ1i}HkG*A*R?6J7t$7_L>WD>*&rVJv
z3#nBi;ffir{rOs@(>F4<(<_J?DaCK$H2F=HHQxkO6eiZVg|hZ9x0$u~B9Bn)*U#56
z*(;-42;fs}4kXy+5N8Q;3QFrUPyePuGC?&s>PncUY#P4*Dm>GDJTfsryxgvFZDi_I
zj85*xvdwMV5AWW+Gd1Qsq^m%Ak{EDP%-e{w`_*4wjNid&3h#{PId#^h3)0HW9$XzB
zwA>e-D$Dr(EZjvacTl%8vSW7Q<ydlt@&eEe%8{*5|chl4Ugv5vknekRfzkBZk+M#R@gKi{>o+@_LDkMo00
zc(Iq=c;l=#6_Mng`lNUo&L$4Zx>i5`BBgv|#-5#S{ClHrjZILwX}DxJrPD>eF=1Af
zBkSToBn+}YoG+$)qe5%OWt}~c@1;5$X~flAuSmTU@`krnYNw2gw)@d+mzke8Su5o}
z6t~F#xhg)-JMp0D_-{cJEx9%4D@0hb*xr3k%EUzcQ|Jv}ZN*%{$kR{PZe$TaC@anO~1bt`hbX+o8AWMUGnA
z&e(|Cvi{KD@I=O1e*ScZyB?&P;?j~GuylFLh;vszzbp|RH(ha@|5wY>vCJplToH=9
zcS-iq5oziA**E9=!y(`5UOs7dTE}gmq+!Kra@`zw5-RP>9A3=M@IghsANhgZJ7q1z
z@G3kach$<#3%^wVyh<_Scxc>p;x2D%LGIvc_Y*Gye(H#UN~c$2Mb9w!T7&r%F|Y}f
z4C03KmE9waq%dWPr<7GyY3FS2Z<7Adw;_-vK6ny$0b72wzA5_S$Kano<()StsNOL$
z^6=PQ+a#+iH9IKTBaGCcGH+BsHGf
zxaNU^f&!+mPQJbZD52O-pOlg1ls6Z}(pGWa8{fW+EsTI#l0aU(cwyS)f4xYLljMna
zzgZ{N8=bh}*$Svx1?a?0lr-8;#i&sC5JnLZO6ANO4^Om+iIRUF?aVn08@b&Q7N+3i
z<2#y+v#zwn)0>v*TSpuOoY8NQ@Vir#YSNiIOSh4zeRP|7QG%
zhVn37Zf8dDp;%?o5K`RKQOU02dlu507E|b~YDo=arB)8W*#vFINa60*hVt=}Bwq8A
zMD>)FYb&*3A^7wXl-?(MjWDwRQc~WZ?62L=)I@7o7#SG}VxOZ9FLpvU`z=d7+3z!C
zX)*#Nu*Ln#`=u^q-ph#d&i7{9KhO&_9T$bO|aJU(3Y7jIlcNIb^i8cbbY<_In=D!#6%UhX>Z|`eGktl
zi`9V~9_>B-aK8Jhs;bSuexzu@?qTERE@(=K+2bT3$v^TSpnFui&X0+8tuH~~6`Qnl
zN+hkQ-2Uod#;X+X50t1MFFI~8rR&EflqF{BFO0k_Iqu{(s%n^?W~i#Ip2<=--D*_b
z+YlyB6t-*KnQPktL5(`vo;9DYlO$x2I@`hHsY&J7auKBNYDUyxLN=z^A7Eug_ga?X
z=IdA$v{zm!@stz>B(WpOnB-$q2Q4#l*-4U={eqWowT>MB`^<*Zlpb=E6&<;v7dY>%vOY8s
zNnZvUd1?{U(&E2)^Jac&3H2-X?v;vh_&5L1T=0`VV5XGO;laasg)Hx&KP$aCD$Gsq
z>#ftkEQs!S!4%UWkHCZQ{z;hu`om-3d)NPPu7
zQ{?M-N|SIEw&RV$d`2V+mTYy>^iBlqISp%MC=$FdGrPsgiVX-RZ){9&IruFACYS@*
za`x?X9`<`_3#nrwuCT7$EIcQUvTotL>rd6p*?zoghR+~M4LhV6n9=rf#{0h!!cz!R
zv(riw0}hVSH*Qi2iY#Kx*$7~C(%yJ6Ejf37=;xdAC;US_fBwmxc+yx~Cr8_TZBl{R
z-;Asy)1K*^=|pOPAtWS3#C@9)h*1!bo}1vRG_(Pc2k4W2B%jM6p8r|hhIagUvDawU
zV+PQINs=*W0Z935HG@yf#eLT8-vT|RFdKT+u3UhIseR_#VB`#c5_c=8HK!*dTPPf~
z?DC>@-&Z8|CnOJJuFZ3|EEVHsW5Yqz)zy8uCp}{S^ZaDRfr*w_zWI}f#;1+OuI4S!
zwwcwzT)iSww9lZ0t{^8vF~Z|r@YJ_x%<8l;5h33pt*@$Yl{1@m1&j}tBgBp?SKOU{
ziu|ygBo8C!l1mh_*|F`_DWHpKtuo*)MgQ+
zr0~#kw6dCddWZyGbvrX1N(}3;Vb;(e3T>{9Tth=cLwuW>P@KxfuTdq8cYPYT7
zLX&zQ6{XxKiL{}7iZo!S>FH5MW}3XM|3icuFr$I~Z+Ew^!0i4<)gjMZ%^Z7B*QyEp
z*PsRo2_0lSEqPh1U3zzBf*ou{30YzfsGgLs99N#=Ucdep_U*;PTKvoubY0khCqz|~_?t5giJ_XOt*2J(NW4s{j~ozqibF)y))Ge1SM=<@d8t09
zQ57jq?Vjd*7vZ;^Sj*WFEWc+CKq7D9pkJKq9%?$u-f|}ml-{}1ZOqRIsvQi#3fB$l
zDX-l}HQVo8d_MtC?X(uEcgXE;%kcuX;e&L97a#wdgW7g5+nVv2`u)cR`toznV
za&q?_mXGS;K8P{V04dxzN{4x0{-*2@a$=5fakFuI!d}RUDf^KZ)rz03&Hi(5#YB0N
z6=wl=iHAm`+}6mj%K3UgKmetLJFj9mB^t6kS$$X&9v-foAo+8LyDa@^LdyF@{y`fj
zd1t&I*3(x$n*+81avEiLu}|7u0~v8dKDl0FkHeMsXLxf)GCDeHK2gC30zXZgy#z>6
z#9$HxqM}9n1hLX^u`$QB&0^vE;a)m&P6~i&j{BKpjaZ9!SomZ@Tlh1qG&C$=ruK(OQ{oq@iCC%`e{IhJX=Jb1@|M
zzT554`n6oN`;9)LgCONhIanxB2?-Vqy3Yiu&wnM-Ki+=b#=_)Td=%2RIZV8_dsD(v
zHKyLeJX0e^q#sv{3S22E5aU+hJ%t13f{*3)3yI!mfOOEJJY?kO#?g*;!s*enzIb9Jo3&@*j1#;(IR7q{8Dv8!|?becOm}AInF-2T`$pp
zeVmK?A|4s0C_sHrGc7e0fi>UW-rjI=e#+;*Jrk3y=;tAli9^Tt98>Q8{hdW|HR@-Q
zGQ{eO0`sBCWBE9Qgo>~}2cF0kRHiH!^&=#-#L;r
z87~!xF@JlwT-jDWm*;MrdPNP!&Nmbso>bz`9^LW7(oNm7qA}7Txi~x51$u==pzPD^
zuszcl!TzNP-)pS+nymRfi)a^|L*ePz^240@yuyDsE;~Ho5dg0K#2}LJy~&z4Z4nj{
zVxenmMqAjQtIKmb@!M_cb(WkMr+g9d+w8OM^NVrF9(R}GDS7-}eSZCQ&vak8A&ZWt
zC~{4QjWl?5qISKVa6%QO@=bOV
z#ND|6Xg>a65Y*y$J9fCdq|gKd*<0zy1~)I7KWSP^i^DV+`=|zmA!BN48n7z=$5EJU
zHZ$HBo#YuXAS7=tGzgyx9W;Kf9ImMG{fs_CGR(B$Pxq{F!A|2LvZ{OfZd&+ay*ToD
zNv8JpKqXI-bP%|tC|IS4FSyrfP$iClK<;*?Q1@&HW5e
z${`}IUs?O3try+79~C2oiym!;tb>sYj4?elI9LX#M%~FO2PPvC-S_~HR#1Q~X)~Q4
zYmNBUlbVAut1AFR5MU<2lc64t*=vP3`Spki`I3QkeGQQi^3o0a;^5ZcQLT=)gNML`ke3U{!SLB01^+Gi!9^_un4XUQ(zTy(uV^Mxt-5%
z#W%*ZSp~V`k>Xza_wV0&8>Xxb2!UMdk?%a>t{Z%)Rz_al-l<{}?(r@udsw25n`EMi<)+i-O6@T$g|kph+rkXsytjxLU&s1aJyZk)Z30cNZ$qeW!lG
z6eIuVpdLZ)-W{54nf5-U15)h|#*yyB``B6kKwsMtM-`|gi#>Soph#R0@ed3f^Lz+V
z%zKE>GK{KSLFmE%%cJ`~Ngco0(%y4wzhny|>x_RF%xm_G^bRX42BK47SXt?)Wqc!r
zCN*6rHy-aDZ{_RV#cYiXEN;UJ-%BnpnrF|R;o##ob$ct3(9h(=A*D3{a3Z*P-c}6rXWvn@bEH@
zj*b%lY!I6KD!vw>7{h|oG!In&Z_Hz5ZnAmX>T?ar_i6gVi7RCZ6&pa;cq`PltGt
z$@>#Y9X0sm0UrWrZZ64W(q)pG9SJX11Yu5c@BC=){SI7aEKF4?lC}{B1fWBGwei{_
z=^KA7sBE8qD@4u?IBe&7-X5hyMdt2B0
z&rfLnC+_^=`DCw`)a^hTKB^_}`VzD>q551|qyl6>
zBNUVhg?y@0Sb4gtqO5Lx1HXMUu{`MmtCKIq%-P_v6o8_^NA*z{%vU?*9-0~drAl1HdIXvA@uHSf^2j?^NAXbpDt=U501VOgPDNKK6dWaH!2@w8@twqL9;Gj=RY
zYTUYY>nbf_dGyI2Y7wZ3FXx_Jw@-ufdUT^k-vySU_m)KkG7vd_?iaX>JjxoV54bG
z4&cGK>mf!3pUkzQNU_`Lha7yzNw`gv0*DAH71hc>4s()d=?`hwb-k;Mwz091dH&x9
zB;NoG&*$5t+IxC}My(Y~0`F;93&kf}jZ;s!jtps!L;8uBf)o>R_=|~;<+sEkp-o&U
zQkHM5?FqQ=J|CsDuEu4z{$G;*6fx5d+`<*TGVe`A!^OjkO7^BBIvh4N`DaXOz)6q&
zit}v7h?s;$^`mbLtID1&vxwwdr_Lg>+Gas&0x*xvc;v*%3m0PE%=0T%4y3Xu`D{Ww
zQfxmf2O@srbBMF;G_F>bs{N>pm0dP-Q%xn0UvO`siL@t)BnQMj-@KS74D?A~g?C{V
z;S>?lf|Hp!m91HeUDUlC?e+v=4pZ?R+;MVrM35e}94)94jPr_#dMM1?J$Jqwe{i^5H0$P&J3!=mqE)MP~EXH
zG51+wLSPA-|E>s$J=nVUzGVn+(
z!}-J<=Y!98+u=v&!56BIC5bXfFr;T-*gBX1CZPpYy2F%L9X|R|5`S`Qc#2%mVv1nLGqVpgfNVG)J0~aS}6S*|jp$5ysqffm&)eNMJTLwq+x`>7K+uzA{j$P;yGe&5VtWa}qh+4BN`T8g8yftS%oFiDvbge_3C*
z{-?#h@?vq2zjK*CEZz8z@$TbZTwLs}<`zc7
zD9_Hk&}G{C3uCDO9@xai6CqHx=!j+>D0%f5XxWfH+^#rXE2U9|{oBu;o0Xc~T%zfy
zmop*16AZbX0u7~}|HRR+a=r^bCliy$jI5%=7AMnr@h+w>J{AU4*~mzGN#(LY>32lo
zbUDPe9{ZLogIVwCCG}s{wkGG*>@!zdLu>>S3^
zYsoMqu$I&zjl15EGF6x5CKk^3tGoNF@U&M9zktA`SUHM&W4Y#Y(%Op3EpVhh@R+DU
z1-R|kCn%)hOTz_5
zw*%y4vDFMYNwnX-g>kY83J&xYiyF)8^U69}!&{1ri=8*d?!8YM>w9QK7f(AvqRWG+
zv;^ovN=~kr^*H4#EY7PZ2&!kC&J#?XA1-S{HdA#eSDz0KJu{+~T%Fg7|LXfM5emf2
z%xtup9r^EKS=1ASZQXs@!J0BcBi=wa&bmBa&coNb9%&;;eOE#v2{Jd1`H4ubX-%(J
z-CV;fYAgY^lU03HE^Ajy3+V-~4bq13aywQg_UUx=I@sT!m=$#k4Aa0kd18qQDiQuB
zp5>NzbFk1P~B8>hjEKb+TF*T6DZtHcmT=
znHD^vQ81tAGLRE+Cy$TrGP#+$wYa`=tWyp2hlx$#V!dDB>W(Vn7>gvR3
zdb9AEm1wANEPP5+H*46}{aKH*AgEV=_AIS`=2vA%dya&ZRNc?x&%bCF7KsBoYcb{28^8`}Qs+sz0D>CaO>r#7D657@;XMiQ(s
zkmxHqikAOZQ6Umg$|;YVDLp^&DQ?y5M%K1hKX1W30rQUC@J00Po|VZC+J(sPuw+jF4YEO6
zxwb_{Mt;Sk;NCtdC2G#=4JNt09+?bgJ*=o7;N-J&bAN@7jjYB&CzkhfYKv^~&aF^K
zKvE@iy}ZgfK$YBxB=EgB+wEaLZaC*sfEY9$i|m0*dJu!p$L?hDC7~r(*SSd-rFOG|
z`R=lXrOy(tqgRLWRiJt5OaIC;%+pWG+p@&no~KfdN$^lpAolZysNS`$yQ?d+FGEQS
zaG-NxB3jFX$?Z^+k*NyUA{38Nx>Ja8;9WgEZ$`!s^EILKPwC4C)tr%m3I~+O@j|>2
zd4l0!$i$!(ZO`GJMCHT_ehtuN(3BKu?6so+?N78_5H3`fZ{2FU2cGH&K1B%J;wOuD
z|NUErVC9Q8dj~vS2Z!Q*M!TS>NRlX(N`Zt72}#Lh*R3fVw{^JE|3+9iGNI*Lx|vMO
zs>Tc_@FXmNt}M9Pc977SZFa{DhZ)xLevxM3;_5PXR(|jx6_O;!wgU%Blr(SaGQ=mY
zZ6A85{uBQqu=GK^l(uprK^6C9Ndiph3Mg$D#R?FX*bg5RAqHk`rF7YvN|x8Ssy4&9
zb~?J0C_$?s&T7=s{CqDU%p(q+yo$R^uGYWpV@0iS9AaUfU=quQgYLAED?~LlHCets
zopSi~)oQo^e%2X0s~eFv{0VF#A|F9n83D8sf*5eDyd6COH?N~ZPABFZY&n$o5JYI~
z=g(>|L#!(a*fLPOz_dU3_=YRXZEGqY%>388FJTyqi+>>4vY2fO;9isaEa+Mh6E{fw
zyjYKom9@>-+0ohBZdy2U37?Api!UGa#+=&ajQZSGiu|&a^5!#8dl+t(>_t*S*W!)w
zNCmrx7hCn0(K@-A(50ja93=DWS50ecPQKP`NGI=vGI2fq{=#Q;NY{xHwFhiI)_ncH
zP}P?uqxpU+YV7x3w9^glv{rkHKH!Qc4-0^@a+ixM-yfx7beBEOGOT=yBFpOsJcxk3
z%ZFNb7iMP~{SIDr8QBLKx-R~v5_4L_M@#+vTNP--m#JFMo2c;5?tibN%bXr=T_yy-
z`^9^F0Ih-aIMKE>6IY9djh{an!jN?Zlv^W7j>tlu+Pq#0(|7U?0e*gXz9X9>(&u|I
zlR1Z*lPb{bCk~L(a#tGAKY76N-a`eaV|H;(^FLp%!>Vk{m@x1txRcclAAOaJ*juht
zK2%m_(jdJHl!V!CI>ryu
z;prcjq6ix^b4yZ6%5=~8VW^hF6~ofp?@4f4+xIv{$0U@wc-0$@JzrmhMVmJKgvT{?V{S&E^l)iQKgsndLciG`i6pVd_^&)k+l1&Lgu=>i
z-@dgq5TIL=cU&sdEKAUzuXRuAm%0*{
z{#1fQFb5#R^j+*uw%V!#1fa;j=c?t_U
z?&GaRPH0BboNJA+fTiXPg6~F81lQT>g5a^lJLmo@0L<#X0(wxCd%rje-L(aKUK!_@^L5;#pk
zts^8tDSNK^-w2>bqMWxi`*DgCcbGD47FOhk^(cRQ1RX%gRTqNgpD!V`B7+czfkJ^E
zL$p+A%AJb`72_Xkc5~?fBIqE1p6
zykp}Q^GBGCU}FA)iAa3v_z%(;Emv2e+TCvP$Vx#p_rY;2T}bywo%E}U;ce_CQg^&9
zp1}(TQ7^z3WNxLL^gf&f1lpLYO?)%`Nh=ii%<)~)&?amKuinky;e3`;HKJAQ_DI
z4iDe|D@!iFSqMMh&osFl!}_?&X4%)KK~`Bg^t@-Z=$YTZ>g4oz$n22>9j0t5Hobep
z)B|!Vs$+5AKhw(#6SVU4CXl^UXZ)gIiVXq?zKQ5VUI;J<-J)OA*+7`-S2`}NO{rmL
zom`QwYJ?Qp_(I&?PN94F9L)x`MEgBX6w3dpZ+1mY08C+bwMNo$42EzbFWpCN34`X)
z#v$hny@Ne$F6cbpPU7)5gcYb8fDf|<9x{V6=N2DAOX!HcIs7@$mhb=+Qkc1WngV
zXsZ8h5EY*#ZUVDyqSa3^@N*y6vq
zg~WFj)&I$HHMuxl$x8W+paVst`Tbea(+T$UPUX_)`yc|ro;_=ZcEh<^o7+nt`sV?O
z3=TjP@r*z~vU+)OSl?Oj>(HM4lQ`-uK^M$`8e2U*y-zoj^P!(xN`tgz
z7%``P(XuvNsEeqh9qE#`NWPakG5^LEioMcmdAC$vLzPT{k4$Ex(rM}9NytjAQ|h?G
zF;yh1Jcf+AdT%hiTsHz!aXFCp)aix2{dVQ{wtW~|sP24}i`XR9=q8&6>9Ck6p$I4B
z#GxPz%A;N1(~90e5H9^6M;$}MlCpoUSw+(2^sh+8{dI%hUq80cQ(Li8`o9sho+Ztt
z3;VY$1V5IX5I4GbFQ+r&6nqeH)M4-#!Vni7#F)H1pT67>Oi*oMiRtK>o~{R1p_K%Y
zkta7uaznz=dzr+VttmyyRGlzS0UYw-=l58?-Yw$jMI81oPkRiMP;1N{$?G>=Ox3Ysj^AMF%qbptYi;udgozT0=a^5P6Lx6OaPM
zY)|K*51-7|tHh=SqPutuk-K3fl*q}!Mztns3m3>xFdA+$kNZq)E3h-x0&EC;fl{
zr-4C69J#oHF{|wDma8Z8rDhJ>_D!3SAk>P%)!XV$N+SQ{_cQA
z20K7>T&)~!E>c{DXRs-XQFP+W%$XQ@mzN~S4>;|h+o^gJ0h_Uv2=0vYL&sFq>IgO=
zt@)kMzqcw1QC9Y-<1YqH`Q62*7$b@C@rMgpDL!L*IohADxeNumRnP#Kqs#5SokNGZe>;b@0lJ_L-e{{ji`
zLRYl=5f5%alXaNXqpbc~+_iD1d{qK8-;D@MSmH91%8vxIlq-P-qtHy@5Y2nwJy_`O
z)QC3wlQhmYa)c6!d96m8I_bt}$r8i3gUW*k?R>13D)S?bFgG<^ZIRgPlKcYJJ=&)7
z@;|L7mYanzC^1J;3dcXxl`*;KK{K-+_*g9BVh1pC>J?|Phz-Su!l>eAQw-63w9^#E
zLLy1b89EJ8<~ASI!r}UWKat5qjFkWux;Ff;-Uzn2C6JMl{ZP
zm1Ft>13&K}-(sjWP7$=7sBpV4C-Ax;ucVD1Fmr$I8VxfXt^~4awHZ
z>ZU}jOuawfp$*%y0i1S%J-mYiZjF`ZT0mC!Oeit)8t*j?Qt6wRv$w)p{)zf-LwC5i
zrFDP;Y0DPc#5A;@8zWG>S_1d$GOR(|jN!HVf;(E9
zdS8Yby~UC@rI5#K&Q*&*;2d9l9}YrDk>FCga)dZ}IhLYDg_w@6R>_zlTIc6~tM`%L
z>18Jo&?GDX!#DO${|jr-#?}Dd4WxkgHe=N@0&k*cNA7*-9a*pS9Fqjy-g3
z|KxhNK8M{QxoY=Dgs`Kv0J7{{6_k;lUWFhewQQl!lh{I;1JU(4Kd8xTk3iFr2h7hd
znkjUaUf56B>7i?oE}Rdzz_J&US5O$0p1zIKlqIypm
z1W8WXeWCR5t22z{Xqrz}#FV)$O~0kmBM(Y8Orq&HzSH$r_c>^kN$R}}JEMNlZ}Ne_
ztOHBTu;+Q$ZUzms3zxo?*N`BXsZz^QAyL@*!4{fzetyo?(a~|}ZhvtfaYX(zE__2f
zL>~?Pc2hOSuangd;gBsdMXFGoubCq#p0LZaQjy)i;uF1&?hC=}>*ig^IwXCqd|i5<
zxVu+$q{SW+=b;4d(9HXbL`4*@Kq>x9uBRLET934aO_takIDwPo1L2^#{s)s^hv~+&
z7Pls=hcgVtMMaN|6Fw^-jHSEs^72XRaMWO9y1qV+Ez}O({RwG{ml7Q;pfvD%_2o5c
zaMnoYTmJCoPT$B*RAzGmWFdsK0NH~
zmh`@EAWo+=6Z1b}JUT65*y2>hPQ}x^-
zgFYG~7qvE1HN`YMOSJaLQ;Yoaj_Kc7$=^W9M&;`hs;hrb50PunFs-<*|Mf
z5RDT_glbgo0<`zoK3SmChD}B2x2xnkmzry6?o>m?^seXSKdMzoTU^Ra^0}PRdmjU~
z?#wv9L($PrZG^l{$`Jha+1UA*A3~5UR
zGNusxmA%Nz-p55q)Zn-#=TtJrF
zutb7kld_TGLR{XN{?goh*&dOFGh-cPbmO>I7-M=&&&`tF;10c2D-7`Wmv92R^b>Nz
zAmvqI2M1utpvdY~Ia|D@Ih>GnaB#3Aq!tWDqr6Muj=F*4d*l44y!;BA<vqVF3^eYhfm#yLov)RJI==%r=;X~xoj=DZbkqA$HKf75M
z7tDymgNBfho&D?N3Gt|vDh8nznY&VP`-bmpIE*w6_D2*Utw?H#9_J`xc~irr*7z}f
zxXlq&gFMoxp`npwnrxdlu(nT*6hi`U+62aFv=*R_8}unwqIWpY?^IM&l!H$P3S)kG
z|Af;(tY&FMsI_sGk>2~0HnIPRQx^KRGJ?=hT>V~vrS6Tuu4lrw6Gw0a`b{2MFCP~d
zK{}f)$P^h$Uq&YCtp1g=%zJs5vcb&hH#$cE+|Y)&F)*>P0=@SKb-SS7)0r6AfP^va
zk#Q5&)8t=q-l}3cKzkOE3;P?BM#-UCYLM~HKdFjXaJEF+(e3X6X(sn&MRT?VPKLHT
z^D}3IaNhUYkb-y_`Vn=5AG88^f=Lwwt>T!-5^S@!*7}Q+T#_LjcU@PJ{*CbaNZt2Q
zMdTCG?)pY~p`=@flr_i~baZ@H_ivw$IsH2v*moBCaM`rkNF4}oYRwxuYm&x~vr5~2RLi1SByNLo&rucVx1d>xtGwQO
zaM|))FC|&nre#^P=bLk+AK~#Xqh$OWj3LVen`=hs+abnIC}a9cfS~Z!&2sUx~6yfxg5ae
z^}lD5Xl1T9k$%`}xTfZ?RFYs&GV*te2>h_rNui;aXl=skHMb9itzfq8kNm9R8@>u@
z>Vo|%&faKV+&FS7Ok;oNy($Ubv4w*7y9H#^`;#Aj(Lwv!3l;J25Lk^Qoh8Clf?``X
zkRl!Xj2d5*Jfu)4egjpHQoZ0Ig=XZrkS~q~X%9Fg5fF@T^V#@!(Lj$$ix
z#!StemWV+XE@*Kg*E8VDtgF)`f%!Z0m<-0y)C1tyZD2(`wf|j`(AEK!f*EllpZ%!NlE!y9?g1o+XR%n?vHHq
zNS$ZPXVPOOy$&Z!aAZ5~&0sg3tgt>#5^Fo)_^a5{s;ReR+9^G9^dSZnDfSthh0{sG^M=KC*`+5g@u)%g$YqDKdp9(CdOK+}JXw
zkgRJ+6)WmvU*O~!1z{y{%8@Gc114^A&yC5;<7$wGVahU&`=`likmAXYQtu**qU-U!
zw?dyAj7}`O(YiRV4Q=$mxt~ltI!*m~A@!$10AjgiyQk>Ei&s&0s&U)nZiy#J*~Je4MPcb-W%T+=F+S?$t%t+OGQHu?|hEA)}XKLAi><&U
zZV`eR#=PmFZnty{I1`|2v_g!T7UxHhmd^GZdb3IqQe`0^vv$cz3_0p-UtL!R9S(r^&j0)ed=8}-f2R=%
zQR|T+352C&l=eDuMNxy(gBLpEF=T#1L)%k06nF3tT2%JIJE0*W+OpBs9(bm=mYw#F
zu?BCgBn2%9a&badUl(5V^8fBt%&mg_M;YZjwDysV-57jO@LBr$2x9uR9(O5BKwV
z-}n2R*X#K@?Vc~D-(S1&UpV{0;ezd5f~i*h;kv$Ki-6NnR{xG%ih8A(nT!zPTMEWp
ze%@iBsH00XKG#^2ZI{ch7ET68hIiSn|B|g$yLR2XQmC8ZR4Uq^x(7QwC#ZIu8y6V6
zLiet!!(-=QaP;Cdmj2Po<(FCZpNr&g)i*ER&X!jm9UC4KkgmJ|j(B>T&>$>;6v5Cg
z_j%&`V-ZmYkD~yb`Fmk@H!tz9#V2F69B0b)enFKA>Dx{MRDAa{?MGqEyn7m
z-Ov_K$8~BGxoHUsIl43by@VCF5KO&TAukB0%K_z2q@l2bzNVtQJd<%=s#2N}yz
z)=e=zJw0B?zy5^+`El+j2lXyWThdx6Zn
zo0{Qg_;Y(f+3BQ(e@55r;M&ED(RK%vYQNt4uWrcSlYSHlF$J!_ljYEvRc5S~ob($>
zIL+!Yn$ltwPL#~zWNN?*5HDg>Hgb@Wz#rrm3kufq_jn+
zbzy1g;y?c-5SiPAJk5PcUm>S?JtPZC&CAe6bGq3K)h0z5YP$28n3(KRrd_^z^{KtN
zdFss-xqEwC6Hg-Zjx5fdN8(pL?>J!7ygq6&ZwTkU`Dy+6Fb`~kz1aTgUGY5ky|iU@
zcqk%r5aDG;I=Z_#5rjo)iPU0YALMg{6%R*y4K0bM%ISf#RlK@ba`;az80HX~R4zgI
z(HbI*8hNc$J_}0q1_kkU^H?+Ee?pr*K)MTrsErego9ino{)_9MZV+N%`MJ5Pd|`wT
zN?2i+bi~~sTkQ7=X@8V>x|582qNWJ3N^F{JFs*Y1*YhFV&$F6>gr;Q(ls?Vw_Ad~Blz`f
zvnFnl(C0Otp~`|lEUv`N*(j;YW7vf<1r)e_sdMM%%#nV??&A3^uOkMv>NT>8=^
zC!S-J1C%HnWS!P8P9P_9BVRyXJ7
z<`S@N7>(nWsh=5%FY@yRJ13Ukgx+3k1^?^L9dHcT$kmzs@;qkt_Q8VIoCEpuwQI06
z6`6~Q4!;SAi7nXodEnL%C(n|JiluWumd$`v(>gOdLtiyS%WvRTD=4c_{7O3qAl0!sg77fjANy6cM8QBG{)_vB_mdfAVG-Kq&|)XeSF*ByJ;7!_V;epDUL
zrcq&m9IF{Z#FMR0s@msJ^AH2tEJNETqSYe&7xLWfEwVxX(WG>mSMHcef
zonlI#!A_cgcGvaSMqh>xWr&){EJ!1P3(!tyd9N7b-IAl(oveRo!aiK3f16j2GpA3L
z#u%8M!Sq`{L_JFw*;M7$uDq*Wu)>-CeT&ih!iu{sB_QC05cQGqj4?;DZ^)x+vCUz+
zaE0;^PKG3nVub-Lw~
zPV)vGh4K5StuS;y?6=g21KC%cXc$-iZ90}*a$HQIj7zjTMwo+oHLi~fF07v`QSbMvJX)%O0I3mZffw#u&wKiQ-1nM6OgSEqg=>>1~q
zfm3}ivalEzb9!MpyTL_H9d%}QKmb0TY0c-!?c>Pzj%jo6xUE?KJ$laPspGQfaka|HRWFh69L1v4BwLV8-~H6gDL=!&5_Cw*TVpzb
z9H-~|`n&fjqfP>*5o^tveAhL0LBL&+g%qFj>(_4kShO1>aRR`hA^?8$?Z8bqt;-SQPGn7Hh)jw>Z=K8{9(Dq#Y7@&L^Z3wmNP#(NLScXEb(@!
zciR2-A3m4tRr?0FE|NoabaG*4$m6
z^~tZ=pyv};ws(D-Se^$f;CwATNwy37=VXWF(hDRIk)@;#eW!?`!+)i6P-abkpxxpR
z+~r@|B?eyn**DzbcyhCh=h?p-0gZQ>A#v23Iv6L3@A@Vhf5T%2d8f
zSqIgoR?F88C;{Ls4Izv{UHVooE
zUam1J@=oL!qHt=uoC`(USeG%t{A-Btn#;-Y#P?L+FZ#`^A-^^YybTop)ST=dnUv%(
z*q0=W96xj;IP;SXb#>VpicG)LIOHn?A_Q>Nf>W}x4mc4g;>JExBuszuRW)hPy1Ur8
zNjIq&`Yx2Vx#(PgQq~8=j?(y1N=nM`zyM(wCU_Xwae9(BSTBp9=~^?g!3>?SN49K&
zf;zEJRm8#^Qk@rAs3^=57cJ8t{irBWqD|OP$@qdoxBT#vp3jiel6N6*NSI~{fS;|iR);4~?I^Nx!&tsg
z7$MCqWWKkr?~8xIuBP>?a6U?&PcVUDsNUP__0^icPCgh~UPX2$3}5c5yHsf?LqyJG
zI!;&E_X||FH00{iP#G0}B`#*+whtc)ikfg!*T@@V$n9{OrgE*=lXw7$e*_eY3Z6J|
zLOD>y9!@^8;><7y9y|Cfr6QZZ39eYM)Y0hqFjE(9-dtNaf6qX^r^K$zL7jnEfMnf;
zBeV2I{KM)3nB~X0@#F5|C=~)71aQiRKv$3ykVE0HT09ua*%WD6nVCnBOU)2n3)A3R
zFt?$UFQ;-X&(C_PmMv5^h)EVbr0Lk_J?CB{}u=0dsJZHZ{)D
z;`tRUt*xJ+qj8SCamP;d>GNhHC7-1pI$MdVs2t2gYO6U+-{P*T99N%9+yc$OBgxbw
zXS!|Pv3Db7p_0DxPM#GmwLn;Lt7I=?I@|>Bz$7Ie!Cbyn=TYIXG(%h|g&zSzOY$Ir
zj!#tM$2jPy?)mI4)XZ7EVjyKt{QA{&g?{$xdt67EX1ZS1HaBswE6O>*(6BFcZEdX>
zDtl{NTQTUpR$oL!M6e8w7`yTlW$j8g&$oTmMGg_{<68#`#9~mhnXStmwWL@_P3-Lt
zZGa{}c*nl`_?;8~WHpm1r~Z$kSIPT=g98HtKPHx$?my}LSJG=47#Ms^61p@Sj^@o(
zMbxylwOfUp$q|&pU+||D*hpTmaoK9(g3Cl1p)9#T{EP60
zvCk~~(NH4Ofyrn`9nSbLW~i15?9Toh%@WHi#%AQ*SHr;9#3kc4AYWNc>4YLJZn9DM
zy{{R?=J(=k;f|?M8qe?kSYmvf0$L-#Lr7j`1G_s>+D(k9eIj
zJCogHhH|v72&R2)-|XmGGX?aR$|wB+pw)7B|3moP?6&+oPpc}fVE#qKgT#IUV}8FH
zdL=z`GDFpC=LFQU9)x=woJcF65>FfNWUTsth-v-hK%(~!jCqroo|^g-5PU{LqWOyZ
zn=#ycVgB#!m(=;SPtIR!2@^LUe9{18WG_?B{UmP;%`xA=C@Ni7ER4?2?;h3n~U6GTh
zD3f88^L`)vl`yFBqvYxf)k3_K*U$IpA#8q1S?^(;mF#R(S%3UfCa*#F)BR@%mo$y9
z0Z0-m`Ds#UgWV(w57yg-1
zVR*8U&dbs+3{C#4rc+<>3z`#)W>69`=*0=~voc2>Tk8@q$CSQZiTUP>VWN=;n0Xd?
zK!uzYU6BuZkW^L0;kBylEB;}@SmbsJ`j=1#DVRRd&Wawn;nJ5;S65sd1Cc`OOE>}1
z?(YjZw4FOy-B7h9>>2x8A2LE=@UneayVLj@$FFWl$(xB4)*ZqfK|2~73E@cccJQptgI~Y
zlVpbVTR(4Fa&_KV!>9
zsmv-LLOC=vWP~1U1p8zGngB+QJQlI#@eHFF9DhwAL2p_s2PkuiIjYgF0%Im_1ye}D
zW%yM}(x5{9n3R-cja(=Uhz5&qkwmxaNK;~>bU>c$mCr6x
z@NYtVPPO+0>#QdP9lomhaW=WaP-5|Lh^`3}ADLAiDQ_W!Gu6fUOifMgztB%Vinm(m
z`^uc0l43jBmNMKd*7B3k0+dp-S?XsH(Yrf-8o`kh5!8@c#q{$l*Kn$saNJbFEo{wc
zr@X5*H?t8bIR#`Zu;~u3fKeFgts(9qyI*LOBg3<>=OGIyf+8{!xY~OcDFeTQu|ux6
z66TkzF3HhwMD8K13*k1Bo<46pJRu}{8a?R59B{{>VQW(ZUcT9b(&1DAR@yn&9xlh)
zBe;;&nsZXs@@l;f4ELk-IGn7XOS!%^i!iF{yi4yGDet8E;`?&pPGtNS6}diHmd3}*
zms6Sx$ldHiYr$782@5yM`&~VE>*p^;olmWsz-e8CF{#Rw>5h}kZC_RRS{?GbbYSYn
zLS|y(l99{>g6oa8^N+7uYh&$i(iGJ?0!RN?P3yU7+9+(Yn|LyYn~qAqUMG6Spu57+
z>VZ9l8cW7D?lueYu<+%}yK%Sf`3N3O?_|H4(>2HLRJngIIB%@_ohHk?fuLsV1`56G
zr}UUyt;|f)YqR9x!#$jBxY!?eUS_r3H@S|m{9dEGT9q2N`uOI#j1@HE78C|FF9eoB
hHTnN1Tdd=UsC4au^K7nrL;nV9U(_
Date: Tue, 23 Feb 2021 18:39:07 +0800
Subject: [PATCH 05/12] 2-23 update figure
---
data/ch_wireshark/sec_arp.tex | 2 +-
data/ch_wireshark/sec_ip.tex | 8 ++++----
data/ch_wireshark/sec_tcp.tex | 8 ++++++--
figure/chapters/wireshark/echo-request.png | Bin 48610 -> 34951 bytes
figure/chapters/wireshark/ip-view.png | Bin 193384 -> 23695 bytes
figure/chapters/wireshark/traceroute-exec.png | Bin 91331 -> 8840 bytes
.../wireshark/wireshark-filter-setup.png | Bin 96286 -> 60923 bytes
.../chapters/wireshark/wireshark-monitor.png | Bin 86556 -> 64417 bytes
8 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/data/ch_wireshark/sec_arp.tex b/data/ch_wireshark/sec_arp.tex
index 4b31da1..67655ce 100644
--- a/data/ch_wireshark/sec_arp.tex
+++ b/data/ch_wireshark/sec_arp.tex
@@ -63,7 +63,7 @@ Wireshark可以在Windows、Linux和MacOS操作系统中运行,
\begin{tabular}{|c|c|c|c|c|c|} \hline
\heiti 前导字符 & \heiti 目的MAC地址 & \heiti 源MAC地址 &
\heiti 类型 & \heiti IP数据报 & \heiti 帧校验\\ \hline
- 8字节 & 6字节 & 6字节 & 2字节 & - & 4字节 \\ \hline
+ 8字节 & 6字节 & 6字节 & 2字节 & 46~1500字节 & 4字节 \\ \hline
\end{tabular}
\end{table}
diff --git a/data/ch_wireshark/sec_ip.tex b/data/ch_wireshark/sec_ip.tex
index c9afed8..7fff86c 100644
--- a/data/ch_wireshark/sec_ip.tex
+++ b/data/ch_wireshark/sec_ip.tex
@@ -237,7 +237,7 @@ tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示
\subsubsection{ping命令}
-本机(示例IP为10.24.90.1)启动Wireshark软件,
+本机(示例IP为192.168.1.251)启动Wireshark软件,
选择要监听的网络接口(如eth0、wlan0);
然后在终端发起网络命令:ping IP地址/域名。
@@ -280,7 +280,7 @@ tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示
\begin{figure}[!ht]
\centering
- \includegraphics[width=10cm]{ping-exec}
+ \includegraphics[width=12cm]{ping-exec}
\caption{ping命令执行示例}
\label{fig:c:wireshark_ping-exec}
\end{figure}
@@ -292,7 +292,7 @@ tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示
\subsubsection{traceroute命令}
-本机(示例IP为10.24.90.172)启动Wireshark软件,
+本机(示例IP为192.168.1.251)启动Wireshark软件,
选择要监听的网络接口(如eth0、wlan0);
然后在终端发起网络命令:traceroute IP地址/域名。
@@ -308,7 +308,7 @@ tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示
\end{figure}
\item 在终端中使用traceroute命令,
- 目的主机是外网的一台设备(如图\ref{fig:c:wireshark_traceroute-exec},示例IP为210.34.0.12)。
+ 目的主机是外网的一台设备(如图\ref{fig:c:wireshark_traceroute-exec},示例IP为210.34.0.1)。
\begin{figure}[!ht]
\centering
diff --git a/data/ch_wireshark/sec_tcp.tex b/data/ch_wireshark/sec_tcp.tex
index 60ca5fc..f3cfb9b 100644
--- a/data/ch_wireshark/sec_tcp.tex
+++ b/data/ch_wireshark/sec_tcp.tex
@@ -188,9 +188,13 @@ TCP拥塞控制算法一直处在不断的改进之中,围绕对网络环境
直至收到新确认号的ACK则将cwnd更新为ssthresh。
TCP NewReno则进一步改进了快速恢复算法。
-随着网络速度增长,传统拥塞控制算法的cwnd增长速度影响了TCP的性能,CUBIC应运而生。
+随着网络速度增长,传统拥塞控制算法的cwnd增长速度影响了TCP的性能,
+CUBIC\footnote{\href{https://www.researchgate.net/publication/220623913}{CUBIC: A New TCP-Friendly High-Speed TCP Variant}}
+应运而生。
CUBIC的关键特征是:cwnd窗口的增长依赖两次丢包的时间。
-2016年,谷歌提出了BBR拥塞控制算法,它不再基于丢包感知来调整cwnd,
+2016年,谷歌提出了
+BBR\footnote{\href{https://research.google/pubs/pub45646/}{BBR: Congestion-Based Congestion Control}}
+拥塞控制算法,它不再基于丢包感知来调整cwnd,
而是利用估算的带宽和延迟直接推测拥塞程度进而确定发送窗口。
\subsubsection{实验方法和手段}
diff --git a/figure/chapters/wireshark/echo-request.png b/figure/chapters/wireshark/echo-request.png
index 1f0b83a2280a621cd7603d7581ca324a7bd38070..3b09a2f346cab2ae4a6ba49c1df39ea513b33a41 100644
GIT binary patch
literal 34951
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