%# -*- coding: utf-8-unix -*-

\section{Wireshark软件使用与ARP协议分析}
\label{sec:c:wireshark:s:arp}

\subsection{实验目的}
\label{subsec:c:wireshark:s:arp_object}

学习Wireshark的基本操作，
抓取和分析有线局域网的数据包；
掌握以太网MAC帧的基本结构，
掌握ARP协议的特点及工作过程。

\subsection{实验内容}
\label{subsec:c:wireshark:s:arp_content}

使用Wireshark抓取局域网的数据包并进行分析：

\begin{enumerate}
  \item \textbf{学习Wireshark基本操作：}
  重点掌握捕获过滤器和显示过滤器。
  \item \textbf{观察MAC地址：}了解MAC地址的组成，辨识MAC地址类型。
  \item \textbf{分析以太网帧结构：}观察以太网帧的首部和尾部，
  了解数据封装成帧的原理。
  \item \textbf{分析ARP协议：}抓取ARP请求和应答报文，分析其工作过程。
\end{enumerate}

\subsection{实验原理}
\label{subsec:c:wireshark:s:arp_principle}

\subsubsection{Wireshark简介}

Wireshark软件是目前全球使用最广泛的开源网络数据包分析工具（前身为Ethereal），
由Gerald Combs编写并于1988年获开源许可发布。
网络数据包分析是指进入网络通信系统、
捕获和解码网络上实时传输数据以及搜集统计信息的过程。
通过Wireshark对网络数据进行分析，
我们能够了解网络是如何运行的、数据包是如何被转发的、应用是如何被访问的；
能够分析各层网络协议的性能、掌握通信主体的运行情况，
确认带宽分配和时延大小、查看应用的快慢并改进优化，
识别网络中存在的攻击或恶意行为、解决网络异常和故障。
Wireshark可以在Windows、Linux和macOS操作系统中运行，
具备友好的图形界面、丰富的统计及图表分析功能。

\subsubsection{以太网MAC帧格式}

本实验基于使用最广泛的有线局域网（以太网Ethernet II），
以太网的帧结构如表\ref{tab:c:wireshark_eth-format}所示。
其中，MAC地址（Media Access Control Address，媒体存取控制位址）或称物理地址（Physical Address），
用于在网络中标识网卡。MAC地址的长度为48位(6个字节)，
通常表示为12个16进制数，如：00-16-EA-AE-3C-40。
其中前3个字节的16进制数00-16-EA代表网络硬件制造商的编号、即组织唯一标志符(OUI)，
它由IEEE分配；
而后3个字节的16进制数AE-3C-40代表该制造商所生产的某个网络产品(如网卡)的系列号。

\begin{table}[!ht]
  \small
  \centering
  \caption{以太网帧格式}
  \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字节 & 46-1500字节 & 4字节 \\ \hline
  \end{tabular}
\end{table}

\subsubsection{ARP协议及数据报格式}
地址解析协议（Address Resolution Protocol，ARP），
主要作用是将IP地址解析为MAC地址。当某主机或网络设备要发送数据给目标主机时，
必须知道对方的网络层地址（即IP地址），而且在数据链路层封装成帧时，
还必须有目标主机（或下一跳路由器）的MAC地址。
本实验重点观察最简单的情形：
同一个网段内，主机A要向主机B发送信息时，
ARP解析的过程（主机A和B不在同一网段的情况请参阅课本相关内容）。具体如下：

\begin{enumerate}
  \item 主机A首先查看自己的ARP表。如果找到了主机B的MAC地址，
  则利用这个地址对IP数据报进行帧封装，并将数据报发送给主机B。
  \item 如果主机A在ARP表中找不到主机B的MAC地址，则以广播方式发送一个ARP请求报文。
  ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址，
  目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。
  由于ARP请求报文以广播方式发送，该网段上的所有主机都可以接收到该请求，
  但只有被请求的主机B会对该请求进行处理。
  \item 主机B比较自己的IP地址和ARP请求报文中的目标IP地址，
  当两者相同时进行如下处理：
  将ARP请求报文中的发送端（即主机A）的IP地址和MAC地址存入自己的ARP表中。
  然后以单播方式发送ARP响应报文给主机A，其中包含了自己的MAC地址。
  \item 主机A收到ARP响应报文后，
  将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发，
  同时将IP数据报进行封装后发送出去。
\end{enumerate}

ARP报文结构如图\ref{fig:c:wireshark_arp-format}所示，
ARP报文总长度为28字节，MAC地址长度为6字节，
IP地址长度为4字节。每个字段的含义如下：

