目录

认识 Wireshark 界面

当中的过滤区域是我们在面对多个数据包时,设置条件快速找出我们需要的数据包。

Packet list 区域中会记录包的序号、捕获用时、来源地址、目的地址、使用的协议、数据包长度、包信息。Packet Details 区域用于分析数据包的详细信息。Packet Bytes 区域记录着数据在链路上传递的原始信息,以16进制和ASCII码显示。

WiresharkInterface.png

为了解 Packet list 区域,选中一个数据包来看。

PacketDetails.png

这几行分别对应不同层面的数据信息:

  • Frame:物理层数据帧的情况;
  • Ethernet II:数据链路层以太网帧头部的信息;
  • Internet Protocol Version 4:网络层数据包头部信息;
  • Transmission Control Protocol:传输层的数据段头部信息。

Frame

PacketDetails01.png

Frame 8: 93 bytes on wire (744 bits), 93 bytes captured (744 bits) on interface 0
# 第8号帧,线路上有93字节(744位比特),在接口 0 捕获 93 字节(744比特)

    Interface id: 0 (\Device\NPF_{2F38179F-6704-4558-9BD9-EB371978DC54})
    # 接口id 0

    Encapsulation type: Ethernet (1)
    # 封装类型

    Arrival Time: Mar 21, 2018 18:18:59.427874000 中国标准时间
    # 捕获日期和时间

    [Time shift for this packet: 0.000000000 seconds]
    Epoch Time: 1521627539.427874000 seconds
    [Time delta from previous captured frame: 0.068534000 seconds]
    # 当前数据包与前一个数据包的时间间隔

    [Time delta from previous displayed frame: 0.068534000 seconds]
    [Time since reference or first frame: 0.311438000 seconds]
    #  当前数据包与第一个数据包的时间间隔

    Frame Number: 8
    # 帧的编号

    Frame Length: 93 bytes (744 bits)
    # 帧长度

    Capture Length: 93 bytes (744 bits)
    # 捕获长度

    [Frame is marked: False]
    # 此帧是否做了标记:否

    [Frame is ignored: False]
    # 此帧是否做被忽略:否

    [Protocols in frame: eth:ethertype:ip:tcp:ssl]
    # 帧内封装的协议层次结构

    [Coloring Rule Name: TCP]
    # 着色标记的协议名称

    [Coloring Rule String: tcp]
    # 着色规则显示的字符串

Ethernet II

Ethernet II, Src: Hangzhou_54:30:02 (38:97:d6:54:30:02), Dst: Micro-St_71:dc:fc (d8:cb:8a:71:dc:fc)
# 对以下内容的简介

Destination: Micro-St_71:dc:fc (d8:cb:8a:71:dc:fc)
# 目标 MAC 地址

Source: Hangzhou_54:30:02 (38:97:d6:54:30:02)
# 源 MAC 地址

Type: IPv4 (0x0800)

Internet Protocol Version

每个协议都不同,建议对比查看《TCP/IP详解 卷一:协议》。在搜索引擎中输入关键词「TCP/IP详解 卷1:协议》在线阅读」就能找到在线版本。

PacketDetails02.png

Internet Protocol Version 4, Src: 116.211.121.192, Dst: 172.28.112.24
# 对以下内容的简介

0100 .... = Version: 4
# 互联网协议 IPV4

.... 0101 = Header Length: 20 bytes (5)
# IP 包头部的长度

Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
# 差分服务字段

Total Length: 79
# IP 包的总长度

Identification: 0x44a6 (17574)
# 标志字段

