1、 界面介绍
启动Wireshark后,在主界面会列出当前系统中所有的网卡信息。在此处选择要监听的网卡,双击就会进入监听模式。还有另一个入口就是上方的配置按钮。
打开配置界面,可以对网卡和数据包捕获做一些配置。
选中网卡,点击开始。
抓包的过程中,我们可以看到数据的变化。点击停止按钮,停止捕获数据包。
在软件的核心界面就是数据包列表,显示的列有序号、时间、源IP、目标IP、协议、长度、基本信息。Wireshark使用不同的颜色对不同的协议做了区分。在视图菜单,我们可以找到和着色相关的命令。
在图9所示的命令中,对话着色用来选择指定颜色对应的协议,着色分组列表用来隐藏非选中着色分组中的数据包,着色规则用来定义着色外观和包含的协议,如图10所示。
2、封包详细信息
Frame: 物理层的数据帧概况
Ethernet II: 数据链路层以太网帧头部信息
Internet Protocol Version 4: 互联网层IP包头部信息
Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP
Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议
3、TCP包的具体内容
如果捕获的是一个OSI layer 2的封包,在Source(来源)和Destination(目的地)列中看到的将是MAC地址,当然,此时Port(端口)列将会为空。如果捕获的是一个OSI layer 3或者更高层的封包,在Source(来源)和Destination(目的地)列中看到的将是IP地址。Port(端口)列仅会在这个封包属于第4或者更高层时才会显示。
3、代理原理
Web 代理(proxy)服务器是网络的中间实体。代理位于客户端和服务器之间,扮演 “中间人”的角色,在各端点之间来回传送 HTTP 报文。代理分为两种:普通代理与隧道代
这里要说明的是WEB代理区别于网关:代理连接的是两个或多个使用相同协议的应用程序,而网关连接的则是 两个或多个使用不同协议的端点。网关扮演的是“协议转换器”的角色,即使客户端和服务器使用的是不同的协议,客户端也可以通过它完成与服务器之间的事务处理。如发邮件时连接HTTP协议与SMTP协议。
这里的代理既是服务器,又是客户端
网关允许某客户端使用隧道之前,可以对其进行代理认证(为了降低对隧道的滥用,网关应该只为特定的知名端口,比如 HTTPS 的端口 443)
比较
普通代理可以用来承载 HTTP 流量;
隧道代理可以用来承载任何 TCP 流量,包括 HTTP 和 HTTPS。
捕获HTTP(以58主站为例)
捕获TLS(前身是SSL)(以赶集登录为例)
层次对比
| REMOTE_ADDR | HTTP_X_FORWARDED_FOR | 隐藏身份 | 识别难度 |
未使用代理 | 真实IP | 无 | 无 |
|
透明代理 | 代理IP | 真实IP | 无 | 易 |
匿名代理 | 代理IP | 代理IP | 是 | 易 |
欺诈代理 | 代理IP | 随机IP | 是 | 易 |
高匿名代理 | 代理IP | 无 | 是 | 难 |
这里简单做的一个表格汇总,显然,高匿的代理IP最具挑战,也是最常用的。
识别
那么对于代理IP的识别又是怎样的呢?
反向探测扫描IP是不是开通了80,8080等代理服务器经常开通的端口,显然一个普通的用户IP不太可能开通如上的端口。
HTTP头部的X_Forwarded_For:开通了HTTP代理的IP可以通过此法来识别是不是代理IP;如果带有XFF信息,该IP是代理IP无疑。
Keep-alive报文:如果带有Proxy-Connection的Keep-alive报文,该IP毫无疑问是代理IP。
查看IP上端口:如果一个IP有的端口大于10000,那么该IP大多也存在问题,普通的家庭IP开这么大的端口几乎是不可能的。
常见的方式类型及方式:HTTP TCP UDP / Ping,telnet,nmap ,socket
4、包过滤
捕获的数据包通常都是比较庞大的。Wireshark提供了两种过滤器:
一种是显示过滤器,就是主界面上那个,用来在捕获的记录中找到所需要的记录
一种是捕获过滤器,用来过滤捕获的封包,以免捕获太多的记录。
5、捕获过滤器
捕捉过滤器是用来配置应该捕获什么样的数据包,在启动数据包捕捉之前就应该配置好。打开主界面“捕获”——>“捕获过滤器”。
在捕获过滤器界面,我们可以看到已有的过滤器,可以修改删除它们,同时我们可以增加自己的过滤器。
捕获过滤器语法:
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的封包 |
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内的所有封包。 |
当使用关键字作为值时,需使用反斜杠“\”。"ether proto \ip" (与关键字"ip"相同)。这样写将会以IP协议作为目标。"ip proto \icmp" (与关键字"icmp"相同).这样写将会以ping工具常用的icmp作为目标。
可以在"ip"或"ether"后面使用"multicast"及"broadcast"关键字。当您想排除广播请求时,"no broadcast"就会非常有用。
使用定义好的捕获过滤器
点击下图所示的展开过滤器按钮。在过滤器列表中选择一个过滤器。再双击启动抓包,就会看到效果了。
6、显示过滤器
显示过滤器用来过滤已经捕获的数据包。在数据包列表的上方,有一个显示过滤器输入框,可以直接输入过滤表达式,点击输入框右侧的表达式按钮,可以打开表达式编辑器,左侧框内是可供选择的字段。
显示过滤器的语法如图所示:
1)Protocol,协议字段。支持的协议可以从显示过滤器表达式的编辑器中看到,从OSI 7层模型的2到7层都支持。
2)String1, String2 (可选项)。协议的子类,展开显示过滤器表达式中的协议的三角,可以看到。
3)Comparison operators
比较运算符
逻辑运算符
逻辑异或是一种排除性的或。当其被用在过滤器的两个条件之间时,只有当且仅当其中的一个条件满足时,这样的结果才会被显示在屏幕上。例如:
"tcp.dstport 80 xor tcp.dstport 1025" 只有当目的TCP端口为80或者来源于端口1025(但又不能同时满足这两点)时,这样的封包才会被显示。
snmp || dns || icmp 显示SNMP或DNS或ICMP封包。
ip.addr == 10.1.1.1显示来源或目的IP地址为10.1.1.1的封包。
ip.src != 10.1.2.3 or ip.dst != 10.4.5.6显示来源不为10.1.2.3或者目的不为10.4.5.6的封包。
ip.src != 10.1.2.3 and ip.dst != 10.4.5.6显示来源不为10.1.2.3并且目的IP不为10.4.5.6的封包。
tcp.port == 25 显示来源或目的TCP端口号为25的封包。
tcp.dstport == 25 显示目的TCP端口号为25的封包。
tcp.flags 显示包含TCP标志的封包。
tcp.flags.syn == 0x02显示包含TCP SYN标志的封包。
在使用过滤器表达式编辑器的时候,如果过滤器的语法是正确的,表达式的背景呈绿色。如果呈红色,说明表达式有误。
生成表达式,点击Ok按钮,回到数据包列表界面。
此时表达式会输入到表达式栏中。回车之后,就会看到过滤效果。
此外我们也可以通过选中数据包来生成过滤器,右键——>作为过虑器应用。
如图21所示,不同的选项,大家都可以尝试下,都是基本逻辑谓词的组合。比如我选择“或选中”,可以组合多个数据包的条件,如图
选择了两个数据包,协议不同,自动生成的过滤表达式会按照你鼠标点击的位置所在的列字典作为条件来生成。图中我两次的位置都在Destination列上,所以生成的表达式是一样的。
8、查看当前网络时延
TCP报文中查看RTT。抓TCP的报文,比如观看OTT的报文,点击Statistics->TCP Stream Graph->Round Trip Time Graph,点击后,弹出双向时延随时间变化的数据。如下图,最大双向时延大概为40ms。
9、查看UDP报文丢包率
对于抓取的报文进行过滤,下面以过滤组播报文为例,过滤出组播组地址为 239.255.0.107的组播流。
如下图所示,对于UDP报文进行“解码”,选择某路UDP流,右击,选择“Decord as”,出现如下对话框,选择“RTP”协议。
如下图,选择菜单中“Telephony”—》“RTP”---》“Stream Analysis”
RTP流分析结果如下图,图中统计出RTP流的丢包率、时延等情况。
10、查看TCP报文丢包率
点击Analyze->Expert Info Composite,弹出表格,查看Warnings中的Previous segment lost即丢包数,另外还可以查看包是否乱序等。
11、查看TS流丢包率
BTV等观看花屏,但是抓包RTP流不存在丢包、乱序、重复包的情况下,另外对于TS over UDP封装组播的场景,即没有采用RTP封装,则需要进一步分析TS包是否连续、是否存在TS包丢失的情况。正常情况下,少数几个TS包丢失可以不必关注,当出现大量的TS包丢失,则需要进行关注。
步骤一、如下图所示,对于UDP报文进行“解码”,选择某路UDP流,右击,选择“Decord as”,出现如下对话框,选择“RTP”协议。
步骤二、选择菜单Wireshark > Analyze > Expert Info Composite,如下图,下图中的TS包存在丢失。
12、通过报文查看视频平均码率
WireShark具有的统计功能非常强大,最基本的一项就是流量的概要信息统计。在“Statistics”菜单中选择“Summary”菜单项即可看到抓包的流量概要信息。这里可以显示所有报文的流量统计信息,也可以显示具有某一过滤条件的报文的流量统计信息。
点击Statistics-Summary,如图所示,过滤出TCP报文及源地址,“红色”框内的为整个报文的平均流量 3.581Mbps,“蓝色”框内的为过滤出的tcp报文平均流量 1.087Mbps。即我们说的视频码率。
13、通过报文查看视频实时码率
如果要看实时的码率,要看突发流量,在“Statistics”菜单中选择“IO Graphs”菜单项打开“IO Graphs”对话框,可以设置多个过滤条件,注意设置单位。得到的曲线图即实时的码率大小。
14、查看流量图
进入统计—>流量图,可以选中流类型、地址等。
15、流量分布
依次选择统计---HTTP---流量分布(负载分配)
在下面的例子里,我们创建了一个显示过滤器,使查询结果中仅包含有关openmaniak.com网站的内容。
、
16、封包计数器
依次选择统计---HTTP---统计---HTTP---封包计数器(分组计数器),显示HTTP请求和响应。
我们创建了一个显示过滤器,使查询结果中仅包含有关openmaniak.com网站的内容。
17、应答
显示从Web服务器取得的文件。统计---HTTP---应答(请求)
我们创建了一个显示过滤器,使查询结果中仅包含有关openmaniak.com网站的内容。
18、IP地址
统计封包的来源或目的IP地址。
19、封包长度
20端口类型
显示TCP或UDP端口的统计数据。
21、三次握手过程分析
TCP接收端
1、基本行为
收包,回ACK,告诉发端某序号之前的包已正常接收,当前缓冲区还空多大空间。适当时候将数据从接收缓冲区送往上层应用。
2、具体行为
1)收2个包,回1个TCP ACK:
2)如果第2个包在200ms内没有收到,定时器超时会触发接收端发TCP ACK,该情况下所回的ACK称为Delayed-ACK,200ms定时器称为Delayed-ACK timer
3)如果发现丢包,对于后续收到的每一个包回1个重复ACK。
4)重传的包收到后,会和之前收到的所有包一起回ACK。
5)接收端所回的ACK默认情况下是选择性ACK(SACK),ACK中携带了接收端已经接收到的包序号信息,发送端重传时只重传没有接收到的部分即可。
6)满足下面任何一个条件时数据被送往应用层缓冲区:
ü 应用程序已经通过调用recv()做好数据接收的准备
ü TCP头部中PSH被置1。
ü TCP接收缓冲区溢出。
ü 数据在TCP接收缓冲区中存放的时间超过了0.5s。
ü 如果注册表中IgnorePushBitOnReceives被置1,则TCP收到1个包就会立即将其送往上层应用。
从实际抓包数据来看,windows操作系统的实现是:收到1个包会立即将其送往上层应用。发生乱序或丢包情况下,数据会被暂存在接收缓冲区中,直至收到乱序或重传的数据后才会送往上层应用。
7)实际回ACK的行为比上面讲的要复杂,
TCP发送端
1、基本行为
接收TCP ACK,将确认的数据从发送缓冲区中清除,并发出适当数量的数据包。
发包数量取决于:
发包数量 = MIN{发送缓冲区中数据字节数,接收窗口,拥塞窗口}- 已发送未确认数据字节数
2、具体行为
1)不停进行RTT测量,确定RTO(超时重传定时器)。
2)连接建立后先进入慢启动,拥塞窗口按指数增长。
3)拥塞窗口达到慢启动门限后进入拥塞避免,拥塞窗口线性增长。
4)收到第2个重复ACK,会启动快速重传,进入快速恢复。
5)RTO定时器超时如果还未收到ACK,则启动超时重传,之后进入慢启动。
打开wireshark, 打开浏览器输入 http://www.cnblogs.com/tankxiao
在wireshark中输入http过滤, 然后选中GET /tankxiao HTTP/1.1的那条记录,右键然后点击"Follow TCP Stream",
这样做的目的是为了得到与浏览器打开网站相关的数据包,将得到如下图
图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。
第一次握手数据包
客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图
第二次握手的数据包
服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如下图
第三次握手的数据包
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图:
就这样通过了TCP三次握手,建立了连接