网络编程7——IP协议(子网掩码,NAT机制,IPv6协议) + 以太网

文章目录

  • 前言
  • 一、IP协议
    • 协议头格式
    • 认识IP地址
      • 格式
      • 组成
      • 子网掩码
    • 地址管理
      • 1.动态分配
      • 2.NAT机制
      • 3.IPv6协议
    • 路由选择
  • 二、以太网
    • 以太网帧格式
    • 认识MTU
  • 总结


前言

本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也对编程感兴趣的话,互关一下,以后互相学习,共同进步。这篇文章能够帮助到你的话,劳请大家点赞转发支持一下!

IP协议是网络层的重要协议,我们编写代码很难直接接触到,因此本文只讲解IP协议的两个核心功能:地址管理与路由选择,废话不多说,直接上干货。


一、IP协议

协议头格式

在这里插入图片描述

  • 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4。
  • 4位头部长度(header length):IP头部的长度是多少个32bit,也就是 长度 * 4 的字节数。4bit表示最大的数字是15,因此IP头部最大长度是 15 * 4 字节。
  • 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字节):选项字段用来支持排错、测量以及安全等措施,内容很丰富。 此字段的长度可变,从1个字节到40个字节不等,取决于所选择的项目。

认识IP地址

格式

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


组成

IP地址分为两个部分:网络号和主机号。

1️⃣网络号:标识网段,保证相互连接的两个网段具有不同的标识。(表示局域网)

2️⃣主机号:标识主机,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。(表示局域网的内部设备)

图解如下: 在这里插入图片描述
在这里插入图片描述
一个路由器,有两个IP地址,分别对应不同的局域网,路由器的作用就是把多个局域网连接起来。 一个路由器所在的两个局域网的网络号不能重复


子网掩码

一个IP地址中,哪个部分是网络号,哪个部分是主机号? 一定是前三个字节是网络号吗?? 答案是不一定的。

对于网络号与主机号的划分,主要有两种分类方式。 1️⃣IP地址分类(ABCDE)【教科书上存在,但是已经淘汰,不做介绍】 2️⃣子网掩码

在命令行中输入"ipconfig" 可以查看Windows IP 配置。
在这里插入图片描述
子网掩码,也是一串32位的二进制数。

1所占的二进制位就表示网络号,0所占的二进制位就表示主机号
上述的子网掩码用二进制表示:
111111111.11111111.11111111.00000000
也就是说这个IP地址前24位表示网络号,后8位表示主机号。

所有的子网掩码,左侧都是1,右侧都是0,不会出现0101这种混合情况。


地址管理

在协议头格式中为
源IP地址:发送方设备的网络地址
目的IP地址:接收方设备的网络地址

  • 每个网络设备都要有一个 唯一的IP地址

IP地址是32位二进制数,所以IP地址的总数量为 232 个,大约为42亿9千万

在如今这样一个网络高度发达的时代,物联网兴起的时代,不止是电子产品联网了,还有家具,电器等设备都进行了联网。所以这些IP地址早就已经不足以支持这么多设备了。

为了解决这个问题,大佬们提出了三种解决方案。
目前主流的解决方案是 动态分配 与 NAT机制 这两种。

1.动态分配

动态分配比较好理解,

动态分配:任何一台设备,只有在上网的时候才分配IP地址,不上网就不分配

这个方案只是增加了IP地址的利用率,并没有增加IP地址的数量,只是一定程度上的缓解,不能彻底解决问题。


2.NAT机制

NAT(Network Address Translator,网络地址转换)是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术。

NAT机制内容

NAT机制将所有的IP地址分为了两大类 内网与外网

内网IP: 10.*;172.16. * —— 172.31. * ;192.168. *
外网IP: 剩下的所有IP


内网IP在同一个内网中,不可重复 ;不同内网中可以重复 (如下图)。
外网IP必须是唯一的

在这里插入图片描述

内网设备如果要访问外网,会给他分配一个外网IP,这个外网IP是内网设备共有的,因此一个外网IP就代表了许多设备

如上图,如果内网1中的任何一台设备要访问外网,就会分配一个外网IP,假设为 66.66.66.66,并且使用这个外网IP去访问其他外网。

而这个分配下来的外网IP是这个内网中所有设备共有的,此时内网1中的任意设备访问外网时都会使用这个外网IP。

内网与外网

内网与外网的区别可以这样理解:

