Linux网络基础3之IP协议

 (。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~icon-default.png?t=N7T8https://blog.csdn.net/ky233?type=blog

点个关注不迷路⌯'▾'⌯

目前已经学完了应用层以及传输层,我们应用层是把数据发送到传输层的缓存区里,而我们的传输层把数据交到哪里了呢?网络吗?并不是,而是向下交付到网络层!

在应用层,我们关注数据使用的问题,在下三层我们关注的是网络通信的细节,将数据可靠的从A主机传输的B主机!

一、IP协议的概念

IP协议帮我们解决了什么问题呢?提供一种能力,从A主机送到B主机的能力!有很大的概率,如果发送失败了则重新调用网络层传输!

二、IP协议的报头

首先数据层肯定是TCP向下交付的数据加上TCP的报头和http的报头

1.如何封装和解包

首先IP的报头也是有固定大小的,前20个字节就是它的报头,其中这里面有4位首部长度,用用首部减20字节就是选项,没有选项那首部就是20自己,它采用的是定长报头加+自描述字段!

2.如何进行分用

8位协议里面用来表识是udp还是tcp

3.四位版本

永远填的是IPV4,IPV4是用4字节表示的,和IPV6不兼容

4.四位首部长度

四位首部长度是由4个比特位来决定的也就是0000-1111,也就是0-15,但是4位首部长度是由单位的,基本单位是4字节,也就是说假设4位首部长度为x,则真实的长度应该是4*x!

5.八位服务字段

这里面有三个优先权字段已经被弃用了

有4位TOS字段,分别表示:最小延迟,最大吞吐量,最高可靠性,最小成本,这四个选项互相冲突最多只能选择一个!还有1个保留位必须置为0!

6.十六位总长度

总长度包含报头和有效载荷!所以有效载荷=16位总长度-(4位首部长度*4)

7.生存时间

当一个报文在路上转发的时候,有可能因为路由器因为一个bug在某一个局部网络当中进行来回互相转发,所以为了防止这样的情况所以就要设置生存时间!

这就相当于一个计数器,每次转发都会--,当到0时就直接被丢弃!

8.八位协议

里面包含的就是我们上层主机的具体协议,如TCP或者是UDP

9.16位首部校验和

如果我们在校验的时候失败了,这个报文就直接而被丢弃了,我们并不怕被丢弃,因为有TCP再次发送!使用CRC进行校验, 来鉴别头部是否损坏!

10.32位源ip和32位目的ip

当时我们绑定端口号和IP地址,ip地址就是在这里用的!

———————————————————————————————————————————

我们的ip报文的形式和TCP报文的形式非常类似,如都是20字节,所以我们称之为TCP/IP协议

其中应用层把数据交给传输层,传输层决定发多少什么时候发,怎么办,全部都是把这些交给网络层,未来还会继续交付给数据链路层,但是由于链路层有物理特性的原因,一般无法转发太大的数据,所以链路层,一次转发到网络的报文有大小限制(1500字节,MTU)!

那么如果网络层要想下交付2500字节的数据呢?这时候我们的网络层就要进行数据分片。到时候会在接受层的网络层进行组装然后在向上交付!

所谓分片就是将一个比较大的报文,拆分成多个小的、满足条件的报文。分片的行为是网络层做的,同样组装的行为也必须是对方网络层做的!

为什么要组装呢?是因为上层给自己的网络层是一个完整的TCP报文,所以向上交付也要是一个完整的报文!

IP分片的行为,TCP是不知道并且不关心的!

———————————————————————————————————————————

11.16位标识

有了上面的基础知识,下面的就好理解了

16位标识:唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的.

12.3位标示字段

第一位是保留的,第二位标识是标识禁止分片的,置为1就是不分片,如果大于链路层的最大允许则直接丢弃;第三位是标识更多分片,如果分片了最后一个置为0,其他则置为1;

13.13位片偏移

假设一个数据被分为3段,第一个片偏移就是0,第二个就是原始报文的最后一个位

三、解决分片问题

有下面几点要解决

1.分片不是主流!

分片的坏处:

  1. 在网络层分片和组装的过程中,上层(传输层和应用层)知道么?答案是不关心,不知道的
  2. 丢包是有概率的,分片会增加丢包的概率,一个丢包了就组装不起来,需要重新发
  3. 彻底解决分片问题要在传输层!

2.具有识别报文和报文的不同

  1. 用16位标识来区分,不同报文它的标识不同,相同报文的分片,标识是相同的!

3.具有识别报文是否被分片

  1. 如果没有被分片则更多分片标志位为0并且13为片偏移一定为0
  2. 只要收到了大量的报文,用三位标识符的更多分片,如果更多分片比特位为1,就代表这个报文被分片了
  3. 如果我就是最后一个分片了呢?那么更多分片标志位一定是0,那么13位片偏移一定不为0,

所以结合2、3两点,就可以将报文的分片区分出来,并放在一起!

4.识别出哪些报文时开始,哪些分片是中间,哪些是结尾

  1. 开始:那么更多分片一定是1,片偏移一定为0!
  2. 中间:更多分片是1,并且片偏移不是0!
  3. 中间多个报文保证收全:偏移量+自身大小=下一个报文的偏移量,所以根据偏移量进行升序排序,结合对应的偏移量+自身大小=下一个报文的偏移量,这样的算法来扫描报文,如果中间不匹配则中间一定有丢失的,如果计算到结尾,就一定收取完整了!
  4. 结尾:更多分片一定是0,片偏移一定不是0!

这点能做到,区分是否收全,并提供组装方案!

5.异常处理,如果在组装过程中,任何一个分片丢失则都要识别出来

  1. 组装功能如上:偏移量+自身大小=下一个报文的偏移量,所以根据偏移量进行升序排序,结合对应的偏移量+自身大小=下一个报文的偏移量,这样的算法来扫描报文,如果中间不匹配则中间一定有丢失的,如果计算到结尾,就一定收取完整了!

四、网段划分

我们需要将ip进行各种划分,要有各种网络划分的方案

IP地址分为两部分,网络号和主机号

网络号表征的是:不同的区域,根据网络好就可以进行不同区域的转发!同一个区域的网络标识一定是一样的,主机标识一定是不一样的,在不同区域网络标识一定不同,但主机号有可能相同!

所以IP=网络+主机

网络号可以在不同的查找过程中,是不断的变大,并且收敛的!网络号就类似我们的学号!

网络距离边长要解决两个问题!

一个是可靠性的问题:这个是由TCP来解决的

一个是定位目标主机:这个是由IP和IP地址来解决的!

那么为什么要把IP地址划分成网络号和主机号呢?

答案是便于定位以及提高查找效率!

不同的子网其实就是把网络号相同的主机放到一起.

如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网 中的其他主机重复

那么问题来了, 手动管理子网内的IP, 是一个相当麻烦的事情

  • 有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.
  • 一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器

子网掩码:

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
  • 子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾;
  • 将IP地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;
  • 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

也就是说目的ip&当前路由器的子网掩码=该报文要去的目的地的网络

因为不同的路由器一定至少要级联2个网络。每一个网络的网络号可能是不同的!所以每个路由器都要给自己直接连接的网络都要对峙对应的子网掩码!

可见,IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围;

IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高 24位是1,也就是255.255.255.0 

五、公网IP和私网IP

我们上面所说的全部是公网ip,因为ipv4的严重不足,所以我们又有了私网ip

如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都 可以,但是RFC 1918规定了用于组建局域网的私有IP地址

  • 10.*,前8位是网络号,共16,777,216个地址
  • 172.16.到172.31.,前12位是网络号,共1,048,576个地址 1
  • 92.168.*,前16位是网络号,共65,536个地址

包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);

