当前位置: 首页 > article >正文

【C++/Linux】TinyWebServer前置知识之IP协议详解

目录

IPv4地址

分类

IP数据报分片

IP 协议在传输数据报时,将数据报分为若干分片(小数据报)后进行传输,并在目的系统中进行重组,这一过程称为分片(Fragmentation)。

IP模块工作流程​编辑


IP(网际互连协议,Internet Protocol)是TCP/IP协议族中最为核心的协议。所有的 TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。

报文格式

版本:占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4),以后要使用IPv6(即版本6的IP协议)。

首部长度:占4位,可表示的0~15,单位是4B。因为IP首部的固定长度是20字节,因此首部长度字段的最小值是5(即二进制表示的首部长度是0101)。而当首部长度为最大值1111时(即十进制数的15),就表明首部长度达到最大值15个32位字长,即60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此IP数据报的数据部分永远在4字节的整数倍时开始。首部长度限制为60字节的缺点是有时可能不够用,但这样做是希望用户尽量减少开销。最常用的首部长度是20字节(即首部长度为0101),这时不使用任何选项。

区分服务:占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务DS(DifferentiatedServices)。只有在使用区分服务时,这个字段才起作用,在一般的情况下都不使用这个字段。

总长度:占16位,指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节。

标识(identification)占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。

