网络通信基本原理

news2025/7/19 10:13:38

通讯的必要条件

  • 主机之间需要有传输介质。光纤、蓝牙、wify
  • 主机上必须有网卡设备。把二进制信息转为高低电压的过程就是数据的调制过程。把电信号转为二进制信息的过程为解调制。
  • 主机之间需要协商网络速率。
    在这里插入图片描述

网路的通讯方式

日常生活中,我们通讯的方式不可能只有两台主机,如何建立多台主机互连,假如要与十台电脑通讯,那么不可能去买一台有十个网卡的主机,所以这个时候就可以通过交换机路由器完成这个事情。

如何建立多台主机互连?如何定位局域网中的其它主机?

通过交换机我们可以将多台电脑进行连接。
a主机将消息发送给交换机,交换机将消息广播给其他主机,在这个过程中其他机器都会收到这条消息,然后b主机就通过MAC地址发现a想找的是自己,而其他的主机就会将这条消息当作垃圾丢弃。这个过程就是通过交换机来完成局域网通信的操作。
在这里插入图片描述

通过交换机来完成局域网通信有哪些问题?

通过交换机来完成局域网通信是无法满足互联网的需求。比如说我们不可能将所有电脑都放在一个局域网内,因为交换机的接口数量是有上限的,而且如果我们把所有机器放在一个局域网里,那么这个时候广播风暴就会尤为明显!因为任意一条消息的发送都会被其他主机所接收,然后还要确认是否有效。基于这种情况,网路就被分为许多较小的局域网,然后就是城域网,最后是互联网。
在这里插入图片描述

如何解决?

我们现在能访问百度,但是百度并不在局域网内,所以我们与百度的主机分属于不同的局域网,那这两个局域网之间该如何建立通讯呢?这里我们就需要用来路由器来进行数据的交换了。首先我们的电脑要去访问百度的主机,我们不仅需要知道百度的网卡地址,还需要知道它在哪个网络里,这块就需要用到ip地址了。这里要说明的是,我们数据在发送的时候不仅只有程序代码所接收到的数据,还有原mac地址、原ip地址和目标mac地址、目标ip地址等等。这些内容呢首先会被组装成一条大的数据,之后再发送到路由器上,路由器是可以识别当前要找的主机它在不在这个局域网内。如果说它不在当前的局域网内,这个时候他会按照路由表上的信息去帮助我们通过网络路由来找到对应的网络,之后再去把数据发送过去。发送到对应的网络之后,由那边的交换机完成定位功能。那这样的话我们就通过了路由器实现了不同网络之间的主机通讯。
在这里插入图片描述

网络层次模型

对于网络通信来说它是一个复杂的工程,它需要有很多的基础硬件设备,而这些设备又有很多的厂商在进行生产,所以为了方便网络的实施与管理维护就会有相应的组织来推出相应的标准规范 。目前最常见的就是OSI七层模型和TCP、IP的四层模型。TCP、IP是建立在OSI之上的另外四种模型。无论我们采用的哪一种模型,它其实都是对通信的过程进行分层,然后每层当中也存在很多的协议。例如我们常用的http就属于应用层的协议,而tcp和udp就属于传输层的协议。下面就以OSI为例来介绍它的七层分层以及每一次做了哪些事情。它的作用就是更加清晰规范的完成网络通讯。
这里主要掌握分层的目的,七层的名称和作用,还有就是一些常见的协议名称

OSI七层模型

  • 应用层: 用户与网络的接口
    • 利用http协议完成网站服务
    • 利用ftp协议完成文件的传输服务
    • 利用ssh协议完成远程登陆服务
  • 表示层: 数据加密、转换、压缩
  • 会话层: 控制网络连接建立与终止
  • 传输层:保证数据传输的可靠性
    • 在封装的时候还会携带目标占用的端口号,例如访问网站的时候会携带80端口
  • 网络层: 通过路由来找到目标网络
    • 常见的就是ip协议,让我们根据ip地址来确定源和目标的网络
  • 数据链路层:确定目标主机
    • 这一层就是确定了目标网路并进入了某一个局域网内
  • 物理层: 各种网络物理设备和标准
    数据从A至B,先封装再解封

