【HarmonyOS学习日志(13)】计算机网络之TCP/IP协议族(二)

文章目录

    • TCP/IP协议族
      • ARP
      • DNS
        • 标志字段:协商具体的通信方式和反馈通信状态
        • DNS查询问题的格式
        • 资源记录(Resource Record, RR)格式:被用于应答字段、授权字段和额外信息字段
    • IP协议
      • IP服务的特点
        • 无状态
        • 无连接
        • 不可靠
      • IP头部结构
        • IPv4头部结构
        • IPv6头部结构
        • IPv6扩展头部
      • IP分片
        • 头部信息
        • 例子:携带ICMP报文的IP数据报被分片
      • IP路由
        • IP模块工作流程
        • 路由机制
      • IP转发
      • 重定向

TCP/IP协议族

见上篇 【HarmonyOS学习日志(12)】计算机网络之TCP/IP协议族(一)-CSDN博客

ARP

实现任意网络层地址到任意物理层地址的转换。

主机向自己所在网络广播一个ARP请求,请求中包含目标机器网络地址,这个网络上的其他所有机器都会收到这个请求,但只有被请求的目标机器会应答一个ARP应答,其中包含自己的物理网址。

在这里插入图片描述

在该流程中,硬件类型定义物理地址类型,协议类型要表示要映射的协议的地址的类型,两个长度为硬件地址长度字段和协议地址长度字段。

操作则有四种:ARP的请求、ARP的应答,RARP请求和RARP的应答,分别对应的值为1234。

发送端填充除了目的端的以太网地址外的其他三个字段构建ARP请求并发送,而接收端发现该请求目的端的IP地址就是自己,所以就把自己的以太网地址填进去,然后交换这个目的端地址和两个发送端的地址,构建了ARP的应答然后返回,并且把操作的这个字段设置为2,ARP应答。

ARP维护者一个高速的缓存,包含着经常访问和最近访问的机器的IP地址到物理地址的映射。

DNS

域名服务,将机器域名转换成IP地址

DNS是一套分布式的域名服务系统。每个DNS服务器上存在大量的机器域名和IP地址的映射,并且是动态更新的

在这里插入图片描述

16位问题个数,16位应答资源记录个数,16位授权资源记录数目,16位额外资源记录数目这四个部分表示资源的记录数目。

标志字段:协商具体的通信方式和反馈通信状态

在这里插入图片描述

  • QR:查询/应答标志。查询报文(0),应答报文(1)
  • Opcode:定义查询和应答的类型。标准查询(0),反向查询(1),请求服务器状态(2)
  • AA:授权应答标志,仅由应答报文使用。授权服务器(1)
  • TC:截断标志,仅当DNS报文使用UDP服务时使用
  • RD:递归查询标志。迭代查询(0),递归查询(1)
  • RA:允许递归标志,仅由应答报文使用。DNS服务器支持递归查询(1)
  • Zero:未用,置0
  • Rcode:应答状态。无错误(0),域名不存在(3)
DNS查询问题的格式

在这里插入图片描述

32位的查询名包含16位的查询类型和16位的查询类

  • 查询名:以一定格式封装了要查询的主机域名。

  • 查询类型:表示如何执行查询操作。

    • A(1):获取目标主机的IP地址
    • CNAME(5):获得目标主机的别名。
    • PTR(12):反向查询。
  • 查询类:表示获取因特网地址(IP地址)

资源记录(Resource Record, RR)格式:被用于应答字段、授权字段和额外信息字段

在这里插入图片描述

  • 32位域名:该记录中与资源对应的名字。
  • 16位类型:含义与DNS查询问题中对应字段相同。
  • ·16位类:含义与DNS查询问题中对应字段相同。
  • 32位生存时间:该查询记录结果可被本地客户端程序缓存多长时间。

IP协议

IP服务的特点

IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。

无状态

IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接受都是相互独立、没有上下文关系的。