\begin{itemize}
  \item \textbf{硬件类型：}指明了发送方想知道的硬件接口类型，以太网的值为1。
  \item \textbf{协议类型：}表示要映射的协议地址类型。IP 地址的类型值为0x0800。
  \item \textbf{硬件地址长度和协议地址长度：}分别指出硬件地址和协议地址的长度，
  以字节为单位。在以太网中，它们的值分别为6和4。
  \item \textbf{操作码（op）：}用来表示这个报文的类型，
  ARP 请求为1，ARP 响应为2，RARP 请求为3，RARP 响应为4。
\end{itemize}

\begin{figure}[!ht]
  \centering
  \includegraphics[width=9cm]{arp-format}
  \caption{ARP报文结构示意图}
  \label{fig:c:wireshark_arp-format}
\end{figure}

\subsubsection{实验方法及手段}

使用Wireshark软件在有线局域网中捕捉相关网络操作的数据包，
运用观察对比、计算验证、分析统计等方法，
掌握以太网MAC帧和IP数据报的结构以及ARP协议的工作原理。

\subsection{实验条件}
\label{subsec:c:wireshark:s:arp_requirement}

\begin{itemize}
  \item PC机一台，连入局域网；
  \item Wireshark软件，建议3.0以上版本。
\end{itemize}

\subsection{实验步骤}
\label{subsec:c:wireshark:s:arp_procedure}

\subsubsection{WireShark基本使用}