TCP IP四层模型

  • 应用层
    • 就是将OSI的应用层、表示层、会话层合并
  • 传输层
    • 就是OSI的传输层
  • 主机层
    • 就是OSI的网络层
  • 接入层
    • 就是将OSI的数据链路层、物理层合并

数据从A到B

  • 按照分层自上向下一层一层封装
  • 到了B主机的网卡协调之后,再按照自下向上的顺序进行拆解
  • 最后在应用层里拿到A主机所发送过来的数据

数据封装与解封的过程

  • 第一步在应用层产出需要使用的数据data
    在这里插入图片描述
  • 然后data数据就传向了传输层。在这一层对于我们来说最熟悉的就是TCP与UDP协议,这两个协议都是基于端口的,而端口的作用就是在主机上用于确定唯一一个应用进程。所以数据在这层就会包裹上目标应用端口和应用在当前主机上的源端口
    在这里插入图片描述
  • 数据再传到网络层,因为我们的主机是在不同的网络里的,所以需要通过IP协议来确定目标主机所在的网络。因此数据在这一层中会包裹目标主机的mac地址、目标主机的ip地址和当前主机的源ip地址。有了这些地址之后我们只是能确定某一个网络,并不能确定在这个网络里边那一台机器是我们想要的,所以接下来数据就到达了链路层
    在这里插入图片描述
  • 在这一层主要是通过mac地址来完成寻址操作,所以数据在这一层会被包裹目标主句的mac地址与当前主机的mac地址。至此一条具备完整信息的数据就封装ok了。
    在这里插入图片描述
  • 这个时候就要传递给网络了,而我们知道网线是不能识别二进制的,所以经过物理层(网卡)的调制之后就会变成高低电压,而我们这里任然是已二进制的数据来表示转换之后的数据,有了高低电压之后经过网络路由器的分配和传输介质的运输,最终就到达了目标主机的网卡。
    在这里插入图片描述
  • 这个时候它首先要去做数据的解调,将电信号变成二进制,然后再向上层传递至链路层
    在这里插入图片描述
  • 到达链路层之后它就去分析一下,目标的mac地址是不是当前主机的mac地址,如果是则继续向上传递至网络层
    在这里插入图片描述
  • 在这层就要去校验目标的ip是不是当前自己的ip,如果是,则继续拆包。向上传输至传输层
    在这里插入图片描述
  • 这里再次确定当前的端口是不是自己,如果是的话,则再次拆解数据,向上传递至应用层
    在这里插入图片描述
  • 到了应用层之后,当前网络里的目标应用就拿到了另外一个网络当中的某一台主机上的某一个应用所传递过来的数据。 这个过程就是数据在通讯过程中的封装与解封的步骤。
    在这里插入图片描述

TCP三次握手的建立与四次挥手的过程

TCP协议

  • TCP 用于处理实时通信
  • TCP是基于端口,面向连接的传输层协议
  • TCP的握手和挥手本质上都是四次,只不过握手合并成三次。因为主机之间要想通信需要先建立双向数据通道
  • TCP的主要特点是传输稳定性高,但是在传输效率上相对于UDP要低
    在这里插入图片描述

创建控制字段

  • SYN = 1 表示当前主机请求建立连接
  • FIN = 1 表示当前主机请求断开连接
  • ACK = 1 表示数据信息确认

