javaEE-网络原理-IP协议

news/2025/1/11 9:19:32/

目录

一.网络层 IP协议

IP协议头部格式

IP协议如何管理地址

1.动态分配IP地址:

2.NAT机制(网络地址映射)

​编辑3.IPv6

IP协议如何进行网段划分

早期的网段划分和现在还不一样:

一些特殊的IP地址:

IP协议进行地址管理

二、数据链路层 以太网

以太网帧格式:

三、DNS协议


一.网络层 IP协议

IP协议主要完成两项工作:

1.地址管理:使用一套地址体系(IP地址),来描述互联网上每个设备所处的位置.

2.路由选择:指一个数据包如何从互联网上的一个设备传输到另一个设备。

IP协议头部格式

1.4位版本(version):指定IP协议的版本,对于IPv4来说,就是4.对IPv6来说,就是6,只有两个值.目前主流版本是IPv4.

2.4位首部长度(header length):IP头部的⻓度是多少个32bit,也就是length*4的字节数.4bit表⽰最 ⼤的数字是15,因此IP头部最⼤⻓度是60字节.

3.8位服务类型(Type Of Service):实际上只有4位,并且这4位是相互冲突的,只有1位是1,其余三位都是0,分别代表:最小延时,最大吞吐量,最高可靠性,最小成本。表示当前IP协议所处的模式。

4.16位总长度(total length):整个IP数据报的总长度(报头+载荷)。

虽然IP数据报长度受限,但IP提供了拆包和组包的功能,当IP载荷(TCP数据报/UDP数据报)长度过长时,IP数据报就会自动拆分成多个IP数据报,每个数据报都会携带载荷的一部分信息.

这个拆包是在操作系统内核中完成的,程序代码无法控制.

5.16位标识符,3位标志位,13位片偏移:

上面拆包时,多个IP数据报将一个载荷拆分成多个IP数据报,这多个IP数据报的标识符都是相同的值.

拆包之后如何组包就是通过 16位标识符,3个标志位和13位片偏移 来识别完成的.

16位标识符用来确认哪些是同一个IP数据报的载荷,将其组装在一起;

3位标志位:只有2位是有效的,1位代表IP数据报是否拆分;1位代表该IP数据报携带的载荷是否为最后一个.

13位片偏移:表示了这些包的先后顺序,IP数据报可能会出现先发后至的现象,这个片偏移标识载荷的前后位置.

6.8位生存时间:单位是"次数"。当一个IP数据报每经过一个路由器,TTL的值就-1,当TTL为0时,就将这个数据报丢掉。这是为了防止IP数据报的目的地址有问题,而在网络中无限止的转发下去。

TTL的值一般是32/64就足以支撑当前的网络传输了.

windows有一个tracert指令,可以查看当前网络通信的路径:

比如访问美国官网:

7.8位协议:表示在传输层使用哪个协议.

8.16位首部检验和:只用来检验IP报头,IP数据报的载荷中有TCP检验和/UDP检验和,在IP层就不再检验了.

9.32位原IP地址,32位目的IP地址:标示量发件人和收件人的IP地址.

IP协议如何管理地址

就是通过这两个32位原IP地址和32位目的IP地址.

IP地址本质上就是32位整数,为了方便,把IP地址表示成 点分十进制的形式。通过三个点,把IP地址分成4部分,每部分1字节,每个字节的范围:0-255。

IP地址的存在,就是为了区分网络上的不同设备,希望每个设备都有一个唯一的IP地址.

32位地址,表示的范围:2^32=42亿9千万多 的数字,这个数字看起来很大,但对于快速发展的网络来说,并没有很大,如何解决IP地址不够用问题,就成了一个很重要的事情,

有三种解决方法:

1.动态分配IP地址:

全世界,并不是所有设备都同一时刻一起上网的,通过更充分的利用IP地址,动态分配IP地址,解决问题。(这个方法,理论上可行,但实际中中很难实施的)

2.NAT机制(网络地址映射)

先把IP地址分为两大类:

