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

news2024/11/26 11:57:49

文章目录

  • 前言
  • 一、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机制是难点,其中的内网与外网的界限比较模糊,如果还是有点不明白,可以私信我,一起讨论。

路漫漫不止修身也养性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第十六章 原理篇:DETR

脑子不好使啊!复习过的东西过几天就忘记了! 参考教程: 论文地址:[pdf]End-to-End Object Detection with Transformer 源码地址:https://github.com/facebookresearch/detr 文章目录 概述the DETR modelDETR architect…

springboot篮球论坛系统

篮球论坛管理方面的任务繁琐,以至于每年都在篮球论坛管理这方面投入较多的精力却效果甚微,篮球论坛系统的目标就是为了能够缓解篮球论坛管理工作方面面临的压力,让篮球论坛管理方面的工作变得更加高效准确。 本项目在开发和设计过程中涉及到原理和技术有: B/S、java技术和MySQL…

Git❀详细使用教程

Git❀详细使用教程 一、Git简介1.1 什么是Git?1.2 Git的特点1.3 集中式与分布式的区别?1.4 Git工作流程图 二、Git安装与常用命令2.1 Git环境配置2.1.1 下载与安装2.1.2 基本配置2.1.3 为常用指令设置别名(可选)2.1.4 解决GitBash…

ChatGPT炒股:从上市公司招股说明书中批量提取发明专利表格

上市公司招股说明书通常会详细列明公司的发明专利,而通过企业的发明专利可以了解企业未来的业务布局情况,怎么把这些发明专利列表都批量提取出来呢? 随机打开几个上市公司的招股说明书,可以看到发明专利这一内容,共同的特征是都有…

Python的面向对象从入门到精通(简单易懂)

目录 1 初识对象 2. 成员方法 3. 类和对象 4. 构造方法 5. 其它内置方法 6. 封装 7. 继承 8. 复写 9. 类型的注解 10. 多态 1 初识对象 1. 生活中或是程序中,我们都可以使用设计表格、生产表格、填写表格的形式组织数据 2. 进行对比,在程序中&a…

进程间通信-无名管道

#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <string.h> int main(int argc, char **argv) {int pfd[2];int ret;pid_t pid;char buf[20]{0};retpipe(pfd);//创建一个无名管道if(ret<0){perror("pipe");ret…

lombok和guava工具

写在前面 本文看下如何通过使用lombok和guava来提高生产力。 1&#xff1a;lombok 我们开发程序时&#xff0c;如read method&#xff0c;write method&#xff0c;tostring&#xff0c;构造函数等&#xff0c;其写法其实都是固定和重复的&#xff0c;因此就可以考虑使用程序…

如何操作MySQL数据库基本数据

目录 一、MySQL数据库概念 数据 表&#xff08;数据表&#xff09; 数据库 数据库管理系统 数据库的建立和维护功能 数据定义功能 数据操纵功能 数据库的运行管理功能 通信功能 数据流向 二、主流数据库分类 1.SQL Server 数据库 &#xff08;微软分公司产品&…

Linux网络第六章——PXE高效批量网络装机

高效&#xff1a;速度快 批量&#xff1a;多台同时安装 网络&#xff1a;必须在网络环境 PXE&#xff1a;自动装机 需要&#xff1a; 1、DHCP实现地址自动分配 2、FTP把安装文件传输给客户机 3、xinetd&#xff1a;新一代的网络守护进程服务程序&#xff0c;管理轻量级…

赎金信(力扣)思维 JAVA

给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1a; 输入&#xff…

请求响应-响应-案例

案例需求 加载并解析emp.xml文件中的数据&#xff0c;完成数据处理&#xff0c;并在页面展示 emp.xml文件代码如下&#xff1a; <?xml version"1.0" encoding"UTF-8" ?> <emps><emp><name>金毛狮王</name><age>5…

Leangoo领歌敏捷工具标签管理上线~

在Leangoo领歌中&#xff0c;标签通常用作对任务的分类&#xff0c;或任务的优先级区分。 每创建一个看板设置一次标签&#xff0c;有点繁琐&#xff0c;现在标签管理功能上线&#xff0c;可以统一设置标签&#xff0c;统一导入标签。 标签设置步骤&#xff1a; 第一步&…

机器人xacro文件转换成urdf文件方法,并在rviz可视化

一、进入工作空间&#xff0c;source一下 cd cat_ws source devel/setup.bash二、进入xacro所在的文件夹&#xff0c;完成xacro文件到urdf文件的转换 cd src/kinova-ros/kinova_description/urdf/然后执行下面命令 rosrun xacro xacro.py two_arm_robot_example_standalone.…

注解和反射04(Java)

#拓展 获取泛型信息 反射操作泛型&#xff1a; package reflection;import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; import java.util.Map;//通过反射获取泛型 public class Test06{…

进制转换解析

进制 进制介绍 对于整数&#xff0c;有四种表示方式&#xff1a; 二进制&#xff1a;0,1 &#xff0c;满 2 进 1.以 0b 或 0B 开头。 十进制&#xff1a;0-9 &#xff0c;满 10 进 1。 八进制&#xff1a;0-7 &#xff0c;满 8 进 1. 以数字 0 开头表示。 十六进制&#xff1…

力扣题库刷题笔记42--接雨水(未通过)

1、题目如下&#xff1a; 2、个人Python代码实现&#xff08;部分用例超时&#xff09; 本地执行大概超过30S&#xff0c;力扣显示超时 3、个人Python代码思路&#xff1a; 当且仅当nums[i] < nums[i1]&#xff0c;nums[i] < nums[i-1]&#xff0c;此时nums[i]才能接到雨…

运动规划概述

运动规划概述 前端路径搜索后端轨迹生成MPD & MPC地图表示多智能体路径规划MAPF 前端路径搜索 不希望花费太多的算力和代价&#xff0c;因此通常把高维问题降成低维问题&#xff0c;先找到一条粗劣可行的低维解。 基于搜索的路径规划 图搜索问题 Dijkstra and A* 、 Jump…

第四十六章Java包(package)

在编写 Java 程序时&#xff0c;随着程序架构越来越大&#xff0c;类的个数也越来越多&#xff0c;这时就会发现管理程序中维护类名称也是一件很麻烦的事&#xff0c;尤其是一些同名问题的发生。有时&#xff0c;开发人员还可能需要将处理同一方面的问题的类放在同一个目录下&a…

python相关

1 首先下载python环境 win r 输入python 下载对应版本的环境 建议使用python3以上的版本。 2 windows环境下安装selenium 安装easy_install https://pypi.python.org/pypi/setuptools在此链接 然后python setup.py&#xff0c;看到了以下字样&#xff0c;则表明成功 这里需…

16万字市智慧人社项目建设方2023WORD

导读&#xff1a;原文《16万字市智慧人社项目建设方2023WORD》word&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 目 录 第 1 章 项目概述 1.1 项目名称 1.2 …