Flags: 0x02 (Don't Fragment)
# 标记字段

Fragment offset: 0
# 分片偏移

Time to live: 54
# 生存期

Protocol: TCP (6)
# 当前数据包所封装的上层协议为 TCP 协议

Header checksum: 0xf53a [validation disabled]
# 头部数据的校验和

[Header checksum status: Unverified]

Source: 116.211.121.192
# 源地址

Destination: 172.28.112.24
# 目标地址

[Source GeoIP: Unknown]
[Destination GeoIP: Unknown]

Transmission Control Protocol

PacketDetails03.png

Transmission Control Protocol, Src Port: 443, Dst Port: 49719, Seq: 49, Ack: 86, Len: 39
Source Port: 443
# 来源端口

Destination Port: 49719
# 目的端口

[Stream index: 0]
[TCP Segment Len: 39]
Sequence number: 49    (relative sequence number)
# 序列号(相对序列号)

[Next sequence number: 88    (relative sequence number)]
# 下一个序列号(相对序列号)

Acknowledgment number: 86    (relative ack number)
# 确认序列号

0101 .... = Header Length: 20 bytes (5)
# 头部长度

Flags: 0x018 (PSH, ACK)
# TCP 标记字段

Window size value: 271
[Calculated window size: 271]
[Window size scaling factor: -1 (unknown)]
# 流量控制的窗口大小

Checksum: 0xd1f2 [unverified]
[Checksum Status: Unverified]
# TCP 数据段的校验和

Urgent pointer: 0
[SEQ/ACK analysis]
TCP payload (39 bytes)

筛选器

筛选器就是用来找出你想要的包,本身内置了许多筛选器,官方说在这里学习是比较好的方法,也就是说别死记硬背。

发现找到还是看不懂?这里有一份官方文档推荐给你。

filter.jpg
filter_details.jpg

https://www.wireshark.org/docs/wsug_html_chunked/ChWorkBuildDisplayFilterSection.html#FiltLogOps

常见过滤器一览:

  • tcp
    • port
      • ......

关系操作:

  • and
    &&
  • or
    ||
  • xor
    ^^
  • not
    !

比较操作:

  • ==,相等
    eq
  • !=
    ne
  • >
    gt
  • <
    lt
  • >=
    ge
  • <=
    le

对数据包操作

导出数据传输中的二进制内容,文件 -> 导出对象 -> 具体对象。这里用 HTTP 作为实例保存原始传输数据。

导出二进制数据.png

如果遇到 SMTP 附件也可导出对象,或是将 begin 到 end 的数据保存到文件,使用 uudecode <file> 解码还原附件文件。

begin 644 XXX_XXX.zip
M4$L#!`H``````'VZ0TTBWE0B,````#`````2`!P`=&UP+V%T=&%C:&UE;G0N
M='AT550)``.=3K5;G4ZU6W5X"P`!!``````$`````%1H92!XXXX@:7,@.#1E
M,6-F-6,M-V1F.2TT96,Q+3AC8F$MSS8Y,C@W9C(V-#9F"E!+`0(>`PH`````
M`'VZXXXXXX,````#`````2`!@```````$```"D@0````!T;7`O871T86-H
M;65N="YT>'155`4``YU.M5MU>`L``00`````!`````!02P4&``````$``0!8
)````?```````
`
end

数据流跟踪。分析出数据流内容,点击对应内容跳到具体数据包。

跟踪数据流1.png
跟踪数据流2.png

不知道你遇到 gzip 压缩数据如何解码,如果 Wireshark 能够识别是 HTTP 请求,通过 追踪流 -> HTTP 流 将自动将 POST 数据解码。

另一种方式是手动解码,追踪流 -> TCP 流,Show data as raw 显示原始数据,将其另存为文件。

gzip 数据保存到文件.png

使用 vim 或 vi 将 gzip 无关的数据删除,这里 set nu 显示行号共有 14 行无关数据——^M 是换行符,使用 gg 回到行首 d14j 向下删除 14 行,删除完用 zz 保存退出文件。

vim gzip 数据.png

解码就很简单,Linux 下最方便,使用 gunzip 即可,但文件后缀必须是 .gz。

gunzip <FileName.gz>

要是直接想将解码的文件数据可以用 -c 选项。解码时使用 -c 文件后缀可以随意取,或者不写后缀。

gunzip -c <FileName>

Content-Encoding 编码是 deflate 的数据保存步骤和 gzip 一致,只是解码需要在 deflate 数据前添加 gzip 头部 \x1f\x8b\x08\x00\x00\x00\x00\x00

printf "\x1f\x8b\x08\x00\x00\x00\x00\x00"  | cat - <FileName> | gunzip

简述 TCP/IP

凡是搞技术哪能不懂一点网络,文中的内容打开 Wireshark一一对照可能比较好理解。

进入正题,学习 TCP/IP 时以 OSI 参考模型作为参照会比较方便,TCP/IP 网络接口层对应着 OSI 数据链路层与物理层,在一般研究中按 4 层来(官方文档中定义是 4 层),当然也有人把它分 5 层,是指网络接口层拆分为两层。

快速记忆口诀:

  • ISO 7 层,物数网传会表应,
  • TCP/IP 4 层,物网传应。

网络接口层中包含有传输介质与数据链路层,传输介质是指你的双绞线(网线)、光纤、同轴电缆(以前有线电视屁股接的粗线)、串口线,当然对于这些名词可以到百度图片中查看下他们长什么样子这里不做介绍,数据链路层定义着线缆该怎样传输的协议,主要有两种第一种我们都耳熟能详的 Ethernet(以太网),第二种是 IEEE802.3。

model.png

EthernetⅡ帧格式

一共有 5 个字段,1-2 是 MAC 地址各占 6Byte,3 类型占 2Byte,4 数据有个范围 46~1500 如果数据小与 46Byte 就用 0 填充到 46Byte,5 FCS 占 4Byte。

MAC 地址(Media Access Control,介质访问控制)一共 6Byte——48bit 以 16 进制表示,前 24bit 是厂商标识码也叫组织唯一标识符简称 OUI(Organizationally Unique Ideifier)是向 IEEE(电器和电子工程师协会)去申请购买,后 24bit 是网卡厂商(Network Interface Card 简称 NIC)内拿来标识自己产品的这个号码是全球唯一的,需要注意前 24bit 厂家第一位 bit 位 0 表示单播地址,1 表示多播地址,第二位 bit 位 0 表示公有地址(公网IP),1 表示私有地址(私有IP)。

类型内容写的是上一层协议是什么,常见的值有 0800(IPV4)、0806(ARP)、8035(RARP)、86DD(IPV6)等......

数据(待补充)

FCS(Frame Check Sequence 帧校验序列)用于检测帧头部信息是否完整它采用算法产生一个固定值放在帧尾,交换机(是一种转发数据的设备)收到后一样采用指定算法来对比值是否相同,如果交换机检测到帧有破坏就丢弃。

Ethernet.png

IEEE802.3帧格式

为什么又出来一个 802.3 而且和 EthernetⅡ 差不多,当时的 Ethernet 还是个私有标准,后来的 IEEE 出了一个与 Ethernet与 EthernetⅡ 差不多的协议叫 802.3,这个协议出来后开发以太网的施乐好像顿悟了把以太网标准给公开了。他们两个的区别在于数据层面的用 Ethernet 数据层面指是主机产生的数据,控制层面的用 802.3 控制是指交换机与交换机之间的数据,眼熟就好。

IEEE802.3.png

对于各层数据的叫法都不同,下面资料摘取《图解TCP/IP》中。

包、帧、数据报、段、消息
以上五个术语都用来表述数据的单位,大致区分如下:
包可以说是全能性术语。帧用于表示数据链路层中包的单位。
而数据包是IP和UDP等网络层以上的分层中包的单位。
段则表示TCP数据流中的信息。最后,消息是指应用协议中数据的单位。

因特网层

IP协议

IP数据报结构.png

  1. 协议 占 8 bit,上层使用的什么协议,数据接收方便与将数据交给那一层处理。
  2. 首部长度 用于标识 IP 头部总长度占据 4bit(0101)没有可选项一般默认为 20 字节,以 4 字节乘以 5 得到 20Byte。那为什么会是 20Byte?其实这个 5 是由二进制 0101 得来的,一个bit是一个单位表示 4 字节,那最大值为 1111 十进制就是 15,所以 4*15 最大值为 60Byte。
  3. 服务类型 占用 8bit 一般未用到,用全 0 表示。
  4. 总长度 占 16bit 用于表达 IP 头部与数据部分的总长度,最大为 16 个 1 十进制是 65535(2^16),总长度不能超过最大传输单元 MTU,MTU 是数据链路层数据部分最大值,以太网中 MTU 最大值是 1500Byte(总长度),所以传输最大值为 1500Byte。
  5. 标识(Identification) 占 13bit,用于标识数据报是唯一的,主机在内存中有个计数器每发一个包计数器就加 1 到达 65535 就归 0 时,前面提过数据总长度不能超过 MTU,如果超过通常路由器就会进行分片(分片后的报文是由主机来进行重组,因为在过程中每个网络的 MTU 可能不一样),分片同时会将数据报首部字段复制过来,仅仅修改少量数据。
  6. 标志 占 3bit,第一个 bit 不使用为 0,第二个 bit 是 DF(Don't Fragment flag)位用于设置是否分片 0 代表分片 1 不分片,第三个 bit 是 MF(More Fragments flag)位表示后面是否还有分片的报文,MF=0 表示这个报文是最后一个分片,MF=1 代表后面还有分片。
  7. 片偏移 占 13bit,分片大小只能小于等于传输网络的 MTU,分片是指数据分片不包含报头。
  8. 生存时间(Time to live 简称 TTL)占 8bit 最大值是 2^8=256,在发送时设置一个值每经过一个路由减一,TTL为0时路由就丢弃不转发不至于包有问题无限转发。
  9. 协议(Protocol)占 8bit,指出数据部分使用的哪种协议,它有这样几个值,1=ICMP,4=IP,6=TCP,17=UDP。
  10. 首部校验和 占 16bit,用来检查数据报首部是否有误,有错就丢弃。
  11. 源 IP 地址占 32bit
  12. 目的 IP 地址占 32bit
  13. IP 选项字段,用于控制和测试,不常用如果用到一般为 4 的整数倍(超过 20 字节),填充字段是如果首部长度不足 32bit(4 字节)的整数倍补 0 填到 32bit 整数倍数,这里的填充依照于首部长度。
  14. 数据(Data)数据是包括上层的首部信息的数据

无连接不可靠,IP 地址主要给网络设备(路由器)看,方便设备转发这个数据报。

ARP协议

ARP(Address Resolution Protocol)原理是这样的,ARP 用于将 IP 地址解析成 MAC 地址。假设 A 主机想跟 B 主机通信,A 主机首先在本地 ARP 表中查找 B 主机,如果表中找不到就类似下图一样向本地网段中发送一个目标 IP 地址为 B 主机,MAC 地址为全 0 的广播帧。

request.png

网络中主机接收到广播帧后对比目标IP是不是自己,不是就丢弃(顺便把发送帧的主机 IP 与 MAC 地址写入本地 ARP 表,因为ARP请求包中带有发起请求主机的 MAC 与 IP),当 B 主机发现 IP 地址与自己地址一致,同样会把 A 主机的 MAC 与 IP 地址写入自己本地 ARP 表中。

receive.png

随后以单播方式响应一个ARP 包,当 A 接收到 B 的单播帧后也将 B 主机 IP 与 MAC 地址写入自己本地 ARP 表中,随后 A 与 B 就可以愉快的通信了。
在 Windows 系统内部有个本地 ARP 缓存表,大约以 120s 清除一遍(未证实)。清除后也需要以上面的方式重新进行发送请求。

record.png

上面只要接收到双方广播针/单播针就将对方的 MAC&IP 写入本地 MAC 表,这个称作免费 ARP。

下面引用于 网络数据包分析从入门到精通 实验中的笔记

最后我们再讨论一个关于免费 ARP(gratuitousARP)的例子。由于网络中一个设备的 IP 地址是可以改变的,而 MAC 地址不会改变。那么一旦出现 IP 地址改变的情况,网络主机中缓存的 IP 和 MAC 地址映射就不再有效了。那么为了防止由于映射失败造成的通信错误,免费的 ARP 请求会被发送到网络中,强制所有收到它的设备使用新的 IP 以及 MAC 地址映射来更新缓存。通常,它发生在系统引导期间进行接口配置或 IP 地址出现变化的时候。

这样一来,网络上的所有主机都能收到它。接下来我们可以发现,发送方的IP地址和接收方的 IP 地址是一致的。网络中的其它主机收到这个数据包之后,它会让这些主机使用新的 IP 和 MAC 地址映射关系来更新它们的 ARP 表。由于这个 ARP 数据包是源主机未经请求主动发出的,并导致了目标主机更新了 ARP 缓存,所以称之为免费的 ARP。

做个试验试试。

gratuitousARP.png

总结:

免费 ARP 时在 NIC 重启或 IP 变化时,在网络中发送免费 ARP 广播包,所有接收到包的机器把包中发送方 IP 和 MAC 记录到本地 MAC 表中,包中发送端 IP 和接收端 IP 一致,如果网络中某一台机器回包就证明这两机器 IP 冲突了。

冲突了怎么办?当 Win7 网络是自动获取 IP 时重新向 DHCP 广播,向 DHCP 要个新 IP,如果网络是手动指定 IP,会直接变169.254.x.x 这类 IP,并弹窗警告 IP 冲突,冲突会记录到系统日志。Kali-Linux 上会把消息记录在 /var/log/messages 日志中。

主机到主机层

这里的主机到主机层对应 OSI 参考模型中的传输层,这一层主要功能是对应用程序之间产生的数据(Payload)进行分片,上面介绍的 IP 协议主要与路由器打交道,这层还包含端口(指的是协议端口)主要用于标识应用程序使用那种协议,告诉它数据应该交给哪层协议处理。端口分两种,标准端口 0~1023,有特定服务使用不会改变,临时端口 1024~65535,给一些不常见的应用程序进行使用,这些程序端口由系统动态分配来避免端口重复。

UDP(User Datagram Protocol)

UDP 无连接不可靠,我不跟你建立连接,我只管发至于到不到随缘,常用于语音通信/直播等...如果语音用TCP丢包了它会重传,那么原来丢失的包扰乱正常通话,我说一句:你在吗?结果 丢包了对于另一方听到的就是:你吗,听到后气愤的准备骂人:xxx 突然冒出 这个字(重传了)不要太吓人好吗。还有它相比 TCP 传输速度回快一点因为首部信息仅仅只有 8Byte,TCP 达到 20Byte 不等,在传输的数据部分较小的情况下 UDP 明显比 TCP 快。

udp-head.png

  1. 源端口 占 16bit
  2. 目的端口 占 16bit
  3. 包长度 占 16bit 包含头部与数据
  4. 校验和 占 16bit

TCP(Transmission Control Protocol)

我们都听说 TCP 是稳定连接的那 TCP 的可靠性是在于它的重发、应答、序列号等一系列处理措施,先来看看如何建立一个 TCP连接。这里准备了数据包对照分析,点击下载数据包

客户端向服务端发送数据,服务端收到以返回 ACK(Acknowledgement)表示我收到你的数据啦,如果没返回 ACK 表示可能没有收到数据,客户端在一段时间内未接收到 ACK 就会重发这个数据(简称重传)。

但未收到 ACK 也可能是网络延迟所导致的,这时客户端重发就会导致服务端数据会重复,这时可以通过序列号来分辨,这又是一个新名词来解释一下,我们在第一次发起握手的时候就会有一个由系统随机产生的数字序列号(Sequence Number 简称 Seq),为每一个字节来标上一个序列号,服务端 ACK 返回的值是客户端的最后一个字节序列号 +1 来这个值表示下一个数据的序列号。

假设客户端发送了 3 个分片的包(1,2,3),并为每个字节标上序列号,服务端接收到这个包就会将最大的序列号 +1 作为 ACK 返回过去告诉客户端下一个要发送的包,如果只收到了 1 那 ACK 的值就会从 2(1+1)开始,这样就表示我收到了分片 1 第二个分片丢了,请你从 2 继续发,这就是顺序传输。

SYN.png

好了说的有点儿乱,根据图再来捋一遍三次握手的步骤。

  1. 客户端像服务端发送 SYN(同步)包请求建立连接
  2. 服务端收到客户端 SYN 包后先回复 ACK(值是客户端的 Seq+1),确认我收到了你建立连接的请求,也发送一个 SYN(同步)请求连接。
  3. 客户端收到服务端的 SYN 与 ACK,回复 ACK(值是第二次握手的 SYN)表示我收到了你的 SYN 请求连接。

上面就是三次握手过程可以总结成一句话:客户端 SYN:你准备好了吗?,服务端 ACK:我准备好了,服务端 SYN:你准备好了吗?,客户端 ACK:我准备好了。

TCP 不仅有连接也有断开。

FIN.png

  1. 第一次握手服务端发送 FIN 请求断开连接表示数据传输完毕
  2. 第二次握手客户端收到 FIN 回复 ACK(值是为第一次握手 Seq+1)
  3. 第三次握手客户端发送 FIN 也请求断开
  4. 第四次握手服务端收到客户端发送的 FIN 后回复一个 ACK(值是Seq+1)整个断开过程就完成。
MSS(Maximum Segment Size)

最大分片大小,TCP 重发与分片都是以 MSS 为单位数据小于等于这个值,在三次握手时 TCP 头部中写入 MSS 告诉对方我能接收的最大数据,比如建立连接是客户端说我能最大发送 4500Byte 的数据,服务端说我只能接收 1500Byte 的数据,下次客户端发送数据时就会以 1500Byte 大小发送,要与 MTU 区别开来 MTU 是你的 4 层包头 +3 层报头(OSI参考模型)一共 1500Byte。

Window

窗口就是管理发送方传输速率每次传多少字节,一次发送一段数据等待接收方的 ACK,在回应中 TCP 包含一个字段这个字段会包含希望下一次发送多大的数据,那有时链路带宽会比较拥塞就少传一点链路带宽占用率低就多传一点这叫滑动窗口。

如果在网络拥塞的情况下发送一大段数据很可能导致网络故障,TCP 在发送时字节会从低到高慢慢递增 1/2/4/8 直到填充满带宽,那在下一次发送有可能出现拥塞出现这种情况直接把窗口大小减半继续发送这是慢启动(TCP Slow Start)。

校验和(Check Sum)防冲突篡改,能校验数据和包头。

tcp-head.png

  1. 源端口占 16bit
  2. 目的端口占 16bit
  3. 序列号 占 32bit
  4. 确认应答号占 32bit
  5. 数据偏移占 4bit
  6. 保留占 4bit
  7. 控制位占 8bit
  8. 窗口大小占 16bit
  9. 校验和占 16bit
  10. 紧急指针 16bit
  11. 选项

过于复杂还没搞明白......

数据转发

看了这么多理论,来简单看下数据怎样传输。

应用程序产生数据并进行编码点击发送后(应用层与表示层),建立会话相当于交给传输层建立连接并把 TCP 包头加到应用数据上包头包含源目端口,交给下层的网络层这层用 IP 协议将上层的 TCP 包头与数据作为 IP 的数据(上层认为下层传过来的都是数据),再加上 IP 报头包含有源目 IP 地址与类型字段(我上层的数据是什么协议),查找路由表(默认路由)发往谁,交给网卡封装(数据链路层)还是一样将 IP 传过来的报头与数据作为以太网帧的数据,添加上以太网源目 MAC 地址 FCS 校验帧与类型字段,通过交换机(交换机查看 MAC 地址是转发谁)转发给网关,网关拆开链路层的帧查看当中的 IP 地址,交给最接近这个地址的路由器进行转发到达后路由转给交换机再到主机。

tuopu.png

参考资料

最近更新:

发布时间:

摆哈儿龙门阵