换句话说我们现在能接触到的,全部都是私有ip

也就是说,我们所有的主机先经过家用路由器的私网然后到运营商的私网,然后进入到公网,在根据需要的信息来进行数据交换!

那么IP不足是怎么缓解的呢? 私有网络对应的ip是局部的,可以在不同的子网中重复出现!!

 上图就是我们的主机从私网ip进入对应的公网ip所要做的事情;首先要将报文中的源ip替换成路由器的WAN口ip,每经过一个路由器都要这样做(除了公网路由器),这样就可以一层一层的向上递进,直到到达了公网,公网和公网可以直接通信,然后再次从公网到达最后从私网到公网的转换的路由器!

接下来具体到达自己的主机过程现在还说不了,因为并没有学呢,后面会解答!

六、路由的过程

在复杂的网络结构中, 找出一条通往终点的路线;

路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程. 所谓 "一跳" 就是数据链路层中的一个区间. 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间.

IP数据包的传输过程也和问路一样.

  • 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
  • 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
  • 依次反复, 一直到达目标IP地址;

七、线程demo

1.如何分片的细节

为了支持支持未来组装,每一个分片都必须有ip报头!

注意分片应该这样分片!

2.

八、小结

TCP协议帮我们解决的是可靠性的问题,而IP协议帮我们解决了数据转发的功能,经过这两个层就可以可靠的将数据从A主机到B主机!