这种服务最大的缺点就是无法处理乱序和重复的IP数据报,比如发送端发送出的第N个IP数据报可能比第N+1个IP数据报后到达这个接收端,在这两种情况下IP模块就无法检测到乱序和重重复,因为没有任何的上下文关系。接收端的IP数据模块只要接收到了完整的数据报就会将其数据部分交给上层协议。

上层协议看来是乱序的、重复的。面向连接的协议,比如TCP协议就能够自己处理乱序、重复的报文段。

无状态的服务优点也十分明显:简单、高效。

我们无需为保证通信的状态而分配一些内核资源,也无需每次传输数据的时候携带一些状态的信息。

无连接

IP通信双方都不长久地维持对方的任何信息,每次发送数据时都必须指定对方IP地址。

不可靠

IP协议不能保证IP数据报准确地到达接收端,只是承诺尽最大努力(best effort)

IP头部结构

IP头部信息出现在每个IP数据报中,用于指定IP通信的源端IP地址、目的端IP地址,指导IP分片和重组,以及指定部分通信行为。

IPv4头部结构

在这里插入图片描述

4位的版本号指定IP协议的版本(IPv4中的4)

4位头部长度是标识IP头部有多少个32位字也就是四字节

8位服务类型(TOS)包括一个3位的优先权字段,4位的TOS字段和一个保留的字段,保留字段必须要置0。4位的TOS字段分别表示最小延迟、最大吞吐量、最高可靠性和最小费用。

16位总长度是整个IP数据报的长度,因此IP数据报最大的长度单位是65535字节。但由于MTU的限制,数据报都会被分片传输。接下来的3个字段来标识如何进行分片。

  • 16位的标识字段是标识主机发送的每个数据报,初始值由系统随机生成,每发送一个数据报,值就+1
  • 3位的标志字段的第一位保留,第二位DF表示禁止分片,如果设置了这个位的话IP的这个模块就不会对数据报进行分片,在这种情况下如果IP数据报长度超过了MTU的话将会丢弃数据报并返回一个差错报文。
  • 13位片偏移是分片相对原始IP数据报开始处的偏移,实际的偏移值是该值左移三位也就是乘8之后得到的

8位的生存时间(TTL)是指数据包到达目的地址前允许经过的路由器的跳数。常见的数值是64,没经过一个路由就会被路由器减1,到0就会丢弃并返回一个差错报文,这样可以防止陷入路由循环.

8位协议用来区分上层的协议,其中ICMP是1,TCP是6,UDP是17。

16位头部校验和由发送端填充,接收端对其使用CRC的算法以检验头部是否损坏(仅检验头部)

32位的源端IP地址和目的端IP地址用来标识发送端和接收端。

选项字段是可变长的可选信息,最多包含4字节的可选选项包括:

  • 记录路由(record route):告诉数据报途径的所有路由器都将自己的IP地址填入头部的选项部分,这样就可以跟踪传输路径。
  • 时间戳(timestamp):告诉每个路由器都将数据报被转发的时间填入选项部分,以测量传输时间。
  • 松散源路由选择(loose source routing):制定一个路由器的IP地址列表,数据报发送过程中必须严格经过所有的路由器。
  • 严格源路由选择(strict source routing):与松散源路由选择相似,不过是数据报只能经过指定的路由器
IPv6头部结构

在这里插入图片描述

4位的版本号(version)指定了协议的版本,对于IPv6来说,其值是6。

8位的通讯类型(traffic class)指示数据流通讯类型或优先级

20位的流标签(flow label)是IPv6新增加的字段,对于某些对连接服务质量有特殊要求的通信,比如音频和视频的实时传输数据。

16位的净荷长度(payload length)是指IPv6扩展头部和应用程序之间的和,不包括固定的头部长度。

8位的下一位包头(next header):指出紧跟这个固定头部的头部类型,比如扩展头部或者某个上层协议头部。

