验证性实验

阶段一(ipconfig):

ipconfig是微软操作系统的计算机上用来控制网络连接的一个命令行工具。它的主要用来显示当前网络连接的配置信息(/all参数)。

ip地址:

ip地址(公网地址),每台机器的ip地址是唯一的,ip地址=网络地址+主机地址
例:
网络地址(街道地址):192.168.100.0
主机地址(门牌号):0.0.0.1
ip地址(住户地址):192.168.100.1
广播地址(最后一个住户地址+1):192.168.100.255

子网掩码:

用来判断两台计算机的ip地址是否属于同一子网络,用ip地址和子网掩码转换为二进制进行与运算求得网络地址

默认网关:

一台主机把数据包发给默认指定的网关,由它来处理数据包。

DNS服务器:

域名系统(Domain Name System),完成域名解析的工作,将域名和ip地址进行转换,方便机器识别ip地址。

ipconfig /?

在这里插入图片描述

实作一(查看自己计算机的网络配置):

学校WIFI ipconfig /all
在这里插入图片描述
寝室宽带 ipconfig /all
在这里插入图片描述
寝室WIFI ipconfig /all
在这里插入图片描述

实作二(查看旁边计算机的网络配置):

旁边计算机 学校WIFI
在这里插入图片描述
自己计算机 学校WIFI
在这里插入图片描述

问题:

你的计算机和旁边的计算机是否处于同一子网,为什么?

  • 处于同一子网,因为根据ip地址与子网掩码得到了相同的网络地址

阶段二(ping):

  • PING(Packet Internet Groper),因特网包探索器,用于测试网络连接量的程序。ping是工作在TCP/IP 网络体系结构中应用层的一个服务命令,主要是向特定的目的主机发送 ICMP(Internet Control Message Protocol 因特网报文控制协议)Echo 请求报文,测试目的站是否可达及了解其有关状态。
  • 向指定的网络地址发送一定长度的数据包,按照约定,若指定网络地址存在的话,会返回同样大小的数据包,当然,若在特定时间内没有返回,就是“超时”,会被认为指定的网络地址不存在。

实作一(ping www.cqjtu.edu.cn):

在这里插入图片描述
“字节=32”:ICMP报文中有32个字节的测试数据
“时间=10ms”:往返时间
“TTL=58”:在传输过程中最多经过58个路由器
“已发送=4”:发送4个包, “已接收=4”:收到4个回应包, “丢失=0”:没有丢失包
表示网络状态相当良好

实作二(ping /?):

在这里插入图片描述

TroubleShooting:

假设你不能ping通某计算机或IP,但你确定该计算机和你之间的网络是连通的,那么可能的原因是什么?该如何处理能保证ping通?

  • 当你的网络出现故障不能访问某计算机如14.215.177.39(百度的 IP 地址之一 )时,我们一般可采用由近及远的连通性测试来确定问题所在。现假设你的IP是192.168.1.89,你旁边计算机的IP是192.168.1.64,网关的IP是192.168.1.1,那么过程如下:
    1.ping 127.0.0.1,测试自己计算机的状态,如果OK,那么说明本机网络软件硬件工作正常,否则,问题在本机,检查本机TCP/IP配置即网卡状态等
    2.ping 192.168.1.64 ,测试到旁边计算机的连通性,如果OK,那么说明本子网内部工作正常,否则,问题在本机网络出口到交换机之间,检查本机网卡到交换机的连线等
    3.ping 192.168.1.1,测试到网关的连通性,如果OK,那么说明本子网出口工作正常,否则,问题在网关,这是你无能为力的事情,报告给网管
    4.ping 14.215.177.39,测试到百度的连通性,如果 OK,那就 OK,否则,问题在网关以外,这也是你无能为力的事情,报告给网管或者李彦宏?

TroubleShooting:

假设在秘籍中进行的网络排查中,ping百度的IP即ping 14.215.177.39没问题,但ping百度的域名即ping www.baidu.com不行,那么可能的原因是什么?如何进行验证和解决?另外,经常有同学问到的:“能上QQ,但不能上网” 跟这个问题的原因是相似的。

  • 域名ping不通说明域名解析不出来。负责解析域名的,就是DNS,首先清空一下DNS缓存,命令窗口ipconfig/flushdns然后设置电脑的DNS为google的DNS 8.8.8.8 或者电信的 101.226.4.6或者114.114.114.114大部分是可以的 如果还是Ping不通 则可联系给域名服务的服务商,他们会给出dns服务器。能上 QQ,但不能上网是因为QQ不需要DNS解析域名,DNS出问题不会影响QQ。

