4-TCP 协议(抓包)

既然我们要分析 TCP(Transmision Control Protocol) 协议,首先我们得先抓个包看看,再进行分析。

1. 准备工作

为了能够控制网络数据的传输,我们自己写一个简单的 TCP 协议的程序。我相信这一块你已经非常熟练了,在Linux 编程学习笔记的第十四部分,我们已经对简单的 socket 编程基础做了一个介绍。在这个部分,我们需要利用之前我们写好的基于 TCP 协议的大写转换服务器程序。

接下来,我们还需要一个能够运行在 Windows 上的客户端。文件清单如下:

. |-unp   |-protocol     |-tools       |-tcpserver       | |-serv.c       |-winclient         |-tcp_client.cpp

这些代码托管在 gitos 上:http://git.oschina.net/ivan_allen/unp

在你的 Linux 上,使用命令:

git clone https://git.oschina.net/ivan_allen/unp.git

就可以把代码同步到你的机器上啦。

unp/tools/tcpserver/serv.c 文件直接在你的 Linux 上编译:

gcc serv.c -o serv

unp/tools/winclient/tcp_client.cpp 这个文件需要你下载到你的 windows 上,在你的 Linux 中运行:

$ sz tcp_client.cpp

就可以把它下载到你的 windows 机器上啦。如果提示找不到命令 sz 命令,你可能需要提前安装一下:

$sudo apt-get install lrzsz

同样的还有一个命令 rz,它可以用来将 windows 上的文件上传到 Linux 中。

注意 sz、rz 需要在 xshell 或者 secure crt 程序来用。所以你需要使用 xshell 客户端程序或 secure crt 来连接到你的 Linux 虚拟机上。

tcp_client.cpp 下载到 windows 上后,请使用 vc6.0 或 vs 进行编译。

2. 开始抓包

  • 在 linux 启动你的 serv 服务器
// 指定 ip 地址和端口号 $ serv 192.168.80.130 5000

一定要注意,ip 地址就是你的 Linux 系统上配置的 ip 地址,你可以通过 ifconfig 来查看。端口号你可以随便写,只要大于 1024 就行了。这后面这个 ip port 实际上就是服务器 serv 绑定的套接字地址。

  • 在 windows 上打开 OmniPeek 抓包

注意网卡要选 VMnet8,因为我们需要抓取 windows 和虚拟机之间的通信数据包。然后点击 Start Capture 进行抓包。

  • 打开 Windows 控制台,也就是 cmd 命令

运行方式如下,最后记得输入 q 表示退出并关闭连接。


这里写图片描述
图1 Windows 客户端上运行 tcp_client 程序

tcp_client.exe 程序就是我们之前编译的 tcp_client.cpp 文件所产生的。

这时候,在 OmniPeek 中已经抓取到了相应的数据包:


这里写图片描述
图2 OmniPeek 抓取到的数据

有可能你抓取到了很多不相关的数据包,此时你可以使用过滤器:


这里写图片描述
图3 在过滤器中输入 port(5000) 后回车

在过滤器中输入 port(5000) 后按下回车键(表示你只关心端口 5000 上传输的数据),此时为弹出一个对话框,选择 Hide unselected packets. 因为我已经选择过了,所以这里是灰色的。


这里写图片描述
图4 选择隐藏未被选择的数据包

完成后,你应该就可以看到图 2 中的画面了。当然你的数据不可能完全和我的一样。

在图 2 中表示一共在端口 5000 上抓到了 15 个数据帧,这里我们双击第 4 个数据帧,可以打开一个新的窗口看到解析的结果:


这里写图片描述
图5 第 4 个数据帧解析结果

以太网规定,帧中的数据最少为 46 字节,再加上帧头 14 字节和帧尾的 4 字节校验和,一共就是 64 字节。从图 5 中看到,该数据帧总长度为 64 字节,这并不是什么巧合。

3. 分析 TCP 协议

抓取到包后,我们当然就开始解读这些 2 进制数据的含义啦。

下回分解。

4. 总结

  • 配置好你的环境,抓取数据包