本文内容有以下三个部分:

  1. wireshark过滤规则
  2. osi模型简述
  3. tcp三次握手

一、wireshark过滤规则

wireshark只是一个抓包工具,用其他抓包工具同样能够分析tcp三次握手协议。以下这张图片完整地展现了wireshark的面板。

wireshark tcp三次握手 wireshark抓包tcp三次握手_tcp

使用好wireshark一个关键是如何从抓到的众多的包中找到我们想要的那一个。这里就要说filter过滤规则了。如上图,在过滤器方框,我们加上了ip.src==192.168.1.102 or ip.dst==192.168.1.102的过滤规则,意思是在封包列表中,只显示源ip地址为192.168.1.102或者目的ip地址为192.168.1.102的包。
下面列举一些常用的过滤规则:

1. 过滤IP,如来源IP或者目标IP等于某个IP 
 如前面说的例子: ip.src==192.168.1.102 or ip.dst==192.168.1.102 
 比如TCP,只显示TCP协议。2. 过滤端口 
 tcp.dstport == 80 // 只显tcp协议的目标端口80 
 tcp.srcport == 80 // 只显tcp协议的来源端口80 
 也可以写成tcp.port eq 80 or udp.port eq 80 这样的模式3. 过滤协议 
 单独写上tcp、udp、xml、http就可以过滤出具体协议的报文。你也可以用tcp or xml这样格式来过滤。 
 我们还可以更加具体过滤协议的内容,如tcp.flags.syn == 0x02 表示显示包含TCP SYN标志的封包。4. 过滤mac地址 
 eth.src eq A0:00:00:04:C5:84 // 过滤来源mac地址 
 eth.dst==A0:00:00:04:C5:84 // 过滤目的mac地址5. http模式过滤 
 http.request.method == “GET” 
 http.request.method == “POST” 
 http.request.uri == “/img/logo-edu.gif” 
 http contains “GET” 
 http contains “HTTP/1.” 
 // GET包 
 http.request.method == “GET” && http contains “Host: ” 
 http.request.method == “GET” && http contains “User-Agent: ” 
 // POST包 
 http.request.method == “POST” && http contains “Host: ” 
 http.request.method == “POST” && http contains “User-Agent: ” 
 // 响应包 
 http contains “HTTP/1.1 200 OK” && http contains “Content-Type: ” 
 http contains “HTTP/1.0 200 OK” && http contains “Content-Type: “6. 过滤内容 
 contains:包含某字符串 
 ip.src==192.168.1.107 and udp contains 02:12:21:00:22 
 ip.src==192.168.1.107 and tcp contains “GET” 
 前面也有例子,http contains “HTTP/1.0 200 OK” && http contains “Content-Type: “

更加高级的用法就不讨论了,读者有兴趣可以查阅wireshark官网用户手册

二、osi模型简述

OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。如下图左边部分。在每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如源ip地址和目的ip地址等。

wireshark tcp三次握手 wireshark抓包tcp三次握手_wireshark tcp三次握手_02


osi模型中,在下一层的角度看,当收到上一层的包时,全部会被认为是本层的数据,然后在本层中加上自己本层的首部,继续往下传递。一个数据包格式如下:

wireshark tcp三次握手 wireshark抓包tcp三次握手_tcp_03


举一个例子,比如客户端应用程序A向远端服务器应用程序B发送“早上好”的数据,那么大致流程是这样的:

  1. 应用程序A把数据发送给下一层的TCP模块。
  2. TCP模块属于传输层。TCP在应用层数据的前端加上一个TCP首部。TCP首部中包含源端口号和目标端口号等信息。然后将包发送给IP模块。
  3. IP模块属于网络层。IP将TCP传过来的TCP首部和TCP数据合起来当做自己的数据,并且在TCP首部的前面加上自己的IP首部。IP首部包含了源ip地址和目的ip地址。然后,IP包将被发送给数据链路层,也就是以太网驱动程序。
  4. 从IP传过来的包,对于以太网驱动程序来说不过就是数据。给这些数据加上以太网首部,里面包含了源MAC地址和目的MAC地址。然后再通过物理层把数据发送给目的MAC地址。
  5. 服务器物理层接收到来自客户端的数据包时,首先从以太网的包首部找到MAC地址,判断是否为发给自己的包,如果不是就丢弃,如果是就向上转移给IP模块解析。
  6. IP模块收到IP包首部和后面的数据以后,判断包首部的目的ip地址与自己的ip地址是否匹配,如果匹配,就接收数据并传给TCP模块处理。
  7. TCP模块会检查端口号确定接收数据的应用程序是哪一个。
  8. 应用程序接收到数据包之后也会根据自己的规则判断做出一系列的处理。

通过上面例子大致的过程,可以体会到从上而下发包再到从下而上收包的过程。

三、tcp三次握手

wireshark tcp三次握手 wireshark抓包tcp三次握手_三次握手_04


上图为tcp三次握手,很多书籍都能看到。TCP提供面向有连接的通信传输,在数据通信开始之前先做好通信两端之间的准备工作。也就是说必须握手成功之后,才能进行通信。 接下来,用wireshark来抓取tcp三次握手报文。打开浏览器输入 。运用我们再前面介绍的过滤规则,在过滤框中输入http contains u014530704,找到如下包:

wireshark tcp三次握手 wireshark抓包tcp三次握手_wireshark tcp三次握手_05

可以发现我们向服务器请求的包,其中目的ip地址是47.95.165.112。
然后我们找 ip.src==47.95.165.112 or ip.dst==47.95.165.112 的包,找到了如下:

wireshark tcp三次握手 wireshark抓包tcp三次握手_三次握手_06


红色方框为本机192.168.1.101和服务器47.95.165.112之间的三次握手协议。三次握手协议的过程为:

  1. 客户端通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答。
  2. 服务器发送ACK包确认应答,发送SYN包请求连接。
  3. 客户端针对SYN包发送ACK包确认应答。

最后,讲述一下看懂报文的方法。想要读懂tcp报文,头部至关重要,对着下图去看wireshark tcp报文,并且找到tcp首部各个字段代表的意思,你就能读懂tcp报文了。其他像以太网报文、ip报文、http报文等同样如此。

wireshark tcp三次握手 wireshark抓包tcp三次握手_三次握手_07