网络层--IP协议

引入:

IP协议主要解决什么问题呢?

IP协议提供一种将数据从主机A 发送到 主机B的能力。(有能力不一定能做到,比如小明很聪明,可以考100分,但是他也不是每次搜能考100分,可靠性由传输层来解决)

IP协议基本概念

主机  : 配有IP地址, 但是不进行路由控制的设备;

路由器: 即配有IP地址, 又能进行路由控制;

节点  : 主机和路由器的统称。

IP协议头格式

  1. 如何封装和解包呢?

        定长报头+自描述字段(4位首部长度)

  2. 如何交付?(如何确定交付的协议)

        8位协议:标识UDP还是TCP

4位版本:

确定是IPv6还是IPv4

4位首部长度

IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. (基本单位是4字节)4bit表示最大
的数字是15, 因此IP头部最大长度是60字节. 当4位首部长度值为 0101 时表示没有选项(20字节)

8位服务类型(Type Of Service):

3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0).
        4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于 ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要.

16位总长度(total length):

IP数据报整体占多少个字节.

16位标识(id):

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

3位标志:

第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁
止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为1, 其他是0. 类似于一个结束标记

13位分片偏移(framegament offset):

是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了).

8位生存时间(Time To Live, TTL):

数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环。

8位协议:

表示上层协议的类型

16位头部校验和:

使用CRC进行校验, 来鉴别头部是否损坏.出错就会丢弃报文。

32位源地址和32位目标地址:

表示发送端和接收端.

选项字段(不定长, 最多40字节): 

分片:

链路层因为其物理特性的原因,一般不会一次性转发太大的数据==>也就是说:

链路层有一次可以转发到网络中的报文大小的限制,一般是1500(MTU),所以网络层需要将一个较大的ip报文拆分成多个小的,符合条件的报文,这就是分片。

分片的行为是网络层完成的,上层的传输层和应用层并不知道,(这在一定程度上埋下隐患),同样组装的行为也必须由对方的网络层完成。

   为什么呢?

原因可以分为2个:

  1 、 对方给自己的是一个完整的TCP报文,那我自己上传输层交付时也必须是一个完整TCP报文;

        2 、 协议具有一致性,IP协议负责分片和组装不会影响其他层的服务。

分片决定了网络层IP协议具有3种能力

1. 具有区分不同报文的能力      ----16位标识符

2. 具有判断报文是不是分片的能力   ----“更多分片”

3. 异常处理             ---- 任何一个分片丢失,都可以识别出来

  怎么做到分片的呢?

3位标志中有一位是保留的,第2位为1时表示禁止分片,如果报文长度超过MTC,IP就会丢弃报文。第3位 表示 “ 更多分片 ” ,如果分片了的化,最后一个分片置为 0, 其他是 1,类似一个结束标记。

认识偏移量

开始: 更多分片 1 ,片偏移 = 0

结尾: 更多分片 0 ,片偏移 ≠ 0

中间: 更多分片 1 ,片偏移 ≠ 0

  中间那么多的分片,如何确定所有分片都收到了呢?

根据偏移量进行升序排序,结合偏移量+自身大小=下一个报文的偏移量,通过扫描整个报文,来进行判断,如果不匹配,则说明报文出现了丢失,需要重新发送,如果成功遍历到结尾,则表明收取到了完整的报文。

分片之前,报文一定是一个完整的报文分片之后,每一个分片也有单独的IP报头

下面简单分析一下分片过程

假设MTC=1500

原本的整个报文数据大小是 3000 ,(注意: IP报文=IP报头+有效载荷)

第一步,先分一个1500的数据块,直接拿走原本的报头(实际可能更复杂哈) ,

剩下的1500的数据并不是可以直接就成为一个分片,还要添加报头信息(20字节)为了支持未来的组装,每一个分片都必须有IP报头,所有分割1480的大小,再添加20字节的报头,最后一个分片包含20字节的报头和20字节的有效载荷。

我们再来分析一下这三个报文

报文编号123
16位标识123412341234
3位标志“更多分片”110
13位片偏移015002980
总长度1500150040

分片的坏处

之前我们提到在网络层进行分片和组装,上层是不知道的,同时,我们也应该有这个常识:

丢包是有概率的,分包会增加报文个数,在一定程度上增加了丢包的概率。,要彻底解决丢包问题,还得依靠 传输层。当然这也决定了分片不是主流

网段划分

IP 地址分为两个部分 , 网络号和主机号
        网络号: 保证相互连接的两个网段具有不同的标识 ;
        主机号: 同一网段内 , 主机之间具有相同的网络号 , 但是必须有不同的主机号 ;