TCP三次握手

  • 这里以CS网络架构为例,第一次客户端向服务端发送一个建立连接的请求(用SYN=1表示)在这里插入图片描述
  • 服务端接收到这个请求之后回送一条消息表示接收到了这个请求(用ACK=1表示)。到这一步就建立了一条由客户端向服务端的连接通道,而服务端要向客户端建立通道,同样需要建立连接。在这里插入图片描述
  • 服务端发送一个请求给客户端,表示它也想建立一个连接(同样用SYN=1来表示)
    在这里插入图片描述
  • 同样客户端也需要回送一个消息给服务端,表示接收到了这个请求(同样用ACK=1来表示)这四次连接发生之后就有了一个客户端与服务端进行数据通信的双向通道。
    在这里插入图片描述
    不过这里看起来是四次握手,不是三次握手。本身来说应该是四次握手,只不过在实际处理的时候,服务端在回复客户端ACk=1的时候,同时再发送一个SYN=1.也就是将这两次握手合并,这就得到了最终的三次握手。
    在这里插入图片描述

TCP四次挥手

  • 首先客户端发送一个断开连接的请求给服务端
    在这里插入图片描述
  • 然后服务端回复一个消息确认。这个时候就相当于断开了客户端到服务端的通道
    在这里插入图片描述
  • 接着服务端发送一个断开请求给客户端
    在这里插入图片描述
  • 客户端也回复一个确认消息给服务端。这样就断开了服务端到客户端的请求。 那么为什么不跟握手一样将服务端的确认客户端的断开回复与服务端请求与客户端断开请求合并呢?道理也很简单,一个服务端会服务于多个客户端,我们不能保证某一个客户端将请求发送给服务端之后服务端就能立即的将结果数据全部传输给客户端。也就是说客户端的确已经把所有的数据都发给了服务端,但是服务端还没有将客户端想要的数据都全部传回,这个时候掐断连接自然不合理。所以就需要服务端在确认自己已经把数据发送完成之后再主动发起一次断开连接的请求给客户端。因此挥手必须是要有四次,而握手就可以合并为三次。
    在这里插入图片描述

创建TCP通信

Net模块实现了底层通信接口

通信过程

  • 创建服务端:接收和回写客户端数据
  • 创建客户端:发送和接收服务端数据
  • 数据传输: 内置服务事件和方法读写数据

通信事件

  • listing事件:调用server.listen方法之后触发
  • connection事件:新的连接建立时触发
  • close事件: 当server关闭时触发
  • error事件: 当错误出现时触发

通信事件&方法

  • data事件:当接收到数据时触发该事件
    • 每当某一端调用write方法来发送数据的时候,那么另一端就可以通过on来监听data事件去消耗数据。其实也就是从可读流里拿数据的操作
  • write方法:在socket上发送数据,默认ut8编码
    • 它和data方法是相对的,net模块所创建的都是基于流的操作,所以他本身就是可读流和可写流的集合。data可以去消费数据,write就可以用来写入数据。
  • end操作:当socket的一端发送FIN包时触发,结束可读端

基于net创建服务端和客户端的TCP通信

自此我们就知道了,在node中通过net模块可以创建一个基于流操作的tcp通信,依据内置的方法可以创建一个服务端和一个客户端然后再去监听具体的事件,当某些事件被触发的时候,我们就可以去利用相应的方法来生产和消费数据。

  • server.js
const net = require('net')

// 创建服务端实例
const server = net.createServer()

const PORT = 1234
const HOST = 'localhost'

server.listen(PORT, HOST)

server.on('listening', () => {
  console.log(`服务端已经开启在 ${HOST}: ${PORT}`)
})

// 接收消息 回写消息
server.on('connection', (socket) => {
  socket.on('data', (chunk) => {
    const msg = chunk.toString()
    console.log(msg)

    // 回数据
    socket.write(Buffer.from('您好' + msg))
  })
})

server.on('close', () => {
  console.log('服务端关闭了')
})

server.on('error', (err) => {
  if (err.code == 'EADDRINUSE') {
    console.log('地址正在被使用')
  }else{
    console.log(err)
  }
})
  • client.js
const net = require('net')

const client = net.createConnection({
  port: 1234, 
  host: '127.0.0.1'
})