对于省份来说,河北省就是保定市,沧州市这些市的外网IP,这些市就是内网IP。
河北省(外网)包括保定市,沧州市,其他省份(外网)要想找到保定市(内网),就要先找到河北省(外网)

对于国家来说:中国就是河北省,河南省,这些省的外网IP,这些省就是内网IP。
中国(外网)包括河北省,河南省(内网),其他国家(外网)要想找到河北省(内网),就要先找到中国(外网)。

对于星球来说:地球就是中国,俄罗斯这些国家的外网IP,这些国家就是内网IP。
地球(外网)包括中国,俄罗斯(内网),其他星球(外网)要想找到中国(内网),就要先找到地球(外网)。

内网与外网并不是绝对的。

在命令行中输入"ipconfig" 可以查看Windows IP 配置。
在这里插入图片描述
实际上这个IPv4就是一个内网地址。

在这里插入图片描述
这个IP是在百度中查的这就是我的主机的外网IP,这个外网IP一定会被很多设备共用。外网IP查询地址


搞个流程图,可能更容易理解。

多台计算机向服务器发送请求
在这里插入图片描述
服务器向多台主机返回响应

在这里插入图片描述
当然了网络环境是很复杂的,因此可能需要经过多台路由器,交换机的转发才能到达服务器,因此可能请求发送过程中源IP地址被记录替换很多次,响应返回过程中目的IP被替换很多次。

你一定有个疑问???
如果多个设备经过同一路由器发出请求,而网络状况,请求都不一样,所以响应回到路由器肯定也是没有顺序可言的。那么路由器是怎么区分哪个响应该返回给哪台主机的呢??

此时,需要 NAT 设备根据传输层信息或其他上层协议去区分不同的会话,并且可能要对上层协议的标识进行转换,比如 TCP 或 UDP 端口号

在NAT的背景下,设备之间通信是有要求的
外网设备 -》外网设备,不需要任何NAT设备,直接通信。
内网设备 -》其他内网设备,不允许!
外网设备 -》内网设备,不允许!
内网设备 -》外网设备,经过对应内网的NAT设备即可完成通信。


3.IPv6协议

目前主流的IP协议是IPv4协议,就是目前介绍的协议。

而IPv6协议是一个新的IP协议,大概在2000年左右提出。

他与IPv4的最大区别就是:
IPv4用 4个字节 32位二进制位数来表示IP地址。 IPv6用 16个字节
128位二进制位数来表示IP地址。

IPv6协议有 2128个IP地址 ,这个数字是十分巨大的。这些IP地址可以给地球每一粒沙子都分配一个IP地址,因此IPv6协议从根本上解决了IP地址不够用的问题。

那为什么现在主流的IP协议还是IPv4协议呢??
因为:IPv4与IPv6并不兼容
IPv4出世的早,故而市面上的设备基本都是IPv4协议。
一个普通的IPv4设备,要想支持NAT,软件上升级下系统就可以了(成本很低)
一个普通的IPv4设备,要想支持IPv6,不仅要升级软件,还要升级硬件(成本很高)
所以大家就都用动态分配与NAT机制暂时解决IPv4的弊端,凑合用IPv4.


路由选择

现在主机A要给主机B发送一条消息。
互联网当中存在大量冗余,即A到B之间有很多条不同的线路可以选择,而 路由选择就是来选择到底走哪条路的

某个路由器是无法把整个网络环境记录下来的,路由器只能选择记录周围的情况(路由器内部使用 路由表这样的数据结构来记录邻居信息),即同一个局域网的情况。

因此网络转发的过程,就是一个逐渐问路的过程。
每个路由器只知道周围的情况,很可能你要找的IP地址他不知道(目的IP在路由表中没有匹配到),
此时路由器就会给你指出一条默认路径即路由表中的 “下一跳表项”(更上一级的路由器),
越上级路由器越牛,路由表记录的IP也就越多,因此重复这个过程就能找到目的IP了。
上述就是一个路由转发过程(简化版)了


二、以太网

“以太网” 不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容。

以太网是当前应用最广泛的局域网技术;和以太网并列的还有令牌环网,无线LAN等。


以太网帧格式

在这里插入图片描述

以太网帧中的地址,指的是mac地址,可以作为网络上身份识别的一种有效的技术手段,与IP地址类似。
mac地址占六个字节,数量是IP地址的6万多倍,因此够用,可以做到每个网卡都有唯一一个mac地址,且mac地址都是在网卡出厂时被写死的,不需要动态分配。


