相信大家总是能听到TCP、UDP,还有TCP三次握手,之前都是看的书上的理论,今天来用Wireshark抓一个tcp三次握手。
在平时的开发中,如果是一般的Http或者Https请求,我们直接在Windows上使用Fiddler、Mac上使用Charles来抓包即可。当然,使用Wireshark也可以抓取http、https请求,不过一般使用Wireshark来抓TCP请求。
官方下载地址:https://www.wireshark.org/download.html
首先,来看下wireshark界面
这里选择Wi-Fi就能抓到本机所有的请求了,我这里是wifi,如果是直接连网线,看到的就是本地连接了。这个很简单,你试一下就能知道了。
然后就能看到各种网络请求了,包括应用层协议和传输层协议。
因为数据传输记录太多了,那么就一定需要过滤器功能了。上面的过滤器栏中支持以下几种表达式:
表达式规则
- 协议过滤
比如tcp,只显示TCP协议。http,就是只显示HTTP协议。注意,这里是区分大小写的。 - IP 地址过滤
比如 ip.src ==192.168.1.102 显示源地址为192.168.1.102,
ip.dst==192.168.1.102, 目标地址为192.168.1.102 - 端口过滤
tcp.port ==80, 端口为80的
tcp.srcport == 80, 只显示TCP协议的愿端口为80的。 - Http模式过滤
http.request.method=="GET", 只显示HTTP GET方法的。 - 逻辑运算符为 AND/ OR
点击任意一个记录,下面会显示该记录的封包详细信息
- Frame: 物理层的数据帧概况
- Ethernet II: 数据链路层以太网帧头部信息,这里就可以看到本机mac地址以及目标mac地址了
- Internet Protocol Version 4: 互联网层IP包头部信息,这里可以看到本机以及目标ip地址
- Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP,这里能看到TCP的数据包了,下面会讲到。
- Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议
关于互联网通信协议,推荐阮一峰的“互联网协议入门”,写的真好。http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html
下面看下TCP报文头部格式:
再来对比看一下Wireshark抓的TCP包,终于从理论到实践了。大学期间看了很多遍TCP报文头都记不住。重点关注一下Sequence number 和 Acknowledgment number 以及Flags。
现在进入我们的重点,TCP三次握手,这个历史性的握手
我们先访问一个http请求“http://www.cnblogs.com/tankxiao”,注意这里不是https哦,关于https我后面再讲。
我们找到我们请求的http地址,注意看Stream index = 2,这个index等下可以追踪到这次http建立之前的tcp三次握手过程。
我们鼠标右键这个http请求,Follow-TCP Stream,就可以看到此次tcp建立连接的历史性握手了。
上面的地址栏过滤"tcp.stream eq 2"中的2就是上面的Stream index。
咱么首先看下TCP三次握手经典图
大学时看过很多遍这个图,却记不住到底啥意思,就是因为太抽象了,抽象到只能死记硬背,今天通过wireshark一看就明白了。
下面来分步解析一下三次握手过程,主要关注三个参数,分别是Flags、Sequence number、Acknowledgment number。
第一次握手
Flags:SYN
Sequence number:0
Acknowledgment number:0
第二次握手
Flags:SYN,ACK
Sequence number:0
Acknowledgment number:1
第三次握手
Flags:ACK
Sequence number:1
Acknowledgment number:1
总结:TCP三次握手过程
- 客户端发送SYN标志和序列号Seq来向服务器发起连接
- 服务端收到请求,向客户端发送ACK表示确认,确认号是接收到的序列号+1。同时发送SYN标志位以及自己的序列号给客户端发起连接
- 客户端再发送ACK标志给服务端表示确认,其中确认号是服务端发送过来的序列号+1
参考博客:https://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html