《计算机网络——自顶向下方法》精炼——2.6.2-2.7.1

news2024/11/25 4:31:49

“An investment in knowledge pays the best interest.” - Benjamin

文章目录

  • 分布式散列表
    • (键-值)对
    • 散列函数
      • 逻辑上的实现
        • 环形DHT
        • 对等方扰动
          • 对等方离开
          • 对等方加入
  • UDP套接字编程
      • 客户端代码
      • 服务器端代码

分布式散列表

分布式散列表是一种数据库。集中式数据库采用客户-服务器模式,分布式数据库则有很多个对等方,每个对等方存储一部分(键-值)对。

(键-值)对

数据在数据库中以(键-值)对的方式进行存储。

  1. 键:相当于索引,某个对等方在查询数据时需要使用键来查询相对应的数据。
  2. 值:实际存储的数据。

在P2P结构中,每个对等方存储一部分(键-值)对,通过互相查询来获取数据。

散列函数

为了确定哪个对等方存储哪些数据以便查询,为每个对等方都分配了一个标识符,每个标识符都是[0,2n-1]中的一个数,这样可以很方便的用n位二进制数来表示。
接下来,我们用散列算法的方式计算出一个键所对应的标识符,并把这个键值对加入这个标识符所代表对等方的数据中。
我们使用的散列算法是:

将键对2n取模,得到一个在[0,2n-1]的值,寻找大于这个值的最小标识符,这就是这个键所对应的标识符。

举个例子:

若标识符范围在[0,15]范围内,有标识符为1,5,12,14四个对等方。要加入的键值对的键值为36,则:

  1. 36对16取模,结果为4.
  2. 大于4的最小标识符为5,则5是负责这个键值对的对等方.
  3. 将这个键值对传入

逻辑上的实现

在实际操作中,我们要做到让一个对等方想新增数据时确定谁是负责这个键值对的对等方,但要让每一个对等方都能与所有对等方直接联系从成本上就是不现实的,因此我们需要取巧。

环形DHT

我们在逻辑上将所有对等方连接成一个环:
在这里插入图片描述
在这个环中,对等方之间的链路称为覆盖链路,这是一种逻辑上的概念,在物理上它由许多不同链路和路由器组成。
一个环中的对等方只与它的后继结点和前任结点联系。我们用上图的例子来说明这个DHT是怎么工作的:

  1. 3想知道谁负责11,它向4发送询问报文。
  2. 4知道5更接近键值,于是向5发送询问报文
  3. 一直重复这个过程,直到12收到查询报文,发现它就是大于键值的最小对等方,于是它向3发送一个报文,说明自己负责11

这个结构的弊端就是发送报文的数量太多,可能给网络带来压力,为了协调连接成本和发送报文的成本,我们加一些“捷径”。如下图,如果1想询问11是谁负责,它发现它可以直接联系到5,从5再向后依次询问,这样就可以跳过3和4.
加粗样式

对等方扰动

对等方加入和离开时会产生对等方扰动,我们思考DHT怎么处理这种扰动。处理扰动的方式有点类似于链表的思想。

对等方离开

每个对等方都知道它的第一个后继和第二个后继。

  1. 当它的第一个后继离开时,它将它的第二个后继设为第一个后继,并询问这个后继的后继,以得到新的第二个后继。
  2. 当它的第二个后继离开时,它询问它第二个后继的后继,以得到新的第二个后继。
对等方加入
  1. 若对等方13想加入该DHT,它能联系到1,于是它询问1以得到13的前任和后继
  2. 假如12和14在DHT中,那么1将报文发送到12,12知道它是13的前任,并告知14它是13的后继。
  3. 12给13发送报文,告知它13的后继和前任,13加入DHT,将14设为它的后继,同时12将13设为他的后继。

UDP套接字编程

编写一个网络程序时,在应用层上有两种选择:

  1. 我们可以使用FTP、HTTP等实现在协议标准中的协议,这时我们需要使用协议标准中规定的端口号;
  2. 我们也可以使用自己编写的应用层协议编写网络程序,这个时候就要避免使用协议标准中规定的端口号。

接下来,我们要做的第一件事就是确定所使用的运输层协议,即TCP/UDP。我们先看使用UDP的情况,即UDP套接字编程。