client.on('connect', () => {
  client.write('小星星')
})

client.on('data', (chunk) => {
  console.log(chunk.toString())
})

client.on('error', (err) => {
  console.log(err)
})

client.on('close', () => {
  console.log('客户端断开连接')
})

TCP数据粘包

通信包含数据发送端和接收端
发送端累积数据统一发送.
接收端缓冲数据之后再消费
TCP拥塞机制决定发送时机

数据的封包与拆包

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

数据传输的过程

  • 进行数据编码,获取二进制数据包
  • 按规则拆解数据,获取指定长度的数据

Buffer数据读写

  • writeInt16BE:将value从指定位置写入
  • readInt16BE:从指定位置开始读取数据

HTTP协议

获取Http请求信息

设置Http响应

客户端代理

代理客户端解决跨域

Http静态服务

静态服务工具

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

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

相关文章

IPD流程概要

一、IPD流程的主要内容 CDCP:concept decision check point 的缩写,意为概念决策评审点。在概念阶段结束时要召开一个概率决策评审会,在这个会议上,PDT正式向IPMT报告初始的业务计划,由IPMT决定项目是继续还是终止。若初始的业务计划得到批准,分委会将做出下一阶段开始前…

11.14-11.21

1.线性蒙皮 1.1 线性蒙皮定义 线性蒙皮:是由一系列骨骼驱动的。每个顶点会根据顶点权重图和相应的骨骼关联。根据骨骼在当前位置相对于静止位置的变换矩阵以及此顶点相对于该骨骼的权重,我们可以计算出该顶点在该骨骼影响下的位置。 假设Wij是第j个骨…

【数据可视化】第三章——数据可视化综合实践

Matplotlib作业数据.csv文件查看百度网盘:链接:https://pan.baidu.com/s/1oFB_KwhiJNlJAgXg7RaYuw?pwdabcd 提取码:abcd 1.作业描述 作业:根据Matplotlib作业数据.csv做出4种不同类型的组合图像 要求:根据情况适当添…

深入浅出基于HLS流媒体协议视频加密的解决方案

一套简单的基于HLS流媒体协议,使用video.js NodeJS FFmpeg等相关技术实现的m3u8tsaes128视频加密及播放的解决方案示例。 项目简介 起初是为了将工作中已有的基于Flash的视频播放器替换为不依赖Flash的HTML5视频播放器,主要使用了现有的video.js开源播…

Windows内核--HAL在抽象什么?(3.4)

From: HAL在Kernel和硬件之间 HAL在抽象什么? HAL位于内核最底层。“与硬件直接打交道“的这一层被称为硬件抽象层。顾名思义,Windows内核希望把硬件相关的代码放在HAL模块,而这似乎与WRK众多amd64或x86目录相违背。 注意,任何代…

如何优雅的终止线程 Java

目录 终止线程的方法 打断sleep函数 打断正常执行的线程 两阶段终止模式 错误的方法 使用线程对象的 stop() 方法停止线程 使用 System.exit(int) 方法停止线程 正确的方法:使用 interrrupt 终止线程的方法 XXXThread.interrupt(); 在线程的 run函数中对该线…

NFT+体育,卡塔尔世界杯有哪些NFT看点!

有人说没有冷门的世界杯不是真正的世界杯!11月22日,卡塔尔世界杯小组赛C组第1轮比赛中,沙特爆冷2:1逆转阿根廷队,成了今年世界杯的第一个冷门。世界排名第51位的沙特队战胜了排名第3的阿根廷队,结束了阿根廷队此前的36…

vue拖拽删除实现

拖拽删除 背景 自营上传图片,但是需要排序和删除功能,所以用到了h5的拖拽 源元素: 即被拖拽的元素。 目标元素: 即合法的可释放元素。 每个事件的事件主体都是两者之一。 拖拽事件 触发顺序及次数 被拖拽元素,事…