1.私网IP(局域网IP):IP地址以:10.*,172.16-172.31.*,192.168.*开头的都是局域网IP。

2.公网IP(广域网IP):除了私网IP外,别的都是公网IP.

要求公网的设备上,使用的公网IP都不能重复,必须是唯一的;但私网设备使用的私网IP,只要保证在同一个局域网内不能重复,不同局域网之间的IP允许重复。

由于上面的规定,在设备之间进行访问时,有一个重要限制:

1>.公网设备访问公网设备时,可以直接访问。

2>.私网设备访问私网设备(同一个局域网中的),可以直接访问。

3>.私网设备访问私网设备(不同局域网中的),不允许访问。

4>.私网设备访问公网设备,需要对私网设备地IP地址进行转换,也是可以访问地。

5>.公网设备访问私网设备,不允许主动访问。

一个路由器一般都带有两个IP地址:

LAN口IP:一般是一个局域网;

WAN口IP:可能是一个局域网,也可能是一个公网。

路由器地核心就是把这两个局域网连接起来。

在客户端(我的电脑)构造一个IP数据报:

到达路由器,要对源IP进行修改,设这个路由器地WAN口IP为5.6.7.8;

这个IP数据报到达路由器,就会被修改为:

并不是每个路由器都会对IP地址进行替换地,当当前IP地址为公网IP时,就不在替换了。

进行IP地址替换,本质上是为了让一个公网IP地址,对应到多个设备,从而起到节省IP的效果.

当IP数据报到达服务器之后,只能看到源IP为5.6.7.8,无法感知最初局域网IP地址了。

从服务器中返回的IP数据报又怎样返回到局域网设备呢?

路由器在进行NAT的时候,会把这次通信的相关信息记录下来:

路由器IP数据报:

                         源Ip                      替换后IP       目的IP

主机一:        192.168.1.10               5.6.7.8             1.2.3.4

从服务器返回的响应数据的源IP和目的IP和收到的IP数据报是相反的:

服务器IP数据报:

源IP:1.2.3.4

目的IP:5.6.7.8

当服务器将相应数据返回的时候,t通过目的IP,对照路由表中记录的替换后的IP ,就能找到源IP地址了.

当局域网中的主机访问的都是不同的服务器,可以根据 路由表中的记录 通过 替换后的IP 进行查找源IP地址,但是当局域网设备不只一个访问相同的服务器时,又能找到源主机吗?

此时路由器中记录的信息:

                         源Ip                      替换后IP       目的IP

主机一:        192.168.1.10               5.6.7.8             1.2.3.4

主机二:        192.168.1.20               5.6.7.8             1.2.3.4

当 将返回的信息的  目的IP  与路由表的  替换后的IP 进行对比,此时,还是无法确定哪个是源主机. 

实际上,这个表中还有一列数据:源端口 目的端口:

路由器收到的响应数据包是这样的,

路由器通过查询 IP数据报 传输层的目的端口,就能知道 替换之前的IP了。

又有问题了,因为端口号都是系统随机分配的,若是极小的概率下,两个主机之间的端口号相同,又要怎么查找源IP地址呢?

这是路由器有实现了一个功能,替换源端口号:路由器会对端口号进行映射,为每个主机分配不同的端口号:

此时,路由器IP数据报到达服务器处的IP数据报就成了这个样子:

IP数据报:

                源IP         目的IP         源端口         目的端口

主机一:5.6.7.8      1.2.3.4         10001           9090  

主机二:5.6.7.8      1.2.3.4         10002           9090  

返回响应的IP数据报就成了这个样子:

                源IP         目的IP         源端口         目的端口

主机一:1.2.3.4        5.6.7.8        9090           10001

主机二:1.2.3.4        5.6.7.8        9090           10002

IP数据报返回到路由器时,通过 查找传输层的目的端口 就能找到源主机了。

3.IPv6

