这是目录
1 ARP
1.1 抓包过程
- 打开Wireshark,左键两下“以太网”(有线就选以太网,无线就选择WLAN)
- 在过滤器中输入“arp”来实现报文过滤
- 如果没看到ARP报文,可以先以管理员身份打开 Power Shell
- 然后输入arp -d 删除原有arp缓存,再查看wireshark即可发现arp报文
1.2 原理理解
ARP——Address Resolution Protocol,地址解析协议;正如其英文名,是用于地址解析的协议;具体是利用该协议通过目的IP地址解析出下一跳的MAC地址,来帮助报文的二层封装实现报文的下一跳传递;ARP可以理解为是IP和MAC之间转换的桥梁;
1.3 字段分析
-
RFC 826文档内的帧格式
-
抓包软件内的帧格式
-
主要字段对照分析
Ethernet II
Destination
- 对于ARP的request报文,正常目的MAC为全f的广播MAC,因为下一跳的位置未知需要使用广播的方式来扩散该报文;
- 对于ARP的reply报文,由于可以从ARP request报文得知要回复的对象的目的MAC,所以此时reply报文的目的MAC就为其配对的request报文的source MAC;
- 特例分析
在Windows 网卡抓包时,发现ARP Request报文的目的MAC不一定是全f的广播,也有可能是单播(请求目的MAC的单播)
本人认为这应该是一种优化的策略,目的是为了减少ARP请求报文对广播域内其他链路和终端设备的影响;
因为windows本地有一张ARP表,表内缓存了我们通过ARP请求获取到的IP对应的MAC映射表项,而每一条表项都有老化时间(默认为2分钟),对于老化的表项,我们本地在需要使用它时又要重新发送ARP请求来重新缓存表项;
而如果目的MAC还是使用全f的广播,这种方式会使得ARP请求报文扩散到整个广播域,占用不必要的带宽,而且收到广播报文的终端设备无论这个ARP请求报文是不是发给自己都要上送CPU拆开二层头部,这一过程也很浪费其他终端设备的CPU资源;
所以Windows 采用这种优化方式,在ARP映射表项的老化时间还没到但是快到的时候,直接通过这种单播的ARP请求报文来获取数据更新即将老化的ARP映射表项,由于目的MAC是单播的形式,所以可以尽量减少对其他链路和终端的影响;
如果你抓包没有发现目的MAC为全f的ARP请求报文,我们可以以管理员身份运行“Windows PowerShell”,输入arp -d(清空本地ARP表),再输入arp -a(显示本地ARP表),然后随便访问一个网址,你就可以发现目的MAC为全f的ARP请求报文了,而且不出意外的话请求的是网关IP对应的MAC地址,至于为啥后面会说;
Source
- Source MAC为设备发送ARP报文的出接口对应的MAC地址;
怎么判断发送ARP报文的出接口是哪一个?
- 对于终端设备
终端设备配置的网关就类似于配置了一条默认路由,
如 网关为172.21.0.1 就等价于 默认路由0.0.0.0 0.0.0.0 172.21.0.1
(下一跳),
而本地又有一条直连路由172.21.0.0 255.255.0.0 出口网卡
(出接口),
当我们想访问外网的时候,比如 ping 218.85.157.99 的时候,我们需要进行icmp echo报文的二层封装,由于Destinate IP为218.85.157.99匹配了我们上面说的那一条默认路由,所以二层封装的目的MAC就为默认路由下一跳172.21.0.1的接口对应的MAC地址(如果本地没有就得先进行ARP的查询),而根据172.21.0.1迭代到直连路由,就能确定出接口的网卡,而这个网卡的MAC地址就是 Source MAC地址;当然,也有特殊情况,如果无法确定出接口,终端会直接进行泛洪,每一个有IP的接口都会发出ARP请求报文,而此时封装的源MAC地址就是对应的每个出接口的MAC地址了;- 对于网络设备
原理同终端设备,不赘述;
ARP
Type
- 告诉系统要将报文上送给处理ARP协议的进程处理;
Hardware type
- 常用的以太网帧类型 Ethernet II
Protocol type
- 诉系统要将报文上送给处理IP协议的进程处理;
Sender IP & Target IP & Sender MAC & Target MAC
- Sender IP
发出报文的出接口对应的IP地址,注意区别于IP层的Source IP,Sender IP在报文传输过程中会随着下一跳变化,而Source IP不会;- Target IP
下一跳对应的IP地址,注意区别于IP层的Destinat IP,Target IP在报文传输过程中会随着下一跳变化,而Destinat IP不会;- Sender MAC
发出报文的出接口对应的MAC地址- Target MAC
下一跳IP对应的MAC地址,在ARP请求报文中,这一项为全0,因为位置下一跳IP对应的MAC地址,所以才需要发送请求报文,所以这一设置十分的合理;不过在Windows的优化机制下,又有一些差异,上面有讲不再赘述;
2 TCP
2.1 抓包过程
-
其他步骤同ARP抓包不赘述
-
在过滤器输入tcp
-
找到三次握手报文
-
找到四次挥手报文(也有三次挥手)
2.2 原理理解
TCP—Transform Control Protocol,传输控制协议;为了实现传输的可靠性而生的协议,TCP大多是作为应用层的底层协议来实现应用层数据的可靠传输;TCP是面向连接的一种协议;
2.3 字段分析
- RFC793内的帧格式
- 抓包软件内的帧格式
- 主要字段对照分析
源端口Source Port
- 本地为特定进程创建的临时端口号,一般为私有端口号;
目的端口Destinate Port
- 目的端口号为接收TCP连接的远端设备上已经预先设定好的端口号,一般为公认端口号或者注册端口号,这些端口号可以明确的映射到一个进程,如BGP 是179(公认端口号)、QQ是4000(注册端口号);
端口类型分类
- 公认端口
端口号范围:0至1023
特点:这些端口是为最重要且广泛认可的服务保留的,与特定的服务紧密绑定,且分配是固定的。操作系统通常会限制只有系统服务或者具有超级用户权限的进程才能绑定这些端口。例如,HTTP服务使用80端口,FTP服务使用21端口,SSH服务使用22端口。- 注册端口
端口号范围:1024至49151
特点:这些端口用于已注册并标准化的、但不像公认端口那样严格绑定的服务。虽然不如公认端口那么固定,但仍有可能被某些服务软件或应用默认使用。这些端口通常是为那些需要固定端口的应用程序提供服务,并允许第三方开发者为其软件申请官方注册的端口号。- 私有端口
端口号范围:49152至65535
特点:这些端口并不固定分配给任何特定服务,而是由操作系统动态分配给短暂的客户端连接请求。当一台主机上的应用程序(如web浏览器或电子邮件客户端)发起连接时,操作系统会选择一个未被占用的动态端口来建立连接。这样做的目的是避免端口冲突,并确保在同一台计算机上运行的多个服务或应用可以同时进行网络通信。
序号seq num
占4个字节,用来标记数据段的顺序。在建立TCP连接的时候,主机端和客户端都会随机产生一个seq序列号,然后会在此基础上递增1(注意三次握手的目的就是为了确认序列号,以确保后面的报文传输
有序 的进行;此时是没有数据的传输也就是TCP层里面没有payload);在建立了连接之后,则序列号就不是+1递增的模式了,而是在原本的序列号的基础上加上先前发的TCP报文里面的payload的字段
确认号ACK num
占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;也表示对方发来的在确认号之前的报文已被成功接收读取
ACK确认位
占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。在三次握手建立邻居关系后的后续TCP报文交互中,ACK都置位,因为ACK的置位表示对前者报文的一种确认;
SYN同步位
连接建立时用于同步序号。三次握手过程中,双方都要有一个SYN=1报文,因为建立连接的过程是双向的。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0;
FIN终止位
用来释放一个连接。FIN=1表示:此报文的发送方的数据已经发送完毕,并要求释放单向传输连接,用在四次挥手的过程中;
URG紧急位
表示本报文段中发送的数据是否包含紧急数据,当URG=1,表示有紧急数据,后面的紧急指针字段只有当URG=1时才有效;
PSH推送位
告诉对方收到该报文段后是否应该立即把数据推送给上层,如果为1,则表示对方应当立即把数据提交给上层,而不是缓存起来;
PSH和URG的同异
- 共同点:URG和PSH都是提高报文段的优先级,使报文段更先推送给上层
- 不同点:两者将报文段更先推送给上层的实现方法不一样,URG是通过置1来让后面的紧急指针字段有效,从而让报文段更先发送,而PSH是通过置1来告诉接收方在接收到报文段后应该立即把数据发给上层而不是缓存起来。
MSS最大传输大小
在我们进行三次握手的时候,也就是SYN=1时也会进行MSS的协商,然后双方就会确定一个较小的MSS作为传输的TCP报文的最大数据分段。默认的MSS=MTU-IP头-TCP头=1500-20-20=1460;很多时候MSS的值最好小于默认值1460,比如在PPPoe的场景下,为了避免出口设备因为MSS设置过大,导致出口无端分片造成的网速慢,甚至丢包(假如报文不支持分片)情况的发生,我们一般将MSS设置的比较小,比如1200(因为PPPoe本身也有8字节,如果使用默认的MSS1460,则1460+20+20+8>1500就会触发分片);
窗口Window
在我们进行三次握手的时候,会进行MSS的协商,而窗口的大小默认为MSS的4倍,如果MSS=1460则Window=5840;窗口分为接收窗口和发送窗口。窗口的作用就是为了可以一次性发送更多的TCP数据包,而不是发一个数据包等待一个确认包。同时确认报文也是汇总确认。窗口可以保证TCP数据报的传输更加高效
Payload
表示报文中数据的含量Payload≤MSS-OPTIONS,下一个发送的报文的seq在报文被正常接收且确认的情况下是原seq+原Payload(因为传输的数据是按字节来确定seq)
2.4 四次挥手分析
从图中报文缩略信息也可以得知,四次挥手的过程如下图所示
当然,如果服务器端没有剩余数据传输,四次挥手流程也可能变成三次
3 SNMP
2.1 抓包过程
1、主机安装snmp服务
2、主机启用snmp服务
3、设置snmp主机使用的社区和IP地址
4、打开Wireshark,监视虚拟网卡的收发包情况
5、开启snmputilg,输入查询命令
6、成功抓到报文
2.2 原理理解
SNMP—Simple Network Management Protocol,简单网络管理协议;主要作用是利用管理站实现对代理系统的监视和管理;
SNMP是基于UDP 161的应用层协议;基于UDP,一方面是因为UDP具有更好的实时性,可以更快的获取到数据;同时,较于使用需要建立连接的TCP而言,UDP占用管理站和代理系统的资源更少;同时,SNMP多用于内网环境,而内网的网络状况比较可控,所以也不需要TCP来保证传输的可靠性;
SNMP最主要还是用于网络和设备状态的监控,对于设备的复杂配置还是依靠其他的协议,比如Telnet,SSH登录设备进行配置;
2.3 字段分析
注:
IP层的目的IP为我们请求的设备的IP地址,目的端口为UDP 161对应SNMP协议,这里不在赘述,重点看一下SNMP协议部分的载荷;
Version版本
版本字段,写入版本字段的是版本号减 1。例如,SNMP(即 SNMPV1)应写入 0,SNMP一共有v1、v2、v3三个版本;
Community共同体
字符串形式,作为网络管理站 NMS 和 SNMP 代理之间的明文口令,默认为 public;管理站和代理系统设置的community字段要一致,才可以顺利进行数据查询;由于community字段是明文传递,明文口令容易暴露,所以在公网环境中,使用未加密的SNMP(v1/v2)有很大的风险,也就是在此基础上才衍生出了加密的SNMPv3版本;
PDU 类型
SNMP 协议的操作类型。
- 值为 0,表示 get-request 操作;
- 值为 1,表示 get-next-request 操作;
- 值为2,表示 get-response 操作;
- 值为 3,表示 set-request 操作;
- 值为 7,表示 informRequest 操作。
request-id 请求标识
管理站 NMS 设置的一个整数值。SNMP 代理在发送 get-response 报文时也要返回此请求标识符。
差错状态
整数,由 SNMP 代理进行标注,指明有错误发生。
差错索引
当出现 noSuchName、badValue 或 readOnly的错误时,由代理进程在回答时设置的一个整数。该数值指明引起错误的变量在变量列表中的偏移位置。
Object-name名称
MIB 管理信息库中的 OID,用该值来向代理系统请求对应的信息。
具体OID代表含义可以查询以下文章
文章链接
值
OID 对应的返回的代理系统信息的真实值,在request中为null因为还没或取代代理系统返回的数据信息;
4 实验小结
通过这次实验,首先认识到了现网中的抓到报文和模拟器中抓到报文的一定区别,比如ARP的单播请求报文,明白了网络要想更好的进行服务就要有所优化;其次,抓包后对字段的分析也加深了我对于协议的理解;总之,受益匪浅啊;