发送请求

在实验开始前,在Wireshark上选择捕获无线网卡上的所有数据包。

开启Capture,并在Chrome浏览器中输入http://www.bupt.edu.cn并访问,当页面加载完成后关闭Wireshark的Capture状态。

针对这一次访问的抓包完成,接下来进行这一过程中的通信过程的分析。打开Wireshark,可见这一小段时间中网络中流过的所有数据包。

DNS协议数据包分析

现在首先来分析DNS协议中,计算机向DNS服务器获取域名对应IP地址的过程。

在Wireshark的filter中输入

dns

筛选出所有经过无线网卡的数据包,我将会从中筛选出所有与浏览器访问北京邮电大学官网的相关的数据包进行分析。

从筛选出来的数据包中可以看到,计算机向10.8.218.159发出了2个查询请求,分别是IPv4的地址解析(A)与IPv6的地址解析(AAAA),首先来分析一下ipv4的地址解析请求。

分析得出,在这一个数据包中,帧的长度为75字节,并且发送了包含eth、ethertype、ip、udp、dns协议的数据。

Ethernet II数据头

可见,数据包的0至13字节,是EthernetV2协议的字段,其中0至5字节是接收方的MAC地址, 6至11字节是发送方的MAC地址,12至13字节为类型字段,经过解析为IPv4类型。

IPv4数据头

数据包的14至33字节,是IPv4协议的字段, 其中14字节是IPv4协议的版本号以及字段的长度,IPv4头部字段长度为20字节。18至19字节是标识字段,为0xe78d。20至21字节是标志位以及片偏移位,关于标志与标识的解释如下,

标识(identification):该字段标记当前分片为第几个分片,在数据报重组时很有用。 标志(flag):该字段用于标记该报文是否为分片(有一些可能不需要分片,或不希望分片),后面是否还有分片(是否是最后一个分片)。 片偏移:指当前分片在原数据报(分片前的数据报)中相对于用户数据字段的偏移量,即在原数据报中的相对位置。

第22字节为生存时间,即计时器判断包是否成功发送的时间。第23字节为上层使用的协议类型,可见DNS采用UDP协议传输。24至25字节为校验位。26至29位为发送方IP地址,30至33位为接收方IP地址。

UDP数据头

数据包的第34至41字节,为UDP协议的字段。第34至35字节是发送方的端口号,第36至37字节是接收方的端口号。第38至39字节是UDP协议端内的的字段长度,最后第40至41字节为UDP包数据的校验和。

DNS数据段

第42至74字节为DNS字段,其中:第42至43字节为事务ID,第44至45位标志位声明该数据包为DNS查询,第46至47位为查询的记录数量,第48至49位为应答的记录数量,第54至70位为要查询的域名,第71至72字节为查询的记录类型,第73至74字节为查询的分类。

之后查看应答数据包,应答数据包的的下层结构跟查询数据包相似但返回的DNS段略有不同。

可见应答段出现的服务器返回的记录,域名对应的IP地址为10.3.9.254。

总结

由此可见,一次DNS查询经过了网络的多层处理,最终经过物理层到达目的服务器,其中每一层的作用都十分重要,每层一旦出现异常查询都会失败。

HTTP协议数据包分析

根据之前抓取DNS协议数据包的结果,得出http://www.bupt.edu.cn的IP地址如下:

IPv4 10.3.9.254

IPv6 2001:da8:215:4009:250:56ff:fe97:40c7

在filter中输入

http.request

可以看到有通过IPv6地址进行“GET”方法访问的数据包。

点选1026号帧并进行分析。

我们来分析一下TCP协议以及HTTP协议的数据段。

TCP数据头

第54至85字节为TCP协议的数据头部,第54至55字节为TCP协议发送端的端口,第55至56字节为TCP协议接收端的端口,第58至61字节为包编号,第62至65字节为期望收到的包编号,第66至67字节为标志位,分别代表:

帧名 功能 帧位
W : CWR 拥塞窗口减少 1
E : ECE 显式拥塞提醒回应 2
U : UR 紧急 3
A : ACK 应答 4
P : PUSH 推送,数据包立即发送 5
R : RST 复位,中断一个连接 6
S : SYN 同步,表示开始会话请求 7
F : FIN 结束,结束会话 8

URG:紧急标志

紧急(The urgent pointer) 标志有效。紧急标志置位,

ACK:确认标志

确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure:1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。

PSH:推标志

该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。

RST:复位标志,复位标志有效。用于复位相应的TCP连接。

SYN:同步标志

同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。

FIN:结束标志

带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据

第68至69字节为窗口大小,第70至71字节为校验和,第72至73字节为优先指针。

根据资料,各部分的作用如下:

TCP源端口:16位的源端口其中包含初始化通信的端口。源端口和源IP地址的作用是标示报问的返回地址。

TCP目的端口:16位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口。

TCP序列号:32位的序列号由接收端计算机使用,重新分段的报文成最初形式。当SYN出现,序列码实际上是初始序列码(ISN),而第一个数据字节是ISN+1。这个序列号(序列码)是可以补偿传输中的不一致。

TCP应答号:32位的序列号由接收端计算机使用,重组分段的报文成最初形式。,如果设置了ACK控制位,这个值表示一个准备接收的包的序列码。

数据偏移量:4位包括TCP头大小,指示何处数据开始。

保留:6位值域,这些位必须是0。为了将来定义新的用途所保留。

标志:6位标志域。表示为:紧急标志、有意义的应答标志、推、重置连接标志、同步序列号标志、完成发送数据标志。按照顺序排列是:URG、ACK、PSH、RST、SYN、FIN。

窗口:16位,用来表示想收到的每个TCP数据段的大小。

校验位:16位TCP头。源机器基于数据内容计算一个数值,收信息机要与源机器数值结果完全一样,从而证明数据的有效性。

优先指针:16位,指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。

选项:长度不定,但长度必须以字节。如果没有选项就表示这个一字节的域等于0。

填充:不定长,填充的内容必须为0,它是为了数学目的而存在。目的是确保空间的可预测性。保证包头的结合和数据的开始处偏移量能够被32整除,一般额外的零以保证TCP头是32位的整数倍。

HTTP数据段

HTTP协议是通过文本信息传递的,抓取到的信息如下。

GET / HTTP/1.1
Host: www.bupt.edu.cn
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,ja;q=0.2
Cookie: a4852_times=1; Hm_lvt_41e71a1bb3180ffdb5c83f253d23d0c0=1508423957,1509187989

HTTP数据包使用\r\n来分隔,第1行是状态行,余下部分是消息报头。请求数据包只包括状态行和消息报头,然后以空行分隔。

HTTP/1.1 200 OK
Date: Mon, 06 Nov 2017 01:37:04 GMT
Server: Apache/2.2.29 (Unix) PHP/5.6.21
X-Powered-By: PHP/5.6.21
X-Frame-Options: SAMEORIGIN
Keep-Alive: timeout=5, max=97
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

...(Contents)

返回的响应以状态行和消息报头开始以空行分隔,之后就是HTTP数据包的内容。