IP协议

网络层

        对于网络层来说,它是传输层协议的具体实施,那么它具体是如何实施的呢?

IP协议

     

         IP能够实现将数据从A主机送到B主机,在网络中,每一个IP报文都包含了它的目标网络和目标主机。

        而IP协议就是网络层使用的协议。

IP协议报头

        为了了解协议,我们需要了解它的报头。

  •  4位版本号:表示使用的IP协议的版本(分为IPV4和IPV6)
  • 4位首部长度:表示报头的长度,其单位是4字节
  • 8位服务类型:三位优先权字段(已弃用),4位TOS字段,和1位保留字段。其中4位TOS字段分别是:最小延迟,最大吞吐量,最高可靠性,最小成本,这四者互相冲突,只能选择一个
  • 16位总长度:IP数据报总长度
  • 8位生存时间(TTL):数据到达目的地的最大报文跳数,一般为64,每经过一个路由器就-1,目的是防止路由循环
  • 8位协议:表示上层协议
  • 16位校验和:CRC校验,鉴别头部是否损坏
  • 32位源IP地址:发送端的IP地址
  • 32位IP地址:接收段的IP地址

        其中,IP地址所记录的就是网络号和主机号

分片

        在数据链路层有一个规定,就是发送的数据不可超过1500字节,但是传输层并不关心数据有没有超过1500字节,因此网络层对传输层发下来的数据要进行分片,将数据分开。

如何知道数据被分片了?

        解决这个问题我们需要先了解报头中的这三个属性。

  • 16位标示:唯一的标识主机发送的报文,若是报文被分片了,同一报文中被分片的数据的标识都是相同的
  • 3位标志:第一位保留(目前没用),第二位为1表示禁止分片第三位为‘更多分片’,如果一个报文的第三位为1,表示它后续还有被分片的报文,为0则表示它是最后一个分片
  • 13位片偏移:就是分片相对于原始IP报文开始出的偏移,表示该分片处于原报文的哪个位置,实际偏移量为这个值 *8 ,因此出了最后一个报文,其他报文长度都是8的整数倍

        通过这三个属性,我们就知道报文是否被分片了。

        若是3位标志的第三个为1表示是分片,若是为0&&13位片偏移大于0也说明是分片。

        同一报文的分片则通过16位标示分辨。

        而分片的数据则按照13位片偏移来按升序组装,而报头中的校验和则保证数据的正确性。

如何进行分片的?

        

         当传输层发下来三千字节的数据时,网络层的IP协议会先添加报头。

        然后发现数据已经超过1500字节了,因此它就会将数据给分片。

        第一片包括原来的IP报头和1480字节的数据。

        第二片则是纯1480字节的数据,然后添加报头。

        第三片则是剩下的40字节的数据,然后添加报头。

网段划分(重要)*

        为了提高传输效率方便定位主机,互联网上的每一台主机都隶属于一个子网,每一台主机在网络上都有自己主机号,每一个子网都有自己的网络号。

        我们可以将子网当成学院,主机则是学生,同一个学院的学生的学院号相同,但是它们的学号不同。

        而网络通信的过程就像是学生寻找失主的过程。

        假设王五捡到了张三的学生证,王五就去学生群里发消息说捡到了学号为 000 123 学号的学生证,让他认领,张三就在学生群中看到了消息,从而找回了自己的学生证。

         然后我们更换下概念,学生是主机学院是这个主机所在的子网学生群则是公网

         就像图中,同一个网段中的主机标识不同,但是不同网段的主机标识可以相同,而且不同网段的网络号也不同,此外,连接两个子网的就是路由器。

        这样就能够保证网络中的主机的IP地址都不相同。

        其中路由器在网络中担任了重要角色,它带有DHCP功能,能够自动的给子网内新增节点分配IP地址。

子网掩码

        在之前,曾提出过一种划分网络号和主机号的方案,将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

        但是这种方案随着网络的发展出现了局限性,大部分组织都申请的是B类的IP地址,导致B类很快就分配完了,但是A类却浪费了大量地址。

        因此又提出了新的划分方案:CIDR

  • 引入了额外的子网掩码来区分网络号和主机号
  • 子网掩码是一个32位的正整数,通常由一串 ‘0’ 结尾
  • 将IP地址和子网掩码进行 “按位与” 的操作,就得到了网络号
  • 而网络号和主机号的划分与这几个方案都无关

例如:

         通过与操作能够成功的计算出网络号和子网地址范围。

        此外还有一种特殊的表述方法:140.252.20.68/24,就表示IP地址是 140.252.20.68,子网掩码高24位为1,也就是 255.255.255.0 。

特殊的IP地址

  • 主机地址全为0表示网络号,也就是这个局域网
  • 主机地址全为1表示广播地址,也就是给同一链路中的所有主机发送数据包
  • 127.*表示本地环回测试,一般是127.0.0.1