\begin{enumerate}
  \item 通过Wireshark官网下载最新版软件，按默认选项安装。
  \item 运行Wireshark软件，程序界面会显示当前的网络接口列表，
  双击要观察的网络接口，开始捕捉数据包，
  Wireshark软件选择网络接口的界面如图\ref{fig:c:wireshark_wireshark-boot-ui}所示。

  \begin{figure}[!ht]
    \centering
    \includegraphics[width=12cm]{wireshark-boot-ui}
    \caption{Wireshark软件启动界面}
    \label{fig:c:wireshark_wireshark-boot-ui}
  \end{figure}

  \item 点击工具栏上的红色方块按钮停止捕捉。
  \item 菜单、工具栏、状态栏和主窗口如图\ref{fig:c:wireshark_wireshark-main-ui}所示，
  可以根据需要通过菜单“视图”以及“编辑/首选项/外观”的相关选项对基本设置进行更改。
  例如图\ref{fig:c:wireshark_wireshark-setup-ui}中的语言、字体缩放、颜色、布局等项目。

  \begin{figure}[!ht]
    \centering
    \includegraphics[width=12cm]{wireshark-main-ui}
    \caption{Wireshark主窗口界面}
    \label{fig:c:wireshark_wireshark-main-ui}
  \end{figure}

  \begin{figure}[!ht]
    \centering
    \includegraphics[width=12cm]{wireshark-setup-ui}
    \caption{Wireshark的设置界面}
    \label{fig:c:wireshark_wireshark-setup-ui}
  \end{figure}

  \item 使用“显示过滤器”可以方便地从捕获的数据包中筛选出要观察的数据包。
  显示过滤器支持若干的过滤选项：
  源MAC、目的MAC、源IP、目的IP、TCP/UDP传输协议、
  应用层协议（HTTP, DHCP）、源端口Port、目的端口Port等。
  在显示过滤器栏中输入过滤表达式（
  更详细的显示过滤语法可以查看WireShark的官方文档
  \footnote{
    \href{https://www.wireshark.org/docs/wsug_html_chunked/ChWorkBuildDisplayFilterSection.html}
    {WireShark显示过滤器语法}
  }
  ），例如下面的命令：
  
  \begin{itemize}
    \item \texttt{arp~~~~~~~~~~~~~~~~~~~~~~~~//显示arp协议报文，例如图\ref{fig:c:wireshark_wireshark-filters}}
    \item \texttt{ip.src == a.b.c.d \&\& icmp~~//显示源地址为a.b.c.d的icmp报文}
  \end{itemize}

  \begin{figure}[!ht]
    \centering
    \includegraphics[width=12cm]{wireshark-filters}
    \caption{显示过滤规则的示例}
    \label{fig:c:wireshark_wireshark-filters}
  \end{figure}

  \item 通过主菜单“文件”/“导出特定分组”（如图\ref{fig:c:wireshark_wireshark-save}），
  可以保存捕获的网络数据（也可以先选中某些包，只保存部分数据）。

  \begin{figure}[!ht]
    \centering
    \includegraphics[width=12cm]{wireshark-save}
    \caption{操作主菜单保存数据文件}
    \label{fig:c:wireshark_wireshark-save}
  \end{figure}

  \item 如果只想捕捉特定的数据包，
  可以使用菜单“捕获”/“捕获过滤器”选定想要的类型
  （如图\ref{fig:c:wireshark_wireshark-special-type}）。
  例如，选择“IPv4 only”，Wireshark只抓取ipv4类型的数据包。
  Wireshark过滤器官方文档提供了更加全面详细的语法和常用示例
  \footnote{\href{https://wiki.wireshark.org/CaptureFilters/\#Useful_Filters}
  {WireShark常用过滤器语法}}。

  \begin{figure}[!ht]
    \centering
    \includegraphics[width=12cm]{wireshark-special-type}
    \caption{选中特定的捕获类型}
    \label{fig:c:wireshark_wireshark-special-type}
  \end{figure}

  \item Wireshark还提供了丰富的统计功能供用户选用，
  如图\ref{fig:c:wireshark_wireshark-statistic}。
  更多文档可以查询Wireshark使用帮助
  \footnote{\href{https://www.wireshark.org/\#learnWS}{WireShark学习手册}}。

  \begin{figure}[!ht]
    \centering
    \includegraphics[width=12cm]{wireshark-statistic}
    \caption{统计功能}
    \label{fig:c:wireshark_wireshark-statistic}
  \end{figure}
\end{enumerate}

\subsubsection{观察MAC地址}
启动Wireshark捕捉数据包，
在命令行窗口分别ping网关和ping同网段的一台主机，
分析本机发出的数据包。
重点观察以太网帧的 Destination和Source的MAC地址，
辨识MAC地址类型，解读OUI信息、I/G和G/L位。
\subsubsection{分析以太网的帧结构}
选择其中一个数据包，点击Ethernet II展开（图\ref{fig:c:wireshark_eth-frame-detail}），
查看MAC帧的各个字段。

\begin{figure}[!ht]
  \centering
  \includegraphics[width=12cm]{eth-frame-detail}
  \caption{以太网帧结构展开界面}
  \label{fig:c:wireshark_eth-frame-detail}
\end{figure}

\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缓存中添加对应InetAddr地址的EtherAddr地址静态项
  \end{code}
  \caption{arp命令语法及参数}
  \label{fig:arp-cmd}
\end{figure}

\subsubsection{ARP协议分析}
\begin{enumerate}
  \item 使用\texttt{arp –d}命令（其语法见图\ref{fig:arp-cmd})，
  清空本机的ARP缓存，
  开启Wireshark，ping本机的同网段地址，在显示过滤器条框中输入“\texttt{arp}”，
  观察捕获的ARP报文的各个字段，分析请求/响应的过程。
  \item 使用\texttt{arp –d}命令，清空本机的ARP缓存。开启Wireshark，
  ping与本机网段不同的IP地址或域名，观察捕获的ARP报文的各个字段，
  分析请求/响应的过程。
\end{enumerate}

\subsection{思考题}
\label{subsec:c:wireshark:s:arp_rethink}

\begin{enumerate}
  \item 使用了显示过滤器后，Wireshark的抓包工作量会减少吗？
  \item MAC帧的长度和IP数据报的长度有怎样的关系？请用你的数据记录进行验证。
  \item 假设本机IP地址是192.168.0.38，在本机上运行Wireshark捕获报文，
  使用“\texttt{ip.addr == 192.168.0.38}”作为过滤条件，
  能否过滤出本机发出/收到的ARP报文？为什么？
  \item ping同一局域网内的主机和局域网外的主机，都会产生ARP报文么？
  所产生的ARP报文有何不同，为什么？
  \item ARP请求数据包是支撑TCP/IP协议正常运作的广播包。
  如果滥发或错发ARP广播包会产生那些不良影响？如何发现和应对？
  \item 什么是免费 ARP（Gratuitous ARP）？它的作用是什么？
  请使用Wireshark进行捕捉和分析。
\end{enumerate}

\subsection{考核方法}
\label{subsec:c:wireshark:s:arp_criterion}

考核分为现场考核和实验报告两个部分，具体如下。
报告内容应包含以下内容，相关的分析解释都需要截图证明，
并与提交的Wireshark抓包数据文件相吻合。

\begin{enumerate}
  \item （20分）现场考核：Wireshark的基本使用。
  \item （30分）以太网帧格式分析：MAC地址类型、头部信息、长度及封装。
  \item （30分）结合捕捉的网络数据，分析ARP数据包，描述ARP协议工作过程。
  \item （10分）回答任意两道思考题。
  \item （10分）记录自己在本次实验中所遇到的问题，以及心得感悟。
  如果遇到异常情况，或者无法完成任务时，也请分析错误产生的原因。
\end{enumerate}
