信网实验2

基本操作

命令 ifconfig ens5image image

命令解释

ifconfig是一个用于配置和显示Linux操作系统网络接口信息的命令。当执行ifconfig ens5命令时,它会显示ens5网络接口的配置信息,包括IP地址、子网掩码、MAC地址、数据包统计等。

IPv6 连接:

HostA 的终端 1 中执行 `sudo tcpdump -vxn host HostA 的 IPv6(ens5 scope:link) 地址 and S 的 IPv6(ens5 scope:link)地址 -i ens5`。

HostA 的终端 2 中执行 `ping6 -c 1 S 的 IPv6(ens5 scope:link)地址%ens5`。

image

image image

命令解释

  1. sudo tcpdump -vxn host HostA 的 IPv6(ens5 scope:link) 地址 and S 的 IPv6(ens5 scope:link)地址 -i ens5 这个命令的作用是使用tcpdump工具来捕获指定主机HostA和另一台主机S之间通过ens5网络接口的IPv6通信数据包。其中-v选项表示以详细模式显示数据包信息,-x选项表示以十六进制和ASCII形式显示数据包内容,-n选项表示以数字形式显示地址而不进行地址解析,-i ens5表示指定监听的网络接口为ens5。

  2. ping6 -c 1 S 的 IPv6(ens5 scope:link)地址%ens5 这个命令的作用是向指定的IPv6地址发送一个ICMPv6 Echo Request数据包,以测试与目标主机S的连通性。其中-c 1表示只发送一个数据包,S 的 IPv6(ens5 scope:link)地址表示目标主机S的IPv6地址,%ens5表示指定使用ens5网络接口发送数据包。

结果

【实验要求】:此步骤需要记录终端 1 中抓到的 2 个报文数据,表明哪个是请求报文,哪个是回复报文。根据 IPv6 协议报文格式分析上述 tcpdump 抓包结果,要求画出 IPv6 以及 ICMPv6 的基本报头结构并将各个字段分别填入其中 (例如 IP 协议版本、源地址和目的地址、源端口和目的端口、报文含义等)。对这个报文的含义加以解释。

第一个报文是请求报文,第二个报文是回复报文。

第一个报文的IPv6报头如下:

1
2
3
4
5
6
7
8
Version: 6
Traffic Class: 0
Flow Label: 0
Payload Length: 64
Next Header: ICMPv6 (58)
Hop Limit: 64
Source Address: fe80::f816:3eff:fea7:a942
Destination Address: fe80::f816:3eff:fee7:f7b3
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
+-------------+----------------+------------+------------------+
|  Version    | Traffic Class  | Flow Label | Payload Length   |
+-------------+----------------+------------+------------------+
|      6      |        0       |      0     |        64        |
+-------------+----------------+------------+------------------+
| Next Header |   Hop Limit    | Source Address                |
+-------------+----------------+-------------------------------+
|     58      |       64       | fe80::f816:3eff:fea7:a942     |
+---------------+----------------+-----------------------------+
|               Destination Address                            |
+--------------------------------------------------------------+
|               fe80::f816:3eff:fee7:f7b3                      |
+--------------------------------------------------------------+

ICMPv6报头如下:

1
2
3
4
5
Type: ICMPv6 Echo Request (128)
Code: 0
Checksum: 0x158e
Identifier: 0x0001
Sequence Number: 1

第二个报文的IPv6报头如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
+-------------+----------------+------------+------------------+
|  Version    | Traffic Class  | Flow Label | Payload Length   |
+-------------+----------------+------------+------------------+
|      6      |        0       |      0     |        64        |
+-------------+----------------+------------+------------------+
| Next Header |   Hop Limit    | Source Address                |
+-------------+----------------+-------------------------------+
|     58      |       64       | fe80::f816:3eff:fee7:f7b3     |
+---------------+----------------+-----------------------------+
|               Destination Address                            |
+--------------------------------------------------------------+
|               e80::f816:3eff:fea7:a942                       |
+--------------------------------------------------------------+

ICMPv6报头如下:

1
2
3
4
5
Type: ICMPv6 Echo Reply (129) 
Code: 0 
Checksum: 0x0506 
Identifier: 0x0001 
Sequence Number: 1

根据ICMPv6报文的类型和代码,可以判断第一个报文是ICMPv6 Echo Request报文,第二个报文是ICMPv6 Echo Reply报文。

