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

计算机网络-网络层

核心协议:IP

工作内容:

1、地址管理->IP地址

2、路由选择->对数据包传输路径进行规划

关于各种协议的报头里的字段,大概有一个直观的了解

IP协议报头结构

4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4。实际上只有两个取值,还有一个是6->IPv4,只不过IPv4是主流的。

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

8位服务类型(Type Of Service): 3位优先权字段(已经弃⽤), 4位TOS字段, 和1位保留字段(必须置为0)。4位TOS分别表⽰: 最⼩延时(数据从A到B的时间消耗最短), 最⼤吞吐量(数据从A到B单位时间内,传输的数量更多), 最⾼可靠性(IP协议并不像TCP那样有严格的可靠性,但是IP一些机制也会影响到丢包的概率), 最⼩成本(设备上消耗的资源更小)。这四者相互冲突, 只能选择⼀个.对于ssh/telnet这样的应⽤程序, 最⼩延时⽐较重要; 对于ftp这样的程序, 最⼤吞吐量⽐较重要。

16位总⻓度(total length): IP数据报的总长度

UDP也是16位(2字节),是不是意味着也只能最大传输64KB呢?

并非如此IP协议,内置了拆包组包机制(下图这三个属性就描述了这个过程,单个IP数据报确实没法超过64KB,但是不代表IP协议不能传输超过64KB的数据,IP协议会自动把大的数据包,拆成多个IP数据报携带传输,在接收方再进行拼装。

eg、买的柜子、床、椅子,非常大进不了电梯,也进不了房门,咋办?厂家发的货,本身就不是囫囵个的柜子和床,而是零件,到了屋里之后,再组装起来就可以了~~

16位标识(id): 唯⼀的标识主机发送的报⽂. 如果IP报⽂在数据链路层被分⽚了, 那么每⼀个⽚⾥⾯的这个id都是相同的.

3位标志字段: 第⼀位保留(保留的意思是现在不⽤, 但是还没想好说不定以后要⽤到). 第⼆位置为1表⽰禁⽌分⽚, 这时候如果报⽂⻓度超过MTU, IP模块就会丢弃报⽂. 第三位表⽰"更多分⽚", 如果分⽚了的话, 最后⼀个分⽚置为1, 其他是0. 类似于⼀个结束标记.

13位分⽚偏移(framegament offset): 是分⽚相对于原始IP报⽂开始处的偏移. 其实就是在表⽰当前分⽚在原报⽂中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后⼀个报⽂之外, 其他报⽂的⻓度必须是8的整数倍(否则报⽂就不连续了).

IP协议会自动拆包,同一个载荷的数据,会被分成多份,交给多个IP数据报来携带。多个IP数据报,16标识是相同数值,--> 13位片偏移决定组包的时候数据包的先后顺序(避免后发先至), --> 3位标志位,只有2个有效(剩下一个保留位)其中一个,表示这个包是否需要组包(是否是拆包的一部分)另一个表示当前包是否是组包中的最后一个单位。

8位⽣存时间(Time To Live, TTL): 数据报到达⽬的地的最⼤报⽂跳数. ⼀般是64. 每次经过⼀个路由, TTL -= 1, ⼀直减到0还没到达, 那么就丢弃了. 这个字段主要是⽤来防⽌出现路由循环

一个数据包在网络中最多存活多长时间。假设构造一个IP数据报,目的IP写错了,写成不存在的IP,如果让这样的数据包,无限传输,就会消耗很多网络的资源,TTL约定了传输时间的上限,达到上限之后,数据包就会自动被丢弃掉~~TTL的单位不是s或者min,而是"次数"
指的是经过路由器转发的次数,发送一个IP数据报的时候会有一个初始的TTL的值(32,64,128.…)数据报每次经过一个路由器转发,TTL就会-1(经过交换机,不减的)
一旦TTL减到0了,此时这个数据包就会被当前的路由器直接丢弃掉~~

eg、

几十毫秒,说明网络是比较好的,上百毫秒,上干毫秒,网络就是比较卡的~~

数据包初始TTL64,中间经过了13个路由器的转发最终到达了百度~~

64这样的TTL够用吗?正常情况下,64这样的TTL是非常充裕的,而且发送数据包的时候还有128这样的TTL。

但是计算机世界不一样.每个路由器,执行力都是非常强的,每个路由器,虽然不能感知到整个网络结构的全貌,但是都能了解网络结构的一部分(具体来说每个路由器都认识哪些设备和他相邻的)

8位协议: 表⽰上层协议的类型

IP数据报中,携带的载荷,是哪种传输层协议的数据报,通过这里的不同数值,感知到,接下来要把数据交给TCP解析还是UDP解析还是其他协议解析。类似于TCP/UDP报头中的"端口号"。

16位头部校验和: 使⽤CRC进⾏校验, 来鉴别头部是否损坏.

验证数据在传输中是否出错(只是针对首部,IP报头),因为载荷部分TCP/UDP都有自己的校验和了。

32位源地址和32位⽬标地址: (IP数据报中最关键的信息)表⽰发送端和接收端.

是32位的整数,一个很大的数字不方便人进行阅读和理解
点分十进制写法:把32位(4字节)IP地址通过3个圆点分割开,每个部分是一个字节,范围0-255

IP地址用来标识网络上的一个设备,期望IP地址,是唯一的。
32位表示的数据范围,0->42亿9千万
这样的数字,还充裕嘛?如果放到15年前回答,认为不会超过,但是放到今天可就不一定了。从进入移动互联网时代,2007年,乔布斯发布一代苹果手机,每个人的手机,也是能上网的。

解决IP不够用的问题
方案一:动态分配P地址
一个设备上网就分配IP,不上网就先不分配(权宜之计)


方案二:NAT网络地址转换(当前的网络世界,主要就是在NAT机制支撑下,面试很少直接考NAT,不是考点,但是这个机制理解当前互联网工作基本原理的重要环节~~

以一当千,使用一个IP代表一大波设备
把IP地址分成两大类(重要
1.内网IP/私网IP   10.*     172.16-172.31.*     192.168*
2.外网IP/公网IP

要求公网IP必须是唯一的.但是私网IP是允许重复的(在不同的局域网中是允许重复的)

一个设备在进行上网的时候IP数据报中的IP地址,就会被NAT设备(通常就是路由器)进行自动的修改
1.同一个局域网内,主机A访问主机B不会涉及到NAT机制
2.公网上的设备A,访问公网上的设备B不会涉及到NAT
3.一个局域网中的主机A访问另一个局域网的主机B在NAT机制中,是不允许的!
4.局域网上的设备A,访问公网上的设备B,NAT机制主要就是针对这个情况生效

但是如果有多台电脑同时访问公网,公网返回响应数据包时怎么区分不同电脑呢?

在网络通信中,不仅仅只有IP信息,还有一个关键的是端口号。端口号本来是区分同一个主机上不同的应用程序的。在NAT中,就可以用于区分不同主机上不同的应用程序。
 

此处也就是通过端口号区分不同主机的不同程序

假设有不同主机但存在相同的端口号(概率极小极小)

此时路由器在建立映射关系表的时候,可以把端口号也替换成不重复的其他端口号

NAT机制的缺点:
网络环境,太复杂了,替换过程中,每一层路由器都需要维护映射关系,每次转发数据,都要查询映射关系,都是开销。
解决IP地址不够用方案三:IPv6从根本上解决IP地址不够用的问题
IPv4使用32位4个字节表示IP地址,
IPv6使用128位16个字节表示IP地址
IPv6的地址空间非常巨大,可以给地球上的每一粒沙子都分配一个唯一的IP地址~~

IPv6提出的时间是在上个世纪90年代,时间上和NAT其实差不多的,之所以IPV6推广举步维限,是因为IPv6和IPv4不兼容!要想使用IPv6就需要更换新的设备(能支持IPv6的设备)
在IPv6提出的当年,显然是不具备这样的条件的,换设备就得花钱,但是花了这个钱,网速又不能变快,NAT机制,只要给路由器设备,更新升级软件即可,硬件不需要改变(成本非常低)

但是IPv6在国内普及程度非常高超过70%了,IPv6的推进甚至上升到了"国家战略"维度
 

为啥国家要大力推进这个事情呢?

截⽌到 2023 年 8 ⽉ 28 ⽇, 我国 IPv6 活跃⽤⼾数达7.67亿(⽹⺠总数为10.79亿, 占⽐ 71%), 世界领先.

⼤⼒发展 IPv6 的原因, 参考以下视频.

电⼦监听、全国断⽹,棱镜⻔背后,中国如何从末路狂奔到世界之巅_哔哩哔哩_bilibili

选项字段(不定⻓, 最多40字节): 略

地址管理

网络划分

IP地址中的"网段划分”,组网(组建网络)
组网的时候就需要我们针对每个上网设备IP地址(包括路由器的IP)进行设置
有的同学说我也没设置过,好像插上网线就能上网呢?
对于家庭网络比较简单的网络结构来说,路由器都有"自动分配IP"功能(DHCP)
公司,学校,商场,宾馆…更复杂的场景,网络需求更复杂,就需要手动进行设置了

通过"子网掩码(CIDR)”区分出哪里是网络号,哪里是主机号

IP地址分为两个部分, ⽹络号和主机号。子网掩码:255.255.255.0 也是32位的整数,左半部分都是1,右半部分都是0(二进制数为1111 1111   1111 1111   1111 1111   0000 0000),不能01穿插出现,也可以缩写为 /24(左边有24个1)。

网络中规定:
同一个局域网中的设备,网络号必须相同,主机号必须不同
两个相邻的局域网(同一个路由器连接了两个局域网),网络号必须不同

某个设备网络号不相同的情况,无法上网
某个设备网络号虽然相同,主机号和别的设备重复,也无法上网



除了子网掩码的方案,还有一种方案,ABCDE五类网络

上古时期的网络划分方式,现在已经看不到这个方式了,仍然存在于教科书上.

AB类,主机号太多了,实际上一般没有这么大的局域网,这个方案不涉及到子网掩码,IP地址浪费的比较多

特殊的IP地址

1、主机号为全0(二进制)
此时这个IP就是表示当前网段.(相当于网络号)
因此,给局域网中的某个设备,分配IP地址的时候,不能把主机号设为全0.

2、主机号为全1(二进制)广播IP
比如子网掩码是255.255.255.0     192.168.0.255
往这个IP地址上发送数据包,就相当于给整个局域网中所有的设备都发了一次数据包
很多看到的"业务上的广播”都是通过应用层编写代码来实现的而不是借助广播IP

3.127.* 环回IP(loopback)
自发自收.给这个IP发一个数据,设备就会从这个IP上再收到同一个数据
使用环回IP一般进行测试,写的网络程序,大多数情况都是为了跨主机通信
往往需要先自行测试.一台主机测试客户端和服务器之间能否正常交互
一般使用的环回IP就是127.0.0.1
虽然其他127开头的IP也是可以的.但是很少见~~

路由选择

路由选择是非常大的话题,深入挖掘会产生出很多的,很复杂的技术体系.和咱们都关系不大
1.开发路由器的程序员
2.运营商的网络维护人员
(普通的网络管理员,都不必关注这些)
咱们这里只是浅浅的聊一下路由选择的大概流程~

路由的过程, 是⼀跳⼀跳(Hop by Hop) "问路" 的过程.所谓 "⼀跳" 就是数据链路层中的⼀个区间. 具体在以太⽹中指从源MAC地址到⽬的MAC地址之间的帧传输区间.

IP数据包的传输过程也和问路⼀样.

• 当IP数据包, 到达路由器时, 路由器会先查看⽬的IP;

• 路由器决定这个数据包是能直接发送给⽬标主机, 还是需要发送给下⼀个路由器;

• 依次反复, ⼀直到达⽬标IP地址;

那么如何判定当前这个数据包该发送到哪⾥呢? 这个就依靠每个节点内部维护⼀个路由表;

每个路由器,都不知道整体网络结构的全貌但是能够知道其中的一部分.
路由表(路由器内部维护的重要的数据结构)路由表类似于hash一样
key就相当于IP地址(网络号)
value就是对应的网络接口(往哪个方向走)
IP数据报到达路由器,就要进行路由表查表操作
IP数据报中的目的IP,查一查这个目的IP在路由表中是否存在,
如果查到了,自然按照路由表指向的方向继续转发即可
如果没查到,路由表会有一个"默认的表项”(下一跳)
指向了一个更高层级的路由器(认识的设备范围更广)

上面讨论的过程,是一个直观的认识的过程,真实的转发过程,会更加复杂
(1)路由表里的东西是咋来的?
自动获取的(路由表生成算法)
手工配置(网络管理员,手动设置)
(2)真实的网络结构(尤其是广域网的网络结构是怎样的)
非常非常复杂
感兴趣可以去B站搜一下,中国电信/中国联通/中国移动网络架构~~
 


http://www.mrgr.cn/news/80603.html

相关文章:

  • Elasticsearch02-安装7.x
  • iOS 应用的生命周期
  • Elasticsearch Java Api Client中DSL语句的查询方法汇总(二)
  • SpringDataJpa-字段加解密存储
  • 如何在Pycharm中添加环境
  • k8s kubernetes
  • c++:STL:string
  • Pytorch | 从零构建GoogleNet对CIFAR10进行分类
  • Eureka学习笔记-服务端
  • Frida进行Android dex文件整体脱壳
  • 【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string,垃圾回收( GC)
  • Java函数式编程【三】【Stream终止操作】【上】之【简单约简】
  • ElasticSearch 数据聚合与运算
  • 基础开发工具-编辑器vim
  • 005 QT常用控件Qwidget_上
  • linux0.11源码分析第一弹——bootset.s内容
  • kali Linux 2024.3安装教程2024(图文超详细)
  • LED 灯实验
  • C# WinForm移除非法字符的输入框
  • 四、CSS3
  • Java集合 HashMap 原理解读(含源码解析)
  • 灵当crm pdf.php存在任意文件读取漏洞
  • C#速成(GID+图形编程)
  • C++之二:类和对象
  • 基于STM32设计的粮食仓库(粮仓)环境监测系统_284
  • GIN