8位的跳数限制(hop limit):与TTL相同。

IPv4地址一般使用点分十进制来表示的,而这个IPv6的这个地址是用16进制来表示的

IPv6扩展头部

可变长的扩展头部使得IPv6能支持更多的选项,并且很便于将来的扩展需要。它的长度可以是0,表示数据报没有使用任何扩展头部。一个数据报可以包含多个扩展头部,每个扩展头部的类型由前一个头部(固定头部或扩展头部)中的下一个字段指定。

在这里插入图片描述

IP分片

当IP数据报的长度超过帧的MTU时,它将被分片传输。

头部信息

在这里插入图片描述

头部中有三个字段提供了足够多的信息:数据报的标识、标志和片偏移。除了最后一个分片之外,其余分片都要置MF标志。此外每个分片的IP的头部的总长度字段都将设置为该分片的长度

例子:携带ICMP报文的IP数据报被分片

在这里插入图片描述

在这个例子里面长度是1501字节的IP数据报被拆分成了两个IP分片,其中一个IP分片的长度为1500字节,第二个IP分片的长度为21字节。那么每个IP分片都包含自己的IP的头部20字节,且第一个IP分片的IP头部被设置了MF标志,而第二个则没有设置该标志,因为它是最后一个分片。

原始的IP数据报中,IP头部的内容被完整的复制到了第一个IP的分片中,而第二个IP分片不包含ICMP的头部信息,因为IP模块重组该ICMP的报文的时候只需要一份信息就足够。

ICMP的报文的头部长度取决于报文的类型,变化范围非常的大

IP路由

IP路由决定发送数据报到目标机器的路径

IP模块工作流程

在这里插入图片描述

当IP模块接收到了来自数据链路层的IP数据报的时候,它首先对该数据报的头部做CRC的校验,确认无误后再分析具体信息。如果IP数据报头部设置了源站选路选项,则调用数据报转发子模块来处理数据报。如果IP数据报的头部中的目标IP就是本机的某个IP地址或者是广播地址,则该数据报就是发送给主机的。这个IP的模块就根据数据报头部中的协议字段来确定将派发给哪一个上层的应用(分用)。

如果IP模块发现这个数据报不是发送给本机的,也是调用转发子模块来转发出去。转发子模块首先检测子系统是否允许转发,不允许就丢弃,如果允许就执行一些操作,它交给IP数据报输出子模块。

IP模块实现了数据报路由的核心的数据结构是路由表,那么这个表按照数据报的目标的IP地址进行分类,同一个类型的IP数据报将被发往相同的下一跳路由器。

IP的输出队列存放的是所有等待发送的数据报,除了需要转发的数据报之外还包括封装了本机的上层数据的IP数据报。

路由机制

那么路由表是如何按照IP地址分类的?给定数据报的目标IP地址,它将匹配路由表中的哪一项?

路由机制:

  1. 查找路由表中和数据报的目标IP地址完全匹配的主机IP地址。如果找到,就使用该路由项,没找到则转2。
  2. 查找路由表中和数据报的目标IP地址具有相同网络ID的网络IP地址。如果找到,就使用该路由项,没找到则转3。
  3. 选择默认路由项,这通常意味着数据报的下一跳是网关。

IP转发

将不是发送给本机的IP数据报交由数据包转发子模块进行转发。

对于允许IP数据报转发的文件系统(主机/路由器),数据报转发子模块将对期望转发的数据报执行以下操作:

  1. 检查数据报头部的TTL值。如果TTL为0,则丢弃该数据报。
  2. 查看数据报头部的严格源路由选择选项。如果该选项被设置,则检测数据报的目标IP地址是否是本机的某个IP地址。如果不是则返回一个ICMP源站选路失败报文。
  3. 给源端发送一个ICMP重定向报文,以告诉它一个更合适的下一跳路由器(如果有必要)
  4. 将TTL值减1
  5. 处理IP头部选项
  6. 执行IP分片操作(如果有必要)

