56 网络层

本节重点

理解网络层的作用,深入理解IP协议的基本原理
对整个TCP/IP协议有系统的理解
对TCP/IP协议体系下的其他重要协议和技术有一定的了解

目录

  1. 前置认识
  2. ip协议
  3. 基本概念
  4. 协议头格式
  5. 网段划分
  6. 特殊的ip地址
  7. ip地址的数量限制
  8. 私有ip和公有ip
  9. 路由
  10. 路由表生成算法

在复杂的网络环境中确定一个合适的路径

1. 前置认识

传输层提供了很多策略,保证数据传输的各种策略,数据丢包等如何处理,那么将数据传输的跑腿活,这个具体工作是由谁来做。这就是接下来要说的网络层,用户需要的是将数据可靠的从A主机到B主机,ip协议本质工作,提供将数据从A主机到B主机的能力

2. IP协议

在这里插入图片描述
网络要对所有的主机进行表示。源ip,目的ip来标识源主机和目的主机。每一个局部网络通过路由器和其他局部网络相连,想要到达目的主机,需要先到达目标网络,再找到目标主机,然后是目标进程

3. 基本概念

主机:配有IP地址,但是不进行路由控制的设备
路由器:即配有ip地址,又能进行路由控制
节点:主机和路由器的统称

ip地址就像身份证号一样,每一部分都是设计好,有代表的意义,身份证号由地区码+出生年月和签发机构等构成

4. 协议头格式

在这里插入图片描述

  • 4位版本号(version):指定IP协议的版本,对于ipv4来说,就是4
  • 4位头部长度(header length):IP头部的长度是多少个32bit,也就是length*4的字节数,4bit表示最大的数字是15,单位是4,因此ip头部最大长度是60字节
  • 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0),4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本,这四者相互冲突,只能选择一个,对于ssh/telent这样的应用程序,最小延时比较重要,对于ftp这样的程序,最大吞吐量比较重要
  • 16位总长度(total length):IP数据报整体占多少个字节
  • 8位生存时间(Time To Live,TTL):是数据报到达目的地的最大报文跳数,一般是64,每次经过一个路由,TTL-1,一直减到0还没到达,那么就丢弃了,这个字段主要是用来防止游离报文出现路由循环
  • 8位协议:表示上层协议的类型
  • 16位头部校验和:使用CRC校验,鉴别头部是否损坏,坏了就丢弃
  • 32位源地址和32位目标地址:表示发送端和接收端
  • 选项字段(不定长,最多40字节):略

分片与组装
MTU对报文的大小做了限制,规定最大1500字节,如果发出的过大,网络层就需要分片交付,到达目标网络层完成拼接

  • 16位标识(id):唯一的标识主机发送的报文,如果ip报文在数据链路层被分片了,那么每一个片里的id是相同的
  • 3位标志字段:第一位保留(保留的意思是现在不用,没想好以后用不用),第二位置为1表示禁止分片,这时候如果报文长度超过MTU,ip模块会丢弃报文,第三位标识“更多分片”,如果分片了的话,最后一个分片位置为1,其他为0是一个结束标记
  • 13位分片偏移(framegament offset):是分片相对于原始ip报文开始处的偏移,其实就是在表示当前分片在报文中哪个位置,实际便宜的字节数是这个值*8得到的,因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)

如何知道分片了
如果分片了,那么片偏移不等于0,或者更多分片等于1

如何分片
比如一个3000字节的报文,超过了1500,需要分片,先将头部1500字节取出来,设置片偏移为1,然后第二个分片取1480字节,设置报头更多分片1,偏移1500,拼接上去,最后部分添加报头,设置偏移2980,更多分片为0表示结束。这三个标识id是统一的

如何组装
根据偏移排序,去掉除第一个报文的报头,拼接数据。丢弃哪一个都可以通过偏移和标志查出来。如果丢了一个就要全部重发。所以不建议分片,会增加丢包概率

5. 网段划分(重要)

网络号:保证相互连接的两个网段具有不同的标识
主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号

在这里插入图片描述
不同的子网其实就是把网络号相同的主机放在一起
如果在子网中新增一台主机,这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网的其他主机重复

路由器本质也是特定一个子网的主机,也要配置ip地址。一定要至少连接2个子网,也就相当于同时在两个子网,暂时认为路由器有多张网卡就行,路由器可以配置多个ip的。一般是一个子网中第一台设备,一般它的ip地址都是:网络号.1,路由器不仅可以进行ip报文的转发,还可以构建子网(局域网)