一个网络程序应用包含两部分,客户程序和服务器程序。下图表示了客户和服务器之间的交互过程:
请添加图片描述
从客户视角来看,它只是从套接字处送出去和拿到了数据;从服务器视角来看也是如此,因此我们编写程序时也要保证视角中只有应用层和套接字。运输层的操作由协议自动进行。接下来用一个例子介绍实际代码,这个代码中客户将一串字符送到服务器,服务器将这串字符的大写版本送回客户。

客户端代码

下图是应用程序客户端的代码:
在这里插入图片描述

  1. socket模块行让我们能在程序中创建套接字
  2. serverName行提供了目的主机名(服务器名)或服务器IP地址,如果使服务器名,则自动使用DNS服务获取IP地址
  3. serverPort行提供了服务器端接收该报文的套接字。这一行和上一行共同指向了一个服务器端一个具体的进程。
  4. clientSocket行创建了一个客户端套接字,其中包含两个参数。
  • AF_INET指示网络层使用了IPv4网络
  • SOCK_DGRAM指示这是一个UDP套接字
  1. 这一行是python语法,将这个字符串放到变量message中
  2. 这一行指示套接字将要发送的数据发送给特定进程。
  • message是发送的数据
  • 第二个参数包含了服务器的IP地址和服务器的套接字,确定了一个具体进程作为目的进程
  1. 这一行的recvfrom()函数开辟长度为2048的缓存接收报文,并将报文的数据放入modifiedmessage,将源地址放入serverAddress。
  2. 这一行将modifiedmassage,也就是报文的数据打印到屏幕上。
  3. 关闭套接字,关闭进程。

服务器端代码

在这里插入图片描述
这里只介绍与客户端代码不一样的部分:

  1. 第四行将serverPort,即12000这个端口号分配给一个套接字,以便能用这个套接字接收特定进程的报文
  2. while循环让服务器每次处理完一个请求后回到recvfrom()函数行再次接收报文。
  3. 倒数第二行执行将字符串的所有字母改写成大写字母的指令。
    请添加图片描述
    我是霜_哀,在算法之路上努力前行的一位萌新,感谢你的阅读!如果觉得好的话,可以关注一下,我会在将来带来更多更全面的计网知识讲解!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NIO基础 - 网络编程

non-blocking io 非阻塞 IO 1. 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入…

STM32配置ADC2(DMA)进行采集 DAC 输出-1

1.实验目标 在正点原子的ADC(DMA)例程上,将ADC1改成ADC2来采集电压,并且进行测试 开发板:正点原子探索者STM32F407ZG 2.查看adc.h和开发指南需要修改哪些配置 ADC相关 通过查看开发指南我们发现,ADC1 和…

垃圾分类算法

垃圾分类算法 垃圾分类算法系统整体结构Python环境TensorFlow环境微信小程序及后台服务器环境数据预处理 垃圾分类算法 基于TensorFlow和VGG-16卷积神经网络训练垃圾分类模型,通过服务器实现分类模型移植到移动端,并在微信小程序中进行应用。 系统整体…

【ROS仿真实战】机器人模型描述文件介绍(二)

