目录
本文参考Wireshark网络抓包
推荐一个协议地图
1. 以太网协议头(数据链路层) -- 14byte
字段 | 长度 | 含义 |
DMAC | 6字节 | 目的MAC地址,IPV4为6字节,该字段确定帧的接收者。 |
SMAC | 6字节 | 源MAC地址,IPV4为6字节,该字段标识发送帧的工作站。 |
Type | 2字节 | 协议类型。下表列出了链路直接封装的协议。IP协议=0x0800 |
Data | 变长 | 数据字段的最小长度必须为46字节以保证帧长至少为64字节,这意味着传输一字节信息也必须使用46字节的数据字段。 如果填入该字段的信息少于46字节,该字段的其余部分也必须进行填充。数据字段的最大长度为1500字节。 |
CRC | 4字节 | 用于帧内后续字节差错的循环冗余检验(也称为FCS或帧检验序列)。 |
2. IP数据头(网络层) -- 20byte
字段 | 长度 | 含义 |
Version | 4比特 | 4:表示为IPV4; 6:表示为IPV6。 |
IHL | 4比特 | 首部长度,如果不带Option字段,则为20,最长为60,该值限制了记录路由选项。以4字节为一个单位。 |
Type of Service | 8比特 | 服务类型。只有在有QoS差分服务要求时这个字段才起作用。 |
Total Length | 16比特 | 总长度,整个IP数据报的长度,包括首部和数据之和,单位为字节,最长65535,总长度必须不超过最大传输单元MTU。 |
Identification | 16比特 | 标识,主机每发一个报文,加1,分片重组时会用到该字段。 |
Flags | 3比特 | 标志位: 图2 IP Flag字段格式 Bit 0: 保留位,必须为0。 Bit 1: DF(Don't Fragment),能否分片位,0表示可以分片,1表示不能分片。 Bit 2: MF(More Fragment),表示是否该报文为最后一片,0表示最后一片,1代表后面还有。 |
Fragment Offset | 12比特 | 片偏移:分片重组时会用到该字段。表示较长的分组在分片后,某片在原分组中的相对位置。以8个字节为偏移单位。 |
Time to Live | 8比特 | 生存时间:可经过的最多路由数,即数据包在网络中可通过的路由器数的最大值。 |
Protocol | 8比特 | 协议:下一层协议。指出此数据包携带的数据使用何种协议,以便目的主机的IP层将数据部分上交给哪个进程处理。 常见值: 0: 保留Reserved 1: ICMP, Internet Control Message [RFC792] 2: IGMP, Internet Group Management [RFC1112] 3: GGP, Gateway-to-Gateway [RFC823] 4: IP in IP (encapsulation) [RFC2003] 6: TCP Transmission Control Protocol [RFC793] 17: UDP User Datagram Protocol [RFC768] 20: HMP Host Monitoring Protocol [RFC 869] 27: RDP Reliable Data Protocol [ RFC908 ] 46: RSVP (Reservation Protocol) 47: GRE (General Routing Encapsulation) 50: ESP Encap Security Payload [RFC2406] 51: AH (Authentication Header) [RFC2402] 54: NARP (NBMA Address Resolution Protocol) [RFC1735] 58: IPv6-ICMP (ICMP for IPv6) [RFC1883] 59: IPv6-NoNxt (No Next Header for IPv6) [RFC1883] 60: IPv6-Opts (Destination Options for IPv6) [RFC1883] 89: OSPF (OSPF Version 2) [RFC 1583] 112: VRRP (Virtual Router Redundancy Protocol) [RFC3768] 115: L2TP (Layer Two Tunneling Protocol) 124: ISIS over IPv4 126: CRTP (Combat Radio Transport Protocol) 127: CRUDP (Combat Radio User Protocol) 132: SCTP (Stream Control Transmission Protocol) 136: UDPLite [RFC 3828] 137: MPLS-in-IP [RFC 4023] |
Header Checksum | 16比特 | 首部检验和,只检验数据包的首部,不检验数据部分。这里不采用CRC检验码,而采用简单的计算方法。 |
Source Address | 32比特 | 源IP地址。 |
Destination Address | 32比特 | 目的IP地址。 |
3. ARP抓包分析
3.1 ARP介绍
ARP(Address Resolution Protocol)地址解析协议,将IP地址解析成MAC地址。
ARP工作流程分请求和响应:
3.2 报文格式
arp协议是在网络层的,所以我们先解析ether,再解析arp
字段 | 长度(bit) | 含义 |
Ethernet Address of destination | 48比特 | 目的以太网地址。发送ARP请求时,为广播的MAC地址,0xFF.FF.FF.FF.FF.FF。 |
Ethernet Address of sender | 48比特 | 源以太网地址。 |
Frame Type | 16比特 | 表示后面数据的类型。对于ARP请求或应答来说,该字段的值为0x0806。 |
Hardware Type | 16比特 | 表示硬件地址的类型。对于以太网,该类型的值为“1”。 |
Protocol Type | 16比特 | 表示发送方要映射的协议地址类型。对于IP地址,该值为0x0800。 |
Hardware Length | 8比特 | 表示硬件地址的长度,单位是字节。对于ARP请求或应答来说,该值为6。 |
Protocol Length | 8比特 | 表示协议地址的长度,单位是字节。对于ARP请求或应答来说,该值为4。 |
OP | 16比特 | 操作类型: 1 ARP请求 2 ARP应答 3 RARP请求 4 RARP应答 |
Ethernet Address of sender | 48比特 | 发送方以太网地址。这个字段和ARP报文首部的源以太网地址字段是重复信息。 |
IP Address of sender | 32比特 | 发送方的IP地址。 |
Ethernet Address of destination | 48比特 | 接收方的以太网地址。发送ARP请求时,该处填充值为0x00.00.00.00.00.00。 |
IP Address of destination | 32比特 | 接收方的IP地址。 |
3.3 抓包分析
3.3.1 先arp -d把arp表清空。
arp -a查看ARP表已被清空。抓192.168.240.130的ip
3.3.2 过滤ARP协议的数据包
显示过滤器中输入:arp,过滤ARP协议的数据包。
3.3.3 Ping 目标IP
第一个包是ARP请求包,第二个包是ARP响应包。
3.3.4 第一个数据包请求分析
目标地址(Destination字段)是 Broadcast,就是广播的意思
第一处:ARP后面的括号里是 request,说明这是个请求包
第二处:源IP、源MAC、目标IP都有值,目标MAC却全是0,意思就是告诉他们:我不知道这个IP的MAC地址。
3.3.5 第二个数据包应答分析
第一处:ARP后面的括号里是 reply,说明这是个响应包
第二处:源IP、源MAC、目标IP、目标MAC都有值,接收方可以从这里获取IP对应的MAC地址。
3.3.6 arp -a 查看ARP表
ARP的学习能力:解析成功的MAC地址会被临时缓存,以节约资源。
3.3.7 再次访问Ping 目标IP
第二次访问,ARP表中已经缓存了MAC地址,所以这次ARP请求不再广播,而是直接从ARP表中获取。
4. ICMP抓包分析
4.1 ICMP介绍
ICMP(Internet Control Message Protocol)网际报文控制协议,用于传输错误报告控制信息,对网络安全有极其重要的意义。
例如请求的服务不可用、主机或路由不可达,ICMP协议依靠IP协议来完成任务,是IP协议的一个集成部分。
通常不被用户网络程序直接使用,多用于ping和tracert等这样的诊断程序。
4.2 报文格式
ICMP协议是IP的一个组成部分,负责传递 。
字段 | 长度 | 含义 |
Type | 1字节 | 消息类型: 0:回显应答报文 8:请求回显报文 |
Code | 1字节 | 消息代码,此处值为0。 |
Checksum | 2字节 | 检验和。 |
Identifier | 2字节 | 标识符,发送端标示此发送的报文 |
Sequence Number | 2字节 | 序列号,发送端发送的报文的顺序号。每发送一次顺序号就加1。 |
Data | 可变 | 选项数据,是一个可变长的字段,其中包含要返回给发送者的数据。回显应答通常返回与所收到的数据完全相同的数据。 |
4.3 抓包分析
ping是用来测试网络连通性的命令。
一旦发出ping命令,主机会发出连续的测试数据包到网络中,在通常的情况下,主机会收到回应数据包,ping采用的是ICMP协议。
4.3.1 确定目标地址
选择192.168.240.130作为目标地址。
4.3.2 第一个数据包进行分析
报文由IP首部和ICMP报文组成。
4.3.3 第二个数据包进行分析
4.3.4 错误诊断
“Type:0,Code:0”表示报文类型为诊断报文类型请正常的包。ICMP提供多种类型的消息为源端节点提供网络额故障信息反馈,报文类型可归纳如下:
ICMP消息类型代码对应表
类型Type | 代码Code | 描述 |
0 | 0 | 回显应答(ping应答) |
3 | 0 | 网络不可达 |
3 | 1 | 主机不可达 |
3 | 2 | 协议不可达 |
3 | 3 | 端口不可达 |
3 | 4 | 需要进行分片但设置不分片比特 |
3 | 5 | 源站选路失败 |
3 | 6 | 目的网络不认识 |
3 | 7 | 目的主机不认识 |
3 | 8 | 源主机被隔离(作废不用) |
3 | 9 | 目的网络被强制禁止 |
3 | 10 | 目的主机被强制禁止 |
3 | 11 | 由于TOS,网络不可达 |
3 | 12 | 由于TOS,主机不可达 |
3 | 13 | 由于过滤,通信被强制禁止 |
3 | 14 | 主机越权 |
3 | 15 | 优先权中止生效 |
4 | 0 | 源端被关闭 |
5 | 0 | 对网络重定向 |
5 | 1 | 对主机重定向 |
5 | 2 | 对服务类型和网络重定向 |
5 | 3 | 对服务类型和主机重定向 |
8 | 0 | 请求回显(ping请求) |
9 | 0 | 路由器通告 |
10 | 0 | 路由器请求告 |
11 | 0 | 传输期间生存时间为0 |
11 | 1 | 在数据报组装期间生存时间为0 |
12 | 0 | 坏的IP首部 |
12 | 1 | 缺少必须的选项 |
13 | 0 | 时间戳请求(作废不用) |
14 | 0 | 时间戳应答(作废不用) |
15 | 0 | 信息请求(作废不用) |
16 | 0 | 信息应答(作废不用) |
17 | 0 | 地址掩码请求 |
18 | 0 | 地址掩码应答 |
5. UDP抓包分析
5.1 udp介绍
UDP(User Datagram Protocol)用户数据报协议,提供面向事务的简单不可靠信息传送服务。
- 将网络数据流压缩成数据包的形式。每一个数据包的前8个字节保存包头信息,剩余的包含具体的传输数据。
- 虽然UDP是不可靠的传输协议,但它是分发信息的理想协议,例如在屏幕上报告股票市场、显示航空信息;
- 在路由信息协议RIP(Routing Information Protocol)中修改路由表、QQ聊天、迅雷、网络电话等。
- TCP的效率不一定比UDP低,只要窗口足够大,TCP也可以不受往返时间的约束而源源不断地传数据。
1)UDP的优势
1. UDP 协议的头长度不到TCP头的一半,所以同样大小的包里UDP携带的净数据比TCP包多。
2. 没有Seq和Ack等概念,省去了建立连接的开销,DNS解析就使用UDP协议。
2)UDP的劣势
1. 超过MTU的时候,发送方的网络层负责分片,接收方收到分片后再组装起来,这个过程会消耗资源,降低性能。
2. 没有重传机制,丢包由应用层处理,某个写操作有6个包,当有一个丢失的时候,就要将6个包重新发送。
3. 分片机制存在弱点,接收方是根据包中的“More fragments”的flag来判断是否包已接收完,1表示还有分片,0表示最后一个分片,可以组装了。
如果持续发送flag为1的UDP,接收方无法组装,就有可能耗尽内存。
5.2 UDP协议的数据格式(传输层) -- 8byte
字段 | 长度 | 描述 |
Source Port | 2字节 | 标识哪个应用程序发送(发送进程)。 |
Destination Port | 2字节 | 标识哪个应用程序接收(接收进程)。 |
Length | 2字节 | UDP首部加上UDP数据的字节数,最小为8。 |
Checksum | 2字节 | 覆盖UDP首部和UDP数据,是可选的。 |
data octets | 变长 | UDP负载,可选的。 |
5.3 抓包分析
5.3.1 捕获到UDP数据包
5.3.2 物理层
表示这是第1262帧数据报的详细信息。其中包的大小为2528个字节
5.3.3 数据链路层
表示以太网帧头部信息。源MAC和目标MAC地址
5.3.4网络层
5.3.5 传输层
5.3.6 数据区
6. TCP抓包分析
6.1 tcp介绍
TCP(Transmission Control Protocol)传输控制协议,一种面向连接、可靠、基于IP的传输层协议,主要目的是为数据提供可靠的端到端传输。
在OSI模型的第四层工作,能够处理数据的顺序和错误恢复,最终保证数据能够到达其应到达的地方。
6.1.1 标志位
SYN: 同步,在建立连接时用来同步序号。SYN=1, ACK=0表示一个连接请求报文段。SYN=1,ACK=1表示同意建立连接。
FIN: 终止,FIN=1时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接。
ACK: 确认,ACK = 1时代表这是一个确认的TCP包,取值0则不是确认包。
DUP ACK:重复,重复确认报文,有重复报文,一般是是丢包或延迟引起的,从这个报文看应该是丢包了。
URG:紧急,当URG=1时,表示报文段中有紧急数据,应尽快传送
PSH:推送,当发送端PSH=1时,接收端尽快的交付给应用进程
RST:复位,当RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接
6.1.2 端口
客户端与不同服务器建立连接时,源端口和目标端口可不同。
6.1.3 TCP三次握手
6.1.4 TCP四次挥手
TCP四次断开,例如关闭页面的时候就会断开连接
6.1.5 TCP概念
1. 发送窗口
无法简单的看出发送窗口的大小,发送窗口会由网络因素决定。发送窗口定义了一次发的字节,而MSS定义了这些字节通过多少个包发送。
2. 拥塞窗口(cwnd)
描述源端在拥塞控制情况下一次最多能发送的数据包的数量。
在发送方维护一个虚拟的拥塞窗口,并利用各种算法使它尽可能接近真实的拥塞点。
网络对发送窗口的限制,就是通过拥塞窗口实现的。
3. 在途字节数(bytes in flight)
已经发送出去,但尚未被确认的字节数。
在途字节数 = Seq + Len - Ack
其中Seq和Len来自上一个数据发送方的包,而Ack来自上一个数据接收方的包。
4. 拥塞点(congestion point)
发生拥塞时候的在途字节数就是该时刻的网络拥塞点。
先从Wireshark中找到一连串重传包中的第一个,再根据该Seq找到原始包最后计算该原始包发送时刻的在途字节数。
5. 慢启动
RFC建议初始拥塞窗口发送2、3、或4个MSS,如果发出去的包都能得到确认,则表明还没到拥塞点,可以收到n个确认增加n个MSS
6. 拥塞避免
慢启动持续一段时间后,拥塞窗口达到一个较大的值,就得放慢RFC建议在每个往返时间增加1个MSS,比如发了16个MSS全部确认,那么就增加到17个MSS
7. 超时重传
发出去的包在等待一段时间(RTO)后,没有收到确认,就只能重传了
8. 快速重传(Fast Retransmit)
不以时间驱动,而以数据驱动重传。如果包没有连续到达,就ACK最后那个可能被丢了的包,如果发送方连续收到3次相同的ACK,就重传。
9. SACK(Selective Acknowledgment)
选择性确认重传,ACK还是Fast Retransmit的ACK,SACK则是汇报收到的数据,在发送端就可以根据回传的SACK来知道哪些数据到了,哪些没有到。
10. 延迟确认(Delayed ACK)
如果收到一个包后暂时没什么数据发给对方,那就延迟一段时间再确认。假如这段时间恰好有数据要发送,那数据和确认信息可以在一个包中发送。
11. LSO
LSO拯救CPU而出的创意,为了缓解CPU的压力,把它的一部分工作外包给了网卡,比如TCP的分段。
启用LSO之后,TCP层就可以把大于MSS的数据块直接传给网卡,让网卡负责分段。
比如“Seq=348586,Len=2776”,被网卡分为“Seq=348586,Len=1388”和“Seq=349974,Len=1388”两个包。
在发送端抓包相当于站在CPU角度,只看到一个分段前的大包,而接收端就可以看到两个包。
所以才会出现只见重传包,不见原始包的情况。
12. Nagle算法
在发出去的数据还没有被确认之前,假如又有小数据生成,那就把小数据收集起来,凑满一个MSS或等收到确认后再发送。
13. Vegas算法
通过监控网络状态来调整发包速度。
当网络状态良好时,数据包的RTT比较稳定,这时可以增大拥塞窗口;
当网络开始繁忙时,数据包开始排队,RTT就会变大,这时就减小拥塞窗口。
6.1.6 选项字段
PTR(Pointer Record):指针记录,PTR记录解析IP地址到域名
TTL(Time to live):
存活时间,限制数据包在网络中存在的时间,防止数据包不断的在IP互联网络上循环,初始值一般为64,每经过一个路由减去1。
通过TTL过滤运营商劫持包,假的包是抢先应答的,所以和真实包的TTL可能不同(例如ip.ttl == 54)
Seq:数据段的序号,当接收端收到乱序的包,就能根据此序号重新排序,当前Seq等上一个Seq号与长度相加获取到
Len:数据段的长度,这个长度不包括TCP头
Ack:确认号,接收方向发送方确认已经收到了哪些字节
RTT(Round Trip Time):也就是一个数据包从发出去到回来的时间
RTO(Retransmission TimeOut):超时重传计数器,描述数据包从发送到失效的时间间隔,是判断数据包丢失与否及网络是否拥塞的重要参数
MTU(Maximum Transmit Unit):最大传输单元
MSS(Maximum Segment Size):最长报文段,TCP包所能携带的最大数据量,不包含TCP头和Option。一般为MTU值减去IPv4头部(至少20字节)和TCP头部(至少20字节)得到。
Win(Window Size):声明自己的接收窗口
TCP Window Scale:窗口扩张,放在TCP头之外的Option,向对方声明一个shift count,作为2的指数,再乘以TCP定义的接收窗口,得到真正的TCP窗口
DF(Don't fragment):在网络层中,如果带了就丢弃没带就分片
MF(More fragments):0表示最后一个分片,1表示不是最后一片
6.1.7 过滤表达式
握手请求被对方拒绝:tcp.flags.reset === 1 && tcp.seq === 1
重传的握手请求:tcp.flags.syn === 1 && tcp.analysis.retransmission
过滤延迟确认:tcp.analysis.ack_rtt > 0.2 and tcp.len == 0
6.2 TCP头部结构
字段 | 长度 | 含义 |
Source Port | 16比特 | 源端口,标识哪个应用程序发送。 |
Destination Port | 16比特 | 目的端口,标识哪个应用程序接收。 |
Sequence Number | 32比特 | 序号字段。TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。 |
Acknowledgment Number | 32比特 | 确认号,是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。 |
Data Offset | 4比特 | 数据偏移,即首部长度,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,以32比特(4字节)为计算单位。最多有60字节的首部,若无选项字段,正常为20字节。 |
Reserved | 6比特 | 保留,必须填0。 |
URG | 1比特 | 紧急指针有效标识。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。 |
ACK | 1比特 | 确认序号有效标识。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。 |
PSH | 1比特 | 标识接收方应该尽快将这个报文段交给应用层。接收到PSH = 1的TCP报文段,应尽快的交付接收应用进程,而不再等待整个缓存都填满了后再向上交付。 |
RST | 1比特 | 重建连接标识。当RST=1时,表明TCP连接中出现严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接。 |
SYN | 1比特 | 同步序号标识,用来发起一个连接。SYN=1表示这是一个连接请求或连接接受请求。 |
FIN | 1比特 | 发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接。 |
Window | 16比特 | 窗口:TCP的流量控制,窗口起始于确认序号字段指明的值,这个值是接收端正期望接收的字节数。窗口最大为65535字节。 |
Checksum | 16比特 | 校验字段,包括TCP首部和TCP数据,是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。 |
Urgent Pointer | 16比特 | 紧急指针,只有当URG标志置1时紧急指针才有效。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。 |
Options | 可变 | 选项字段。TCP协议最初只规定了一种选项,即最长报文段长度(数据字段加上TCP首部),又称为MSS。MSS告诉对方TCP“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节”。 新的RFC规定有以下几种选型:选项表结束,无操作,最大报文段长度,窗口扩大因子,时间戳。 窗口扩大因子:3字节,其中一个字节表示偏移值S。新的窗口值等于TCP首部中的窗口位数增大到(16+S),相当于把窗口值向左移动S位后获得实际的窗口大小。 时间戳:10字节,其中最主要的字段是时间戳值(4字节)和时间戳回送应答字段(4字节)。 选项确认选项: |
Padding | 可变 | 填充字段,用来补位,使整个首部长度是4字节的整数倍。 |
data | 可变 | TCP负载。 |
6.3 抓包分析
6.3.1 物理层
表示这是第1300帧数据报的详细信息。其中包的大小为11472个字节
6.3.2 数据链路层
表示以太网帧头部信息。源MAC和目标MAC地址
6.3.3 网络层
6.3.4 传输层
推荐一个不错的学习网站 C/C++后台高级服务器https://ke.qq.com/course/417774?flowToken=1010783