网络与通讯
1. 说一说ARP
概念:ARP即地址解析协议(Address Resolution Protocol),是根据ip地址获取物理mac地址的一个TCP/IP协议,其基本功能就是通过目标设备的ip地址,查询目标设备的mac地址,以保证通信的顺利进行。
工作流程:
任何时候,一台主机有ip数据报文发送给另一台主机,都需要知道接收方的ip地址,但是ip地址必须封装成帧才能通过物理网落。意味着发送方必须有接收方的物理地址,因此需要完成ip地址到物理地址的映射。ARP协议接收来自ip协议的逻辑地址,将其映射为相应的物理地址,然后把物理地址交给数据链路层。
当主机发送信息时,会将包含目标ip地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此来确定目标的物理地址。
ARP响应,网络中的每一台主机都会接收并处理ARP请求报文,然后进行验证,查看接收方的ip地址是不是自己的地址。只有验证成功的主机才会返回一个ARP响应报文,这个响应报文包含接收方的ip地址和物理地址。该报文利用收到的ARP请求报文中的请求方物理地址以单播的方式直接发送给ARP请求报文的发送方。
硬件类型 | 协议类型 | |
硬件长度 | 协议长度 | 操作码(请求:1,响应:2) |
源mac地址 | ||
源ip地址 | ||
目的mac地址 | ||
目的ip地址 |
应用:
(1)ARP命令:ARP缓存中包含一个或多个表,用于存储ip地址及其经过解析的mac地址。ARP命令用于查询本机ARP缓存中ip地址->mac地址的对应关系、添加或删除静态对应关系等。
(2)ARP欺骗:ARP地址转换表是依赖于高速缓冲存储器动态更新,而其更新是受到周期的限制,只保存最近使用的地址映射关系表项,这就给了攻击者有机可乘,在高速缓冲存储器更新表项之前修改地址转换表,实现攻击行为。ARP欺骗会导致目标计算机与网关通信失败,或导致通信重定向,造成安全隐患。
2. 讲一下RARP
(1)概念
RARP(reverse address resolution protocol) :反向地址转换协议,以和ARP相反的方式工作,RARP发出要反向解析的Mac地址并希望返回其对应的ip地址,应答包括由能够提供所需信息的RARP服务器发出的ip地址。
(2)工作原理
- 发送主机发送一个本地的RARP广播,在此广播包中,声明自己的Mac地址并请求任何收到此请求的RARP服务器分配一个ip地址;
- 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该Mac地址对应的ip地址;
- 如果存在,RARP服务器就给源主机发送一个响应数据包并将此ip地址提供给对方主机使用;
- 如果不存在,RARP服务器对此不作任何响应;
- 源主机收到从RARP服务器的响应信息,就利用得到的ip地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败。
(3)工作过程
- 网络上的每台设备都会有一个独一的硬件地址,通常是由设备厂商分配的MAC地址。PC1从网卡上读取MAC地址,然后在网络上发送一个RARP请求的广播数据包,请求RARP服务器回复该PC的IP地址。
- RARP服务器收到了RARP请求数据包,为其分配IP地址,并将RARP回应发送给PC1。
- PC1收到RARP回应后,就使用得到的IP地址进行通讯。
3. 请你说说多通信网,以及对各种技术的了解程度
在某些特殊领域情况下,主管单位和下属单位之间没有统一的网络结构,分别隶属于几个物理上互不连通的网络。使这些不同的网络通信顺畅,解决方法就是使用一个或几个路由器来连接这些网络从而实现多网络的互连通信,达到数据的交换和处理的目的。
对于目前的多网通信,路由、交换与远程访问技术是三大支撑技术体系:
(1)路由技术
路由技术所采用的路由协议工作在OSI参考模型的第三层-网络层,作用主要是通信子网中路由数据包。路由器将数据包接收并缓存,然后根据数据的目的地查询路由表,并根据路由表中的信息,分析其代价,最后选择一条最佳的路径将信息发送出去。
路由的转发过程,主要流程包括线路输入、包头分析、数据存储、包头修改和线路输出,模块通常包括数据交换网络、控制网络、接口处理节点、路由处理器和管理模块。
(2)交换技术
传统的数据交换发生在数据链路层,交换技术识别数据帧中的mac地址信息,根据mac地址进行转发,并将这些mac地址与对应的端口,记录在内部的mac地址表中。而在大规模局域网中,为了减小广播风暴的危害,必须把大型局域网按功能或地域等因素划分成多个小局域网,这样会导致不同子网间的大量互访,传统的交换技术无法实现,所以目前主流的是将传统交换机和路由技术结合的新技术:路由交换机,该技术能够使路由模块与需要路由的其他模块间高速交换数据,突破了传统的外界路由接口速率的限制。
多网络通信,从硬件结构上来说,作为服务器的计算机上有多块网卡并存,每一个网卡需要分配一个不同网段的ip地址,以连接不同的网络。多通信网系统此时相当于一个星型结构的信息中枢,各个节点的通信需要通过中枢转达,结构框架可由下图表示:
4. 请你用游程编码写一个算法
概念:又称为行程编码(run length encoding),主要思路是将一个相同值的连续串用一个代表值和串长来代替。例如,有一个字符串“aaabccddddd”,经过游程编码之后可以用“3a1b2c5d”来表示。对图像编码来说,可以定义沿特定方向上具有相同灰度值的相邻像素为一轮,其延续长度称为延续的行程,简称为行程或游程。例如,若沿水平方向有一串M个像素具有相同的灰度N,则行程编码后,只传递2个值(N, M)就可以代替M个像素的M个灰度值N。
游程编码:
(1)定义结构体
C++:
struct RLEstru { uchar runLength; // 行程,代表相同元素的个数 uchar codeLen; // 该元素的编码长度 short RLEValue; // 元素值 };
每次从文件中读取元素值进行编码,编码相同元素的个数不超过16个,若多于16个,则将当前元素值及游程16保存为一个编码项struct RLEstru,然后重新计数游程。
(2)编码
Rust:
const uchar MAXRUNLENGTH = 16; //最大允许行程 uint runLength = 1; //行程长度 for (int i=0; i<数据量-1; i++) { //相邻元素相同 if (前一元素 == 下一元素 && runLength <= MAXRUNLENGTH) { runLength++; } //相邻元素不同 else { struct RLEstru[RLECount].RLEValue =前一元素; struct RLEstru[RLECount].runLength = runLength; struct RLEstru[RLECount].codeLen =前一元素的编码长度; RLECount++; //该块数据编码后的struct RLEstru个数 runLength = 1; } } //边界处理 struct RLEstru[RLECount].RLEValue = 最后一个元素; struct RLEstru[RLECount].runLength = runLength; struct RLEstru[RLECount].codeLen =最后一个元素的编码长度; RLECount++;
(3)输出
一块数据编码完成后,首先将该部分数据编码后的struct RLEstru个数RLECount写入文件,然后将编码后的数据写入文件。重复编码直到所有数据处理完。
(4)解码
- 读取struct RLEstru个数RLECount;
- 读取RLECount * sizeof(struct RLEstru)字节数据;
-
解码
Plain Text:int blockDataCount = 0; //解码数据个数计数 for (int i=0; i<RLECount; i++) { for (int j =0; j<编码数据[i].runLength; j++) //当前元素的行程 { 解码数据[blockDataCount] = 编码数据[i].RLEValue; blockDataCount ++; } }