一次计算机网络课的作业,有几个包不是很好抓,在网上搜了很多,最后勉强抓到,所以记录一下,留个参考。 (ps:计网学的不好,分析的都很简略,可能有误~~
要求
使用Ethereal或相关协议分析工具,进行HTTP(包括头部典型方法与字段)、DNS、TLS、SMTP、ARP、RTP、RTMP(Real Time Messaging Protocol)协议的分析。要求:对每个应用层协议从上到下(Ethernet帧),写出协议执行过程及协议单元封装的过程和主要字段值的意义(例如HTTP协议请求、响应过程,DNS对某个具体域名的查找过程,TCP连接建立、数据传输、释放连接过程,等等)。
实验工具:
- wireshark
- chrome浏览器
- Foxmail客户端
- VLC media player
- VoIP 通话线路
- MicroSIP
分析过程:
以访问一个网页为例。
启动wireshark,在浏览器输入www.xiaomi.com ,访问小米的官网。(ps:网址会自动跳转到www.mi.com ,这是因为小米官网做了域名重定向。)
整个访问小米官网的过程,可以大致划分为以下几个步骤:
- 浏览器输入网址,回车
- DNS域名解析
- 建立TCP连接
- 发起http请求
- 服务器响应http请求,返回网页
- 浏览器解析网页,并渲染
所以,当我们访问这个网址的的时候,首先要做的就是域名解析。域名解析就是要得到域名对应的ip地址,浏览器首先会搜索自身DNS缓存和操作系统DNS缓存,找不到就读取系统hosts文件,若还找不到,那就想DNS服务器发起DNS请求。DNS服务器一般由运营商提供,它会查找自身缓存,若仍然找不到,它会代替我们的浏览器发起迭代DNS查询请求。
分析DNS协议
DNS是一个应用层协议,基于TCP/IP传输,一般的DNS报文传输层是UDP报文。查询的时候一般请求DNS服务器的53端口号。
查询请求的数据包如下:(ps:221.11.1.67 是西安联通提供的DNS服务器)
响应报文如下:
可以看到,经过DNS查询,得到了IP地址123.125.103.192 和111.202.1.201
接下来建立TCP连接,如图是TCP三次握手的报文。
分析TCP握手过程
- 第一次握手:客户端向服务器发送连接请求包,标志位SYN置为1,序号为
Seq = X (由报文可以看出X=0 )
- 第二次握手:服务器收到客户端发过来报文,由SYN=1知道客户端要求建立联机。向客户端发送一个SYN和ACK都置为1的TCP报文,设置初始序号Seq=Y(由报文可得Y=0),将确认序号ACK设置为客户的序列号Seq+1,即
X+1 = 0+1=1 ,
- 第三次握手:客户端收到服务器发来的包后检查ACK是否正确。以及标志位ACK是否为1。若正确,客户端再次发送确认包,ACK标志位为1,SYN标志位为0。确认序号ACK=Y+1=0+1=1,发送序号为X+1=1。服务器收到后确认序号值与ACK=1则连接建立成功,可以传送数据了
TCP建立完成后,就可以进行数据传输了。客户端会向服务器发送HTTP请求报文。
分析HTTP报文
HTTP报文由三部分组成,开始行、首部行和实体主体,如下图。在请求报文中,开始行就是请求行。
下图是抓取的请求报文。可以看到,请求方法为GET ,协议版本是HTTP/1.1 ,主机名www.xiaomi.com ,User-Agent 是生成请求的浏览器类型,Accept 是客户端可识别的响应内容类型列表。Accept-Language : 客户端可接受的自然语言。Accept-Encoding : 客户端可接受的编码压缩格式。connection :连接方式。
下图是响应报文,可以看到我们的请求被重定向到了www.mi.com 。
收到响应报文后,发现我们的请求被重定向到了www.mi.com
所以,我们要去访问www.mi.com ,所以再来一遍DNS查询,TCP连接。抓包结果如下:
那么与www.mi.com 建立了连接之后呢,就可以开始传输数据了吗?并不是。
在数据传输之前,我们要建立加密安全数据通道,这就要用到TLS协议。
分析TLS报文
客户端会先向服务端发送Client Hello 消息,其中包括了随机数、密码套件以及密钥交换算法参数。服务端收到后会给确认,发送给客户端Server Hello 数据包,服务端会根据Client Hello 提供的协议版本列表,选择版本。
下图是TLS协议Client Hello 。
下图是服务端发出的Server Hello
到此,TLS的握手过程就结束了,后面可以加密传输消息了。
分析ARP协议
实验环境:两台电脑同处于一个局域网下,我的电脑IP地址是10.102.38.182 ,另外一台点脑ip地址是10.102.40.125
用我的电脑ping 另外一台电脑,使用wireshark 抓包
请求报文如下:
响应报文如下:
SMTP抓包测试
注意:抓取SMTP数据包需要关闭邮件客户端的SSL加密选项,否则无法抓到。
发送一封测试邮件,观察wireshark抓包结果。
可以看到,首先向211.11.1.67 DNS服务器发送了DNS查询。
报文如下:我用的是QQ邮箱,所以查询的是QQ的邮件服务器。
DNS查询结束后,需要进行TCP握手,建立TCP连接,然后才开始smtp报文。
我直接筛选smtp报文来分析。如图,是筛选结果。因为在smtp报文之前就已经建立了tcp连接,所以第一条smtp报文就是服务器端发给客户端的。
可以逐条分析一下:
第98帧,服务器发给客户端,响应代码220表示连接建立成功
第99帧,客户端收到220代码后,继续发送请求,首先是发送EHLO命令。一般来说客户端和SMTP服务端建立连接之后就需要发送EHLO或者是HELO命令,后面附带的参数是domain ,即相当于客户端的主机域名或者是主机名,这一步的主要作用是声明身份,EHLO/HELO命令相当于是HELLO命令,两者之间的主要区别是EHLO带身份验证而HELO不带身份验证,因此EHLO要更加安全
第101帧,服务端接收到客户端的EHLO请求之后,返回了一个250代码并且附带了支持的身份验证方式
第102帧,客户端使用AUTH命令进行身份验证
第104帧,身份验证成功,返回235的成功代码。
到这里就完成了和SMTP服务器建立连接和身份验证的步骤。
第105帧,客户端发送MAIL FROM 命令,声明邮件的发件人
第108帧,服务器返回250代码确定操作成功
第109帧,然后客户端发送RCPT TO 命令声明邮件的收件人
第113帧,服务器返回250代码确定操作成功
第114帧,客户端使用DATA命令,告知服务器要开始传输邮件的正文内容。
第118帧,服务端返回354代码,告知邮件的内容结束以<CR><LF>.<CR><LF> 为标记
第119帧,客户端接收到354代码后,会给服务端法案送一个确认数据包,开始传输邮件内容
第121帧,邮件正文。我们可以看到在上面的数据包中包含了SMTP和IMF两个部分,因为抓包发送的邮件内容都是文本,所以直接使用IMF协议就可以传输,而SMTP协议中的报文内容则是DATA命令的终止标志
因为我们为了抓包方便,所以没有加密。所以其实我们可以在这里面直接提取到邮件内容。看下图,此报文中有编码格式以及编码。
我们将编码解码为GB2312即可看到邮件内容。如图,确实是我们发送的内容。(解码网站为https://base64.us/ )
第127帧,在客户端发送完邮件内容之后,还会接着发送一个QUIT命令来表示结束这次的SMTP传输
服务器在接受到数据之后会返回250代码表示接受成功并且再返回221代码表示结束本次SMTP传输。分别在第126帧和第131帧.
至此,整个邮件传输过程结束。
我这里筛选了smtp报文,并逐帧分析了整个会话流程。其实还有另一种方式,我们可以右键选择追踪tcp流 来追踪整个会话过程。如下图,这个会话流程可以清晰的看到客户端和服务器的信息交互,我们可以直接分析服务器和客户端的会话过程。
追踪tcp流,我们也可以看到,确实是先经过了TCP三次握手,才进行smtp握手。
RTP抓包分析
RTP协议用于实时传输数据。RTP协议是一种基于UDP的传输协议,一般视频监控,视频会议,语音电话(VOIP)之类的,都会使用RTP协议。
但是我找了下,没有找到能抓到RTP包的网站。然后考虑他的应用场景,手边刚好有海康威视的摄像头,我尝试了一下,连接电脑,打开监控视频,然后下载了一段监控视频,并没有抓到RTP包(连UDP都没抓到,我也不太懂怎么回事)。
随后又想到RTP还应用于语音电话上面,巧了,刚好我这里有一台IP电话交换机,通话使用的就是sip协议,就抓了下这个。
配置好交换机,在两台电脑上分别使用MicroSIP 软件配置好通话账号,然后,拨打电话,抓包分析。
抓包结果如下:
RTP报文如下:
RTMP抓包分析
RTMP是流媒体传输协议。我使用软件VLC,播放rtmp网络流地址。
测试直播地址为rtmp://media3.scctv.net/live/scctv_800 (是美国的一个电视台)
抓包结果如下:可以看到,dns查询完了之后,先tcp三次握手建立连接,然后才开始rtmp。
首先,客户端端发送C0+C1块,确认版本。
(本来客户端向服务器发送C0块,表示要和服务器握手,C0中包含版本号。服务器收到C0后,检查C0中的版本是否支持,如果支持发送S0作为响应,否则应该终止连接。客户端和服务器都分别等待C1和S1,等待版本确认。客户端收到S1后发送C2,服务器收到C1后发送S2(确认),握手完成。)
但是实际上客户端直接发了C0+C1,不等服务端了,自己给自己确认。
服务器应该回复确认包(发送S0+S1+S2)。但是我没抓到,只抓到了两个Unknown 的包,我也不知道啥意思,可能是网络的问题。
不过不重要,反正他本来客户端也不让服务器确认版本号,自己给自己确认了。
直接看下一个,客户端发送C2,握手完成。
客户端发送connect,报文如下
服务器给客户端发送如下报文,主要是告诉客户端确认窗口大小,设置节点带宽。
客户端向服务器发送确认窗口大小,并请求创建流(createStream)。
服务器端给出响应。
客户端向服务器发送播放命令,请求播放stream,并设置Buffer Length 1,3000ms。(展开整个报文太长了)
服务端给出响应结果
服务器向客户端发送推流通知,并附带元数据信息(分辨率、帧率、音频采样率、音频码率等等)和视频、音频数据。
此时客户端就可以开始正常播放rtmp流了。
|