网络多层的协议详述

网络层

1)地址管理:制定一系列的规则,通过地址,在网络上描述出一个设备的位置

2)路由选择:网络环境比较复杂,从一个节点到另一个节点,存在很多条不同的路径,需要规划出更适合的路径进行网络传输

TCP/IP协议栈

4位版本

4 => ipv4 6 => ipv6 目前大规模使用的两个版本
4位首部长度

IP协议的报头,也是变长的 0---0xf => *4 => 0-60字节

选项(如果有)
8位服务类型

能够让IP协议,切换形态

3位为优先权字段(已弃用),4位TOS字段,1位保留字段(必须设置为0)

TOS字段的四个位,彼此之间是相互冲突的,只有一位为1

不同的位设为1,表示IP协议不同的形态

最小延时,最大吞吐量,最高可靠性,最小成本
16位总长度(字节)

描述了IP数据包最长的长度

IP协议也存在64kb的限制,但是IP协议自身支持"拆包组包"功能------

16位标识------将一个大的数据包拆成若干个小包,16位标识就是相同的值

3位标志------一位表示是否允许拆包,一位表示是否是最后一个包

13位片偏移------描述当前每个小的数据包(分片)的相对位置
8位生存时间

描述了一个IP数据包,在网络上还能存活多久

TTL的单位是次数

数据包被构造出来,TTL会被设置成一个初始值,数据包在转发过程中,每次经过一个路由器,TTL就会减1

如果数据包把TTL耗尽,还没顺利到达对方,就被丢弃了
8位协议

描述的是IP数据包的载荷部分,是一个UDP数据包,还是TCP数据包(传输层是那个协议)
16位首部校验和

这个校验和,只是校验IP首部,不管IP的载荷(UDP/TCP这样数据,自身都是有校验和的)
32位源IP地址 ------ 32位目的IP地址

IP地址,本质上是一个32位的整数,一般写作 点分十进制

地址管理

IP地址,是一个32位整数 2*32 => 42亿9千万

地址理论上是不能重复的,互联网发展至今,能上网的设备早已超过IP地址的范围

此时如何解决IP地址不够用的问题:

1)动态分配IP

提高了IP地址的利用率,但是没有增加IP地址的数量(广泛使用的过渡方案)

2)NAT机制(网络地址转换)

本质上是让一个IP地址,代表一批设备

把IP地址分成两大类:

  1. 内网IP(局域网IP)

在同一个局域网内部,内网IP之间不能重复

在不同局域网中,内网IP可以重复

  1. 外网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 发送数据时就会生成表中的映射关系

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

此时IP地址是相同,但是每台主机的端口号是不同的

如果此时恰好两台主机分配端口号相同------>

请求到达路由器后,路由器会发现这两个数据包的目的IP地址和目的端口都一样(访问同一个服务器),源端口也一样

路由器会把源端口也一起替换掉(路由器内部会记录映射关系)

当前的网络环境就是以 NAT + 动态分配 的方式解决IP地址不够用的问题

NAT机制是"纯软件"的方案,因此局域网内部的设备能够主动访问外网的设备,外网的设备不能主动访问局域网的设备

3)IPv6

IPv6 使用16个字节表示IP地址 0---2*128

地球上所有的设备都可以有一个自己的 IPv6地址

IPv6 和 IPv4 是不兼容的

网段划分

IP 地址分为两个部分 网络号和主机号
网络号标识网段 ,保证相互连接的两个网段具有不同的标识
主机号标识主机 ,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号

同一个局域网中的设备,网络号必须相同,主机号必须不同

不同的局域网,网络号不能相同

子网掩码

一个IP地址,哪部分是网络号,哪部分是主机号,是不一定的

子网掩码,就是用来确定网络号的

32位整数(左边全是1,右边全是0)

子网掩码格式和 IP 地址一样,也是一个 32 位的二进制数。其中左边是网络位,用二进制数字 "1" 表示,1 的数目等于网络位的长度;右边是主机位,用二进制数字 "0" 表示, 0 的数目等于主机位的长度
子网掩码也可以使用二进制所有高位1相加的数值来表示
网络通信时,子网掩码结合 IP 地址,可以计算获得网络号(划分子网后的网络号)及主机号(划分
子网后的主机号)。一般用于判断目的 IP 与本 IP 是否为同一个网段
计算方式:
将 IP 地址和子网掩码进行"按位与"操作(二进制相同位,与操作,两个都是1结果为1,否则为0),得到的结果就是网络号。将子网掩码二进制按位取反,再与 IP 地址位与计算,得到的就是主机号

|------|-----------------|-------------------------------------|
| | 十进制 | 二进制 |
| IP地址 | 180.210.242.131 | 10110100.11010010.11110010.10000011 |
| 子网掩码 | 255.255.248.0 | 11111111.11111111.11111000.00000000 |
| 网络号 | 180.210.240.0 | 10110100.11010010.11110000.00000000 |
| 主机号 | 0.0.2.131 | 00000000.00000000.00000010.10000011 |

早期的网络分段形式:A类 B类 C类 D类 E类

|---|---------|----------|
| 0 | 网络号(7位) | 主机号(24位) |

|---|---|----------|----------|
| 1 | 0 | 网络号(14位) | 主机号(16位) |

|---|---|---|----------|---------|
| 1 | 1 | 0 | 网络号(21位) | 主机号(8位) |

|---|---|---|---|-----------|
| 1 | 1 | 1 | 0 | 多播组号(28位) |