传输方只是两端主机有的,而中间层没有!

ip根据目的IP,对子网划分,路由表查找与路由算法,来找到对端主机!
但是,IP没有解决设备转发的具体功能,ip提供的是转发的策略!是对路径的选择!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统学习c++类和对象——深度理解默认成员函数

前言:类和对象是面向对象语言的重要概念。 c身为一门既面向过程,又面向对象的语言。 想要学习c, 首先同样要先了解类和对象。 本节就类和对象的几种构造函数相关内容进行深入的讲解。 目录 类和对象的基本概念 封装 类域和类体 访问限定符…

单片机灭火避障小车设计

目录 目录 II 摘要 III 1 智能小车概述 5 1.1 国内外研究动态 5 1.2 课题的目的和意义 5 2 系统设计概述 6 2.1 系统设计要求 6 2 总体方案设计 7 2.1 硬件设计 7 2.1.1 车体设计 7 2.1.2 主控制器模块 8 2.1.3 电源模块 8 2.1.4 电机驱动模块 9 2.2 火源检测模块 10 2.3 避障…

vue实现图片框选标注

前言 前端有一个需求,对上传的图片进行检测识别,通过返回的接口坐标数据,对图片的某些区域进行框选并标注。如图: 开始 1、上传功能使用elementui的upload插件; 2、在图片上进行标注功能是元素定位在图片上层&#x…

小程序对于人力资源行业的创新与变革

随着移动互联网的快速发展,小程序成为了各行各业推广和服务的新利器。对于人力资源行业来说,开发一款定制化的小程序不仅可以提升服务效率,还可以增强品牌形象和用户粘性。那么,如何定制开发人力资源类的小程序呢?下面…

群晖Synology Office本地文件如何分享给同事远程协作编辑【内网穿透】

文章目录 本教程解决的问题是:1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 本教程解决的问题是: 1.Word,PPT,Excel等重要文件存在本地环境,如何在编…

开源是什么?——跟老吕学Python编程

开源是什么?——跟老吕学Python编程 开源是什么?开放源代码软件是什么?开源软件许可证是什么?开放源代码软件是什么?开放源代码的软件代表有什么?开放源代码软件与自由软件的概念 开源的定义是什么&#xf…

郭炜老师mooc第十一章数据分析和展示(numpy,pandas, matplotlib)

多维数组库numpy numpy创建数组的常用函数 # numpy数组import numpy as np #以后numpy简写为np print(np.array([1,2,3])) #>>[1 2 3] print(np.arange(1,9,2)) #>>[1 3 5 7] 不包括9 print(np.linspace(1,10,4)) #>>[ 1. 4. 7. 10.] # linespace(x,y,n)&…