通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的ip地址都不相同
那么问题来了,手动管理子网内的ip,是一个相当麻烦的事情

  • 有一种技术叫DHCP,能够自动的给子网内新增主机节点分配ip地址,避免了手动管理ip的不便
  • 一般的路由器都带有DHCP功能,因此路由器也可以看做一个DHCP服务器

ipv4是4字节的,最多只有42亿个,属于有限的资源,所以需要对ip资源合理的分配

五类划分

过去曾经提出一种划分网络号和主机号的方案,把所有ip地址分为五类,如下图所示(该图出自[TCPIP])
在这里插入图片描述
A类 0.0.0.0到127.255.255.255
B类 128.0.0.0到191.255.255.255
C类 192.0.0.0到223.255.255.255
D类 224.0.0.0到239.255.255.255
E类 240.0.0.0到247.255.255.255

随着internet的发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址

  • 例如,申请了一个B类地址,理论上一个子网内能允许6万五千多个主机,A类地址的子网内的主机数更多
  • 然而实际网络架设中,不会存在一个子网内有这么多的情况,因此大量的ip地址都被浪费掉了

CIDR

针对这种情况提出了新的划分方案,称为CIDR(classless interdomain routing)

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号
  • 子网掩码也是一个32位的正整数,通常用一串“0”来结尾
  • 将ip地址和子网掩码进行“按位与”操作,得到的结果就是网络号
  • 子网掩码为1,表示对应网络位,0表示主机位
  • 网络号和主机号的划分与这个ip地址是A类、B类还是C类无关

下面举两个例子:
划分子网的例子1
在这里插入图片描述

划分子网的例子2
在这里插入图片描述

可见,子网掩码和ip运算可以得到网络号,主机号从全0到全1就是子网的地址范围
ip地址和子网掩码还有一种更简洁的方法,例如140.252.20.68/24,表示ip地址为140.252.20.68,子网掩码的高24位是1,也就是255.255.255.0

子网掩码可以对ip32位,进行任意划分,内网建设,比如B类主机号16位太多了,可以划出12位给网络,剩下4位作为主机号

6. 特殊的ip地址

将ip地址中的主机地址全部设为0,就成为了网络号,代表这个局域网
ip地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包
127.*的ip地址用于本机环回(loop back)测试,通常是127.0.0.1

在这里插入图片描述

7. ip地址的数量限制

我们知道,ip地址(ipv4)是一个4字节32位的正整数,那么一共只有2的32次方个ip地址,大概是43亿左右,而tcp/ip协议规定,每个主机都需要一个ip地址。这意味着,一共有43亿台主机接入网络吗?实际上,由于一些特殊的ip地址存在,数量远远不足43亿,另外ip地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个ip地址

CIDR在一定程度上缓解了ip地址不够用的问题(提高了利用率,减少了浪费,但是ip地址的绝对上限并没有增加),仍然不是很够用,这时候有三种方式来解决:

  • 动态分配ip地址:只给接入网络的设备分配ip地址,因此同一个mac地址的设备,每次接入互联网中,得到的ip地址不一定是相同的
  • NAT技术(后面重点介绍)
  • ipv6:ipv6并不是ipv4的简单升级版,这时互不相干的两个协议,彼此病不兼容,ipv6用16字节128位来表示一个ip地址,但是目前ipv6还没有普及

8. 私有ip地址和公网ip地址

理解运营商和全球网络

我们是怎么上网,通过调试解调器将模拟光电信号转为数字信号,再交给路由器,路由器构建了局域网,网络在运营商上网需要账号密码,交钱。路由器的管理也有一个账号密码。每个国家的基站等网络都是由运营商和国家完成的

全球网络中,将ip按国家进行了划分。每个国家和地区都有自己的ip地址段。在国内,再次划分,每个ip地址还包含了省和市网段的匹配的信息,市的定位不一定准确。如果别国想访问国内的一台主机,先拿目标ip在全球范围的路由器对比,发现是中国的,然后再交由国内的路由器,判断子网掩码后的所属,到省,到市,一直往下
在这里插入图片描述

数据发送过程

如果一个组织内部组建局域网,ip地址只用于局域网内的通信,而不直接连到internet上,理论上,使用任意的ip地址都可以,但是RFC1918规定了用于组建局域网的私有ip地址

  • 10.*,前8位是网络号,共16,777,216个地址
  • 172.16.到172.31,前12位是网络号,共1,048,576个地址
  • 192.168.*,前16位是网络号,共65536个地址
  • 包含在这个范围内,都称为私有ip,其余的则称为全局ip(或公网ip)