ICMPv6 Echo Request报文用于请求对端发送Echo Reply报文。第一个报文的源地址是fe80::f816:3eff:fea7:a942,目的地址是fe80::f816:3eff:fee7:f7b3。序列号为1,表示这是第一个请求报文。

ICMPv6 Echo Reply报文用于响应ICMPv6 Echo Request报文。第二个报文的源地址是fe80::f816:3eff:fee7:f7b3,目的地址是fe80::f816:3eff:fea7:a942。序列号为1,表示这是对第一个请求报文的响应 上述tcpdump抓包结果表明,两个主机之间正在进行ICMPv6 Echo测试。

路由器公告报文

路由器公告报文的目的地址为 IPv6 组播地址中的“全节点地址”,它的地址是FF02::1,可用 tcpdump 侦听路由器公告报文。HostA 中另开一个终端 3 用于侦听路由器公告报文,命令为:

sudo tcpdump –vxn host ff02::1 -i ens5

【实验要求】记录 HostA 的终端 3 中 tcpdump 抓包得到的数据。由于路由器公告报文的发送有一定地周期,因此这里可能需要等待较长时间,可以把终端 3 最小化继续进行其他实验,等有结果后记录抓包得到的数据。如仍未顺利抓到此包,也可以参考附录中的图 4 回答下述问题。根据 tcpdump 抓取到的报文数据说明路由器通告报文通告了哪些信息并简单解释网络中的其它主机将会如何使用这些信息?

命令解释

这个命令的作用是使用tcpdump工具来捕获发送到IPv6组播地址ff02::1的数据包,该地址是IPv6中的所有节点组播地址。其中-v选项表示以详细模式显示数据包信息,-x选项表示以十六进制和ASCII形式显示数据包内容,-n选项表示以数字形式显示地址而不进行地址解析,-i ens5表示指定监听的网络接口为ens5。

结果

根据 tcpdump 抓取到的报文数据,路由器通告报文通告了以下信息:

  • 源地址:fe80::f816:3eff:fee6:e881
  • 目标地址:ff02::1
  • 路由前缀:2001:db8:85a3::/64
  • 生命周期

网络中的其它主机将会使用这些信息来进行以下操作:

  • 获取路由信息:主机可以使用路由前缀信息来构建自己的路由表,从而能够将数据包发送到目的网络。
  • 自动配置地址:如果路由器通告了 M 比特为 1,则主机将使用 DHCPv6 服务来获取 IPv6 地址。
  • 启用 IPv6 邻居发现:主机可以使用路由器通告中的链路层选项来启用 IPv6 邻居发现。

地址解析

地址解析的目的是通过对端的 IP 获取对端的 MAC 地址。由于地址解析过程会在数据发送前自动进行,因此需要先用 tcpdump 侦听,再 ping 对端,即可观察到NS 和 NA 报文。

HostA 的终端 1 执行命令 sudo tcpdump -vxn host HostA 的 IPv6(ens5 scope:link) 地址 -i ens5 HostA 的终端 2 执行命令 ping6 -c 1 HostB 的 IPv6(ens5 scope:link)地址%ens5。 image

命令解释

sudo tcpdump -vxn host HostA 的 IPv6(ens5 scope:link) 地址 -i ens5 这个命令的作用是使用tcpdump工具来捕获发送到特定IPv6地址(HostA的IPv6地址,ens5接口,scope为link)的数据包,其中-v选项表示以详细模式显示数据包信息,-x选项表示以十六进制和ASCII形式显示数据包内容,-n选项表示以数字形式显示地址而不进行地址解析,-i ens5表示指定监听的网络接口为ens5。

ping6 -c 1 HostB 的 IPv6(ens5 scope:link)地址%ens5。 这个命令的作用是向指定的IPv6地址(HostB的IPv6地址,ens5接口,scope为link)发送一个ICMPv6数据包,-c 1表示只发送一个数据包。在IPv6地址后面加上%ens5是为了指定数据包通过ens5接口发送。

结果

image

image image

【实验要求】:记录 HostA 的终端 1 中观察到邻居请求 (NS) 和邻居通告 (NA) 报文。根据抓取到的报文数据说明邻居请求及邻居公告报文通告了哪些信息,这些信息有什么作用?