帧协议类型字段有三种值,分别对应IP、ARP、RARP,此处只介绍IP类型;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

不同的数据链路层协议,对应不同的硬件物理设备,此时传输数据的上限也不一样。


认识MTU

数据链路层的数据帧的最大载荷长度,称为MTU。
此处的载荷已经添加过传输层报头与网络层报头了

如果承载的数据长度超过MTU,就会在网络层进行分包,将一条数据拆分成多条数据,使每个载荷长度都小于MTU

IP协议的一个工作就是进行分包组包
在这里插入图片描述

组包过程
在这里插入图片描述

注意

不同数据链路层协议MTU不同。

虽然可以进行拆包组包,但是不能改变UDP协议最多只能传64K数据的事实,因为UDP头部中,表示长度的大小处只有两个字节。


总结

以上就是今天要讲的内容,本文NAT机制是难点,其中的内网与外网的界限比较模糊,如果还是有点不明白,可以私信我,一起讨论。

路漫漫不止修身也养性。

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

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

相关文章

MongoDB【MongoDB索引Index (索引概述、索引类型、复合索引、)】(三)-全面详解(学习总结---从入门到深化)

目录 MongoDB索引Index 聚合操作 通过聚合操作可以处理多个文档,并返回计算后的结果。 对多个文档进行分组对分组的文档执行操作并返回单个结果分析数据变化 聚合管道 分别由多个阶段来处理文档,每个阶段的输出是下个阶段的输入, 返回的是…

GitLab名词介绍

GitLab名词介绍 分支:active、stale、default、protected IDEA中git面板:本地、远程、HEAD 合并时的选项:Delete、squash 查看Git常用操作 分支:active、stale、default、protected 在分支页面下,有active、stale…

Acwing 849. Dijkstra求最短路 I

Acwing 849. Dijkstra求最短路 I 链接:849. Dijkstra求最短路 I - AcWing题库 /*题解:dijkstra算法模板对于单源最短路径dijkstra1.每次找到当前距离源最近的节点 作为确定距离的点2.通过这个点看能否让其他的节点来松弛其他点到源的距离重复12操作*/ #include<algorithm&g…

端口映射的作用?如何在路由器上做端口映射

一、端口映射作用 路由器中设置端口映射的主要作用&#xff0c;就是让Internet上的其他用户&#xff0c;可以访问你路由器下面电脑中的数据(软件、文件)。 当家里的电脑使用路由器上网后&#xff0c;在Internet下的其它电脑、手机等网络设备&#xff0c;将无法自接访问你电脑…

linux常用的命令

一.操作目录命令 1.1 ls 命令 语法&#xff1a; ls [选项] [目录或文件] 功能: 对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含…

仙境传说RO:添加自定义道具

仙境传说RO&#xff1a;添加自定义道具 大家好&#xff0c;我是艾西今天和大家聊一下仙境传说RO怎么添加自定义道具。在我们开服时加入一些道具模组等往往会让我们的服务器更有特色以及消费点&#xff0c;那么让我们直接进入正题开始操作&#xff1a;&#xff08;此处我们讲的…

【C#】Kestrel和IIS服务器下的同步与异步配置

最近在回看自己写的代码时&#xff0c;发现服务配置里最开头写了两段代码&#xff0c;第一感觉&#xff0c;这是啥功能&#xff0c;太久有点生疏了&#xff0c;经过一顿搜索和回顾&#xff0c;简单整理如下 目录 1、Kestrel服务器1.1、跨平台1.2、高性能1.3、可扩展性1.4、安全…

零矩阵

暴力解法&#xff1a;先全部检索&#xff0c;定位0所在的位置&#xff0c; 记录到新的数组 数组的行列分别进行去重 数组中记录的行列赋值为零 如果直接修改&#xff0c;在行被修改之后&#xff0c;修改列时会因为行已经被修改产生影响 import org.junit.Test;import java.uti…

二十三种设计模式第十四篇--策略模式

策略模式&#xff1a;主要围绕一个类的行为或者其算法在运行时更改&#xff0c;也是一种行为型模式。 在软件开发中&#xff0c;我们经常遇到需要根据不同的情况选择不同算法或行为的情况。传统的做法是使用大量的条件语句来实现这种逻辑&#xff0c;但这样的实现方式往往难以…