阶段三(tracert):

TRACERT(Trace Route 的组合缩写),也称为路由追踪,该命令行程序可用于跟踪 Internet 协议(IP)数据包传送到目标地址时经过的路径

实作一(tracert www.baidu.com):

在这里插入图片描述
10.160.255.254:本地网关 内网IP
172.19.2.2:上层网关 内网IP
222.176.9.97:重庆市 电信
219.135.96.106:广州市 电信
14.215.32.130:广州市 电信
14.215.177.38:广州市 电信 (百度有限公司广州分公司)

实作二(ping.pe):

在这里插入图片描述

问题一:

tracert能告诉我们路径上的节点以及大致的延迟等信息,那么它背后的原理是什么?

  • 通过向目标发送不同IP存活时间(TTL)值的“Internet控制消息协议(ICMP)”回应数据包,Tracert诊断程序确定到目标所采取的路由。要求路径上的每个路由器在转发数据包之前至少将数据包上的 TTL 递减1。数据包上的 TTL 减为 0 时,路由器将“ICMP 已超时”的消息发回源系统。 Tracert先发送 TTL 为 1的回应数据包,并在随后的每次发送过程将TTL递增 1,直到目标响应或 TTL 达到最大值,从而确定路由。通过检查中间路由器发回的“ICMP已超时”的消息确定路由。某些路由器不经询问直接丢弃 TTL 过期的数据包。

问题二:

在以上两个实作中,如果你留意路径中的节点,你会发现无论是访问百度还是棋歌教学网,路径中的第一跳都是相同的,甚至你应该发现似乎前几个节点都是相同的,你的解释是什么?

  • 因为无论是访问百度还是棋歌教学网,首先都要从本地出发,由于都是在重庆交通大学校内,因此都属于同一子网,首先都要经过同一交换机,因此会相同。

问题三:

在追踪过程中,你可能会看到路径中某些节点显示为 * 号,这是发生了什么?

  • 在某一次寻找下一节点时没有得到对方的响应,只能寻找另一出路。

阶段四(ARP):

ARP(Address Resolution Protocol)即地址解析协议,是用于根据给定网络层地址即 IP 地址,查找并得到其对应的数据链路层地址即 MAC地址的协议。 ARP 协议定义在 1982 年的 RFC 826。

实作一(arp -a):

在这里插入图片描述
缓存了默认网关和其他IP地址及其对应的物理地址

实作二(arp /?):

在这里插入图片描述

实作三(将默认网关设置为静态):

在这里插入图片描述

TroubleShooting:

你可能会在实作三的操作中得到 “ARP 项添加失败: 请求的操作需要提升” 这样的信息,表示命令没能执行成功,你该如何解决?

在这里插入图片描述
在这里插入图片描述
以管理员身份运行,并再次arp -a查看,发现已设置为静态
在这里插入图片描述

问题:

在实作三中,为何缓存中常常有网关的信息?

我们将网关或其它计算机的 arp 信息设置为静态有什么优缺点?

  • 缓存中记录着你访问过的地址信息,当然也包括网关。
    设置为静态可以防止ARP病毒的传播,但这种手工维护MAC表的方式不适用于移动或者经常变化的网络环境中。

阶段五(DHCP):

DHCP(Dynamic Host Configuration Protocol)即动态主机配置协议,是一个用于 IP 网络的网络协议,位于 OSI 模型的应用层,使用 UDP 协议工作,主要有两个用途:
用于内部网或网络服务供应商自动分配 IP 地址给用户
用于内部网管理员对所有电脑作中央管理
简单的说,DHCP 可以让计算机自动获取/释放网络配置。

实作一(ipconfig/release ipconfig/renew):

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题:

在Windows系统下,如果由于某种原因计算机不能获取 DHCP 服务器的配置数据,那么Windows将会根据某种算法自动配置为 169.254.x.x 这样的 IP 地址。显然,这样的 IP 以及相关的配置信息是不能让我们真正接入 Internet 的,为什么?既然不能接入 Internet,那么Winodws系统采用这样的方案有什么意义?

  • Windows根据算法自动配置的IP地址及相关配置信息只能短暂解决计算机不能获取 DHCP 服务器的配置数据的问题,要真正的接入Internet还是得查看本身计算机的正确IP地址。

阶段六(netstat):