day5-day6【代码随想录】螺旋矩阵II

文章目录前言一、螺旋矩阵||(力扣59)二、螺旋矩阵(力扣54)前言 坚持循环不变量原则。 模拟顺时针画矩阵的过程: 填充上行从左到右 填充右列从上到下 填充下行从右到左 填充左列从下到上 由外向内一圈一圈这么画下去 一、螺旋矩阵…

大三保研夏令营须知及前期准备工作

前言 对于大三保研学生而言,学期将近结束;接踵而来的是接下来的保研准备。保研阶段通常可以分为:夏令营、预推免、九推(捡漏)。很多同学往往都是在前两个阶段就能获得满意的offer。 对于计算机专业来说,经历过2022年的“推免季”&…

项目实战——匹配系统(下)

目录 一、整体梳理 二、创建SpringCloud目录 三、创建子项目 四、实现接口 五、config网关配置 六、放行API 七、封装后端逻辑 八、对接匹配系统 九、修改数据库 十、实现匹配之后的逻辑 十一、线程锁 十二、匹配函数 上节课知识梳理: 用户浏览器打开之…

天津专升本报名时的报名点

2023年天津专升本报名区县及应届生、往届生报名点 天津市在校大三应届生报名点选自己的专科院校,往届生及在外省就读的应届生选户籍所在区招办。 退役士兵从天津入伍的选择学校作为报名点,外省市入伍的选择区招办。

slambook2(ch2)—— Ubuntu20.04 使用cmake + make自动化编译过程

slambook2(ch2)—— Ubuntu20.04 使用cmake make自动化编译过程主函数库函数libhello.cpplibhello.hCMakeLists.txt编译重新编译vim加行号主函数 main.cpp 库函数 libhello.cpp libhello.h CMakeLists.txt 编译 mkdir build && cd build c…

ASEMI肖特基二极管MBR30100CT特征,MBR30100CT应用

编辑-Z ASEMI肖特基二极管MBR30100CT参数: 型号:MBR30100CT 最大重复峰值反向电压(VRRM):100V 最大平均正向整流输出电流(IF):30A 峰值正向浪涌电流(IFSM&#xff0…

通达信l1l2行情接口-十档行情有哪些优势?

据提供系统或用户编制的条件选股公式进行选股选定一个条件选股公式或多个组合条件后,计算机自动帮您选出当时或历史上某一段时间内满足条件的所有股票十档行情 英文,列在行情下载显示窗口,同时可保留成板块。 那通达信l1l2行情接口-十档行情…

map容器(20221125)

一、map/multimap容器 1、map基本概念 map中所有元素都是pair; pair第一个元素为key(键值),起到索引的作用,第二个元素为value(实值); 所有元素会根据元素的键值(key)自动排序。 map/multi…

论文阅读笔记 | 三维目标检测——PartA2算法

如有错误,恳请指出。 文章目录0. 前言与补充知识1. 背景2. 相关工作3. 网络结构3.1 Part-aware stageAnchor-free Proposal GenerationAnchor-based Proposal GenerationDiscussion Two Proposal Generation Strategies3.2 Part-aggregation stageROI-aware feature…

ORB-SLAM2 ---- Frame::ComputeBoW函数(TrackReferenceKeyFrame调用版)

目录 1.函数作用 2.什么是BowVec和FeatVec 3.代码 3.1 Frame::ComputeBoW解释 3.2 transform主函数:将一幅图像所有的特征点转化为BowVector和FeatureVector 3.3 transform:将描述子转化为Word id, Word weight,节点所属的…

[毕业设计]机器学习水域检测标注算法

前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投…

uniapp里接入lottie-miniprogram详细指南

包工头:小张啊,我们页面里那几个gif也太low了,你能不能追求远大点。ui妹子:软件推荐可以用lottie实现。我:这玩意我耍过,交给我了。 牛逼已经吹出去了,开干, 遇到问题有&#xff0…