网络已经是无处不在,很多时候我们都会利用网络与不同主机进行通信,包括网络内部和外部的。大多数情况下这不会遇到问题,但是有时您需要仔细检查您的网络以查明问题原因。

  仔细检查网络流量内容的原因有很多。其中第一个原因是您可能正在调试一个现有的网络应用,或者您正在开发一个应用,而您想要监控通过您的网络的流量。第二个原因是需要识别可能耗尽网络带宽和资源的流量。对于前一种情况,您可能已经知道协议的内容了,但是您希望能够更深入地了解正在传输的实际数据,例如,在使用 Web 服务时。对于后一种情况,确定数据包的内容需要了解正在使用的协议的一些扩展知识。
  在 TCP/IP UDP/IP 的通信中,最主要的元素是用于确定主机和端口号的 IP 地址。端口号用于提供额外的通信通道,这样您才能够在两个主机之间实现多个连接。其中端口定义还有一些标准。例如,端口 25 是专用于电子邮件(SMTP)传输,而大多数网站都是运行在端口 80(HTTP)上的。这些规范可以使程序之间通过一个熟悉的通道进行通信,这与您选择电话或传真号的道理是一样的。
  虽然有这样一些规范,但是您实际想使用哪些端口是没有任何限制或约束的。事实上,大多数情况下一些破坏性网络应用和一些安全性方法会故意使用非标准端口。例如,有些应用会通过将一个标准端口用于不同的协议而隐藏内容,如在 端口 25 上使用 HTTP 协议。此外,有时某些应用也会使用与标准不同的端口,这样端口的用途就明显了(如,将端口 99 用于 HTTP),或者将特定的协议流量封装到另一个协议中。最后的方法实际上是网络通道和虚拟私有网络(×××)所使用的方法。
  不管网络流量原因和复杂性,第一个步骤都会开始记录数据。
  记录原始数据
  如果您希望记录网络原始数据,以便自己检查这些信息,那么您可以使用许多不同的工具。大多数的网络嗅探器也能够解码和解密特定的数据包内容,这能够帮助您研究一个已知协议的内容。
  在 Solaris 上,您可以使用 snoop 工具,而在 AIX 上,您可以使用 iptrace 工具。您也可以尝试使用跨平台的 tcpdump 工具,它支持大多数的 UNIX Linux 操作系统。这些工具能够帮您捕捉和解码数据包,通常也能为您执行大多数的协议分析。注意,现代交换机不会将 Ethernet 数据包发送到每一个端口上,这通常会限制您从当前主机获取的信息量。许多现代交换机具有一个管理端口,它通常带有与这种监控完全相同的所有数据包的副本。
  解码网络传输最复杂的是网络数据包中信息的级别。此外,大部分信息也会经过二进制编码后再发送,从网络捕捉完全原始的数据包需要进行大量的操作才能捕捉您需要的数据。通过使用实现某些处理的工具,您可以简化解码网络数据的过程。
  例如,在一个 Ethernet 上查看一个典型的 TCP/IP 协议,您将会发现网络中传输的数据包括:
  Ethernet 数据包头,包括 Ethernet 来源和目标地址,数据包大小和 Ethernet 数据包类型。
  IP 报头,由 IP 寻址(来源和目标),协议标识和 IP 标记。您也会得到关于分片和数据包顺序的信息。
  TCP 报头,它包含端口上的信息、隐含的协议、标记和顺序编号。
  即使有这些信息,我们仍然无法了解实际内容。在 TCP( UDP)协议之下还有额外的协议,标准数据协议(包括 HTTPSMTP FTP),或者封装性协议,如 Remote Procedure Call (RPC) RPC 的子类型,如 NFS
  通常这些工具必须使用协议和/或端口号来确定正在传输的内容。所以,如果流量是通过非标准端口传输的,那么这个些信息可能无法正确解码。
  基本的网络分析
  本文之前提到的许多网络嗅探工具都提供了不同级别的协议解码,它们是通过检查端口和内容来确定所使用的协议实现的。
  例如,snoop tcpdump 都提供了关于 UDP TCP 上不同协议的不同级别的详细信息。例如,在 snoop 中,您可以获得从顶级协议到所传输的单个数据块的关于 NFS 操作的详细信息。例如,您可以通过指定监控 RPC 使用 NFS 协议来实现对 NFS 流量的监控:$ snoop -v rpc nfs。