无论是使用 TCP 还是 UDP,任何一个网络服务都与特定的端口(Port Number)关联在一起。因此,每个端口都对应于某个通信协议/服务。
netstat(Network Statistics)是在内核中访问网络连接状态及其相关信息的命令行程序,可以显示路由表、实际的网络连接和网络接口设备的状态信息,以及与 IP、TCP、UDP 和 ICMP 协议相关的统计数据,一般用于检验本机各端口的网络服务运行状况。

实作一(查看端口文件):

C:\WINDOWS\system32\drivers\etc\services
在这里插入图片描述

实作二(netstat -an):

在这里插入图片描述


阶段七(DNS):

DNS(Domain Name System)即域名系统,是互联网的一项服务。它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS 使用 TCP 和 UDP 的 53 号端口。

实作一(查看DNS信息):

C:\WINDOWS\system32\drivers\etc\hosts
在这里插入图片描述

实作二(ipconfig /displaydns):

在这里插入图片描述

实作三(nslookup qige.io):

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

TroubleShooting:

上面秘籍中我们提到了使用插件或自己修改 hosts 文件来屏蔽广告,思考一下这种方式为何能过滤广告?如果某些广告拦截失效,那么是什么原因?你应该怎样进行分析从而能够成功屏蔽它?

  • 修改hosts文件是指将某个网站重定向到一个地址,使之无法访问从而达到屏蔽广告的效果。如果某些广告拦截失效,首要原因是服务器设置了 keep-alive,次要原因是存在浏览器 DNS 缓存和系统 DNS 缓存。

阶段八(cache):

cache 即缓存,是 IT 领域一个重要的技术。我们此处提到的 cache 主要是浏览器缓存。
浏览器缓存是根据 HTTP 报文的缓存标识进行的,是性能优化中简单高效的一种优化方式了。一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网络负荷。

实作一:

在这里插入图片描述

实作二:

在这里插入图片描述
因此,我们得到结论,不使用cache缓存之后,网页加载速度会变慢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用 C 语言实现顺序栈和循环顺序队列的基本操作: 顺序栈的基本操作: 1. 初始化栈:创建一个空栈,并返回该栈的指针。 ``` #include <stdio.h> #include <stdlib.h> #define MaxSize 100 typedef struct Stack { int data[MaxSize]; int top; } Stack; Stack* initStack() { Stack* s = (Stack*)malloc(sizeof(Stack)); s->top = -1; return s; } ``` 2. 判断栈是否为空:如果栈为空,则返回 1,否则返回 0。 ``` int isEmpty(Stack* s) { if (s->top == -1) { return 1; } else { return 0; } } ``` 3. 入栈操作:将元素 x 压入栈顶。 ``` void push(Stack* s, int x) { if (s->top == MaxSize - 1) { printf("Stack is full!\n"); return; } s->data[++s->top] = x; } ``` 4. 出栈操作:弹出栈顶元素,并返回该元素。 ``` int pop(Stack* s) { if (isEmpty(s)) { printf("Stack is empty!\n"); return -1; } return s->data[s->top--]; } ``` 循环顺序队列的基本操作: 1. 初始化队列:创建一个空队列,并返回该队列的指针。 ``` typedef struct Queue { int data[MaxSize]; int front, rear; } Queue; Queue* initQueue() { Queue* q = (Queue*)malloc(sizeof(Queue)); q->front = q->rear = 0; return q; } ``` 2. 判断队列是否为空:如果队列为空,则返回 1,否则返回 0。 ``` int isEmpty(Queue* q) { if (q->front == q->rear) { return 1; } else { return 0; } } ``` 3. 判断队列是否已满:如果队列已满,则返回 1,否则返回 0。 ``` int isFull(Queue* q) { if ((q->rear + 1) % MaxSize == q->front) { return 1; } else { return 0; } } ``` 4. 入队操作:将元素 x 插入队尾。 ``` void enqueue(Queue* q, int x) { if (isFull(q)) { printf("Queue is full!\n"); return; } q->data[q->rear] = x; q->rear = (q->rear + 1) % MaxSize; } ``` 5. 出队操作:将队头元素弹出,并返回该元素。 ``` int dequeue(Queue* q) { if (isEmpty(q)) { printf("Queue is empty!\n"); return -1; } int x = q->data[q->front]; q->front = (q->front + 1) % MaxSize; return x; } ``` 以上是顺序栈和循环顺序队列的基本操作实现。可以通过自己编写测试代码进行验证

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值