既然我们要分析 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. 总结
- 配置好你的环境,抓取数据包