Tcpdump会让你在网络方面自由飞翔

一、 tcpdump与Wireshark介绍

Tcpdump会让你在网络方面自由飞翔

文章插图
 
在网络问题的调试中 , tcpdump应该说是一个必不可少的工具 , 和大部分linux下优秀工具一样 , 它的特点就是简单而强大 。它是基于Unix系统的命令行式的数据包嗅探工具 , 可以抓取流动在网卡上的数据包 。
默认情况下 , tcpdump不会抓取本机内部通讯的报文 。根据网络协议栈的规定 , 对于报文 , 即使是目的地是本机 , 也需要经过本机的网络协议层 , 所以本机通讯肯定是通过API进入了内核 , 并且完成了路由选择 。【比如本机的TCP通信 , 也必须要socket通信的基本要素:src ip port dst ip port】
如果要使用tcpdump抓取其他主机mac地址的数据包 , 必须开启网卡混杂模式 , 所谓混杂模式 , 用最简单的语言就是让网卡抓取任何经过它的数据包 , 不管这个数据包是不是发给它或者是它发出的 。一般而言 , Unix不会让普通用户设置混杂模式 , 因为这样可以看到别人的信息 , 比如telnet的用户名和密码 , 这样会引起一些安全上的问题 , 所以只有root用户可以开启混杂模式 , 开启混杂模式的命令是:ifconfig en0 promisc, en0是你要打开混杂模式的网卡 。
Linux抓包原理:
Linux抓包是通过注册一种虚拟的底层网络协议来完成对网络报文(准确的说是网络设备)消息的处理权 。当网卡接收到一个网络报文之后 , 它会遍历系统中所有已经注册的网络协议 , 例如以太网协议、x25协议处理模块来尝试进行报文的解析处理 , 这一点和一些文件系统的挂载相似 , 就是让系统中所有的已经注册的文件系统来进行尝试挂载 , 如果哪一个认为自己可以处理 , 那么就完成挂载 。
当抓包模块把自己伪装成一个网络协议的时候 , 系统在收到报文的时候就会给这个伪协议一次机会 , 让它来对网卡收到的报文进行一次处理 , 此时该模块就会趁机对报文进行窥探 , 也就是把这个报文完完整整的复制一份 , 假装是自己接收到的报文 , 汇报给抓包模块 。
Wireshark是一个网络协议检测工具 , 支持windows平台、Unix平台、Mac平台 , 一般只在图形界面平台下使用Wireshark , 如果是Linux的话 , 直接使用tcpdump了 , 因为一般而言Linux都自带的tcpdump , 或者用tcpdump抓包以后用Wireshark打开分析 。
在Mac平台下 , Wireshark通过WinPcap进行抓包 , 封装的很好 , 使用起来很方便 , 可以很容易的制定抓包过滤器或者显示过滤器 。Wireshark是一个免费的工具 , 只要google一下就能很容易找到下载的地方 。
所以 , tcpdump是用来抓取数据非常方便 , Wireshark则是用于分析抓取到的数据比较方便 。
二、tcpdump抓取TCP包分析
TCP传输控制协议是面向连接的可靠的传输层协议 , 在进行数据传输之前 , 需要在传输数据的两端(客户端和服务器端)创建一个连接 , 这个连接由一对插口地址唯一标识 , 即是在IP报文首部的源IP地址、目的IP地址 , 以及TCP数据报首部的源端口地址和目的端口地址 。TCP首部结构如下:
Tcpdump会让你在网络方面自由飞翔

文章插图
 
注意:通常情况下 , 一个正常的TCP连接 , 都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手
其中在TCP连接和断开连接过程中的关键部分如下:
源端口号:即发送方的端口号 , 在TCP连接过程中 , 对于客户端 , 端口号往往由内核分配 , 无需进程指定;
目的端口号:即发送目的的端口号;
序号:即为发送的数据段首个字节的序号;
确认序号:在收到对方发来的数据报 , 发送确认时期待对方下一次发送的数据序号;
SYN:同步序列编号 , Synchronize Sequence Numbers;
ACK:确认编号 , Acknowledgement Number;
FIN:结束标志 , FINish;
1、三次握手 , 过程如下:
Tcpdump会让你在网络方面自由飞翔


推荐阅读