不同的子网其实就是把网络号相同的主机放到一起. 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复.
通过合理设置主机号和网络号 , 就可以保证在相互连接的网络中 , 每台主机的 IP 地址都不相同 .
那么问题来了 , 手动管理子网内的 IP, 是一个相当麻烦的事情 .
有一种技术叫做 DHCP , 能够自动的给子网内新增主机节点分配 IP 地址 , 避免了手动管理 IP 的不便 . 一般的路由器都带有DHCP 功能 . 因此路由器也可以看做一个 DHCP 服务器 .
过去曾经提出一种划分网络号和主机号的方案 , 把所有 IP 地址分为五类 , 如下图所示
A类0.0.0.0到127.255.255.255
B类128.0.0.0到191.255.255.255
C类192.0.0.0到223.255.255.255
D类224.0.0.0到239.255.255.255
E类240.0.0.0到247.255.255.255
随着 Internet 的飞速发展 , 这种划分方案的局限性很快显现出来 , 大多数组织都申请 B 类网络地址 , 导致 B 类地址很快就
分配完了 , A 类却浪费了大量地址 ;
例如 , 申请了一个 B 类地址 , 理论上一个子网内能允许 6 5 千多个主机 . A 类地址的子网内的主机数更多 . 然而实际网络架设中, 不会存在一个子网内有这么多的情况 . 因此大量的 IP 地址都被浪费掉了 .
针对这种情况提出了新的划分方案 , 称为 CIDR(Classless Interdomain Routing):
引入一个额外的子网掩码 (subnet mask) 来区分网络号和主机号 ;
子网掩码也是一个32 位的正整数 . 通常用一串 "0" 来结尾 ;
IP 地址和子网掩码进行 " 按位与 " 操作 , 得到的结果就是网络号 ;
网络号和主机号的划分与这个 IP 地址是 A 类、 B 类还是 C 类无关 ;
示例1
可见 ,IP 地址与子网掩码做与运算可以得到网络号 , 主机号从全 0 到全 1 就是子网的地址范围 ;
IP 地址和子网掩码还有一种更简洁的表示方法 , 例如 140.252.20.68/24, 表示 IP 地址为 140.252.20.68, 子网掩码的高24位是 1, 也就是 255.255.255.0

特殊的IP地址

IP 地址中的主机地址全部设为 0, 就成为了网络号 , 代表这个局域网 ;
IP 地址中的主机地址全部设为 1, 就成为了广播地址 , 用于给同一个链路中相互连接的所有主机发送数据包;
127.* IP 地址用于本机环回 (loop back) 测试 , 通常是 127.0.0.1

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

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

相关文章

Unity VideoPlayer 指定位置开始播放

