网络篇01 | 入门篇
- 01 各层协议目录
- [网络篇02 | 应用层 kcp(王者荣耀)](https://blog.csdn.net/qiushily2030/article/details/135835946)
- [网络篇03 | 应用层 quic](https://blog.csdn.net/qiushily2030/article/details/136192481)
- [网络篇04 | 应用层 mqtt(物联网)](https://blog.csdn.net/qiushily2030/article/details/137739784)
- [网络篇05 | 应用层 http/https](https://blog.csdn.net/qiushily2030/article/details/137738941)
- [网络篇06 | 应用层 自定义协议](https://blog.csdn.net/qiushily2030/article/details/137740639)
- [网络篇07 | 应用层 其他协议](https://blog.csdn.net/qiushily2030/article/details/137740706)
- [网络篇08 | 运输层 tcp](https://blog.csdn.net/qiushily2030/article/details/137740741)
- [网络篇09 | 运输层 udp](https://blog.csdn.net/qiushily2030/article/details/137741519)
- [网络篇10 | 网络层 IP](https://blog.csdn.net/qiushily2030/article/details/137741548)
- [网络篇11 | 网络层 ICMP](https://blog.csdn.net/qiushily2030/article/details/137741672)
- [网络篇12 | 链路层 ARP](https://blog.csdn.net/qiushily2030/article/details/137741897)
- 网络篇13 | 链路层 RARP
- 网络篇14 | 物理层
- 02 网络基础概念
- 1)各层划分
- 2)各层PDU
- 3)网络传输
- 03 网络层级概要
- 1)应用层(应用、表示、会话)
- 2)运输层(TCP、UDP)
- 3)网络层(IP、ICMP、IGMP)
- 4)链路层(ARP、RARP)
- 5)物理层(比特)
- 04 网络诊断工具
- 1)tcpdump
- 2)hping3
- 3)mtr
- 05 网络抓包工具
- 1)Wireshark
- 2)Burp Suite
- 06 位操作
- 1)位运算(原码 反码 补码)
- 2)位运算符
- 3)Java代码使用
01 各层协议目录
网络篇02 | 应用层 kcp(王者荣耀)
网络篇03 | 应用层 quic
网络篇04 | 应用层 mqtt(物联网)
网络篇05 | 应用层 http/https
网络篇06 | 应用层 自定义协议
网络篇07 | 应用层 其他协议
网络篇08 | 运输层 tcp
网络篇09 | 运输层 udp
网络篇10 | 网络层 IP
网络篇11 | 网络层 ICMP
网络篇12 | 链路层 ARP
网络篇13 | 链路层 RARP
网络篇14 | 物理层
02 网络基础概念
1)各层划分
2)各层PDU
3)网络传输
03 网络层级概要
1)应用层(应用、表示、会话)
- 应用层:提供用户接口和服务的应用程序。
- 表示层:处理数据格式转换、加密解密等功能。
- 会话层:管理通信会话,确保数据传输的正确性。
2)运输层(TCP、UDP)
- TCP(Transmission Control Protocol):提供可靠的、面向连接的数据传输服务。
- UDP(User Datagram Protocol):提供不可靠的、无连接的数据传输服务。
3)网络层(IP、ICMP、IGMP)
- IP(Internet Protocol):负责数据包的路由和寻址。
- ICMP(Internet Control Message Protocol):用于传递控制消息和错误报告。
- IGMP(Internet Group Management Protocol):用于组播组管理。
4)链路层(ARP、RARP)
- ARP(Address Resolution Protocol):将 IP 地址映射为 MAC 地址。
- RARP(Reverse Address Resolution Protocol):将 MAC 地址映射回 IP 地址。
5)物理层(比特)
在网络模型中,物理层传输的单位是比特。与其他网络层(如数据链路层、网络层、传输层和应用层)不同,物理层并没有类似于这些层的报文协议。
该层的设备和技术包括网卡、集线器、中继器、光纤、电缆等。物理层是 OSI 模型中最底层的一层,负责在物理媒介上传输比特流。它处理数据的传输速率、传输介质的接口标准、信号的电压等细节。物理层主要任务包括传输比特流、对传输媒介进行编码和解码、提供物理连接的建立和维护。
当数据以比特形式在网络中传输时,以下是一般情况下的传输过程:
- 数据编码:在发送端,原始数据被转换为比特流。这可能涉及将数据分割成固定大小的块,并对每个块进行编码,通常使用数字信号处理技术来表示二进制比特。
- 物理层传输:经过数据编码后的比特流会通过物理层传输介质(如铜线、光纤或无线波段)。在传输介质上,比特以电信号、光信号或者无线信号的形式传输。
- 调制与解调:在模拟传输媒体中,数字信号需要经过调制(Modulation)转换为模拟信号才能传输。接收端会对接收到的信号进行解调(Demodulation),将模拟信号转换回数字信号。
- 传输延迟:在传输过程中,会出现传输延迟(如传播延迟、处理延迟等)。这些延迟会影响数据到达接收端的时间和顺序。
- 接收端解析:接收端接收到比特流后,会根据事先约定好的协议或标准对比特流进行解析和重组,还原出原始数据。
总的来说,数据比特在网络中传输的过程包括编码、基于物理层介质的传输、调制与解调(如果有必要)、传输延迟和接收端的解析过程。这些步骤确保了数据能够在网络中可靠地传输并最终正确地被接收端解析。
在内部服务器通过交换机进行通信时,在数据链路层,设备之间识别目标地址主要是通过目标MAC地址来实现的,每个网络设备都有一个唯一的MAC地址,用于在数据链路层中唯一标识设备。数据链路层帧中包含了源MAC地址和目标MAC地址。
MAC地址与硬件通常是一一绑定的,每个网络设备(如网卡、无线适配器)在生产过程中会被分配一个全球唯一的MAC地址。这个MAC地址是设备固化在其硬件中的,并且不可更改,确保了网络中每个设备具有唯一的身份标识。
硬件与数据链路层对接获取MAC地址的过程:
- 嵌入式设备:在硬件设备(如网络适配器)中内置了芯片或电路,其中包含设备的MAC地址信息。这个MAC地址通常是由设备制造商编程到设备的固件中的。
- 驱动程序:当操作系统启动时,它会加载适当的硬件驱动程序,这些驱动程序知道如何与硬件设备通信并提供所需的服务。驱动程序可以通过访问嵌入式设备以获取设备的MAC地址。
- 数据链路层获取MAC地址:数据链路层在需要发送或接收数据时,会通过底层的驱动程序与硬件设备进行通信。驱动程序会向数据链路层提供设备的MAC地址,以便正确地封装和解析数据帧。
- MAC地址的使用:数据链路层将源MAC地址和目标MAC地址添加到数据帧中,以确保数据帧能够传输到正确的目标设备。接收端根据目标MAC地址来识别并处理接收到的数据帧。
总的来说,MAC地址是设备硬件上的固定标识符,通过嵌入式设备中的芯片或电路与硬件绑定。数据链路层在需要发送或接收数据时,通过驱动程序获取硬件的MAC地址,并将其用于数据帧的封装和解析过程,以实现数据在网络中的准确传输。
04 网络诊断工具
1)tcpdump
监听192.168.50.223端口7778的eth0网卡,包信息导入到r1.cap的Wireshark中。
#执行命令如下,抓包操作会持续进行,直到你手动停止tcpdump命令。通常可以使用Ctrl + C来终止抓包操作,然后查看捕获的数据包。
# tcpdump host 192.168.50.223 and port 7778 -i eth0 -w ./r1.cap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
一下就是Wireshark打开的效果,可以继续分析数据包了。
2)hping3
- Dos攻击
(base) [root@vm12_efficiency01_50_221 ~]# hping3 -I eth0 -a 192.168.10.99 -S 192.168.50.224 -p 80 -i u1
HPING 192.168.50.224 (eth0 192.168.50.224): S set, 40 headers + 0 data bytes
--- 192.168.50.224 hping statistic ---
15626168 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
根据提供的hping3命令输出:
- 已发送了15626168个SYN数据包到目标主机192.168.50.224的端口80。
- 从目标主机返回的统计信息显示,没有接收到任何响应数据包。
- 100%的数据包丢失率表明在传输过程中没有成功建立连接。
- 来回时间的最小、平均和最大值都为0毫秒,这意味着没有收到任何响应数据包。
总的来说,虽然发送了大量的SYN数据包,但由于未收到回复,表示目标主机未响应或无法处理这些连接请求。可能是因为防火墙、网络设置或其他原因导致连接失败。
为什么发了这么多的包,对方的CPU一点都不涨?
我这两台机器都是内网同一个网段,中间只经过交换机,经过了交换机的包过滤,交换机可能会执行一些包过滤功能,如MAC地址过滤、端口安全等,导致部分数据包被丢弃或不被转发。
在这种情况下,虽然你发送了大量的数据包(15626168个SYN包),但目标主机仍未显示任何响应或负载变化。这可能是由于以下原因导致:
- 防火墙或网络设备过滤: 目标主机可能有防火墙或其他网络设备对入站流量进行过滤,从而导致无法接收到你发送的数据包。
- 系统资源处理能力: 目标主机的CPU可能具有很高的处理能力,可以轻松处理大量的连接请求,因此即使有大量的数据包传输也不会显著影响其性能。
- DoS 防护措施: 目标主机可能已经配置了适当的 DoS 防护措施,如连接速率限制、黑名单等,以保护自身免受此类攻击的影响。
在这种情况下,发出如此多的数据包而没有看到任何影响可能意味着目标主机有能力处理这样的请求或者有相应的安全措施来防范此类攻击。
(base) [root@vm12_efficiency01_50_221 ~]# hping3 -c 100000000 -d 120 -S -w 64 -I enp1s0 -p 21 --flood --rand-source -i u0.0000001 192.168.50.224
HPING 192.168.50.224 (lo 192.168.50.224): S set, 40 headers + 120 data bytes
hping in flood mode, no replies will be shown
--- 192.168.50.224 hping statistic ---
1121223 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
根据提供的hping3命令输出:
- 已发送1121223个SYN数据包到目标IP地址192.168.50.224的端口21。
- 没有收到任何回复数据包,导致100%的数据包丢失率。
- 最小、平均和最大来回时间都为0毫秒,表示未发生成功建立连接。
关于目标机器CPU使用率低的原因可能包括:
- 数据包处理方式: 大量SYN数据包可能未成功建立连接,因此目标机器并不需要花费太多资源对这些无法完成握手的连接进行处理。
- 网络设备过滤: 网络中的交换机、防火墙或其他设备可能在数据包传输时过滤了部分流量,导致一些数据包无法到达目标机器。
- 目标主机性能: 目标主机可能具有强大的处理能力,可以轻松处理大量的连接请求,因此即使接收到大量数据包也不会显著增加CPU负载。
虽然发送了大量的数据包并且没有成功建立连接,但由于以上原因,目标机器的CPU使用率仍然保持较低水平。在网络测试中,需要谨慎评估发送频率和数据包数量,以免对目标系统和网络造成意外影响。
- SYN泛洪攻击
(base) [root@vm12_efficiency01_50_221 ~]# hping3 -c 5000 -d 100 -S -w 64 -p 80 --flood --rand-source 192.168.50.224
HPING 192.168.50.224 (eth0 192.168.50.224): S set, 40 headers + 100 data bytes
hping in flood mode, no replies will be shown--- 192.168.50.224 hping statistic ---
2652818 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
根据 hping3 命令的输出,可以看到以下信息:
- 2652818 packets transmitted: 已传输的数据包数量,数据包使用的是TCP协议(S代表TCP SYN报文),每个数据包的大小为100字节。
- 0 packets received: 接收到的数据包数量为 0。
- 100% packet loss: 100% 的数据包丢失率。
- round-trip min/avg/max = 0.0/0.0/0.0 ms: 来回时间的最小、平均和最大值都为0毫秒
这表明发送的5000个数据包中没有一个被目标主机192.168.50.224接收,可能由于网络配置、防火墙或其他原因导致连接失败。
这个是对目标机器发起TCP泛洪攻击,目标的CPU使用率很高,因为要接收处理报文,即使只是过滤拦截。ksoftirqd/2 是 Linux 内核中的软中断处理程序,用于处理网络和I/O相关的软中断。具体而言,ksoftirqd/2 是软中断处理程序之一,其中的 /2 表示这是针对 CPU 2 的软中断处理程序。软中断是一种低优先级的中断处理 机制,用于处理那些不需要立即响应的中断。ksoftirqd 进程负责处理这些软中断请求,例如网络数据包的接收、网络协议栈处理等。
- ICMP泛洪攻击
类似于SYN泛洪攻击,只不过发送的数据包类型不同。
(base) [root@vm12_efficiency01_50_221 ~]# hping3 -c 50000 -d 100 -1 -C 5 -K 1 192.168.50.224
HPING 192.168.50.224 (eth0 192.168.50.224): icmp mode set, 28 headers + 100 data bytes--- 192.168.50.224 hping statistic ---
35 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
这表明在发送了50000个数据包后,目标主机192.168.50.224并没有接收任何数据包。可能由于网络配置、防火墙或其他原因导致连接失败。
根据 hping3 命令的输出,可以得到以下信息:
- 35 packets transmitted: 已传输的数据包数量
- 0 packets received: 接收到的数据包数量为 0
- 100% packet loss: 100% 的数据包丢失率
- round-trip min/avg/max = 0.0/0.0/0.0 ms: 来回时间的最小、平均和最大值都为 0 毫秒
3)mtr
托管:https://github.com/traviscross/mtr/tree/v0.85
官网:https://www.bitwizard.nl/mtr/
- 简介
mtr结合了“traceroute”和“ping”程序的功能。mtr运行在和用户指定的目标主机上。之后确定机器之间的每个网络跳的地址,它向每一个发送一个ICMP ECHO请求序列,以确定连接到每台机器的链路质量。当它这样做的时候,它会打印运行有关每台机器的统计信息。
ping命令通常是由操作系统提供的,包括在Linux系统中。ping命令用于测试与另一个主机的网络连接,并可以帮助确定网络是否正常工作以及网络延迟情况等。在Linux系统中,ping命令通常作为网络诊断工具的一部分,可通过终端运行来执行网络连通性测试。
traceroute命令通常也是由操作系统提供的,包括在Linux系统中。traceroute命令用于确定数据包从本地计算机到目标主机之间所经过的路由路径。它显示了数据包在路由器之间传输时经过的跳数和延迟时间。在Linux系统中,traceroute命令是网络诊断工具的一部分,可用于帮助诊断网络连接问题并分析网络路径。
Ping 和 Traceroute 都是网络诊断工具,但它们的功能和用途有一些区别:
- Ping:
功能:Ping 用于测试主机之间的连通性,通过发送 ICMP Echo Request 报文并接收 ICMP Echo Reply 报文来确认目标主机是否可达。
作用:主要用于检查主机是否在线、测量网络延迟和丢包率。
实现:Ping 是一个简单的工具,通常用于快速检查网络连接状态。 - Traceroute:
功能:Traceroute 用于确定数据包从源主机到目标主机之间经过的路由路径,显示每个路由器(跳)的 IP 地址以及延迟时间。
作用:主要用于诊断网络故障、分析网络路径和了解数据包传输的详细路径。
实现:Traceroute 会发送一系列特制的 ICMP 报文,并观察报文经过的路由器,帮助用户追踪网络路径。
总的来说,Ping 用于测试主机之间的基本连通性和响应时间,而 Traceroute 则用于跟踪数据包在网络中的传输路径。两者结合使用可以帮助定位网络问题并进行全面的网络诊断。
- ping命令
命令ping着重查看到目标节点的延迟。
# ping www.baidu.com
PING www.a.shifen.com (220.181.38.149) 56(84) bytes of data.
64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=1 ttl=51 time=19.0 ms
64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=2 ttl=51 time=19.9 ms
64 bytes from 220.181.38.149 (220.181.38.149): icmp_seq=3 ttl=51 time=17.9 ms
根据你运行的 ping www.baidu.com 命令的输出结果,我们可以看到与百度服务器(220.181.38.149)之间的 ICMP 回显请求和回显应答的信息。
每一行显示了从你的计算机向百度服务器发送 ICMP Echo Request 报文并接收 ICMP Echo Reply 报文的情况。以下是一些关键信息的分析:
- 数据包大小为 56 字节。
- 目标地址为 220.181.38.149,主机名为 www.a.shifen.com。
- 每次请求的 TTL(Time to Live)值为 51。
- 每个报文的延迟时间(time)在 17.9 ms 到 20.6 ms 之间变化。
根据输出结果可知: - 数据包成功发送到目标主机,并且目标主机正确地对这些数据包进行了响应。
- ICMP Echo Request 报文的 TTL 设置为 51,每次从源主机到目标主机的跳数不会超过 51 跳。
- 平均延迟时间大约在 19 ms 左右,表明网络连接相对良好,响应速度较快。
综合分析来看,通过 ping 命令可以测试主机之间的连通性并测量延迟时间。在这种情况下,连接到百度服务器的网络连接是正常的,并且数据包能够在较短的时间内往返。如果遇到网络问题或延迟增加,请进一步检查网络设备、路由器设置等方面。
- traceroute命令
命令traceroute可以查看数据包经过的每一个节点(或者说每一跳(hop))的信息。
# traceroute www.baidu.com
traceroute to www.baidu.com (220.181.38.149), 30 hops max, 60 byte packets1 gateway (192.168.50.1) 2.690 ms 2.821 ms *2 * * *3 * * *4 * * *5 * * *
这个输出显示了数据包从你的计算机到百度服务器(220.181.38.149)之间经过的路由路径的每一跳。每一行表示一个路由器,显示了该路由器的 IP 地址以及数据包经过该路由器时的延迟时间。
根据输出结果可以推断:
- 第1跳是位于本地网关(192.168.50.1),延迟时间约为 2.7 毫秒至 2.8 毫秒。
- 从第2跳开始,出现* * *,网络出现了无法获取响应的情况,可能是某些防火墙、路由器不返回 ICMP 报文所致。
- 在网络传输中,每一跳不仅可能是路由器的选择,还可能是防火墙、交换机或其他网络设备的选择。这些设备根据其配置和路由表信息来决定数据包的转发方式。
- 综合分析来看,如果网络连接正常且未受阻碍,理想情况下 traceroute 应该能够顺利显示每一跳的 IP 地址和延迟时间。由于一些跳没有返回信息,可能需要更深入的诊断来确定问题所在,比如设备配置或网络故障。如果你遇到网络连接问题,可以联系网络管理员或运营商进行进一步调查和解决。
05 网络抓包工具
1)Wireshark
为了安全考虑,wireshark只能查看封包,而不能修改封包的内容,或者发送封包。
wireshark是捕获机器上的某一块网卡的网络包,当你的机器上有多块网卡的时候,你需要选择一个网卡。windows系统一般是以太网、Linux一般是eth0
从上到下有几个区域:过滤条件、封包列表、封包信息、16进制、统计信息等等。
2)Burp Suite
Burp Suite Community Edition官网使用文档:https://portswigger.net/burp/documentation/desktop/getting-started/intercepting-http-traffic?utm_source=burp_suite_community&utm_medium=learn_tab&utm_campaign=onboarding
Burp Suite Community Edition这款是免费版本,一般都用这中版本。
使用内置的浏览器打开,执行普通的GET请求。
以下是抓包的记录。
06 位操作
1)位运算(原码 反码 补码)
2)位运算符
3)Java代码使用
short f1 = buffer.readUnsignedByte();
//取出最高位的值,0x80 = 1000 0000
boolean variableFlag = (f1 & 0x80) == 0x80;
//读取低7位的值,0x7F = 0111 1111
byte messageWay = (byte) (f1 & 0x7F);short v4 = buffer.readUnsignedByte();
//retain字段占据v4的高4位,因此可以通过右移4位来得到它的值。
int retain = v4 >> 4;
//dupFlag字段占据v4的第4位(从右往左数),因此可以通过与0x08进行按位与操作来判断它是否为1。
boolean dupFlag = (v4 & 0x08) == 0x08;
//qosLevel字段占据v4的第3和第2位,因此可以通过与0x06进行按位与操作后再右移1位来得到它的值。 0x06是16进制数,它的二进制表示为00000110,按位与第3和第2位会被保留下来,其余位都被置为0。
int qosLevel = (v4 & 0x06) >> 1;
//rewriteFlag字段占据v4的最低位,因此可以通过与0x01进行按位与操作来判断它是否为1。
boolean rewriteFlag = (v4 & 0x01) != 0;