Python模拟MQTT v3.1.1服务器

示例代码 import logging import asyncio from hbmqtt.broker import Broker# 设置日志级别为DEBUG logging.basicConfig(levellogging.DEBUG)# 创建MQTT服务器 broker Broker()# 启动MQTT服务器 async def start_broker():await broker.start()# 停止MQTT服务器 async def s…

python离线安装ibm_db

下载离线包ibm_db以及clidriver 下载imb_db 在pypi官方网站https://pypi.org/project/ibm-db/#files下载离线安装包ibm_db-3.0.2.tar.gz。下载clidriver 下载地址&#xff1a;https://public.dhe.ibm.com/ibmdl/export/pub/software/data/db2/drivers/odbc_cli/nt32_odbc_cli.…

C语言学生信息管理系统

C语言版学生信息管理系统 一&#xff0c;开发环境 操作系统&#xff1a;windows10, windows11, linux, mac等。开发工具&#xff1a;Qt, vscode, visual studio等开发语言&#xff1a;c语言 二&#xff0c;功能需求 1. 用户界面: 提供一个简洁的文本界面&#xff0c;用户可…

AI 对抗超级细菌:麦克马斯特大学利用深度学习发现新型抗生素 abaucin

内容一览&#xff1a;鲍曼不动杆菌是一种常见的医院获得性革兰氏阴性病原体&#xff0c;通常表现出多重耐药性。利用传统方法&#xff0c;发现抑制此菌的新型抗生素很困难。但利用机器学习可以快速探索化学空间&#xff0c;从而增加发现新型抗菌分子的可能性。近期&#xff0c;…

AI大数据智能视频融合平台EasyCVR新增Ehome黑白名单配置

EasyCVR视频融合平台基于云边端智能协同架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台支持海量视频汇聚管理&#xff0c;可支持多协议接入&#xff0c;包括市场主流标准协议与厂家私有协议及SDK&#xff0c;如&#xff1a;国标GB28181、RTMP、RTSP/Onvi…

2023-07-12:RocketMQ如何做到消息不丢失?

2023-07-12&#xff1a;RocketMQ如何做到消息不丢失&#xff1f; 答案2023-07-12&#xff1a; RocketMQ通过刷盘机制、消息拉取机制和ACK机制等多种方式来确保消息投递的可靠性&#xff0c;防止消息丢失。 1.刷盘机制 RocketMQ中的消息分为内存消息和磁盘消息&#xff0c;内…

【Linux】基础开发工具——gcc/g++篇

文章目录 一、预处理1.1 头文件展开1.2 条件编译 二、编译三、汇编四、链接4.1 什么是库?4.2 库的分类4.3 目标文件和库是如何链接的&#xff1f;4.3.1 动态链接4.3.2 静态链接 4.4 动静态链接的优缺点对比 五、Debug&&release 前言 &#xff1a;  在前面的文章里给大…

1、计算机网络核心

序号地址1计算机网络核心2数据库相关3Redis4Linux相关5JVM的内容6GC相关的7Java多线程与并发8Java多线程与并发-原理9Java常用类库与技巧10Java框架-Spring 文章目录 1、OSI开放式互联参考模型2、TCP/IP3、TCP报文头4、TCP的三次握手5、TCP的四次挥手6、为什么会有TIME_WAIT状态…

ARM Coresight 系列文章 7 - ARM Coresight 通过 AHB-AP 访问 cpu 内部 coresight 组件

文章目录 如下图所示&#xff0c;如果A78想去访问M33的内部 coresight 组件 ETM&#xff0c;需要要怎么做&#xff1f; 答案也正是在图中&#xff0c;首先A78 通过AXI 互联&#xff0c;接入到 APBIC 的 slave port&#xff0c;再通过APBIC 的 master 送出&#xff0c;而APBIC中…

机器学习-进化算法

进化算法 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;crossovermutation 进化策略&#xff08;Evolutionary Strategies&#xff0c;ES&#xff09;基因编程&#xff08;Genetic Programming&#xff09;Multi-objective Evolutionary Algorithms 遗传算…

在Linux中传输文件文件夹的10个scp命令

scp 命令的基本语法 下面的命令将读作 copy source_file_name进入destination_folder在destination_host使用username account。 > scp source_file_name usernamedestination_host:destination_folder里面有很多参数scp你可以使用的命令。以下是可能在日常使用中使用的参数…