Mac OS系统10.9.1,安装Wireshark,后不能跑,提示安装X11,到这里安装XQuartz即可。
TIPS:安装XQuartz 后,重新启动Wireshark,让选择X11,这是去选/Applications/Utilities/XQuartz.app(默认位置),启动得比较久,得有点耐心,若不懂可参考这里installing wireshark on mac osx10.8 mountainlion 和 cannot run wireshark in mac os x moutain-loin.
然后抓包~跟windows一样了。下图是访问tanglei.me抓包,用的github pages搭建的博客,访问IP是192.30.252.153(or 154),看到这个IP,为了看得更清楚,可以利用下Filter。Wireshark功能很强大的说。
如下图是建立连接时的3次握手~其中,SYN=Synchronize Sequence Numbers, ACK=Acknowledgement Number
- Client(本机192.168.1.100)发起TCP请求, 发送序号为x(=0)的SYN包; ——SYN(x)
- Server(Github 192.30.252.153)收到连接请求,给出响应ACK(x+1=1),同时携带一个序号Seq,y(=0); —— SYN(y)+ACK(x+1)
- Client(本机192.168.1.100)对响应做出回复,返回Ack(y+1=1),同时自己序号自增Seq=1; ——ACK(y+1)
文后画了下3次/4次握手的示意图。
3次握手完成,TCP连接建立起来了~随后就直接通信,上图可以看到Client就直接去Get请求了(注意http是应用层的协议,底层传输还是走TCP哦~). 安全的连接就是这样建立起来滴,通过检验序号是否合法,Client端/Server端分别做出相应的机制,比如自己序号y包发出去了,没有收到y+1的响应,对方可能没有收到,然后可能一定时间后 ,会重发这个y包~
再来看看断开连接的4次握手(挥手)。
这里是Github作为Client主动发起关闭连接的请求,这里的FIN=FINish
- Github 发Fin(x=6831)包; ——FIN(X)
- 本机收到上面的包后,做出ACK(x+1=6832)响应,跟Github说我收到了~,你别再发了; ——ACK(X+1)
- 你要关了,那我也准备关吧~ 于是发Fin(y=1054)包,你准备好了么?; ——FIN(Y)
- Github准备好了,给出响应ACK(y+1=1055),告诉本机准备好了; ——ACK(Y+1)
双方确认都要关闭了,然后断开TCP连接。
此过程用tcpdump也是可以清晰的看到滴~下面以windows情况为例,windows上的tcpdump叫windump,用法跟tcpdump一样~详细的可以查看下其文档
本机IP打下码~ 如下166.111.X.X是本机IP.查看同样的例子~
TIPS:用tcpdump/windump时注意选指定的网卡,若安装虚拟机等可能默认的选不到正确的那块,就抓不到包。(windump -D 查看网卡) 下面命令是-i 2 (选择监控第2块网卡), -n (不转换名字,以实际IP地址显示结果), -S (大写的S,打印绝对的序号号,如果没有这个选项的话,非SYN包如ack就是相对的,不方便查看,如果没有这个选项下面第3行ack可能就是1), host通信的地址为192.30.252.153,后面的就不用解释了分别是tcp协议,80端口,然后结果输出到文件。
另外,不同的浏览器可能会对你访问页面发起多次请求,为了更好的看结果,你得注意看某一个端口,如下是与57245端口的请求。实际过程中可能还有其他端口的请求,下面的例子把其他端口的请求给去掉了滴。
C:\Users\tanglei>windump -i 2 -n -S host 192.30.252.153 and tcp port 80>tcpdump.log |
前面3行,正是连tanglei.me时发起的TCP请求的3次握手,末尾4行是要断开的4次握手(挥手).
下面的解释用C代表最先主动发起请求的1方,S代表接受到请求的方.
- 第1行:(C —>S) SYN包,序号1337949936
- 第2行:(S —>C) SYN+ACK,ACK为1337949936+1=1337949937,序号为3859825850
- 第3行:(C —>S) ACK,ACK为3859825850+1=3859825851
再看末尾四行的4次握手。
- 末4行:(C —>S) FIN包,序号3859826074
- 末3行:(S —>C) ACK包,序号3859826074+1=3859826075
- 末2行:(S —>C) FIN包,序号1337950298
- 末1行:(C —>S) ACK包,序号1337950298+1=1337950299
画个图描述下3/4次握手是什么样的.
以前计算机网络课还详细学了下TCP/UDP的协议,这些数据包是怎么组织放在某个位之类的,时间久了都忘了啊~