在这里插入图片描述

  • 一个路由器可以配置两个IP地址,一个是WAN口IP,一个是LAN口IP(子网IP)
  • 路由器LAN口连接的主机,都从属于当前这个路由器的子网中
  • 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的ip地址就可以重复了
  • 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商可能会有很多级,最外层的运营商路由器WAN口IP就是一个公网IP
  • 子网内的主机需要和外网进行通信时,路由器将Ip首部中的ip地址进行替换(替换成WAN口ip),这样逐级替换,最终数据包中的ip地址成为一个公网ip,这种技术称为NAT(Network Address Translation),网络地址转换
  • 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网ip的服务器上,这样的服务器可以在阿里云/腾讯云上购买

比如上面192.168.1.201主机想访问一个ip是201,100,1,1的公网,它自己是私有ip,所以到达自己所在的路由器后要替换,将源ip替换为路由器的WANip,就是10.1.1.2,由家用路由器再发送给运营商路由器,源ip是它的子网,继续替换为122.77.241.4,这个过程可能会重复,直到有一个路由器发送到广域网中,以省为例,判断这个ip是不是国内的,是就转给这个省,不断向下,根据目的ip就可以确定发送的主机

nat路由器在这个替换过程中会保存映射关系,当数据要发送回来的时候,不断还原ip

大企业的网络也由内网构成,但会提供一个公网路由器

9. 路由

在复杂的网络结构中,找出一条通往终点的路线,路由的过程,就是这样一跳一跳(Hop by Hop)“问路”的过程
所谓“一跳”就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间
在这里插入图片描述

ip数据报的传输过程和纹路一样,当ip数据报,到达路由器时,会先查看目的ip。路由器决定这个数据报时能直接发送给目标主机,还是需要发送给下一个路由器,依次反复,一直到达目标ip地址
那么如何判定这个数据包该发送到哪里?每个节点内部维护一个路由表

当路由器找路时,不会出现不知道的情况,那样数据就无法发送了。会有下面的结果:
给你具体下一跳的路
路由器不清楚,但转入默认路由器
到达入口路由器

在这里插入图片描述

路由表

可以用route命令查看
在这里插入图片描述
如果目的ip命中了路由表,就直接转发即可。路由表中的最后一行们主要由下一跳地址和发送接口两部分组成,当目的地址与路由表其他行都不匹配时,就会按缺省路由条目规定的接口发送到下一跳地址

假如某主机网络接口配置和路由表如下:
在这里插入图片描述

这台主机由两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络镰刀192.168.56.0/24网络
路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志标识此条目有效(可以禁用某些条目),G表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不闭经路由器转发

转发过程例1,发送数据报目的192.168.56.3
跟第一行的子网掩码左与运算的到,192.168.56.0,与第一行目的网络不符
第二行同样计算,正式第二行的目的网络,经由eth1接口发送。是与eth1接口直连的网络,可以直接发到目的主机,不需要转发

转发过程例2,发送数据包目的202.10.1.2
和前几项对比都不是
按缺省条目,从eht0发乎,去往192.168.10.1路由器,由这个路由器根据它的路由表决定如何发

10. 路由表生成算法

路由表可以由网络管理员手动维护(静态路由),也可以通过一些算法自动生成(动态路由)。例如距离向量算法,LS算法啊,Dijkstra算法等

相关推荐

  1. 55、定义浅神经网络架构和算法(matlab)

    2024-07-23 05:16:02       17 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-23 05:16:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-23 05:16:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-23 05:16:02       45 阅读
  4. Python语言-面向对象

    2024-07-23 05:16:02       55 阅读

热门阅读

  1. vue中预览视频,word,pdf,xlsx

    2024-07-23 05:16:02       16 阅读
  2. service

    service

    2024-07-23 05:16:02      14 阅读
  3. vue3 页面引入组件

    2024-07-23 05:16:02       17 阅读
  4. NotebookApp Error unpacking user from cookie

    2024-07-23 05:16:02       15 阅读
  5. PHP基础语法(三)

    2024-07-23 05:16:02       19 阅读
  6. Linux中利用消息队列给两个程序切换显示到前台

    2024-07-23 05:16:02       18 阅读
  7. Python面试题:Python中的类型提示与静态类型检查

    2024-07-23 05:16:02       17 阅读
  8. 【架构专题】微服务架构

    2024-07-23 05:16:02       13 阅读
  9. 学术研究期刊

    2024-07-23 05:16:02       14 阅读
  10. 设计模式实战:图形编辑器的设计与实现

    2024-07-23 05:16:02       16 阅读