数据通信练习题

1.0osi七层模型 应用层 data 表示层 会话层 传输层 数据段 防火墙,端口(TCP UDP) 网络层 数据包 路由器 数据链路层 数据帧 交换机 物理层 比特流 网卡 2.IP地址分类 私有地址 A类 0--127 10.0.0.0…

双指针算法练习

27. 移除元素 题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑…

上位机图像处理和嵌入式模块部署(qmacvisual旋转和镜像)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 旋转和镜像是图像处理中经常遇到的一个情况。很多时候,摄像头面对物体进行拍摄,未必是正对着进行拍摄的,这个时…

基于element-plus的Dialog选择控件

翻看之前工程师写的vue2的代码,很多都是复制、粘贴,也真是搞不懂,明明可以写一个控件,不就可以重复使用。很多前端总喜欢element搞一下,ant-design也搞一下,有啥意义,控件也不是自己写的&#x…

45、C++/基础练习20240311

一、提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求 使用C风格字符串完成。 代码&#xff1a; #include <iostream>using namespace std;int main() {string buf;//定义字符串类型变量bufcout << &…

在Jetson Xavier NX 开发板上使用VScode执行ROS程序详细过程

1.创建 ROS 工作空间ws 在home下打开终端输入下面指令 mkdir -p xxx_ws/src(必须得有 src) cd 自己命名_ws catkin_make2.启动 vscode cd 自己命名_ws code .3.vscode 中编译 ros 快捷键 ctrl shift B 调用编译&#xff0c;在上方弹窗位置选择:catkin_make:build 可以点击…

Web题记

[CISCN 2019华北Day2]Web1 告诉我们想要的东西在flag表和flag字段&#xff0c;那应该是sql注入&#xff0c;先试试 试了一些发现会被检查到&#xff0c;随便传数字 除了1和2有返回结果&#xff0c;其余的都报错&#xff0c;应该是数字型注入&#xff0c;抓包看看过滤了哪些 这个…

C语言实现贪吃蛇

前言&#xff1a;今天给大家详细介绍一下小游戏贪吃蛇的代码。 目录 一 .贪吃蛇实现的功能 二.贪吃蛇游戏设计与分析 1.贪吃蛇以及贪吃蛇所需要维护的数据 &#xff08;1&#xff09;贪吃蛇蛇体 &#xff08;2&#xff09;数据维护 2.地图设计 &#xff08;1&#x…

详解7道经典指针运算笔试题!

目录 ​编辑 1. 题目一 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;分析 2. 题目二 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;分析 3. 题目三 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;分析 4. 题目四 &#xff08;…

鸿蒙开发为什么这么火,现在入行鸿蒙是否来的及?

鸿蒙开发是当前备受关注的技术领域之一&#xff0c;对于想要入门学习鸿蒙开发的初学者来说&#xff0c;需要掌握一定的基础知识和技能。鸿蒙开发又是否能为程序员们带来一片光明的未来呢&#xff1f;让我们一同探讨这些问题。 对于初学者来说&#xff0c;鸿蒙开发是否易于上手呢…

构建空间场景轻应用,Mapmost Alpha来啦【文末赠书(10本)--第一期】

文章目录&#xff1a; 一、Mapmost Alpha 介绍二、Mapmost Alpha应对数字孪生业务痛点解决之道2.1 Mapmost Alpha 提供海量城市底板2.2 Mapmost Alpha 提供便捷的配置管理工具2.3 Mapmost Alpha 提供一键式部署发布和分享 三、沉浸式体验Mapmost Alpha3.1 创建应用3.2 新手指导…

树莓派安装Nginx服务搭建web网站结合内网穿透实现公网访问本地站点

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

Everything:文件查找工具,一搜即得

名人说&#xff1a;东边日出西边雨&#xff0c;道是无晴却有晴。——刘禹锡 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍①Everything②核心功能③原理 二、下载安装①下载②安装 三、使用方法①文…
最新文章