NAT机制是通过公用一个公网IP,来节省IP地址数量,并没有增加IP地址的数量;IPv6就是从根本上解决问题:增加了IP地址的数量,IPv4中 IP数量为4字节,32个比特为,IPv6将其扩大到16字节,64个比特位.就是2^64个地址,这就是一个天文数字了,完全够用。

但还有一个问题,IPv6的报头结构和IPv4是不兼容的,存在结构不兼容的问题,引入IPv6,就意味着需要对整个网络设备进行升级,更换成能支持IPv6的设备,这是一个在网络发展长河中是一个非常漫长的过程.

IP协议如何进行网段划分

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

网络号:保证一个网段之内有相同的网络号;

主机号:同一个网段之内,每个主机之间有相同网络号,但每个主机必须有不同的主机号.

在windows控制台中输入ipconfig可以查看自己主机的信息:

 可以看到:IPv4地址的信息:192.168.159.1;

这里还有一个子网掩码:255.255.255.0;这里的前三个数是非0的,第四个数是0,则说明PIv4 的

前三个数据: 192.168.159 就是网络号;第四个数据: 1 就是主机号.

这些IP地址都是路由器自动配置的,不需要我们手动配置.

在一个局域网中,若有主机号和网络号都相同,那么这个主机是无法上网的;

在局域网中,如果主机的网络号和路由器的网络号不相同,也是无法上网的,因为这个主机无法通过路由器访问外网,也就无法访问局域网那个的其他网络.

两个相邻的局域网,网络号是不能相同的。(一个路由器连接的两个网络就是相邻的)

早期的网段划分和现在还不一样:

早期的网段是分为A,B,C,D,E五类。

这种方式的划分比较死板,且A,B类的浪费量非常大,A类的主机号可以有24位,即一个局域网内可以有2^24个主机,没有这么大的局域网能包含这么多主机,很难有这样的使用场景。

这种网段划分的方式已经费用了。

一些特殊的IP地址:

127.*:表示环回IP(loopback),代表自己的主机。一般用于测试(常用 127.0.0.1)

若某个IP的主机号全是0,则表示“这个网段”;

若某个IP的主机号全是1,表示:“广播地址”。这两个IP是一种特殊的IP,不能分配给主机。

广播对应的IP有多种:

单播:一对一;

组播:一对多(这里的多是有限制的,全部中的一部分)

多播:一对多(所有,没有限制)

向广播地址上发送消息,局域网上的所有设备都能收到消息。(但要发UDP消息,TCP消息不支持广播)

IP协议进行地址管理

路由选择是找到了能到达目的主机的所有路径,但哪条在什么样的需求下最合适,就需要探索。

 

由于网络结构太复杂了,每个路由器无法掌握全局路径信息,IP地址对于路径选择属于探索式的“边走边问”,无法在最开始就把路线规划好。

二、数据链路层 以太网

以太网是横跨数据链路层和物理层。

以太网帧格式:

以太网引入了另一套地址体系,“mac”地址/物理地址。mac地址和IP地址是两套独立的地址体系。

IP地址侧重于全局转发,从起点地址到目的地址的转发;mac地址更侧重于局部路径的转发,两个相邻设备的转发。

mac地址按照16进制的形式表示,字符之间用 - 或者 ; 分隔:

mac地址能表示的范围要比IPv4大很多,每个主机都有一个自己的mac地址,是一一绑定的关系。

IP地址很多时候是动态分配的,而mac地址是静态分配的,网卡出厂的时候,mac就写死了,因此可以通过一个mac地址来确定一个主机位置。

数据链路层的以太网数据帧:

由于每个主机都有自己的mac地址,因此,每经过一个路由器/交换机,源mac和目的mac都会改变,

经过这样的转发,就能把数据报进行封装和分用.

ARP和RARP是两个横跨了 网络层 和 数据链路层 的协议.

ARP协议建⽴了主机IP地址和MAC地址的映射关系.ARP 是能让路由器/交换机建立起内部的结构:IP->mac(类似于hash表)转发表。

RARP:也是能让路由器/交换机建立起内部的结构 :mac->IP 建立起一个内部结构,占46字节.

