前言
iOS开发中,常用的都是charles来承担抓包的工作,虽然它能解决90%的场景需求,但是遇到需要抓非http协议的包,或是需要分析协议的交互等等情况的时候,charles就派不上用场了,这时可以祭出我们的神器-wireshark。这货在windows下是挺好用的,没想到在mac下,UI实在是太粗糙,一个典型的重功能不重UI的产品,和mac的其他软件反差很大,但是克服掉UI方面的问题,你会发现它的强大所在。
�RVI接口创建和管理
- 通过数据线连接好iOS设备,拿到设备的UDID(Xcode或iTunes都行)
- 通过终端输入rvictl -s <UDID>来创建一个Remote Virtual Interface(RVI、远程虚拟接口),这个接口就代表iOS设备的网络栈了,对这个接口抓包即可
rvictl -s 74bd53c647548234ddcef0ee3abee616005051ed
Starting device 74bd53c647548234ddcef0ee3abee616005051ed [SUCCEEDED]
- 查询新创建好的rvi接口,一般是rvi0
$ ifconfig -l
lo0 gif0 stf0 en0 en1 en2 en3 p2p0 awdl0 bridge0 rvi0
- 不需要使用之后,要把这个接口去掉
rvictl -x 74bd53c647548234ddcef0ee3abee616005051ed
Stopping device 74bd53c647548234ddcef0ee3abee616005051ed [SUCCEEDED]
抓包
没用wireshark之前,傻傻的用tcpdump来抓包,抓完包之后用tcprewrite解析数据,然后导入到charles看。这个方法一来太繁琐,二来charles只能看到http部分的数据包。后来改用wireshark之后,世界清静了!!
打开wireshark,选择我们之前创建的rvi0接口 ,然后抓包就开始了
�Wireshark启动界面
tcp包分析(这部分是转载他人的)
- TCP数据包中,seq表示这个包的序号,注意,这个序号不是按1递增的,而是按tcp包内数据字节长度加上,如包内数据是21字节,而当前IP1发到IP2的包的seq是10的话,那下个IP1发到IP2的包的seq就是10+21=31
- 每个tcp包都带有win、ack,这些是告诉对方,我还可以接收数据的滑动窗口是多少,如果A发到B的包的win为0,就是A告诉B说我现在滑动窗口为0了,饱了,你不要再发给我了,就说明A端环境有压力(如带宽满了等)
- ack可以理解为应答。A发给B的ack是告诉B,我已收到你发的数据包,收到ack号这里了,你下次要发seq为ack号的给我
- 在网络不堵即滑动窗口一点都不堵的情况下,第一个包的ack号就是第二个包的seq号,如果堵了,由于是滑动窗口缓存处理队列,所以这个值会错开
- 注意我们分析tcp包时,要以一个会话做为一个完整对象,即通讯只发生在两个IP之间,两个固定的端口之间,如果端口变化了,那链接就不是同一条了,不同的链接之间的seq是没有关联的
网友评论