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

网络层重点协议——IP协议详解

 ✏️✏️✏️今天给大家分享的是网络层的重点协议——IP协议。

清风的CSDN博客

🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流!

✈️✈️✈️动动你们发财的小手,点点关注点点赞!在此谢过啦!哈哈哈!😛😛😛

目录

一、IP 协议格式 

 二、认识 IP 地址

2.1 概念

2.2 作用

2.3 格式

2.4 组成 

 2.5 分类 

2.6 特殊的IP地址

2.7 子网掩码

2.7.1 格式

2.7.2 作用

2.7.3 计算方式 

三、NAT 机制 


一、IP 协议格式 

  • 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4。
  • 4位头部长度(header length):IP头部的长度是多少个32bit,也就是 length * 4 的字节 数。4bit表示最大的数字是15,因此IP头部最大长度是60字节。
  • 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本,这四者相互冲突,只能选择一个。
  • 16位总长度(total length):IP数据报整体占多少个字节。
  • 16位标识(id):唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。
  • 3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示"更多分片",如果分片了的话,最后一个分片置为0,其他是1。类似于一个结束标记。
  • 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。
  • 8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数。一般是64。每次经过一个路由,TTL - 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。
  • 8位协议:表示上层协议的类型。
  • 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏。
  • 32位源地址和32位目标地址:表示发送端和接收端。
  • 选项字段(不定长,最多40字节):不做介绍

 二、认识 IP 地址

2.1 概念

IP 地址( Internet Protocol Address )是指互联网协议地址,又译为网际协议地址。

2.2 作用

IP 地址是 IP 协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

2.3 格式

IP 地址是一个 32 位的二进制数,通常被分割为 4 “8 位二进制数 (也就是 4 个字节),如:
01100100.00000100.00000101.00000110
通常用 点分十进制 的方式来表示,即 a.b.c.d 的形式( a,b,c,d 都是 0~255 之间的十进制整数)。如:100.4.5.6。

        IP协议有两个版本,IPv4和IPv6。IPv4数量=2^32,大约43亿左右,而TCP/IP协议规定,每个主机都需要有一个IP地址。对于全世界计算机来说,这个数量是不够的,所以后来推出了IPv6(长度128位,是IPv4的4倍)。但因为目 前IPv4还广泛的使用,且可以使用其他技术来解决IP地址不足的问题,所以IPv6也就没有普及。

2.4 组成 

IP 地址分为两个部分,网络号和主机号:
  • 网络号标识网段,保证相互连接的两个网段具有不同的标识
  • 主机号标识主机,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号
通过合理设置网络号和主机号,就可以保证在相互连接的网络中,每台主机的 IP 地址都是唯一的。
那么,如何划分网络号和主机号呢?

 2.5 分类 

过去曾经提出一种划分网络号和主机号的方案,把所有 IP 地址分为五类,如下图所示:

2.6 特殊的IP地址

  • 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网
  • 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包
  • 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
  • 本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通

在上述的分类中,存在IP地址浪费的问题:

  • 单位一般会申请B类网络(C类连接主机数量有限),但实际网络架设时,连接的主机数量又常远小于65534B类连接主机数),造成IP地址浪费;同理,A类网络的IP地址也会造成大量的浪费。
  • 当一个单位申请了一个网络号。他想将该网络能表示的IP地址再分给它下属的几个小单位时,如果在申请新的网络就会造成浪费。
为了解决以上问题,引入子网掩码来进行子网划分。

2.7 子网掩码

2.7.1 格式

子网掩码格式和 IP 地址一样,也是一个 32 位的二进制数。其中左边是网络位,用二进制数字 “1” 表示, 1 的数目等于网络位的长度;右边是主机位,用二进制数字“0” 表示, 0 的数目等于主机位的长度。 子网掩码也可以使用二进制所有高位1相加的数值来表示。

2.7.2 作用

  •  划分A,B,C三类 IP 地址子网:
如一个 B IP 地址: 191.100.0.0 ,按 A ~ E 类分类来说,网络号二进制数为 16 位网络号 +16位主机号。 假设使用子网掩码 255.255.128.0 (即 17 ) 来划分子网,意味着划分子网后,高 17 位都是网络位 / 网络 号,也就是将原来 16 位主机号,划分为 1 位子网号 +15 位主机号。
此时, IP 地址组成为:网络号 + 子网号 + 主机号,网络号和子网号统一为网络标识(划分子网后的网络号 / 网段)

  • 网络通信时,子网掩码结合IP地址,可以计算获得网络号(划分子网后的网络号)及主机号(划分子网后的主机号)。一般用于判断目的IP与本IP是否为同一个网段。

       对于网络通信来说,发送数据报时,目的主机与发送端主机是否在同一个网段,流程是不一样的。 

