打开Wireshark,选择你的IP所对应网络随便进行抓包,本机选择以太网2
使用 Wireshark 任意进行抓包,熟悉 Ethernet 帧的结构,如:目的 MAC、源 MAC、类型、字段等。
你会发现 Wireshark 展现给我们的帧中没有校验字段,请了解一下原因。
答:Wireshark 展现给我们的帧中没有校验字段,帧已经被校验了,校验字段被wireshark去掉了。
1、ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可使用 icmp 关键字进行过滤以利于分析),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
2、然后 ping qige.io (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
3、再次 ping baidu,com (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址又是多少?这个 MAC 地址又是谁的?
我们发现
1、访问本子网的计算机时,目的 MAC 就是该主机的。
2、访问非本子网的计算机时,目的 MAC 是网关的。
1、为防止干扰,先使用 arp -d * 命令清空 arp 缓存
2、ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可 arp 过滤),查看 ARP 请求的格式以及请求的内容,注意观察该请求的目的 MAC 地址是什么。再查看一下该请求的回应,注意观察该回应的源 MAC 和目的 MAC 地址是什么。
3、再次使用 arp -d * 命令清空 arp 缓存
4、然后 ping qige.io (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 arp 过滤)。查看这次 ARP 请求的是什么,注意观察该请求是谁在回应。
可以看出我首先广播出去查询ip所对应MAC地址,然后得到目的ip直接给我点对点ARP回应,本机则获得了其MAC地址。
通过以上的实验,你应该会发现,
1、ARP 请求都是使用广播方式发送的
2、如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP, 那么 ARP 解析将得到网关的 MAC。
使用 Wireshark 任意进行抓包(可用 ip 过滤),熟悉 IP 包的结构,如:版本、头部长度、总长度、TTL、协议类型等字段。
我们可以看到可以看到分别有版本、头部长度、总长、标识符、标志、分段偏移量、生命期、协议、头部校验、源地址、目的地址。
为提高效率,我们应该让 IP 的头部尽可能的精简。但在如此珍贵的 IP 头部你会发现既有头部长度字段,也有总长度字段。请问为什么?
答:IP的头部长度可以使得接收端计算出报头在何处结束及从何处开始读数据。总长度的字段是因为接收端需要读数据,接收数据。
根据规定,一个 IP 包最大可以有 64K 字节。但由于 Ethernet 帧的限制,当 IP 包的数据超过 1500 字节时就会被发送方的数据链路层分段,然后在接收方的网络层重组。
缺省的,ping 命令只会向对方发送 32 个字节的数据。我们可以使用 ping 202.202.240.16 -l 2000 命令指定要发送的数据长度。此时使用 Wireshark 抓包(用 ip.addr == 202.202.240.16 进行过滤),了解 IP 包如何进行分段,如:分段标志、偏移量以及每个包的大小等
分段与重组是一个耗费资源的操作,特别是当分段由传送路径上的节点即路由器来完成的时候,所以 IPv6 已经不允许分段了。那么 IPv6 中,如果路由器遇到了一个大数据包该怎么办?
答:可以看出,因为IP包最大长度只能1500B,所以就分成了1500B和1000B分别进行传输,第一个包总长为1514B是因为还有帧结构目的MAC地址6B和源MAC地址6B和类型2B共14,而第二个包总长就是1062B中除过1000B内容外,14B是帧结构,而多的48B就可能和ICMP协议格式有关了。
在 IP 包头中有一个 TTL 字段用来限定该包可以在 Internet上传输多少跳(hops),一般该值设置为 64、128等。
在验证性实验部分我们使用了 tracert 命令进行路由追踪。其原理是主动设置 IP 包的 TTL 值,从 1 开始逐渐增加,直至到达最终目的主机。
请使用 tracert www.baidu.com 命令进行追踪,此时使用 Wireshark 抓包(用 icmp 过滤),分析每个发送包的 TTL 是如何进行改变的,从而理解路由追踪原理。
Tracert 命令确定两台主机的路由主要是通过 IP 生存时间 (TTL) 字段和 ICMP 错误消息。 在工作环境中有多条链路出口时,可以通过该命令查询数据是经过的哪一条链路出口。
由于路径上的每个路由器在转发数据包之前至少将数据包上的 TTL 递减 1,因此 Tracert 先发送 TTL 为 1 的回应数据包,并在随后的每次发送过程将 TTL 递增 1,直到目标响应或 TTL 达到最大值,从而确定路由。通过检查中间路由器发回的“ICMP 已超时”的消息确定路由。
在 IPv4 中,TTL 虽然定义为生命期即 Time To Live,但现实中我们都以跳数/节点数进行设置。如果你收到一个包,其 TTL 的值为 50,那么可以推断这个包从源点到你之间有多少跳?
从上图结果可以看出来当TTL=64时,包发到了,所以可以得出本机与服务器中间有64跳。在Cmder中得到相同结果。
用 Wireshark 任意抓包(可用 tcp 过滤),熟悉 TCP 段的结构,如:源端口、目的端口、序列号、确认号、各种标志位等字段。
用 Wireshark 任意抓包(可用 udp 过滤),熟悉 UDP 段的结构,如:源端口、目的端口、长度等。
tcp
端口号:16b,源和目的端口唯一定义一条TCP连接
顺序号:32b,表明本segment在字节流中的相对位置(开始位置)
确认号:32b,希望收到的下一字节序号
头部长度:4b,以32b(一行)为单位。TCP头部长度不固定,因此必须设置该字段,实际也指出了数据部分的开始位置。
FLAG
URG紧急位:一般为0。当置1时,表示数据段中有紧急数据,位置从当前顺序号加上紧急指针(偏移量)开始。发送方传输层实体接到进程紧急指示后,后面收到的数据即为紧急数据,将立即发送已有的数据和紧急数据(不再继续累积数据),且到达后接收方立刻中断,将紧急数据提前提交上层应用程序。
ACK确认号位:置1表示确认号有效;否则忽略确认号字段。用于连接请求时的第一次握手
PSH推位:置1,表示数据段是被“推”过来的,即发送方正在等待一些字节以形成段时突然得到应用程序的Push指令,将立即把此时缓存中的数据形成段,马上递交给IP层(一般在连接好后的第一个请求包置PSH为1)
RST恢复位:置1,可用于表示数据段非法(如确认号不对),拒绝(Reject)不正确的连接请求确认等。一般而言,如你接收到了一个RST位为1的段,表明你这方出现了问题。
SYN同步位:一般为0。置1时只用在连接建立时的3次握手中的前2次,即用于连接双方互相通知顺序号,初始化一个连接。
FIN结束位:置1时用于释放连接,发送方告知接收方已无数据要发送或请求方不再请求数据(现在基本都是4次握手释放)
窗口尺寸:16b,接收方告诉发送方:
(确认号-1)之前的字节已经正确接收,还可最多发送这么多字节。
如果为0,表示(确认号-1)之前的字节已正确接收,但希望暂停发送;其后再发送一个有相同确认号但窗口尺寸非0的段告诉发送方恢复传输
校验核
选项:必须32b的整数倍,一般在连接建立时,如:
协商MTU
注意:传输层的MTU即MSS(Maximum Segment Size )仅为数据部分,多为1460B
协商窗口尺寸因子:由于窗口尺寸为16b,因此最大为64KB。对于特定情况(如1000Mbps但线路延迟100ms且双方方有足够的缓存)应根据线路的状态和发送方及接收方的情况动态的改变窗口尺寸使得其可以大于64KB(左移因子,最大可将窗口尺寸从16b扩大为30b),以提高线路利用率
协商重发方式:选择性 或全部。缺省为选择性重发(SACK)
由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么?
答:传输层实现的是端到端的通信,也就是说两台设备之间的进程通信,而进程通信需要两边的确认,因此在传输层无论选择哪种协议,都需要源端口号与目的端口号实现端到端的进程通信。
打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间使得能够捕获释放连接的包。
请在你捕获的包中找到三次握手建立连接的包,并说明为何它们是用于建立连接的,有什么特征。
三次握手的标志位:
客户端发送数据, 序列号seq:标记数据段的顺序。
客户点请求建立连接,确认号ack:期待收到对方下一个报文段的第一个数据字节的序号。
服务端同意建立请求,回复确认。 确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。
连接建立完成。 同步SYN:连接建立时用于同步序号。
终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接
请在你捕获的包中找到四次挥手释放连接的包,并说明为何它们是用于释放连接的,有什么特征。
四次挥手释放包的查找也可以用标志位进行查询:FIN=1,其序列号为seq=u; TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。
客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
服务器发送完数据后,再次向客户端发送连接释放的确认。FIN=1,ack=u+1,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
客户端收到服务器的连接释放报文后,必须发出确认,ACK=1。
服务器只要收到了客户端发出的确认,释放连接。
1、去掉 Follow TCP Stream,即不跟踪一个 TCP 流,你可能会看到访问 qige.io 时我们建立的连接有多个。请思考为什么会有多个连接?作用是什么?
答: Follow TCP Stream是对ip A port A和ip B port B的对应,加上src/dst的转换。
用tsp过滤了抓包之后,由于存在多个tcp连接,因此会出现多个包,从而不能一下子找到自己想要的包。因此需要分清楚抓到的包是否包含了多个tsp连接的数据。然后找到正确的连接,再使用follow tcp stream功能进行对于TCP流的跟踪。
2、我们上面提到了释放连接需要四次挥手,有时你可能会抓到只有三次挥手。原因是什么?
答:在最终的数据交换有四次,其中第二次和第三次可以合并,当出现这种情况时就只能抓到三个包。
应用层的协议非常的多,我们只对 DNS 和 HTTP 进行相关的分析。
先使用 ipconfig /flushdns 命令清除缓存,再使用 nslookup qige.io 命令进行解析,同时用 Wireshark 任意抓包(可用 dns 过滤)。
你应该可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果。
可了解一下 DNS 查询和应答的相关字段的含义
可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果。
你可能会发现对同一个站点,我们发出的 DNS 解析请求不止一个,思考一下是什么原因?
答:因为我们访问的网址只有一个域名,但是并不只有一台服务器主机,因此每一台服务器的IP地址不同,但他们的域名都是相同的。因此发出的解析请求是分散给不同服务器。
打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用http 过滤再加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间以将释放连接的包捕获。
请在你捕获的包中找到 HTTP 请求包,查看请求使用的什么命令,如:GET, POST。并仔细了解请求的头部有哪些字段及其意义。
请在你捕获的包中找到 HTTP 应答包,查看应答的代码是什么,如:200, 304, 404 等。并仔细了解应答的头部有哪些字段及其意义。
http状态码200表示正常成功返回。
http状态码 304 说明自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
✎ 问题
刷新一次 qige.io 网站的页面同时进行抓包,你会发现不少的 304 代码的应答,这是所请求的对象没有更改的意思,让浏览器使用本地缓存的内容即可。那么服务器为什么会回答 304 应答而不是常见的 200 应答?
答:服务器对于浏览器的第一次应答对于浏览器来说已经有了缓存,因此浏览器第二次发送请求的时候,服务器会回复浏览器上次请求的资源现在在缓存里,因此服务器根据浏览器传来的时间发现和当前请求资源的修改时间一致,应答304,表示不再重新传送。
通过wireshark软件熟悉了网络层,数据链路层,传输层,应用层的协议。