IP地址的数量限制

        由于特殊IP地址和网络高速发展,IPV4版本的IP协议已经不够用了。

        即便有CIDR来缓解,但是依旧治标不治本。

        因此各界大佬提供了三种方案。

  • 动态分配IP地址:只给接入网络的设备分配IP地址
  • NAT技术
  • IPv6协议:是一个128位16字节的协议,能够大大缓解当前IP地址不足的问题

私有IP和公网IP地址

        一般组建局域网的都是私有IP,而私有IP是规定了的。

  • 10.*,前8位是网络号
  • 172.16到172.31,前12位是网络号
  • 192.168.*,前16位是网络号
  • 在这个范围内的都是私有IP

        而公网都需要运营商的路由器来连接。

  •  每台主机发送数据都需要经过家用路由器,企业路由器然后放到广域网中,再发送给对应的主机以此来通信。
  • 每一个路由器可以配置两个IP地址:WAN口IP和LAN口IP(子网IP)
  • 路由器LAN口连接的主机都从属于该路由器的子网
  • 每个路由器它的LAN口IP都相同,但是子网内的主机IP不同,不过子网之间的IP地址就可以重复了
  • 最外层的运营商路由器的WAN口IP就是公网IP
  • NAT技术就是每一层路由器将IP首部的IP地址进行替换,这一层的WAN口IP变为上一层的LAN口IP,逐级替换最后到公网IP
路由

        目前我们已经知道了网络通信实际上是主机发送数据包给路由器,路由器通过数据报上的目的IP来一层一层的找到对应主机,那么IP协议是如何做到的呢?

        实际上IP协议这种一层一层找到对应主机的路的方式叫做路由,而路由就是靠路由器内部维护的路由表

路由表

        在网络中的每个节点都维护着自己的路由表。

        在命令行中可以用 route 命令查看。

  • Flag 中的 U 表示此条目可用,带有G表示下一跳是路由器地址,没有G则表示同一子网中的其他主机地址 

        当我们发送数据报时,就是在路由表上通过与子网掩码运算,来和目的地址对比,若是运算后有对应的目的地址,就直接跳转,没有就采用默认目的地址,通过路由发送到其他子网上去。

        通过这样的方式,我们经过一层一层的路由表的子网掩码计算得到的目的IP会越来越准确,最终定位到目标主机。

总结

        本篇博客了解了什么是IP,IP协议的报头格式,以及报头各个属性的作用,然后还了解了什么是分片。

        而后了解到为了方便定位主机,提高传输效率,大佬们提出了网段划分,但是随之而来的是IP地址的不足,为了解决这个问题大佬提出了子网掩码的解决方法,还了解到一些特殊的IP地址以及IP地址的数量限制。

        后面又了解到私有IP的划分,还了解到不同局域网之间的主机进行通信的大致过程,还了解了路由以及每个节点维护的路由表。

        以上就是网络层协议的内容。

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

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

相关文章

【mysql】—— 表的约束

目录 序言 (一)空属性 (二)默认值 (三)列描述 (四)zerofill (五)主键 (六)自增长 (七)唯一键 &#…

stm32_断点调试无法进入串口接收中断

先说结果,可能是stm32调试功能/keil软件/调试器(试过STLINK和JLINK两种)的问题,不是代码; 1、入坑 配置完串口后,可以发送数据到串口助手,但不能接收数据并做处理,所以第一步&…

安全防御(3)

1.总结当堂NAT与双机热备原理,形成思维导图 2.完成课堂nat与双机热备试验 引用IDS是指入侵检测系统,它可以在网络中检测和防御入侵行为。IDS的签名是指根据已知入侵行为的特征制定的规则,用于检测和警告可能存在的入侵行为。签名过滤器可以根…

图论——最短路算法

引入&#xff1a; 如上图&#xff0c;已知图G。 问节点1到节点3的最短距离。 可心算而出为d[1,2]d[2,3]112,比d[1,3]要小。 求最短路径算法&#xff1a; 1.Floyd(弗洛伊德) 是一种基于三角形不等式的多源最短路径算法。边权可以为负数 表现为a[i,j]a[j,k]<a[i,k]。 …

9.2.2Socket(TCP)

一.过程: 1.建立连接(不是握手),虽然内核中的连接有很多,但是在应用程序中,要一个一个处理. 2. 获取任务:使用ServerSocket.accept()方法,作用是把内核中的连接获取到应用程序中,这个过程类似于生产者消费者模型. 3. 使用缓冲的时候,注意全缓冲和行缓冲. 4.注意关闭文件资源…

排序算法(二)

1.希尔排序-Shell Sort 1.算法原理 将未排序序列按照增量gap的不同分割为若干个子序列&#xff0c;然后分别进行插入排序&#xff0c;得到若干组排好序的序列&#xff1b; 缩小增量gap&#xff0c;并对分割为的子序列进行插入排序&#xff1b;最后一次的gap1&#xff0c;即整个…

SQL 基础查询