2.7.3 计算方式 

  • 将 IP 地址和子网掩码进行“按位与”操作,得到的结果就是网络号。
  • 将子网掩码二进制按位取反,再与 IP 地址位与计算,得到的就是主机号。

示例:

关于IP协议还有一个重要功能——路由选择(数据报在IP协议下如何传输)

路由器转发的过程类似于问路的过程,每个路由器内部都有一个数据结构——路由表。数据报到达路由器,就查询路由表。若查到就直接按照这个方向转发。否则路由器给一个默认的方向,沿着默认方向走。

三、NAT 机制 

IPv4 协议中, IP 地址数量不充足,那么如何解决这个问题呢?
NAT 技术当前解决 IP 地址不够用的主要手段,是路由器的一个重要功能:
  • NAT能够将私有IP对外通信时转为全局IP,也就是就是一种将私有IP和全局IP相互转化的技术方法
  • 很多学校,家庭,公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP
  • 全局IP要求唯一,但是私有IP不需要;在不同的局域网中出现相同的私有IP是完全不影响的

  • NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37
  • NAT路由器收到外部的数据时,又会把目标IP从202.244.174.37替换回10.0.0.10
  • 在NAT路由器内部,有一张自动生成的,用于地址转换的表
  • 当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系

NAPT 工作过程 

那么问题来了,如果局域网内,有多个主机都访问同一个外网服务器,那么对于服务器返回的数据中,目的IP 都是相同的。那么 NAT 路由器如何判定将这个数据包转发给哪个局域网的主机?

这时候NAPT来解决这个问题了,使用IP+port来建立这个关联关系:

这种关联关系也是由 NAT 路由器自动维护的。例如在 TCP 的情况下,建立连接时,就会生成这个表项,在断开连接后,就会删除这个表项。
NAT 技术的缺陷
  • 无法从NAT外部向内部服务器建立连接
  • 转换表的生成和销毁都需要额外开销
  • 通信过程中一旦NAT设备异常,所有的TCP连接都会断开

🌈🌈🌈好啦,今天的分享就到这里。

🌈🌈🌈希望各位看官读完文章后,能够有所提升!

🎉🎉🎉创作不易,还希望各位大佬支持一下!

✈️✈️✈️点赞,你的认可是我创作的动力!

⭐⭐⭐收藏,你的青睐是我努力的方向!

✏️✏️✏️评论:你的意见是我进步的财富

相关文章:

  • 论jenkins的使用方法(初步)
  • CESM笔记——component活动状态+compset前缀解析+B1850,BHIST区别
  • Spring JDBC和事务管理
  • Python实现获取b站视频的弹幕内容
  • 想学编程,但不知道从哪里学起,应该怎么办?
  • TCP对数据的拆分
  • 软件设计模式原则(四)里氏替换原则
  • 本地如何使用PHP搭建简单Imagewheel云图床,结合内网穿透实现在外远程访问?
  • SpringCloud | Dubbo 微服务实战——注册中心详解
  • 48.0/图片和多媒体文件的使用(详细版)
  • 2023年【G1工业锅炉司炉】考试及G1工业锅炉司炉作业考试题库
  • docker-ubuntu中基于keepalived+niginx模拟主从热备完整过程
  • k8s的Pod常见的几种调度形式
  • LeetCode56. Merge Intervals
  • 【办公软件】Outlook启动一直显示“正在启动”的解决方法
  • 2017届校招提前批面试回顾
  • 2017年终总结、随想
  • co模块的前端实现
  • go append函数以及写入
  • Laravel5.4 Queues队列学习
  • leetcode388. Longest Absolute File Path
  • MySQL-事务管理(基础)
  • Node + FFmpeg 实现Canvas动画导出视频
  • Python - 闭包Closure
  • Shadow DOM 内部构造及如何构建独立组件
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Webpack 4 学习01(基础配置)
  • 阿里云购买磁盘后挂载
  • 后端_MYSQL
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 每天一个设计模式之命令模式
  • 前端路由实现-history
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 使用Swoole加速Laravel(正式环境中)
  • 我建了一个叫Hello World的项目
  • # Apache SeaTunnel 究竟是什么?
  • # 安徽锐锋科技IDMS系统简介
  • (三) diretfbrc详解
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (十一)手动添加用户和文件的特殊权限
  • (译)2019年前端性能优化清单 — 下篇
  • ***通过什么方式***网吧
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net 4.0发布后不能正常显示图片问题
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net(C#)中String.Format如何使用
  • .net流程开发平台的一些难点(1)
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @ComponentScan比较
  • @PreAuthorize注解
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]