标志(flag)占3位,但目前只有低两位有意义。标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。标志字段中间的一位记为DF(Don't Fragment),意思是“不能分片”。只有当DF=0时才允许分片。

片偏移占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,除了最后一个分片,长度一定是8字节(64位)的整数倍,最后一个分片可能是8字节(64位)的整数倍。

生存时间占8位,生存时间字段常用的英文缩写是TTL(Time To Live),表明这是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在互联网中兜圈子(例如从路由器R1转发到R2,再转发到R3,然后又转发到R1),因而白白消耗网络资源。最初的设计是以秒作为TTL值的单位。每经过一个路由器时,就把TTL减去数据报在路由器所消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把TTL值减1。当TTL值减为零时,就丢弃这个数据报。

协议占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个协议进行处理。至少记住TCP和UDP(腾讯安全工程师笔试题)。

IPv4地址

分类

IP地址表示如下:

IP地址::={<网络号>,<主机号>}

二进制对于人类来说很难记忆,所以我们将IP地址分为上面的4个部分,每个部分8位(0-255),使用.分隔,就是点分十进制。

A类IP地址 地址范围1.0.0.1-126.255.255.254(二进制表示为:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110)

B类IP地址地址范围128.1.0.1-191.254.255.254(二进制表示为:10000000 00000001 00000000 00000001 - 10111111 11111110 11111111 11111110)

C类IP地址范围192.0.1.1-223.255.254.254(二进制表示为: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111110 11111110)

D类IP地址范围224.0.0.1-239.255.255.254(二进制表示为:11100000 00000001 00000001 00000001 - 11101111 11111111 11111111 11111110)

A类是7位,应该是0-127呀,为什么是1-126呢?因为一些规定,有些ip作为了特殊ip,不能作为A类地址的网络。

除去特殊ip后

IP数据报分片

IP 协议在传输数据报时,将数据报分为若干分片(小数据报)后进行传输,并在目的系统中进行重组,这一过程称为分片(Fragmentation)。

MTU,物理网络一次传送的数据是有最大长度的,因此网络层的下层(数据链路层)的传输单元(数据帧)也有一个最大长度,这个最大长度值就是 MTU,每一种物理网络都会规定链路层数据帧的最大长度,比如以太网的 MTU 为 1500 字节。

IP 协议在传输数据报时,若IP数据报加上数据帧头部后长度大于 MTU,则将数据报切分成若干分片后再进行传输,并在目标系统中进行重组。IP 分片既可能在源端主机进行,也可能发生在中间的路由器处,因为不同网络的 MTU 是不一样的,而传输的整个过程可能会经过不同的物理网络。如果传输路径上的某个网络的 MTU 比源端网络的 MTU 要小,路由器就可能对 IP 数据报再次进行分片。分片数据的重组只会发生在目的端的 IP 层。

IP模块工作流程

从右往左分析:

先从网络驱动程序(网卡)中获取IP地址信息,将其放入到IP输入队列中。

对数据报的头部做CRC校验,判断数据报是否发生错误,确认无误,进行下一步操作。

检验是否接收端是本主机,如果目标IP地址是本网段中的某个IP地址,则将数据发送给具体主机,主机通过端口号确保发送给哪一个应用。如果不是则将该网段中的地址,进行数据报转发。

判断数据报是否允许转发,允许转发则转发,不允许则丢弃。

IP输出队列存放的是等待发送的IP数据报,除过要发送的IP地址外,还包括ICMP报文、TCP报文、UDP报文。

相关文章:

【C++/Linux】TinyWebServer前置知识之IP协议详解

目录 IPv4地址 分类 IP数据报分片 IP 协议在传输数据报时&#xff0c;将数据报分为若干分片&#xff08;小数据报&#xff09;后进行传输&#xff0c;并在目的系统中进行重组&#xff0c;这一过程称为分片&#xff08;Fragmentation&#xff09;。 IP模块工作流程​编辑 I…...

mac安装brew时macos无法信任ruby的解决方法

背景 在使用如下脚本安装brew时&#xff0c;遇到安装ruby&#xff0c;macos不信任外部软件&#xff0c;在安全性点击信任仍然无法安装。 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"如何解决 本地安装好符…...

Codeforces Round 1028 (Div. 2)(A-D)

题面链接&#xff1a;Dashboard - Codeforces Round 1028 (Div. 2) - Codeforces A. Gellyfish and Tricolor Pansy 思路 要知道骑士如果没了那么这个人就失去了攻击手段&#xff0c;贪心的来说我们只需要攻击血量少的即可&#xff0c;那么取min比较一下即可 代码 void so…...

记录一个梦,借助大语言模型图片生成

梦见家门口有一条大河&#xff0c;但大河和其它景物都是灰暗没有鲜艳色彩很普通的梦中场景。大河似乎是长江的支流&#xff0c;但也可能有一个响亮的名字似乎是金沙江。 突然看到一条金红色的龙在快速游动&#xff0c;不敢相信自己的眼睛&#xff0c;因为一直不相信有这种生物…...

android binder(二)应用层编程实例

一、binder驱动浅析 从上图看出&#xff0c;binder的通讯主要涉及三个步骤。 在 Binder Server 端定义好服务&#xff0c;然后向 ServiceManager 注册服务在 Binder Client 中向 ServiceManager 获取到服务发起远程调用&#xff0c;调用 Binder Server 中定义好的服务 整个流…...

HTML 等价字符引用:系统化记忆指南

HTML 等价字符引用:系统化记忆指南 在 HTML 中,字符引用(Character Entity References)用于表示保留字符或特殊符号。我将提供一个系统化的方法来记忆这些重要实体,并解释它们的实际应用。 什么是等价字符引用? HTML 字符引用有两种形式: 命名实体:&entity_name…...

【深度学习】17. 深度生成模型:DCGAN与Wasserstein GAN公式深度推导

深度生成模型:DCGAN与Wasserstein GAN公式深度推导 深度卷积生成对抗网络 DCGAN 在原始 GAN 框架中&#xff0c;生成器和判别器通常使用全连接层构建&#xff0c;这限制了模型处理图像的能力。为此&#xff0c;Radford 等人在 2016 年提出了 DCGAN&#xff08;Deep Convoluti…...

Ubuntu终端性能监视工具

目录 工具1&#xff1a;nvidia-smi 工具2&#xff1a;nvtop 工具3&#xff1a;nvitop 工具1&#xff1a;nvidia-smi nvidia-smi 如果希望自动刷新这个命令&#xff0c;可以输入如下命令&#xff1a; nvidia-smi -l 工具2&#xff1a;nvtop nvtop 安装方法&#xff1a; …...

设计模式——命令设计模式(行为型)

摘要 本文介绍了命令设计模式&#xff0c;这是一种行为型设计模式&#xff0c;用于将请求封装为对象&#xff0c;实现请求的解耦和灵活控制。它包含命令接口、具体命令、接收者、调用者和客户端等角色&#xff0c;优点是解耦请求发送者与接收者&#xff0c;支持命令的排队、记…...

鸿蒙OSUniApp智能商品展示实战:打造高性能的动态排序系统#三方框架 #Uniapp

UniApp智能商品展示实战&#xff1a;打造高性能的动态排序系统 引言 在电商应用开发中&#xff0c;商品展示和智能排序是提升用户体验的关键因素。随着HarmonyOS生态的发展&#xff0c;用户对应用的性能和交互体验要求越来越高。本文将深入探讨如何在UniApp中实现一个性能优异…...

03 APP 自动化-定位元素工具元素定位

文章目录 一、Appium常用元素定位工具1、U IAutomator View Android SDK 自带的定位工具2、Appium Desktop Inspector3、Weditor安装&#xff1a;Weditor工具的使用 4、uiautodev通过定位工具获取app页面元素有哪些属性 二、app 元素定位方法 一、Appium常用元素定位工具 1、U…...

PABD 2025:大数据与智慧城市管理的融合之道

会议简介 2025年公共管理与大数据国际会议&#xff08;ICPMBD 2025&#xff09;确实在海口举办。本次会议将围绕公共管理与大数据的深度融合、数据分析在公共管理中的应用、大数据驱动的政策制定与优化等议题展开深入研讨。参会者将有机会聆听前沿学术报告&#xff0c;分享研究…...

Golang持续集成与自动化测试和部署

概述 Golang是一门性能优异的静态类型语言&#xff0c;但因其奇快的编译速度&#xff0c;结合DevOps, 使得它也非常适合快速开发和迭代。 本文讲述如何使用Golang, 进行持续集成与自动化测试和部署。主要使用了以下相关技术&#xff1a; dep&#xff1a; 进行包的依赖管理gin…...

三套知识系统的实践比较:Notion、Confluence 与 Gitee Wiki

在过去几年中&#xff0c;我们团队先后使用过三套企业知识系统&#xff1a;Notion、Confluence 和 Gitee Wiki。每一套系统上线初期都带来一阵热情&#xff0c;但最终能真正融入研发流程、持续活跃的&#xff0c;只有最后一个。 我们不是要为某个平台背书&#xff0c;而是希望…...

mysql离线安装教程

1.下载地址: https://downloads.mysql.com/archives/community/ 2.上传安装包到系统目录,并解压 tar -xvf mysql-8.0.34-1.el7.x86_64.rpm-bundle.tar3.检查系统中是否存在mariadb的rpm包 rpm -qa|grep mariadb存在则删除 rpm -e xxx4.解压完后执行如下命令安装 sudo rpm -iv…...

OpenGL 3D 编程

OpenGL 是一个强大的跨平台图形 API,用于渲染 2D 和 3D 图形。以下是 OpenGL 3D 编程的入门基础。 一. 环境设置 安装必要的库 GLFW: 用于创建窗口和处理输入 GLEW 或 GLAD: 用于加载 OpenGL 函数 GLM: 数学库,用于 3D 变换 // 基本 OpenGL 程序结构示例 #include <GL/g…...

基于FPGA的VGA显示文字和动态数字基础例程,进而动态显示数据,类似温湿度等

基于FPGA的VGA显示文字和数字 前言一、VGA显示参数二、字模生成三、代码分析1.vga_char顶层2.vga_ctrl驱动文件3.vga_pic数据准备文件 总结 前言 结合正点原子以及野火的基础例程&#xff0c;理解了VGA本身基本协议&#xff0c;VGA本身显示像素为640*480&#xff0c;因此注意生…...

力扣刷题Day 68:搜索插入位置(35)

1.题目描述 2.思路 方法1&#xff1a;回溯的二分查找。 方法2&#xff1a;看到了一个佬很简洁的写法&#xff0c;代码贴在下面了。 3.代码&#xff08;Python3&#xff09; 方法1&#xff1a; class Solution:def searchInsert(self, nums: List[int], target: int) ->…...

NodeJS全栈WEB3面试题——P4Node.js后端集成 服务端设计

4.1 如何在 Node.js 中管理钱包与私钥的安全性&#xff1f; 私钥管理原则&#xff1a;不暴露&#xff0c;不硬编码&#xff0c;不明文存储。 常见做法&#xff1a; 加密存储&#xff1a; 使用 crypto 或 ethers.Wallet.encrypt() 加密私钥&#xff0c;存储到数据库或文件系统…...

SQL进阶之旅 Day 12:分组聚合与HAVING高效应用

【SQL进阶之旅 Day 12】分组聚合与HAVING高效应用 在SQL的世界里&#xff0c;分组聚合&#xff08;Grouping and Aggregation&#xff09;是处理大规模数据集时最常用的技术之一。它允许我们将数据按照某些列进行分类&#xff0c;并对每个分类进行统计计算。而 HAVING 子句则是…...

深入剖析C#构造函数执行:基类调用、初始化顺序与访问控制

导言 在面向对象编程中&#xff0c;理解对象构造过程至关重要。C#的构造函数执行遵循严格的顺序规则&#xff0c;尤其是涉及继承和成员初始化时。本文将深入解析构造函数的执行流程、初始化语句的妙用以及类访问修饰符的影响&#xff0c;助你写出更健壮、可维护的代码。 构造…...

Java 大数据处理:使用 Hadoop 和 Spark 进行大规模数据处理

Java 大数据处理:使用 Hadoop 和 Spark 进行大规模数据处理 在当今数字化时代,数据呈现出爆炸式增长,如何高效地处理大规模数据成为企业面临的重要挑战。Java 作为一门广泛使用的编程语言,在大数据处理领域同样发挥着关键作用。本文将深入探讨如何利用 Hadoop 和 Spark 这…...

使用Python绘制节日祝福——以端午节和儿童节为例

端午节 端午节总算是回家了&#xff0c;感觉时间过得真快&#xff0c;马上就毕业了&#xff0c;用Python弄了一个端午节元素的界面&#xff0c;虽然有点不像&#xff0c;祝大家端午安康。端午节粽子&#xff08;python&#xff09;_python画粽子-CSDN博客https://blog.csdn.net…...

探索大语言模型(LLM):参数量背后的“黄金公式”与Scaling Law的启示

引言 过去十年&#xff0c;人工智能领域最震撼的变革之一&#xff0c;是模型参数量从百万级飙升至万亿级。从GPT-3的1750亿参数到GPT-4的神秘规模&#xff0c;再到谷歌Gemini的“多模态巨兽”&#xff0c;参数量仿佛成了AI能力的代名词。但参数真的是越多越好吗&#xff1f;这…...

Excel to JSON 插件 2.4.0 版本更新

我们很高兴地宣布 Excel to JSON 插件已升级到 2.4.0 版本&#xff01;本次更新带来了两项重要功能&#xff0c;旨在为您提供更大的灵活性和更强大的数据处理能力。 主要更新内容&#xff1a; 1. 用户可以选择从行或列中选择标题 在之前的版本中&#xff0c;插件通常默认从第…...

黑马点评后端笔记

1.基于Session实现登录流程 发送验证码: 先前端校验,后端再校验(防小人),合法生成验证码(RandomUtil生成),后端保存&#xff0c;在通过短信去发送给用户 短信验证码登录和注册: 拿到验证码和手机号后&#xff0c;后端通过session(spring mvc注入)拿到验证码,进行校验,如果用户…...

C#项目07-二维数组的随机创建

实现需求 创建二维数组&#xff0c;数组的列和宽为随机&#xff0c;数组内的数也是随机 知识点 1、Random类 Public Random rd new Random(); int Num_Int rd.Next(1, 100);2、数组上下限。 //定义数组 int[] G_Array new int[1,2,3,4];//一维数组 int[,] G_Array_T …...

光伏功率预测 | LSTM多变量单步光伏功率预测(Matlab完整源码和数据)

光伏功率预测 | MATLAB实现基于LSTM长短期记忆神经网络的光伏功率预测 目录 光伏功率预测 | MATLAB实现基于LSTM长短期记忆神经网络的光伏功率预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 光伏功率预测 | LSTM多变量单步光伏功率预测&#xff08;Matlab完整源码和…...

解锁 AI 大语言模型的“知识宝藏”:知识库的奥秘与优化之道

1. 知识库在 AI 大语言模型中的作用 1.1 提供准确信息 知识库是 AI 大语言模型的重要组成部分&#xff0c;能够为模型提供准确的信息。在处理用户问题时&#xff0c;模型可以参考知识库中的数据&#xff0c;从而给出更准确的答案。例如&#xff0c;在医疗领域&#xff0c;知识…...

一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录——3. 服务器软件更新,以及常用软件安装

前言 前面&#xff0c;我们已经 安装好了 Ubuntu 服务器系统&#xff0c;并且 配置好了 ssh 免密登录服务器 &#xff0c;现在&#xff0c;我们要来进一步的设置服务器。 那么&#xff0c;本文&#xff0c;就是进行服务器的系统更新&#xff0c;以及常用软件的安装 调整 Ubu…...