msyql 不区分大小写 DDL 数据定义语言 查询 show databases create database db01 创建数据库 create database if not exists db01 创建数据库 删除数据库 drop database if exists db01 使用数据库 use 数据库名 CREATE TABLE tb_user(id int PRIMARY KEY COMMENT i…

简单易用且高效的跨平台开发工具:Xojo 2023 for Mac

Xojo for Mac是Mac平台上一个跨平台的针对桌面、Web、移动和Raspberry Pi的快速应用程序开发软件。与其他多平台开发工具相比&#xff0c;Xojo for Mac为开发人员提供了显着的生产率提高。 Xojo for Mac具有拖放功能&#xff0c;使您能够快速创建用户界面设计&#xff0c;然后…

【Linux初阶】进程间通信介绍 管道

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;进程间通信介绍&#xff0c;管道概述&#xff0c;匿名管道应用&#xff0c;命名管道应用 &#x1f6a2;&#…

如何在 Spring Boot 中集成日志框架 SLF4J、Log4j

文章目录 具体步骤附录 笔者的操作环境&#xff1a; Spring Cloud Alibaba&#xff1a;2022.0.0.0-RC2 Spring Cloud&#xff1a;2022.0.0 Spring Boot&#xff1a;3.0.2 Nacos 2.2.3 Maven 3.8.3 JDK 17.0.7 IntelliJ IDEA 2022.3.1 (Ultimate Edition) 具体步骤 因为 …

HTTP代理编程:Python实用技巧与代码实例

今天我要与大家分享一些关于HTTP代理编程的实用技巧和Python代码实例。作为一名HTTP代理产品供应商&#xff0c;希望通过这篇文章&#xff0c;帮助你们掌握一些高效且实用的编程技巧&#xff0c;提高开发和使用HTTP代理产品的能力。 一、使用Python的requests库发送HTTP请求&a…

【ElasticSearch入门】

目录 1.ElasticSearch的简介 2.用数据库实现搜素的功能 3.ES的核心概念 3.1 NRT(Near Realtime)近实时 3.2 cluster集群&#xff0c;ES是一个分布式的系统 3.3 Node节点&#xff0c;就是集群中的一台服务器 3.4 index 索引&#xff08;索引库&#xff09; 3.5 type类型 3.6 doc…

STM32F429IGT6使用CubeMX配置串口通信

1、硬件电路 2、设置RCC&#xff0c;选择高速外部时钟HSE,时钟设置为180MHz 3、配置USART1引脚 4、生成工程配置 5、部分代码 //重定向printf函数 int fputc(int ch, FILE *f) {HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);return ch; } /* USER CODE BE…

Mac M1 安装Oracle Java 与 IEDA

文章目录 1 官网下载2 安装IDEA参考 1 官网下载 https://www.oracle.com/ 使用finder中的拖拽进行安装即可 2 安装IDEA https://www.jetbrains.com/zh-cn/idea/download/?sectionmac 同样的&#xff0c;下载完后拖拽安装即可 参考 Mac M1 安装Java 开发环境 https://blog.…

cuda+anaconda+pytorch按照教程

首先安装显卡对应的CUDA版本&#xff0c;关键点在于区别显卡支持的CUDA最高版本和运行版本 1、查看当前显卡支持的最高版本&#xff0c;有两种方式&#xff1a; 1&#xff09;NVIDIA控制面板—>帮助—>系统信息—>组件—>NVCUDA.dll对应版本 请注意&#xff0c;12…

快速上手React:从概述到组件与事件处理

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

React源码解析18(1)------ React.createElement 和 jsx

1.React.createElement 我们知道在React17版本之前&#xff0c;我们在项目中是一定需要引入react的。 import React from “react” 即便我们有时候没有使用到React&#xff0c;也需要引入。原因是什么呢&#xff1f; 在React项目中&#xff0c;如果我们使用了模板语法JSX&am…

Spring-1-深入理解Spring XML中的依赖注入(DI):简化Java应用程序开发

学习目标 前两篇文章我们介绍了什么是Spring,以及Spring的一些核心概念&#xff0c;并且快速快发一个Spring项目&#xff0c;以及详细讲解IOC&#xff0c;今天详细介绍一些DI(依赖注入) 能够配置setter方式注入属性值 能够配置构造方式注入属性值 能够理解什么是自动装配 一、…

【C语言】每日一题---1

大家好&#xff0c;我是苏貝&#xff0c;本篇博客是系列博客每日一题的第一篇&#xff0c;本系列的题都不会太难&#xff0c;如果大家对这种系列的博客感兴趣的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 下面代码的结果是&#xff1a; #include <…

【Nginx】Nginx负载均衡

负载均衡&#xff1a;通过反向代理来实现 Nginx的七层代理和四层代理&#xff1a; 七层是最常用的反向代理方式&#xff0c;只能配置在nginx配置文件的http模块当中 &#xff1b;配置的方法名称为&#xff1a;upstream模块&#xff0c;不能写在server中也不能写在location中&a…
最新文章