从抓取到的报文数据来看,邻居请求 (NS) 报文通告了以下信息:

  • 源地址:fe80::f816:3eff:fea7:a942
  • 目标地址:fe80::f816:3eff:fee7:1aea
  • 请求类型:Who has

这些信息用于查询目标地址的邻居节点。

邻居通告 (NA) 报文通告了以下信息:

  • 源地址:fe80::f816:3eff:fee7:1aea
  • 目标地址:fe80::f816:3eff:fea7:a942
  • 链路层地址:fa:16:3e:5b:1a:ea
  • 可达性:可达 这些信息用于告知源地址,目标地址是可达的,并且目标地址的链路层地址是 fa:16:3e:e7:f7:b3。

TCP 三次握手

netcat 可以在主机间建立 TCP 连接,建立连接时,可以用 tcpdump 对 报文抓包,观察到 TCP 的三次握手过程。

首先在 S 的终端 1 中执行 nc -l 1958 侦听 1958 端口。

之后在 HostA 的终端1 执行 sudo tcpdump -vxn host HostA 的 IPv4(ens5) 地址 andS 的 IPv4(ens5) 地址 -i ens5

在HostA 的终端2 执行 nc S 的IPv4(ens5)地址 1958

image

命令解释

  • nc -l 1958:这个命令使用nc(netcat)工具在本地监听1958端口,等待接收数据。
  • sudo tcpdump -vxn host HostA 的 IPv4(ens5) 地址 andS 的 IPv4(ens5) 地址 -i ens5:这个命令是用来使用tcpdump工具来捕获网络数据包的命令。其中"-v"表示详细模式,"-x"表示以十六进制和ASCII格式显示数据包,"-n"表示以数字形式显示地址,"-i ens5"表示监听网络接口ens5上的数据包。“host HostA 的 IPv4(ens5) 地址 andS 的 IPv4(ens5) 地址"这部分应该是要指定要捕获的数据包的源和目标主机的IP地址。
  • nc S 的IPv4(ens5)地址 1958:这个命令使用nc(netcat)工具来连接到指定的IPv4地址的主机的1958端口。

结果

image

【实验要求】:完整记录 HostA 的终端 1 中观察到的前三个报文,即 TCP 握手报文。标注出每个报文的类型(SYN、SYN/ACK、ACK)。简要说明 TCP 协议采用三次握手的原因。说明实验中为何无法抓到 RST 包?请问编写应用程序时我们是否需要处理这些报文,为什么?

TCP 协议采用三次握手的原因

  • 确保连接的建立是可靠的。
  • 避免已建立的连接被重复建立。
  • 避免连接被恶意攻击。

在三次握手的过程中,双方主机各发送一个 SYN 报文,然后再各发送一个 ACK 报文。这样,双方主机就可以确认对方是可靠的,并且连接是可靠的。

实验中无法抓到 RST 包的原因

在实验中,HostA 和 HostB 建立了 TCP 连接,并开始传输数据。如果 HostA 或 HostB 想要终止连接,则会发送 RST 包。但是,由于实验中我们没有终止连接,因此无法抓到 RST 包。

如果 HostA 发送了一个无效的 TCP 报文,或者 HostB 拒绝建立连接,则 HostB 可能会发送 RST 包来终止连接。在这种情况下,可以通过 tcpdump 来抓到 RST 包。

编写应用程序时是否需要处理这些报文

编写应用程序时,通常不需要直接处理 TCP 握手报文。应用程序可以通过调用系统 API 来建立和管理 TCP 连接。

隧道

注意 隧道删除命令为 ip tunnel del 隧道名称,若添加隧道命令打错可用此命令删除后重建。

打开两个 Host 虚拟机并各打开一个终端

在 HostA 的终端上执行命令:

sudo ip tunnel add sit1 mode sit remote HostB 的 IPv4 地址 local HostA 的 IPv4 地址 dev ens5(IPv4 地址可以由命令 ifconfig ens5 获得)

sudo ip link set sit1 up

ip link show up【记录结果,此时可以看到名字为 sit1 的设备】 image

sudo ip addr add 3ffe:3216:2101:2106:1234::A/80 dev sit1

ip tunnel show【记录结果】 image

