%# -*- 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{计算FCS检验：}计算帧尾校验和，
  并用抓包数据文件进行验证。
  \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代表该制造商所生产的某个网络产品(如网卡)的系列号。

\renewcommand{\arraystretch}{1.5}
\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 点击工具栏上红色的stop按钮停止抓包。
  \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等。
  在显示过滤器栏中输入过滤表达式（图\ref{fig:c:wireshark_wireshark-filters}），
  例如下面的命令：
  更详细的显示过滤语法可以查看WireShark的官方文档
  \footnote{
    \href{https://www.wireshark.org/docs/wsug_html_chunked/ChWorkBuildDisplayFilterSection.html}
    {WireShark显示过滤器语法}
  }。

  \begin{itemize}
    \item \texttt{arp~~~~~~~~~~~~~~~~~~~~~~~~//显示arp协议报文}
    \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{查看OUI信息}
查看本机MAC地址字段，查看OUI信息，搜索各厂商的OUI进行验证。
\subsubsection{分析以太网的帧结构}
选择其中一个数据包，点击Ethernet II展开（图\ref{fig:c:wireshark_eth-frame-detail}），
查看MAC帧的各个字段。计算帧的长度，并与Wireshark的分析结果比较。
同时查看比较广播帧和单播帧的异同。

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

\subsubsection{差错检测，FCS计算检验}
计算以太网帧的尾部校验和，并与Wireshark显示数值进行比较验证。
\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本机的不同网段地址或域名，观察捕获的ARP报文的各个字段，
  分析请求/响应的过程。
\end{enumerate}

\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}

\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分）以太网帧格式分析：OUI查看、长度计算、校验和计算。
  \item （30分）结合捕捉的网络数据，描述ARP数据包，描述ARP协议工作过程。
  \item （10分）回答任意两道思考题。
  \item （10分）记录自己在本次实验中所遇到的问题，以及心得感悟。
  如果遇到异常情况，或者无法完成任务时，也请分析错误产生的原因。
\end{enumerate}