重定向

ICMP重定向报文

ICMP重定向报文也能用于更新路由表,因此简要讨论ICMP重定向报文。

在这里插入图片描述

ICMP重定向报文的数据部分含义都十分明确,它给接收方提供了如下两个信息:

  • 引起重定向的IP数据报的源端IP地址。
  • 应该使用路由器的IP地址

接收主机根据这两个信息就可以断定引起重定向的IP数据报应该是由哪一个路由器来进行转发,并因此来更新路由表,通常是更新路由表的缓冲而不是直接更改。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GO并发编程

一、并发编程初体验和问题 关于 Go 语言和线程的关系 Go 语言中存在线程。Go 语言的并发模型是基于 Goroutine、Processor(P)和 Machine(M,操作系统线程)的 GMP 模型。Goroutine 是 Go 语言中轻量级的执行单元&#xf…

初次使用uniapp编译到微信小程序编辑器页面空白,真机预览有内容

uniapp微信小程序页面结构 首页页面代码 微信小程序模拟器 模拟器页面为空白时查了下,有几个说是“Hbuilder编译的时候应该编译出来一个app.js文件 但是却编译出了App.js”,但是我的小程序结构没问题,并且真机预览没有问题 真机调试 根据defi…

车载语音的台架和实车测试分析

在车载测试过程中免不了要对一些特殊的业务进行深度的专项测试。比如语音识别,这个技术在汽车上也不算什么新技术,但是涉及到用户的使用,更加涉及操作的安全性,所以这块测试还是很重要的。 那么要做好语音识别的业务专项测试&…

【蓝桥杯每日一题】砍竹子

砍竹子 2024-12-7 蓝桥杯每日一题 砍竹子 STL 贪心 题目大意 这天, 小明在砍竹子, 他面前有 nn 棵竹子排成一排, 一开始第 ii 棵竹子的 高度为 h i h_i hi​. 他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用, 假设这一段竹子的高度为…

Vue实现购物车(纯操作数据,不操作dom)注意:自己引入Vue.js哦

代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title>&l…

ThinkPHP开发的原生微信小程序二手物品回收小程序管理系统源码

二手物品回收小程序 一款基于ThinkPHP开发的原生微信小程序二手物品回收小程序管理系统。支持线上下单、免费上门取件、评估价格等功能。提供全部无加密源码&#xff0c;支持私有化部署。

C#实现一个HttpClient集成通义千问-多轮对话功能实现

多轮对话功能实现 视频教程实现原理消息的类型 功能开发消息类修改请求体修改发送请求函数修改用户消息输入 多轮对话的token消息完整文档消息类型 视频教程 .NetAI开发入门HttpClient实现通义千问集成-多轮对话功能实现 实现原理 一直保留更新messages 现在设置的meessages只…

vite5+vue3+Ts5 开源图片预览器上线

images-viewer-vue3&#xff1a;一款Vue3的轻量级图像查看器&#xff0c;它基于Flip动画技术&#xff0c;支持PC和h5移动网页预览照片&#xff0c;如果它是Vue3开发的产品。 npm开源地址:https://www.npmjs.com/package/images-viewer-vue3?activeTabreadme Flip 动画 < …

Axure RP在智慧农场可视化大屏系统设计中的应用

随着科技的飞速发展&#xff0c;智慧农业已成为现代农业的重要发展方向。智慧农场可视化大屏系统作为智慧农业的重要组成部分&#xff0c;正逐步成为农场管理、决策和展示的核心工具。Axure RP&#xff0c;作为一款强大的原型设计工具&#xff0c;其在智慧农场可视化大屏系统的…

Docker多架构镜像构建踩坑记

