diff --git a/code/reference/ch_wireshark/TCPFlowControlDemo/Server.py b/code/reference/ch_wireshark/TCPFlowControlDemo/Server.py new file mode 100644 index 0000000..fa8b96f --- /dev/null +++ b/code/reference/ch_wireshark/TCPFlowControlDemo/Server.py @@ -0,0 +1,32 @@ +import socket +import time + +def recv_data(sock,length): + data=b'' + while len(data) < length: + more = sock.recv(length - len(data)) + if not more: + pass + #raise EOFError('Cannot RECV execpting data') + data += more + return data + + +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + +# 设置接收缓冲区大小为1024 +s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1024) + +s.bind(('0.0.0.0', 9999)) +s.listen(1) +print("Sever listening on 9999...") +try: + sc, addr = s.accept() + while True: + rcvdata = recv_data(sc,16) + time.sleep(0.01) + pass + +finally: + sc.close() + s.close() diff --git a/code/reference/ch_wireshark/TCPFlowControlDemo/client.py b/code/reference/ch_wireshark/TCPFlowControlDemo/client.py new file mode 100644 index 0000000..d500a28 --- /dev/null +++ b/code/reference/ch_wireshark/TCPFlowControlDemo/client.py @@ -0,0 +1,24 @@ +import socket +import time + +ip_port = ("server", 9999) +data = "0123456789\n"*100 + +c = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + +try: + c.connect(ip_port) + print("Connected.") + time.sleep(1) + i=0 + while i<10: + print("Send:"+data) + c.send(data.encode()) + i=i+1 + +finally: + print("Sent. Waiting....") + +while True: + time.sleep(0.001) + diff --git a/data/appendix/cheat_sheet.tex b/data/appendix/cheat_sheet.tex index 0462b18..a85b30e 100644 --- a/data/appendix/cheat_sheet.tex +++ b/data/appendix/cheat_sheet.tex @@ -73,19 +73,19 @@ \multirow{3}{1.5cm}{\centering 网络抓包与协议分析} & Wireshark软件使用和ARP分析 & - \tabitem{掌握Wireshark的基本操作,使用捕获过滤器和显示过滤器,抓取和分析有线局域网的数据包。} \par - \tabitem{掌握以太网MAC帧的基本结构。} \par - \tabitem{掌握ARP协议的特点及工作过程。} + \tabitem{学习Wireshark的基本操作,掌握过滤器使用,抓取和分析数据包。} \par + \tabitem{熟悉以太网MAC帧的基本结构。} \par + \tabitem{掌握ARP协议的特点及工作原理。} & 2 & $\star$ \\ \cline{2-5} & IP和ICMP分析 & - \tabitem{熟练使用Wireshark软件,观察IP数据报的基本结构,分析数据报的分片过程;} \par - \tabitem{掌握基于ICMP协议的ping和traceroute命令及其工作过程。} + \tabitem{观察IP数据报的基本结构,理解数据报的分片过程;} \par + \tabitem{掌握基于ICMP协议的ping和traceroute命令及其工作原理。} & 2 & $\star\star$ \\ \cline{2-5} & TCP与拥塞控制 & - \tabitem{运用Wireshark观察分析TCP协议报文,分析通信时序,理解TCP的工作过程;} \par - \tabitem{分析TCP连接管理、流量控制和拥塞控制的过程,能够分析TCP的性能问题。} + \tabitem{观察TCP报文,分析通信时序,理解TCP的工作机制;} \par + \tabitem{分析TCP流量控制和拥塞控制的过程,学会排查TCP性能问题。} & 4 & $\star\star\star$ \\ \hline & 套接字基础与UDP通信 & diff --git a/data/ch_wireshark/preface.tex b/data/ch_wireshark/preface.tex index 4e66711..c392c66 100644 --- a/data/ch_wireshark/preface.tex +++ b/data/ch_wireshark/preface.tex @@ -3,8 +3,9 @@ \chapter{网络抓包与协议分析} \label{chap:wireshark} -本单元实验要求学生能熟练使用Wireshark软件,捕捉、分析有线和无线网络数据包, -掌握以太网、802.11、ARP、IP、ICMP和TCP等重要协议传输单元结构, +本单元实验要求学生能熟练使用网络抓包软件, +捕捉和分析网络数据包,掌握以太网、ARP、IP、ICMP +和TCP等重要协议传输单元的结构, 深入理解相关网络命令和重要协议算法的工作原理, -从而培养网络故障检测、网络性能改进和网络安全分析的能力。 +从而培养学生网络故障检测、网络性能改进和网络安全分析的能力。 % (备注:第二版将增补实验1.4: IEEE 802.11协议分析。) \ No newline at end of file diff --git a/data/ch_wireshark/sec_arp.tex b/data/ch_wireshark/sec_arp.tex index 433905e..cd3bd4f 100644 --- a/data/ch_wireshark/sec_arp.tex +++ b/data/ch_wireshark/sec_arp.tex @@ -1,29 +1,30 @@ %# -*- coding: utf-8-unix -*- -\section{Wireshark软件使用与ARP分析} +\section{Wireshark软件使用与ARP协议分析} \label{sec:c:wireshark:s:arp} \subsection{实验目的} \label{subsec:c:wireshark:s:arp_object} -本实验旨在让学生掌握Wireshark的基本操作,使用捕获过滤器和显示过滤器, -抓取和分析有线局域网的数据包;掌握以太网MAC帧的基本结构,掌握ARP协议的特点及工作过程。 +本实验旨在让学生掌握Wireshark的基本操作, +抓取和分析有线局域网的数据包; +掌握以太网MAC帧的基本结构, +掌握ARP协议的特点及工作过程。 \subsection{实验内容} \label{subsec:c:wireshark:s:arp_content} -练习使用Wireshark抓取相关有线局域网的数据包并进行分析。 +练习使用Wireshark抓取局域网的数据包并进行分析: \begin{enumerate} - \item \textbf{熟悉Wireshark界面、基本设置和使用方法:} - 熟悉菜单、工具栏和主窗口,根据自己需要设置Wireshark视图; - 学习使用捕获过滤器和显示过滤器;捕获有线局域网的数据包并保存 - \item \textbf{MAC地址:}了解MAC地址的组成,查看其OUI信息。 + \item \textbf{学习Wireshark基本操作:} + 重点掌握捕获过滤器和显示过滤器。 + \item \textbf{观察MAC地址:}了解MAC地址的组成,辨识MAC地址类型。 \item \textbf{分析以太网帧结构:}观察以太网帧的首部和尾部, - 了解数据封装成帧的过程,计算帧长度。 - \item \textbf{差错检测,FCS计算检验:}计算帧尾校验和, + 了解数据封装成帧的原理。 + \item \textbf{计算FCS检验:}计算帧尾校验和, 并用抓包数据文件进行验证。 - \item \textbf{ARP协议分析:}抓取ARP请求和应答报文,分析其工作过程。 + \item \textbf{分析ARP协议:}抓取ARP请求和应答报文,分析其工作过程。 \end{enumerate} \subsection{实验原理} @@ -40,7 +41,7 @@ Wireshark软件是目前全球使用最广泛的开源网络数据包分析工 能够分析各层网络协议的性能、掌握通信主体的运行情况, 确认带宽分配和时延大小、查看应用的快慢并改进优化, 识别网络中存在的攻击或恶意行为、解决网络异常和故障。 -Wireshark可以在Windows、Linux和MacOS操作系统中运行, +Wireshark可以在Windows、Linux和macOS操作系统中运行, 具备友好的图形界面、丰富的统计及图表分析功能。 \subsubsection{以太网MAC帧格式} @@ -123,8 +124,8 @@ IP地址长度为4字节。每个字段的含义如下: \label{subsec:c:wireshark:s:arp_requirement} \begin{itemize} - \item 装有Wireshark软件的PC机一台(Windows或Linux操作系统); - \item 处于局域网环境。Wireshark建议3.0及以上。 + \item PC机一台,连入局域网; + \item Wireshark软件,建议3.0以上版本。 \end{itemize} \subsection{实验步骤} diff --git a/data/ch_wireshark/sec_ip.tex b/data/ch_wireshark/sec_ip.tex index 7fff86c..486e655 100644 --- a/data/ch_wireshark/sec_ip.tex +++ b/data/ch_wireshark/sec_ip.tex @@ -8,8 +8,8 @@ IP和ICMP协议是TCP/IP协议簇中的网络层协议, 在网络寻址定位、数据分组转发和路由选择等任务中发挥了重要作用。 -本实验使学生能熟练使用Wireshark软件,观察IP数据报的基本结构, -分析数据报的分片;掌握基于ICMP协议的ping和traceroute命令及其工作过程。 +本实验要求熟练使用Wireshark软件,观察IP数据报的基本结构, +分析数据报的分片;掌握基于ICMP协议的ping和traceroute命令及其工作原理。 \subsection{实验内容} \label{subsec:c:wireshark:s:ip_content} @@ -39,7 +39,7 @@ IP和ICMP协议是TCP/IP协议簇中的网络层协议, 可实现大规模的异构网络互联互通,为主机提供无连接的、尽力而为的数据包传输服务。 在网际协议第4版(IPv4)中,IP数据报是一个可变长分组, 包括首部和数据两部分(如图\ref{c:wireshark_ip-structure})。 -首部由20~60字节组成,包含与路由选择和传输有关的重要信息,其各字段意义如下: +首部由20~60字节组成,包含与路由选择和传输有关的重要信息,其各字段意义如下: \begin{figure}[!ht] \centering @@ -220,7 +220,7 @@ tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示 \subsection{实验条件} \label{subsec:c:wireshark:s:ip_requirement} -装有Wireshark软件的PC机一台(Linux或OS 操作系统);局域网环境。 +装有Wireshark软件的PC机一台,处于局域网环境。 参考资料: @@ -333,18 +333,18 @@ tracert命令(Linux)格式和常用参数如图\ref{fig:tracert-cmd}所示 在PC1向PC2发送数据的传输过程中, 以太网数据帧的首部字段和IP数据报的首部字段是怎样变化的? 如果有条件,请搭建实验平台进行实验,并使用Wireshark软件验证你的答案。 - \item 拒绝服务(Denial of Service,DoS)攻击,通过消耗目标主机设备的某种资源, + \item 拒绝服务(Denial of Service,DoS)攻击,DoS通过消耗目标主机设备的某种资源, 导致其网络服务不能被正常用户使用。 \begin{enumerate} \item IP数据报分片机制可能被攻击者利用来构建拒绝服务攻击。 - 试设计一种利用IP数据报分片机制发动DOS攻击的方法,并提出防御的思路。 - \item 请思考利用ICMP报文构建DOS攻击的可能性以及防御方法。 + 试设计一种利用IP数据报分片机制发动DoS攻击的方法,并提出防御的思路。 + \item 请思考利用ICMP报文构建DoS攻击的可能性以及防御方法。 \end{enumerate} \item 在实际操作中,Traceroute命令返回的某些条目以“*”号表示。 - 请思考有哪些原因可能导致这样的情况,该如何避免这样的情况。 + 请思考有哪些原因可能导致这样的情况。 \item 发送方要怎样决定IP数据报分组大小, 才能避免因为不同网络MTU不一致而引起分片呢? - \item 从客户端给服务器(其地址为\texttt{\#IP})发送三个ping命令, + \item 从PC1给PC2(其地址为\texttt{\#IP})发送三个ping命令, 请比较命令的结果,并用Wireshark软件进行观察分析。 \begin{enumerate} \item \texttt{ping \#IP -l 1472 -f -n 1} diff --git a/data/ch_wireshark/sec_tcp.tex b/data/ch_wireshark/sec_tcp.tex index 8dfea35..14a3540 100644 --- a/data/ch_wireshark/sec_tcp.tex +++ b/data/ch_wireshark/sec_tcp.tex @@ -9,7 +9,7 @@ TCP(Transmission Control Protocol传输控制协议)是一种面向连接的、 可靠的、基于字节流的传输层通信协议。 本实验通过运用Wireshark对网络活动进行抓包分析, -让学生观察TCP协议报文,分析通信时序,帮助同学理解TCP的工作过程, +观察TCP协议报文,分析通信时序,理解TCP的工作过程, 掌握TCP工作原理与实现; 学会运用Wireshark分析TCP连接管理、流量控制和拥塞控制的过程,发现TCP的性能问题。 @@ -24,7 +24,7 @@ TCP(Transmission Control Protocol传输控制协议)是一种面向连接的、 (例如,尝试连接未存活的主机或未监听端口或客户端发送了第一个SYN连接请求而服务端无响应); 观察SYN洪泛影响;观察分析TCP通信过程中的各类异常报文(例如数据超时、乱序), 了解其触发机制与含义。 - \item 流量控制(进阶):运行一组TCP连接客户端/服务器程序(Python代码见附录), + \item 流量控制(进阶):运行一组TCP连接客户端/服务器程序(Python代码见节后附件), 制造收发不平衡场景,观察收发报文中通告窗口的变化,分析与窗口机制相关的类型报文, 了解滑动窗口工作原理。 \item 拥塞控制(进阶):改变带宽、时延、丢包率等网络参数,观察大文件传输过程, @@ -41,10 +41,8 @@ TCP(Transmission Control Protocol传输控制协议)是一种面向连接的、 TCP协议基于“尽力而为”的网络层为应用层提供可靠的进程间通信服务, 具体地说是可靠的全双工的端对端字节流传输服务。 在TCP的协议传输单元中(TCP报文段,TCP Segment), -发送方和接收方使用字节序号(Sequence Number)明确收发的数据,并精确到字节单位; +收发双方以字节为单位使用序号(Sequence Number)明确收发的数据, 使用ACK反馈(Acknowledgment)机制,实现端对端的可靠传输控制。 -接下来,简要介绍TCP报文段的结构, -TCP的连接管理、差错控制、流量控制和拥塞控制的原理。 \paragraph{TCP报文段(Segment)}~{} \\ @@ -55,7 +53,7 @@ TCP 报文段结构如图\ref{fig:c:wireshark_TCP-structure}所示, \begin{figure}[!ht] \centering \includegraphics[width=10cm]{TCP-structure} - \caption{TCP报文段结构标意图} + \caption{TCP报文段结构示意图} \label{fig:c:wireshark_TCP-structure} \end{figure} @@ -63,25 +61,25 @@ TCP 报文段结构如图\ref{fig:c:wireshark_TCP-structure}所示, \begin{enumerate} \item \textbf{源端口号(Source Port):}16位的源端口, - 与源IP地址一起标识发送该TCP 报文段的通信进程。端口号范围0\~65535。 + 与源IP地址一起标识发送该TCP报文段的通信进程。端口号范围0-65535。 \item \textbf{目的端口号(Destionation Port):}16位目的端口, - 与目的IP地址一起标识接收该TCP 报文段的通信进程。端口号范围0\~65535。 - \item \textbf{序号(Sequence Number):}该TCP 报文段中第一个数据字节的序号,占4个字节。在TCP连接建立时,通常生成一个随机数作为字节序列号的初始值(ISN)。 + 与目的IP地址一起标识接收该TCP报文段的通信进程。 + \item \textbf{序号(Sequence Number):}该TCP报文段中第一个数据字节的序号,占4个字节。在TCP连接建立时,通常生成一个随机数作为字节序号的初始值(ISN)。 \item \textbf{确认号(Acknowledgement Number):} 表示期望收到对方下一个报文段的字节序号,占4个字节。 \item \textbf{标志位(TCP Flags):} \begin{enumerate} - \item 确认ACK (Acknowledgement):置1表示确认号字段有效。 - \item 推送PSH (Push):置1表示该报文段优先级高, - 接收方 TCP 应该尽快推送给接收应用程序。 - \item 复位RST(Reset):置1表示需要释放 TCP 连接并重新建立连接。 - 一般称携带 RST 标志的 TCP 报文段为「复位报文段」。 + \item 确认ACK(Acknowledgement):置1表示确认号字段有效。 + \item 推送PSH(Push):置1表示该报文段优先级高, + 接收方TCP应尽快推送给接收应用程序。 + \item 复位RST(Reset):置1表示需要释放TCP连接并重新建立连接。 + 一般称带RST标志的TCP报文段为“复位报文段”。 \item 同步SYN(Synchronization):置1表示这是TCP请求连接报文段。 - 一般称携带 SYN 标志的 TCP 报文段为“同步报文段”。 + 一般称带SYN标志的TCP报文段为“同步报文段”。 \item 终止FIN(Finish):置l表示发送方的数据已经发送完毕, - 并要求释放 TCP 连接。 + 并要求释放TCP连接。 \end{enumerate} - \item \textbf{窗口大小(Window):}表示接收缓存大小,即暂时缓存接收的数据。 + \item \textbf{窗口大小(Window):}表示接收缓存大小。 最早TCP协议首部只设置了16位的窗口大小,允许的最大缓存大小不超过64KB; 而RFC1323打破此限定,设置了TCP窗口缩放因子(Window size scaling factor), 使窗口大小等于二者的乘积。 @@ -103,7 +101,7 @@ TCP 报文段结构如图\ref{fig:c:wireshark_TCP-structure}所示, \textbf{建立过程:}TCP是面向连接的,数据传输之前必须在双方之间建立一条连接, 并通过三次握手过程完成。 -其主要目的是,同步连接双方的序列号和确认号,并交换 TCP窗口大小等控制信息。 +其主要目的是,同步连接双方的序号和确认号,并交换TCP窗口大小等控制信息。 一般地,客户端主动向服务器端发起连接请求,具体过程如下: \begin{enumerate} @@ -128,7 +126,7 @@ TCP 报文段结构如图\ref{fig:c:wireshark_TCP-structure}所示, 服务器端完成数据发送之后,也发出FIN=1的报文请求释放连接, 并进入 LAST-ACK状态,直至客户端返回确认(第四次挥手)才关闭TCP连接。 客户端收到服务器的FIN报文后,则进入TIME\_WAIT状态, -并等待 2MSL(最大存活时间- Maximum Segment Lifetime)时间之后,完全关闭TCP连接。 +并等待2MSL(最大存活时间- Maximum Segment Lifetime)时间之后,完全关闭TCP连接。 (注:释放连接也可由服务器端先发起) \paragraph{TCP流量控制}~{} @@ -138,7 +136,7 @@ TCP 报文段结构如图\ref{fig:c:wireshark_TCP-structure}所示, TCP利用滑动窗口(Sliding Window)机制实施流量控制, 其基本原理是用TCP报文段中的窗口大小字段来控制数据发送速率, 即发送方的发送窗口应小于接收方回应报文中的通告窗口值。 -为了提高信道利用率,TCP采用了连续ARQ (Automatic Repeat reQuest), +为了提高信道利用率,TCP采用了连续ARQ(Automatic Repeat reQuest), TCP两端都可以连续发出若干个分组然后等待确认, 也都设有发送/接收窗口和发送/接收缓存。 其中发送窗口可以用3个指针表示, @@ -182,7 +180,7 @@ cwnd初始值为1个MSS(Maximum Segment Size); 则启用快重传算法,并将cwnd重置为1,ssthresh减半。 TCP拥塞控制算法一直处在不断的改进之中,围绕对网络环境因素感知和拥塞避免的控制, -涌现了策略算法。TCP Reno继承Tahoe的三个算法并增加了快速恢复(Fast Recovery)算法。 +涌现出新的策略算法。TCP Reno继承Tahoe的三个算法并增加了快速恢复(Fast Recovery)算法。 收到三个重复的ACK后,Reno会把当前的ssthresh的值设置为当前cwnd的一半, 并将cwnd更新为ssthresh+3MSS;然后每收到一个重复ACK则cwnd+1, 直至收到新确认号的ACK则将cwnd更新为ssthresh。 @@ -199,11 +197,13 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- \subsubsection{实验方法和手段} -使用VMWare软件配置两台本地虚拟机,本地相互连接(如图\ref{fig:c:wireshark_TCP-topo})。 -在VMWare中的虚拟机设置->网络适配器->高级中虚拟机的网卡传入/传出带宽、 -传输速率、时延等,用来仿真不同的网络条件(如图\ref{fig:c:wireshark_VM-advance-setup})。 +两台实验机本地相互连接(如图\ref{fig:c:wireshark_TCP-topo}), +在实验机中仿真不同的网络条件,以便观察TCP的各种控制现象。 +方案一使用虚拟机:VMware Player中通过“虚拟机设置->硬件->网络适配器->高级”(如图\ref{fig:c:wireshark_VM-advance-setup}) +设置虚拟机的网卡传入/传出带宽、数据包丢失率、延迟等; +方案二使用物理机:使用tc进行流量控制场景仿真,使用wondershaper对网卡进行限速。 本实验需要使用的命令和工具,如表\ref{tab:c:wireshark_tools-command}所列。 -常用的Linux操作系统命令还包括:echo、cat、sysctl、ping、ftp。 +常用的Linux命令还包括:echo、cat、sysctl、ping、ftp等。 \begin{figure}[!ht] \centering @@ -225,7 +225,7 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- \centering \caption{主要工具及命令列表} \label{tab:c:wireshark_tools-command} - \begin{tabular}{|m{1.5cm}<{\centering}|m{3cm}<{\centering}|m{8.5cm}|} + \begin{tabular}{|m{2.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 @@ -237,6 +237,7 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- \texttt{netwox} & 网络工具 & \url{https://sourceforge.net/projects/ntwox/}\\ \hline \texttt{ss} & Socket状态 & \texttt{ss –atn}\\ \hline \texttt{netstat} & 显示网络状态 & \texttt{netstat –atn}\\ \hline + \texttt{wondershaper} & 网卡限速工具 & \texttt{wondershaper [网口] [下载速率] [上行速率] wondershaper clear [网口]}\\ \hline \texttt{iperf3} & 网络性能分析 & \url{https://iperf.fr/}\\ \hline \end{tabular} \end{table} @@ -245,17 +246,14 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- \label{subsec:c:wireshark:s:tcp_requirement} \begin{enumerate} - \item 硬件:每个学生一台物理实验机(8G以上内存,80G以上硬盘空间)。 - \item 软件:物理机装Windows7/10、VMWare或VisualBox; - 两台 Ubuntu18虚拟机(每台2G内存、20G HD)。 - 每台Ubuntu虚机上预装wireshark、curl、vsftp、netwox、telnet、namp和iperf3。 - \item 环境准备:分别以Ubuntu 1\#机、Ubuntu2\#机作为TCP的客户端与服务端, - 以下简称1\#机,2\#机;设置虚机网络连接为NAT模式,IPv4设置为DHCP。 - 启动两台实验虚机后,可使用ping进行连接性测试, + \item 硬件:处于同一局域网的两台PC机(可使用虚拟机也可使用物理机)。 + \item 软件:Ubuntu系统(18.04版), + 预装wireshark、curl、vsftp、netwox、telnet、nmap和iperf3。 + \item 环境准备:分别以PC1、PC2作为TCP的客户端与服务端; + 启动两台实验机后,可使用ping进行连接性测试, 也可使用nmap扫一下对方打开的端口, 确保实验环境正常 - (指导书中服务器的IP为192.168.100.144,指导书中命令若有用及此IP, - 应替换为实际观察到的IP) 。 + (指导书中PC2的IP为192.168.100.144,实验中应替换为实际的IP) 。 \end{enumerate} 参考资料: @@ -274,20 +272,20 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- \begin{enumerate} \item 利用python自带的SimpleHTTPServer模块, - 在2\#机上启动一个简易的web服务器。 + 在PC2上启动一个简易的web服务器。 终端上运行\texttt{echo "TCP lab test" > index.html}创建index.html文件为测试站首页, 运行\texttt{sudo python -m SimpleHTTPServer 80}启动一个简易web服务器; 打开新终端,键入\texttt{ss -tln}查看当前主机打开的TCP连接,确认80端口处理监听状态。 - \item 在1\#机上打开一个终端,键入\texttt{sudo wireshark}启动抓包软件; - 再打开一个新终端,键入 curl <2\#机IP> ; + \item 在PC1上打开一个终端,键入\texttt{sudo wireshark}启动抓包软件; + 再打开一个新终端,键入 curl ; 停止抓包,在wireshark过滤出TCP类型报文。 观察首个TCP报文头,并分析各段值代表的意义。 - 如果想要关闭相对序列号/确认号, + 如果想要关闭相对序号/确认号, 可以选择Wireshark菜单栏中的 Edit$\rightarrow$Preference$\rightarrow$protocols$\rightarrow$TCP, 去掉Relative sequence number勾选项。 使用Wireshark内置的绘制流功能,选择菜单栏中的Statistics$\rightarrow$Flow Graph, - Flow Type选择TCP flows可以直观地显示TCP序列号和确认号是如何工作的。 + Flow Type选择TCP flows可以直观地显示TCP序号和确认号是如何工作的。 \item 观察TCP三次握手与四次挥手报文,注意报文收发过程中,双方TCP状态的变化。 以本次抓得报文为据,分别画出本次TCP连接三次握手与四次挥手的时序图, 结合TCP状态机,在双方各阶段标出对应的TCP状态。选择其中一个TCP报文, @@ -310,7 +308,7 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- \item 再次curl访问,观察抓包内容。 \item 关闭服务器端的SimpleHTTPServer(ctrl+C中断,或关闭所在终端), 客户端curl访问服务器80端口,观察应答报文。 - \item 运行\texttt{nmap -sS <2\#机IP>}扫描服务器,并抓包。 + \item 运行\texttt{nmap -sS }扫描服务器,并抓包。 \item 在报告中总结以上观察结果,解释SYN扫描原理。 \end{enumerate} \item 客户端发送了第一个SYN连接请求,服务器无响应的情景。 @@ -326,8 +324,8 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- \item 观察TCP的状态变化,分析wireshark抓到的TCP异常报文。 \item 服务端的SYN-RECV 状态何时释放? \item SYN ACK重传了几次,时间间隔有何变化? - \item 参考(1)在服务端修改SYN ACK重传次数(tcp\_synack\_retries), - 再次观察,此任务结束后清空防火墙规则(iptables -F)。 + \item 参考1中的操作,在服务端修改SYN ACK重传次数(tcp\_synack\_retries), + 再次观察,此任务结束后清空防火墙规则(iptables -F)。 \end{enumerate} \item SYN洪泛。 在服务器端\texttt{sudo echo "0">/proc/sys/net/ipv4/tcp\_syncookies}禁用syncookies, @@ -344,18 +342,18 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- \item 产生一个100M文件: \texttt{dd if=/dev/zero of=100M.file bs=1M count=100} - \item 模拟网络抖动: + \item 模拟网络延迟、包重复、包乱序、包损坏: \texttt{tc qdisc add dev ens33 root netem delay 70ms 10ms 30\% duplicate 1\% reorder 5\% 10\% corrupt 0.1\%} - (将此行命令的add改为change即修改、del即删除此行规则)。 + (调整上述命令中的数值,以达到期望效果;将此行命令的add改为change/del即修改/删除此规则。) \item 下载服务器上的大文件:\texttt{wget 192.168.100.144/100M.file} \end{enumerate} 抓包记录以上过程,分析黑色标签错误报文,结合TCP实现机制, 分析这些报文产生的原因。此类报文也可以从现实网络行为抓取获得, 请结合实际抓得报文分析,报文附件随报告提交。 - 包含但不限于以下几种类型报文: + 包括但不限于以下几种类型报文: [Duplicate ACK]、[TCP Retransmission]、[Fast Retransmission]、 [TCP Spurious Retransmission]、[TCP Out-Of-Order]、 [TCP Previous segment not captured]。 @@ -378,8 +376,9 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- \subsubsection{拥塞控制} \begin{enumerate} - \item 在VMWare中的虚拟机设置$\rightarrow$网络适配器$\rightarrow$高级中设置, - 设置两台虚拟机的网卡传入/传出带宽为10Mbps以下, + \item 任一端限制网卡传入/传出带宽为10Mbps以下:使用虚拟机作为实验机,可 + 在VMWare Player中的虚拟机设置$\rightarrow$网络适配器$\rightarrow$高级中设置; + 物理机可使用wondershaper命令进行限速。 再启动应用(可以是http wget,也可以ftp下载/上传)传输大文件观察。 \item Wireshark抓取全部传输过程数据,找出该网络活动的拥塞点, 并结合Analyze$\rightarrow$Expert Information、Statistic$\rightarrow$IO Graphs、 @@ -418,19 +417,19 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- \begin{enumerate} \item TCP在不可靠的IP层上建立了可靠的端对端连接, - 如何在不可靠的UDP上建立可靠的端对端传输系统呢? + 如果要在不可靠的UDP上建立可靠的端对端传输系统,需要考虑哪些方面? \item TCP连接建立过程中,存在哪些等待队列? - 这些队列是否可能出现溢出状况,高并发TCP连接应用如何调优? - \item 本次实验观察了Linux环境下的TCP实现,在Windows、MacOS环境下, + 这些队列是否可能出现溢出状况?该如何避免? + \item 本次实验观察了Linux环境下的TCP实现,在Windows、macOS环境下, 操作系统又是如何实现TCP的呢? 类似Linux TCP参数,在不同系统环境下如何查看或设置, 请尝试通过抓包其通信过程发现其实现异同。 - \item TCP是封装单元为MSS,可是我们在抓包过程中常发现远大于此值的TCP包, - 为什么TCP可以提交如此大的报文呢? - 此类型的包远超出链路层的MTU,它是如何被处理的呢?请从两端同时抓包观察比对。 \item 在TCP状态机(图\ref{fig:c:wireshark_TCP-status-machine})中, 有些状态停留时间较长,易观察到,有些状态很短暂不易观察到。 试列出不易观察到的状态,并考虑观察到它们的可能方法。 + \item TCP是封装单元为MSS,可是我们在抓包过程中常发现远大于此值的TCP包, + 为什么TCP可以提交如此大的报文呢? + 此类型的包远超出链路层的MTU,它是如何被处理的呢?请从两端同时抓包观察比对。 \begin{figure}[!ht] \centering @@ -453,9 +452,10 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- \item 环境还原:前面操作的iptables、tc遗留规则可能会影响后面的操作效果, \texttt{iptables --list}查看核对一下当前的规则, \texttt{iptables -F}清空当前规则; - 同样,使用\texttt{tc qdisc del dev eth0 root RULE}清除网卡eth0队列规则。 + 同样,使用\texttt{tc qdisc del dev eth0 root RULE}清除网卡eth0队列规则; + wondershaper限速使用clear参数清除。 使用虚拟机的快照功能是更原始、更彻底的还原方式。 - \item 批量网络扫描是威害网络行为,仅在实验室环境下进行试验学习, + \item 批量网络扫描是危害网络行为,仅在实验室环境下进行试验学习, 不得用于运营网络。 \end{enumerate} @@ -465,7 +465,7 @@ BBR\footnote{\href{https://queue.acm.org/detail.cfm?id=3022184}{BBR: Congestion- 完成本次实验,并提交一份实验报告和一组Wireshark数据存储文件。 报告内容应当包括以下部分,相关的分析解释都对应有截图证明,并与数据存储文件吻合。 \begin{enumerate} - \item (20分) 正确绘制出了三次握手报文与四次挥手报文(须结合抓得报文序号), + \item (20分) 正确绘制出了三次握手报文与四次挥手报文(须结合捕获的报文), 并正确标识出了各阶段TCP状态; \item (20分) 观察传输异常现象,并进行分析; \item (20分) 完成流量控制操作要求,结合上下分析报文窗口变化, diff --git a/figure/chapters/wireshark/TCP-status-machine.pdf b/figure/chapters/wireshark/TCP-status-machine.pdf new file mode 100644 index 0000000..bd80446 Binary files /dev/null and b/figure/chapters/wireshark/TCP-status-machine.pdf differ diff --git a/figure/chapters/wireshark/TCP-status-machine.png b/figure/chapters/wireshark/TCP-status-machine.png deleted file mode 100644 index 43e21ef..0000000 Binary files a/figure/chapters/wireshark/TCP-status-machine.png and /dev/null differ diff --git a/figure/chapters/wireshark/TCP-structure.pdf b/figure/chapters/wireshark/TCP-structure.pdf new file mode 100644 index 0000000..ea94989 Binary files /dev/null and b/figure/chapters/wireshark/TCP-structure.pdf differ diff --git a/figure/chapters/wireshark/TCP-structure.png b/figure/chapters/wireshark/TCP-structure.png deleted file mode 100644 index cf32bf4..0000000 Binary files a/figure/chapters/wireshark/TCP-structure.png and /dev/null differ diff --git a/figure/chapters/wireshark/TCP-time-line.pdf b/figure/chapters/wireshark/TCP-time-line.pdf new file mode 100644 index 0000000..54270a9 Binary files /dev/null and b/figure/chapters/wireshark/TCP-time-line.pdf differ diff --git a/figure/chapters/wireshark/TCP-time-line.png b/figure/chapters/wireshark/TCP-time-line.png deleted file mode 100644 index 12af25c..0000000 Binary files a/figure/chapters/wireshark/TCP-time-line.png and /dev/null differ diff --git a/figure/chapters/wireshark/TCP-topo.pdf b/figure/chapters/wireshark/TCP-topo.pdf new file mode 100644 index 0000000..c8b84e5 Binary files /dev/null and b/figure/chapters/wireshark/TCP-topo.pdf differ diff --git a/figure/chapters/wireshark/TCP-topo.png b/figure/chapters/wireshark/TCP-topo.png deleted file mode 100644 index d34e1aa..0000000 Binary files a/figure/chapters/wireshark/TCP-topo.png and /dev/null differ diff --git a/figure/chapters/wireshark/icmp-structure.pdf b/figure/chapters/wireshark/icmp-structure.pdf new file mode 100644 index 0000000..b6b50d8 Binary files /dev/null and b/figure/chapters/wireshark/icmp-structure.pdf differ diff --git a/figure/chapters/wireshark/icmp-structure.png b/figure/chapters/wireshark/icmp-structure.png deleted file mode 100644 index d95ea87..0000000 Binary files a/figure/chapters/wireshark/icmp-structure.png and /dev/null differ diff --git a/figure/chapters/wireshark/ip-structure.pdf b/figure/chapters/wireshark/ip-structure.pdf new file mode 100644 index 0000000..bc81cf4 Binary files /dev/null and b/figure/chapters/wireshark/ip-structure.pdf differ diff --git a/figure/chapters/wireshark/ip-structure.png b/figure/chapters/wireshark/ip-structure.png deleted file mode 100644 index 46cd430..0000000 Binary files a/figure/chapters/wireshark/ip-structure.png and /dev/null differ