Wireshark 介绍
Wireshark是非常流行的网络封包分析软件,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。 官方下载地址
Wireshark 开始抓包
ps:在Linux上运行Wireshark抓包可能会遇到权限问题,解决方案可以参考这里
开始界面: 
选择你正在用的网卡,然后点菜单中的鲨鱼图标就可以进行抓包了!
Wireshark 窗口介绍

WireShark 主要分为这几个界面
Display Filter(显示过滤器), 用于过滤
Packet List Pane(封包列表), 显示捕获到的封包, 有源地址和目标地址,端口号。 颜色不同,代表
Packet Details Pane(封包详细信息), 显示封包中的字段
Dissector Pane(16进制数据)
Miscellanous(地址栏,杂项)
Wireshark 过滤器
Wireshark有两种过滤器,分别是显示过滤器与捕捉过滤器。
区别 * 捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中。需要在开始捕捉前设置。 * 显示过滤器(DisplayFilters):在捕捉结果中进行详细查找。他们可以在得到捕捉结果后随意修改。
两种过滤器的目的是不同的。 * 捕捉过滤器是数据经过的第一层过滤器,它用于控制捕捉数据的数量,以避免产生过大的日志文件。 * 显示过滤器是一种更为强大(复杂)的过滤器。它允许您在日志文件中迅速准确地找到所需要的记录。
捕捉过滤器

Protocol(协议): 可能的值:
ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp. 如果没有特别指明是什么协议,则默认使用所有支持的协议。Direction(方向): 可能的值:
src, dst, src and dst, src or dst如果没有特别指明来源或目的地,则默认使用src or dst作为关键字。 例如,host 10.2.2.2与src or dst host 10.2.2.2是一样的。Host(s): 可能的值:
net, port, host, portrange. 如果没有指定此值,则默认使用host关键字。 例如,src 10.1.1.1与src host 10.1.1.1相同。Logical Operations(逻辑运算): 可能的值:
not, and, or. 否(not)具有最高的优先级。或(or)和与(and)具有相同的优先级,运算时从左至右进行。 例如,not tcp port 3128 and tcp port 23与(not tcp port 3128) and tcp port 23相同。not tcp port 3128 and tcp port 23与not (tcp port 3128 and tcp port 23)不同。
例子: * tcp dst port 3128 //捕捉目的TCP端口为3128的封包。 * ip src host 10.1.1.1 //捕捉来源IP地址为10.1.1.1的封包。 * host 10.1.2.3 //捕捉目的或来源IP地址为10.1.2.3的封包。 * ether host e0-05-c5-44-b1-3c //捕捉目的或来源MAC地址为e0-05-c5-44-b1-3c的封包。如果你想抓本机与所有外网通讯的数据包时,可以将这里的mac地址换成路由的mac地址即可。 * src portrange 2000-2500 //捕捉来源为UDP或TCP,并且端口号在2000至2500范围内的封包。 * not imcp //显示除了icmp以外的所有封包。(icmp通常被ping工具使用) * src host 10.7.2.12 and not dst net 10.200.0.0/16 //显示来源IP地址为10.7.2.12,但目的地不是10.200.0.0/16的封包。 * (src host 10.4.1.12 or src net 10.6.0.0/16) and tcp dst portrange 200-10000 and dst net 10.0.0.0/8 //捕捉来源IP为10.4.1.12或者来源网络为10.6.0.0/16,目的地TCP端口号在200至10000之间,并且目的位于网络 10.0.0.0/8内的所有封包。 * src net 192.168.0.0 mask 255.255.255.0 //捕捉源地址为192.168.0.0网络内的所有封包。
显示过滤器

实例: 
过滤表达式的规则
表达式规则
协议过滤 比如TCP,只显示TCP协议。
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方法的。
封包列表
封包列表的面板中显示,编号,时间戳,源地址,目标地址,协议,长度,以及封包信息。 你可以看到不同的协议用了不同的颜色显示。
你也可以修改这些显示颜色的规则, View ->Coloring Rules.

详细信息
这个面板是我们最重要的,用来查看协议中的每一个字段。
各行信息分别为 * Frame: 物理层的数据帧概况 * Ethernet II: 数据链路层以太网帧头部信息 * Internet Protocol Version 4: 互联网层IP包头部信息 * Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP * Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议
对应的OSI七层模型 
TCP 包解析
从下图可以看到wireshark捕获到的TCP包中的每个字段。

TCP 三路握手分析
三路握手的过程为:

我们用wireshark实际分析下三次握手的过程
打开wireshark, 开始抓包后打开浏览器输入 http://www.liuhe.website
在wireshark中输入http过滤, 然后选中Destination为139.129.38.159 且 GET / HTTP/1.1的那条记录,右键然后点击 “对话过滤器->TCP”.
这样做的目的是为了得到与浏览器打开网站相关的数据包,将得到如下图 
图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。
第一次握手 客户端通过向服务器端发送一个SYN来创建一个主动打开,作为三路握手的一部分。客户端把这段连接的序号设定为随机数A。

第二次握手 服务器端应当为一个合法的SYN回送一个SYN/ACK。ACK 的确认码应为 A+1,SYN/ACK 包本身又有一个随机序号 B。

第三次握手 最后,客户端再发送一个ACK。当服务端受到这个ACK的时候,就完成了三路握手,并进入了连接创建状态。此时包序号被设定为收到的确认号 A+1,而响应则为 B+1。

就这样通过了TCP三次握手,建立了连接。