以太网数据帧载荷部分的数据范围是46-1500字节,最小·46就是ARP协议的使用,最⼤值1500称为以太⽹的最⼤传输单元(MTU),1500字节是受限于物理设备的特性(IP数据报将载荷进行截取承载,也是有这个原因)

三、DNS协议

DNS是⼀整套从域名映射到IP的系统,叫域名解析协议

TCP/IP中使⽤IP地址和端⼝号来确定⽹络上的⼀台主机的⼀个程序.但是IP地址不⽅便记忆.于是⼈们发明了⼀种叫主机名的东西,是⼀个字符串,并且使⽤hosts⽂件来描述主机名和IP地址的关系.

DNS服务器,并不是只有一份,而是由很多份

搭建根域名服务器还时,还会对域名进行分级管理,一级域名,二级域名,三级域名....这样可以控制每个域名管理的数据都不多.

像:www.baidu.com 这就是域名解析协议.

com属于一级域名;baidu:属于二级域名;www属于三级域名...


http://www.ppmy.cn/news/1562203.html

相关文章

力扣-数组-66 加一

解析 从后往前遍历数组&#xff0c;由于首位有可能进位&#xff0c;所以拼接在原数组的首位上增加0&#xff0c;在每一位的加1后检查前一位需不需要进位 代码 class Solution { public:vector<int> plusOne(vector<int>& digits) {if(digits[0]0){digits[0]…

python关键字(保留字)用法、保留的标识符类(1)

python关键字(保留字)用法、保留的标识符类&#xff08;1&#xff09; 一、python保留字(关键字) 1.1、python关键字 以下标识符为保留字&#xff0c;或称 关键字&#xff0c;不可用于普通标识符&#xff0c;即我们不能把它们用作任何标识符名称。 python 保留字(关键字) 关键…

深度学习模型代码书写指导和建议

在深度学习模型开发中,确保 输入张量的维度和表示意义正确对齐 是至关重要的。以下是详细的指导和建议,帮助你在开发过程中减少错误,提高代码的健壮性。 1. 理解输入和输出张量的维度与含义 1.1 明确每个张量的含义和维度 在设计模型之前,确保了解每个张量的维度顺序和每…

什么叫区块链?怎么保证区块链的安全性?

区块链&#xff08;Blockchain&#xff09;是一种分布式数据库或账本技术&#xff0c;它通过去中心化的方式记录交易或其他数据&#xff0c;并确保这些记录是安全、透明和不可篡改的。区块链最初是作为比特币&#xff08;Bitcoin&#xff09;加密货币的基础技术而被公众所知&am…

【Duilib】 List控件支持多选和获取选择的多条数据

问题 使用Duilib库写的一个UI页面用到了List控件&#xff0c;功能变动想支持选择多行数据。 分析 1、List控件本身支持使用SetMultiSelect接口设置是否多选&#xff1a; void SetMultiSelect(bool bMultiSel);2、List控件本身支持使用GetNextSelItem接口获取选中的下一个索引…

mysql和redis的最大连接数

平时我们要评估mysql和redis的最大连接数&#xff0c;可以选择好环境&#xff08;比如4核8G&#xff09;,定好压测方法&#xff08;没有索引的mysql单表&#xff0c;redis单key&#xff09;进行压测&#xff0c;评估其最大并发量。 也可以查看各大云厂商的规格进行评估。 mys…

Postman配置环境变量

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Postman是一套比较方便的接口测试工具&#xff0c;但我们在使用过程中&#xff0c;可能会出现创建了API请求&#xff0c;但API的URL会随着服务器IP地址的变化而改…

vue.js 插槽-具名插槽

在Vue.js中&#xff0c;插槽是一种特殊的语法&#xff0c;用于在父组件中向子组件传递内容。通过插槽&#xff0c;我们可以在子组件的特定位置插入父组件中的内容。 Vue.js中的插槽分为默认插槽和具名插槽。默认插槽是当父组件中的内容没有被具名插槽引用时插入的内容。而具名…