如果 source是 videoclip(以下两种方式都可以): _videoPlayer.Play();Debug.Log("time: " _videoPlayer.clip.length);_videoPlayer.time 10; [SerializeField] VideoPlayer videoPlayer;public void SetClipWithTime(VideoClip…

23062C++QTday5

将之前定义的栈类和队列类都实现成模板类 栈&#xff1a; #include <iostream> #define MAX 128using namespace std;template<typename T,typename C> class Stack { private:T top; //栈顶元素的下标C *data; //指向堆区空间public:Sta…

【C++】常用排序算法

0.前言 1.sort #include <iostream> using namespace std;// 常用排序算法 sort #include<vector> #include<algorithm>//利用仿函数 打印输出 class myPrint { public:void operator()(int val){cout << val << " ";} };//利用普通函…

界面控件DevExpress WPF TreeMap,轻松可视化复杂的分层结构数据!

DevExpress WPF TreeMap控件允许用户使用嵌套的矩形块可视化复杂的平面或分层结构数据。 P.S&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&a…

接入Websocket,自动接收CSDN短消息

最近在研究Websocket功能&#xff0c;本来想接入抖音和快手的弹幕功能&#xff0c;以及短消息功能。 在了解的过程中&#xff0c;也开发了一些测试项目。 这不是&#xff0c;就把CSDN的短消息项目给弄出来了。 直接上代码&#xff1a; # !/usr/bin python3 # -*- encodingu…

spring boot+redis整合基础入门

文章目录 前言准备依赖项配置文件redis模板类注入设置序列化方式 实施基础字符串操作、超时设置Hash操作hash的使用场景以及优缺点 列表操作列表操作的应用场景以及优缺点 Set的基础操作Set类型的业务场景以及优缺点Demo地址 总结 前言 最近项目中有用到redis进行一些数据的缓…

重构优化第三方查询接口返回大数据量的分页问题

# 问题描述 用户线上查询其上网流量详单数据加载慢&#xff0c;且有时候数据没有响应全~ 1、经排除是调用第三方数据量达10w条响应会超时&#xff0c;数据没正常返回 2、现有线上缓存分页也是加载慢数据不能正常展示 3、第三方接口返回类似报文jsonj&#…

LVS负载均衡群集——LVS-NAT模式搭建和LVS-DR模式搭建

目录 lvs工作模式 1、NAT模式&#xff08;VS-NAT&#xff09; 2、直接路由模式&#xff08;VS-DR&#xff09; 3、IP隧道模式&#xff08;VS-TUN&#xff09; LVS调度算法 LVS群集类型 1&#xff09;负载均衡群集 LB 2&#xff09;高可用群集 HA 3&#xff09;高性能运…

C#获取屏幕的分辨率、工作区分辨率

运行结果如下; 由于屏幕的任务栏在侧面所以屏幕宽度变化。 代码如下 private void Form1_Load(object sender, EventArgs e){int SH Screen.PrimaryScreen.Bounds.Height; //1080int SW Screen.PrimaryScreen.Bounds.Width; //1920System.Drawing.Rectangle rec Screen.Get…

Nginx安装与常见命令

一、Nginx简介 官方文档&#xff1a;https://www.nginx.com/ Nginx中文文档&#xff1a;https://nginx.cn/doc/index.html Nginx由俄罗斯人&#xff08;Igor Sysoev&#xff09;编写的轻量级Web服务器&#xff0c;它的发音为 [ˈendʒɪnks] 。 Nginx 不仅是一款高性能的 HTTP服…

【C语言】找单身狗问题

一.找单身狗问题初阶 1.问题描述 一个数组中只有一个数字是出现一次,其他所有数字都出现了两次.编写一个函数,找出这个只出现一次的数字. 例如: 有数组的元素是:1,2,3,4,5,1,2,3,4 只有5出现了一次,要找出5. 2.解题思路 常规思路: 在常规思路中,我们首先想到的肯定是使用两层…

@DS注解方式springboot多数据源配置及失效场景解决

1.使用教程 导入依赖 <!--多数据源--><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version></dependency>配置数据源 datasource:…

stu04-快速生成HTML5文档结构

1.直接输入一个英文的感叹号“!”&#xff0c;然后按Tab键&#xff0c;自动生成 2.输入“html:5”&#xff0c;然后按Tab键自动生成 3.直接复制粘贴以下代码&#xff1a; <!doctype html> <html lang"en"> <head><meta charset"UTF-8&q…

“金钥匙”转动!安全狗成功护航第二十三届中国国际投资贸易洽谈会举办

9月8日至9月11日&#xff0c;为期4天的第二十三届中国国际投资贸易洽谈会在厦门顺利举办。 作为国内云原生安全领导厂商&#xff0c;安全狗凭借突出的安全综合实力&#xff0c;受委托并担任此次会议网络安保技术支撑单位。 厦门服云信息科技有限公司&#xff08;品牌名&#xf…

【C语言】每日一题(半月斩)——day1

目录 &#x1f60a;前言 一.选择题 1.执行下面程序&#xff0c;正确的输出是&#xff08;c&#xff09; 2.以下不正确的定义语句是&#xff08; &#xff09; 3.test.c 文件中包括如下语句&#xff0c;文件中定义的四个变量中&#xff0c;是指针类型的变量为【多选】&a…

ARM架构指令集--专用指令

四、状态寄存器专用指令 CPSR寄存器-N Z C V T为0时 为ARM状态 F为0时 为开启FIQ状态 I为0时 为开启IRQ状态 图1 图2 一开始都是SVC指令&#xff0c;因为在操作系统启动的时候&#xff0c;在做一些初始化的操作&#xff0c;不允许被打断 图3 复位后CPSR寄存器为0xD3--…

BUSMASTER使用记录(一):基本收发、报文过滤、报文录制和数据回放

目录 一、概述二、基本收发2.1 连接设备2.2 接收2.3 发送 三、DBC加载和转换DBF文件四、报文过滤4.1 新增过滤器4.2 使能 五、报文录制/回放报文录制数据回放 一、概述 以往使用过的CAN盒虽然厂家不一样&#xff0c;但都兼容周立功的CANPro。这次使用的BusMaster&#xff0c;需…

【Hive SQL 每日一题】统计用户连续下单的日期区间

文章目录 测试数据需求说明需求实现 测试数据 create table test(user_id string,order_date string);INSERT INTO test(user_id, order_date) VALUES(101, 2021-09-21),(101, 2021-09-22),(101, 2021-09-23),(101, 2021-09-27),(101, 2021-09-28),(101, 2021-09-29),(101, 20…

9月12日作业

作业代码 #include <iostream>using namespace std;class Shape { protected:double cir;double area; public://无参构造Shape() {cout<<"无参构造"<<endl;}//有参构造Shape(double c, double a):cir(c), area(a){cout<<"有参构造&quo…

弄懂软件设计模式(一):单例模式和策略模式

前言 软件设计模式和设计原则是十分重要的&#xff0c;所有的开发框架和组件几乎都使用到了&#xff0c;比如在这小节中的单例模式就在SpringBean中被使用。在这篇文章中荔枝将会仔细梳理有关单例模式和策略模式的相关知识点&#xff0c;其中比较重要的是掌握单例模式的常规写法…