命令解释

  • sudo ip tunnel add sit1 mode sit remote HostB 的 IPv4 地址 local HostA 的 IPv4 地址 dev ens5:该命令用于创建一个名为 sit1 的隧道接口,该隧道接口的模式为 SIT,远程端地址为 HostB 的 IPv4 地址,本地端地址为 HostA 的 IPv4 地址,隧道接口绑定的物理接口为 ens5。

  • sudo ip link set sit1 up:HostA 已经创建了名为 sit1 的隧道接口,但该隧道接口处于禁用状态。通过执行该命令,将 sit1 隧道接口置为启用状态。

  • ip link show 命令用于显示系统的网络接口信息,包括其当前状态。up 选项只显示当前已启用的网络接口。

  • sudo ip addr add 3ffe:3216:2101:2106:1234::A/80 dev sit1 :该命令用于将 IPv6 地址 3ffe:3216:2101:2106:1234::A 分配给隧道接口 sit1,前缀长度为 80

  • ip tunnel show 用于显示系统中所有隧道接口的信息。

在 HostB 的终端上执行命令:

sudo ip tunnel add sit1 mode sit remote HostA 的 IPv4 地址 local HostB 的 IPv4 地址 dev ens5(IPv4 地址可以由命令 ifconfig ens5 获得)

sudo ip link set sit1 up

ip link show up【记录结果,此时可以看到名字为 sit1 的设备】 image sudo ip addr add 3ffe:3216:2101:2106:1234::B/80 dev sit1

ip tunnel show【记录结果】 image

命令解释

  • sudo ip tunnel add sit1 mode sit remote HostA 的 IPv4 地址 local HostB 的 IPv4 地址 dev ens5 用于创建一个名为 sit1 的隧道接口。该隧道接口使用 SIT 模式,远程端地址为 HostA 的 IPv4 地址,本地端地址为 HostB 的 IPv4 地址。隧道接口绑定到物理接口 ens5

  • sudo ip link set sit1 up :通过执行该命令,将 sit1 隧道接口置为启用状态。

  • ip link show 命令用于显示系统的网络接口信息,包括其当前状态。up 选项只显示当前已启用的网络接口。

  • sudo ip addr add 3ffe:3216:2101:2106:1234::B/80 dev sit1 用于将 IPv6 地址 3ffe:3216:2101:2106:1234::B 分配给隧道接口 sit1,前缀长度为 80。

  • ip tunnel show 用于显示系统中所有隧道接口的信息。

在 HostA 上打开两个终端。

其中一个终端用 tcpdump 侦听报文,另一个终端用于 ping6。

  1. 首先在 HostA 的第 1 个终端中执行命令 sudo tcpdump -vxn -i sit1

  2. 其次在 HostA 的第 2 个终端中执行命令 ping6 –c 1 3ffe:3216:2101:2106 :1234::B,检查是否可以 ping 通,若不通则需要检查之前的步骤是否正确完成。 image

  3. 记录 HostA 的第 1 个终端中由 tcpdump 抓取的前两个报文。 image

  4. 关闭 HostA 的这两个终端并重新打开两个新的终端。

  5. 在 HostA 的第 1 个终端中执行命令 sudo tcpdump -vxn –i ens5

  6. 在 HostA 的第 2 个终端中执行命令 ping6 –c 1 3ffe:3216:2101:2106:1234::Bimage

  7. 记录 HostA 的第 1 个终端中由 tcpdump 抓取的前两个报文(可能要等一会儿)。 image

命令解释

  • sudo tcpdump -vxn -i sit1 用于捕获在隧道接口 sit1 上传输的网络数据包。

  • ping6 –c 1 3ffe:3216:2101:2106:1234::B该命令将向 IPv6 地址 3ffe:3216:2101:2106:1234::B 发送一个 ICMP 回显请求数据包。如果该地址可达,则目标主机将会响应一个 ICMP 回显应答数据包。

结果解释

【实验要求】:记录需要记录的实验数据。从报文结构上看,通过隧道通信与两个 IPv6 主机直接通信的区别是什么,即上述隧道通信的报文有什么特点?

通过隧道通信与两个 IPv6 主机直接通信的区别是什么:

  • 隧道通信的报文中,IPv6 头部包含了源地址和目标地址,以及隧道协议类型。两个 IPv6 主机直接通信的报文中,IPv6 头部只包含了源地址和目标地址。
  • 隧道通信的报文中,包含了隧道协议头部,用于描述隧道连接的相关信息。两个 IPv6 主机直接通信的报文中,没有隧道协议头部。