|---|---|---|---|---|-----------|
| 1 | 1 | 1 | 1 | 0 | 留后待用(27位) |

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

操作系统提供了一套"虚拟网卡",关联到这个IP上
4).255
UDP能天然支持 广播,和这个IP有关
使用UDP socket给这个IP发送UDP数据报,此时局域网中的所有设备,都能收到这个数据

TCP无法与这个IP建立连接

路由选择

描述了IP协议(IP数据报)转发的过程

IP数据进行转发的时候,无法知道网络的全貌,只知道一些局部信息(一个路由器知道哪些设备和它是相连的),这就意味着IP数据报,在转发的过程中是一个"探索式"/"启发式"的过程

一个网络层数据报,每次到达一个路由器,都会进行"问路"过程

每个路由器内部都有一个数据结构"路由表",根据数据报中的 目的IP,查路由表

如果查到了,就直接按照路由表中给定的方向(从哪个网口进行转发),继续转发

如果没查到,路由表里有一个"默认的表项""下一个地址",按照默认的表项转发

路由表------>

  1. 手动配置

  2. 自动获取

以太网协议

" 以太网 " 不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了
一些物理层的内容。例如:规定了网络拓扑结构,访问控制方式,传输速率等

通过网线/光纤,来通信,使用的协议是以太网协议

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

以太网数据帧:帧头 + 载荷(IP数据报)+ 帧尾
1)源地址和目的地址是指网卡的硬件地址(也叫 MAC 地址),长度是 48 位,是在网卡出厂时固
化的
2)帧协议类型字段有三种值,分别对应 IP 、 ARP 、 RARP
3)帧末尾是 CRC 校验码

目的地址/源地址

6个字节

不是IP地址,是网络中的另一套地址体系,Mac地址(物理地址)

目前来说,每个设备都是有唯一的Mac地址

Mac地址通常是十六进制表示的,两个十六进制数字就是一个字节

字节和字节之间通常使用 - 或者 : 来分割
IP协议立足于全局,完成整个通信过程中的路径规划工作

以太网则是关注于局部,相邻两个局部之间的通信过程

网络层 与 数据链路层 的路径侧重:

网络层无论有多少条路线,源IP和目的IP始终是整个通信过程中的最初起点和最后终点(不考虑NAT)

数据链路层关注的是"相邻节点"之间的如何转发

源mac和目的mac会根据当前转发的过程,每次到达一个节点,往下一个节点转发的时候,源mac和目的mac都会随之改变

IP数据报的最大长度不超过1500字节

MTU:数据链路层数据报能携带的最大载荷长度

不同数据链路层的协议,MTU不同(和物理层的介质也有关系)

IP数据报的分包组包,大概路是因为MTU,而不是触发64kb上限

这两种协议不是传输"业务数据",而是辅助转发的协议

像交换机这样的设备,收到以太网数据报时,就需要要进行转发

转发的过程中就需要能根据Mac地址,判定数据要走那个网口

此处的网口是"物理意义"上插网线的接口(IP协议,路由器,走哪个网络接口,都是抽象的概念,最后还是要在数据链路层才能决定走哪个网口)
具体的转发过程:

交换机内部有一个数据结构"转发表",和前面的路由器表有点像

转发表示一个简单的像hash的映射(此处不一定由软件实现)

转发表中的内容主要由 arp 协议实现

DNS

DNS,即Domain Name System,域名系统。DNS是一整套从域名映射到IP的系统

使用IP地址,描述设备在网络上的位置(应用层协议)

最早的域名解析系统,是通过一个简单文件实现------> hosts文件

现在搭建了一套DNS系统(一组服务器)

如果要访问服务器,先给这个DNS服务器发起请求,查询一下当前的域名对应的IP,再访问目标网站
一个服务器硬件资源是有限的(CPU,内存,硬盘,网络带宽...)

服务器处理每个请求,都会消耗一定的资源

如果单位时间内访问次数超过服务器的上限,机器就挂了------>

1)开源

搭建"镜像服务器",同步与主根的数据,用户会先访问距离自己最近的镜像服务器

2)节流

让请求量变少,让每个上网的设备,设置网络缓存

对于短时间的多次访问,只让第一次请求DNS即可,把到的结果保存到本地,后面的请求都是用第一次的结果即可

相关推荐
KpLn_HJL12 分钟前
leetcode - 1530. Number of Good Leaf Nodes Pairs
android·java·leetcode
drebander12 分钟前
HTTP 1.0 与 HTTP 2.0 的区别
网络·网络协议·http
Qzer_40732 分钟前
在JVM(Java虚拟机)中,PC寄存器(Program Counter Register)扮演着至关重要的角色,它是JVM执行引擎的核心组成部分之一。
java·开发语言·jvm
星沁城34 分钟前
JVM的垃圾回收机制
java·开发语言·jvm
FF在路上42 分钟前
MybatisPlus使用LambdaQueryWrapper更新时 int默认值问题
java·开发语言·mybatis
AirDroid_qs43 分钟前
XXE-labs靶场 XXE 靶机(通关攻略)
网络·网络安全
gb42152871 小时前
java中sha256和md5某个字符串实例代码
java·开发语言·哈希算法
三十六煩惱風1 小时前
Java中常见的锁及其应用场景
java
愿得一人欣1 小时前
主页去哪了
网络·安全
Watermelon_Mr1 小时前
Spring(二)AOP、切入点表达式、AspecJ常用通知的类型、Spring中的事务管理
java·后端·spring