背景 公司为了做信创项目的亮点&#xff0c;需要将现有的一套在X86上运行的应用系统迁移到ARM服务器上运行&#xff0c;整个项目通过后端Java&#xff0c;前端VUEJS开发通过CICD做成Docker镜像在K8S里面运行。但是当前的CICD产品不支持ARM的镜像构建&#xff0c;于是只能手工构…

文档解析:如何从PDF中解析出表格结构和数据?

从PDF中解析出表格结构和数据&#xff0c;可以采用以下几种方法&#xff1a;从PDF中解析出表格结构和数据&#xff0c;主要用到以下算法和技术&#xff1a; OCR技术&#xff1a;光学字符识别技术&#xff0c;用于从扫描的PDF文件中提取文本信息&#xff0c;包括表格数据。这项…

克服大规模语言模型限制,构建新的应用方法——LangChain

大模型 大模型的出现和落地开启了人工智能(AI)新一轮的信息技术革命&#xff0c;改变了人们的生 活方式、工作方式和思维方式。大模型的落地需要数据、算力和算法三大要素。经过几 年发展&#xff0c;大模型的数据集(包括多模态数据集)制作已经形成了规约&#xff0c;Meta、Go…

两种距离度量简记

一、Lp距离/Minkowski 距离&#xff08;Minkowski distance&#xff09; 1、Lp距离&#xff1a; 特征空间中两个实例点的距离是两个实例点相似程度的反映。Lp距离是一种一般化的距离度量 设特征空间x是n维实数向量空间Rn xi&#xff0c;xj的Lp距离定义为&#xff08;p>1&…

读取电视剧MP4视频的每一帧,检测出现的每一个人脸并保存

检测效果还不错,就是追踪有点难做 import cv2 import mediapipe as mp import os from collections import defaultdict# pip install msvc-runtime# 初始化OpenCV的MultiTracker # multi_tracker = cv2.MultiTracker_create() # multi_tracker = cv2.legacy.MultiTracker_cre…

用最小的代价解决mybatis-plus关于批量保存的性能问题

1.问题说明 问题背景说明&#xff0c;在使用达梦数据库时&#xff0c;mybatis-plus的serviceImpl.saveBatch()方法或者updateBatchById()方法的时候&#xff0c;随着数据量、属性字段的增加&#xff0c;效率越发明显的慢。 serviceImpl.saveBatch(); serviceImpl.updateBatch…

OpenCV相机标定与3D重建(10)眼标定函数calibrateHandEye()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算手眼标定&#xff1a; g T c _{}^{g}\textrm{T}_c g​Tc​ cv::calibrateHandEye 是 OpenCV 中用于手眼标定的函数。该函数通过已知的机器人…

flink yarn模式3种提交任务方式

接上文&#xff1a;一文说清flink从编码到部署上线 1.引言 Apache Hadoop的Yarn是许多数据处理框架中非常流行的资源提供者。Flink的服务提交给Yarn的ResourceManager后&#xff0c;ResourceManager会在由Yarn的NodeManager管理的机器上动态分配运行容器。Flink在这些容器上部…

32.最长有效括号 python

最长有效括号 题目题目描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;题目链接 题解算法步骤&#xff1a;python实现解释&#xff1a;提交结果 题目 题目描述 给你一个只包含 ‘(’ 和 ‘)’ 的字符串&#xff0c;找出最长有效&#xff08;格式…

OpenCV相机标定与3D重建(13)检测给定图像中是否存在符合指定尺寸的棋盘格图案函数checkChessboard()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::checkChessboard 是 OpenCV 库中的一个函数&#xff0c;用于检测给定图像中是否存在符合指定尺寸的棋盘格图案。这个函数对于相机校准非常重…

规范秩相关信息搜集Day2

系列博客目录 文章目录 系列博客目录1.A Survey on Tensor Techniques and Applications in Machine Learning2.有没有研究低秩矩阵有利于分类的计算机方面的论文呢3.Image classification based on low-rank matrix recovery and Naive Bayes collaborative representatio 基于…