文章目录 前言一、URDF与XACRO简介1.1 URDF1.2 XACRO 二、三维模型的选择DAE还是STL?三、 总结 前言 URDF和XACRO是ROS机器人领域中用于描述机器人模型的两种XML格式文件,都是使用XML语法来定义机器人模型的结构、物理特性以及运动学参数等。URDF (Unif…

还在用MySQL存日志?

1. 引言 随着智能硬件成本降低和互联网网络的发展,在生活中场景的设备都已接入了网络中,其中传感器成为了设备获取外界信息的眼睛,网络成为设备交流的桥梁。在设备的交互中,往往存在着触发源,即标识控制指令的来源&am…

大型水利投资集团,打造数智财资管理新范式

随着我国城市化进程的不断推进,城市基础设施在国民经济中的作用愈加重要,其建设水平直接影响一个城市的竞争力。国有城投、水投等企业作为城市基础设施建设的主要参与者,其重要性不言而喻。随着国家、地方对基础设施重要性认识的加深以及政府…

第十章 游戏对象和组件访问

本节我们主要学习GameObject类,该类用于表示任何存在于场景中的游戏对象。这个类继承自Unity Object类(不是C#语言的Object类),我们可以理解这个Unity Object类是所有Unity的基类。这个Unity Object基类比较简单,我们很…

啃完这份笔记,18K妥妥的了......

大家好,最近有不少小伙伴在后台留言,得准备面试了,又不知道从何下手!为了帮大家节约时间,特意准备了一份面试相关的资料,内容非常的全面,真的可以好好补一补,希望大家在都能拿到理想…

MATLAB | 如何使用MATLAB绘制高度自定义的桑基图(sankey)

我之前也出过一个超简单的桑基图绘制函数,但是无法应对很多特殊情况,在这里我将其重构了一些写成了类,加了很多内置修饰函数,实现了流入流出数据不相等或者跨层数据流动的特殊情况绘制,首先展示一下使用我编写的函数能…

基于DSP+FPGA+ADS1282支持32Bit高精度数据采集方案(二)模拟电路设计

如图 4.1 所示是系统硬件系统的信号框图,数字信号处理板上的主要核心是 两个处理芯片,即 FPGA 和 DSP ,其中 FPGA 主要作用是做 DSP 和外围接口的 桥梁及数据预处理, DSP 做为数据解算核心。 FPGA 通过各种的数据总…

【C++初阶】类和对象(一)

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C初阶 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【C初阶】…

一文看懂低代码,5分钟从入门到原理全搞定

全球低代码市场已经走过了近20年,中国低代码市场近5年经历了百花齐放的广泛探索阶段,更旺盛的市场需求逐步在被激发。现在,让我们按下暂停键,看看这些产品给我们呈现了低代码市场一幅怎样的百景图。 低代码平台简介 广义上的低代…

[nesbot/carbon]轻松优雅的驾驭时间处理

简介 这个库的名字其实就很有意思:“carbon”,是化学元素的名字“碳”,为什么叫这个名字呢?在科学界,有一个"放射性碳定年法"的东西,是一种利用碳的同位素14C的放射性来对含有有机物质的物品进行…

废物,我TMD一个985却斗不过专科生(大厂自动化测试2年被裁)

前言 看到标题,可能很多读者朋友恐怕又要骂我了,985这个特殊的字眼也确实异常晃眼,实际上现在985,211也越来越多,它能代表你能够进入到更高的平台,拿到“高级工厂”的入场券,但并不意味着你会成…

每天一道算法练习题--Day14 第一章 --算法专题 --- -----------大话搜索

大话搜索 搜索一般指在有限的状态空间中进行枚举,通过穷尽所有的可能来找到符合条件的解或者解的个数。根据搜索方式的不同,搜索算法可以分为 DFS,BFS,A*算法等。这里只介绍 DFS 和 BFS,以及发生在 DFS 上一种技巧-回…

详解八大排序算法-附动图和源码(插入,希尔,选择,堆排序,冒泡,快速,归并,计数)

目录 🍏一.排序的概念及应用🍏 1.排序的概念 2.排序的应用 3.常用的排序算法 🍎二.排序算法的实现🍎 1.插入排序 1.1直接插入排序 1.2希尔排序(缩小增量排序) 2.选择排序 2.1直接选择排序 2.2堆排序…

LVS负载均衡群集部署—DR直接路由

目录 一、LVS-DR模式二、LVS-DR模式的特点三、LVS-DR中的ARP问题四、LVS-DR的优点与缺点五、为什么谁知lo:0而不是ens33:0六、LVS负载均衡群集-DR模式部署1.配置nfs共享(192.168.154.10)2.部署第一台nginx服务(192.168.154.11)3.部…

常用数据可视化对比类图表大全

优秀的数据可视化从来都不是罗列数据,更要根据自己的数据特征,设计出可以被读者轻松理解的图表。 图表类型有很多,选择正确图表的过程可能会让人混乱。本文将为您介绍数据可视化中比较类图表,以完美地表示您的数据并以最有效的方…

PostgreSQL安装和开启SSL加密连接【配置双向认证】

SSL单向认证和双向认证: SSL单向认证:只有一端校验对端的证书合法性,通常都是客户端来校验服务器的合法性。即在一般的单向认证中,只要求服务器端部署了ssl证书就行,客户端可以无证书,任何用户都可以去访问…

Rasa聊天机器人控制Python Turtle

背景 为了展示Rasa聊天机器人的使用效果以及如何将Rasa应用到业务系统中(这里将Python Turtle模块作为业务系统),用户将语音或者文本输入至Rasa,经过处理后调用Python Turtle的功能。 turtle库是Python语言中一个很流行的绘制图像的函数库,想…