Linux网络基础 — 网络层

目录

IP协议

IP协议报头格式

网段划分

特殊的IP地址

IP地址的数量限制

私有IP地址和公网IP地址

路由

补充


 

网络层

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

IP协议

ip具有将数据从 主机A 跨网络送到 主机B 的能力。

主机: 配有IP地址,但是不进行路由控制的设备。

路由器: 即配有IP地址,又能进行路由控制。

节点: 主机和路由器的统称。

IP协议报头格式

         我们看上图,会发现它跟TCP的报头很像,像一个模子里刻出来的,所以我们通常称他们为TCP/IP。

完整的报头注释:

  • 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4.
  • 4位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节.
  • 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模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话,最后一个分片置为0, 其他是1. 类似于一个结束标记.
  • 13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了).
  • 8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
  • 8位协议: 表示上层协议的类型
  • 16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏.
  • 32位源地址和32位目标地址: 表示发送端和接收端.
  • 选项字段(不定长, 最多40字节): 略

如何将报头和有效载荷分离?

  • 在IP报头中有4位首部长度,代表的是报头的大小,基本单位是4字节,标准报头是20字节,最大是60字节,所以这里按标准报文填写二进制是0101,最大是1111。
  • 那么光有报头的长度还不够,所以报头里还有一个16位总长度,它表示的是报文的总长度,用总长度减去报头的长度,得到的就是有效载荷的长度了,到这里我们就可以将报头和有效载荷分离了。

如何向上交付?

  • 把报头和有效载荷分离之后,我们怎么知道要将有效载荷交付给上层那个协议呢?报头里有一个字段是八位协议,他表示的是上层的协议类型,有了这个我们就可以向上交付了。

解决了上面两个问题之后,我们再看看其他的字段。

  • 16位首部检验和:它是对整个报头进行检验的,如果检验不通过,检验的主机会直接把该报文丢弃,丢弃了不要紧,发送方会进行超时重传的,这个重传不是IP做的,而是发送方主机的上层协议做的。
  • 8位生存时间:现有的网络环境是非常复杂的,没有任何人能保证网络不会出现问题,在我们进行数据转发的过程中因为一些原因导致对方主机不可达,或者出现环形转发的现象,节点路由器要有丢弃数据的能力,否则该数据报文会一直在网络中跳转,导致网络资源被浪费。这个8位生存时间表示数据报到达目的地的最大报文跳数,每进行一次跳转就减1,为0时还没到目的地就会被丢弃。
  • 32位源IP地址和32位目的IP地址:发送端主机和接收端主机的IP,这个目的地址很重要,没有这个数据就不知道要往哪个主机发送,也就没办法发送了。
  • 4位版本:指的是IP的协议版本,一般来说都是IPv4,因为IPv4和 IPv6不兼容,不能直接平替,所以一般都是IPv4。

网段划分

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

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

 

         也就是说不同的子网其实就是把网络号相同的主机放到一起。如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复。通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同。

        那么问题来了,手动管理子网内的IP,是一个相当麻烦的事情。有一种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便。一般的路由器都带有DHCP功能,因此路由器也可以看做一个DHCP服务器。

一般在一个子网中,管理子网中IP的的设备通常是路由器。


过去曾经提出一种划分网络号和主机号的方案,把所有IP 地址分为五类,如下图所示(该图出自[TCPIP])。

他这个是按照前8位进行划分得来的

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万5千多个主机, A类地址的子网内的主机数更多。然而实际网络架设中, 不会存在一个子网内有这么多的情况, 因此大量的IP地址都被浪费掉了。

针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing)。

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

我们之前说过管理子网中IP的设备通常是路由器,那么目标网络和子网掩码、子网中的主机都会被路由器管理!目标网络和子网掩码是在路由器内配置的。

以例子2做演示:将IP地址和子网掩码做 "按位与"  (按位与是两个二进制位都为1,结果为1)。

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

特殊的IP地址

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

IP地址的数量限制

        我们知道,IP地址(IPv4)是一个4字节32位的正整数。那么一共只有 2的32次方个IP地址,大概是43亿左右。 而TCP/IP协议规定,每个主机都需要有一个IP地址。这意味着一共只有43亿台主机能接入网络么?

        实际上,由于一些特殊的IP地址的存在,数量远不足43亿。另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址。

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

动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的。也就是说打开网络时给你分配IP地址,关闭网络就将你的IP回收。

NAT技术:表示地址转化技术,下篇文章会详细的讲。

IPv6: IPv6并不是IPv4的简单升级版,这是互不相干的两个协议, 彼此并不兼容。 IPv6用16字节128位来表示一个IP地址,但是目前IPv6还没有普及。


私有IP地址和公网IP地址

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

10.*  前8位是网络号,共16,777,216个地址
172.16. 到172.31.   前12位是网络号,共1,048,576个地址。
192.168.*  前16位是网络号,共65,536个地址。

包含在这三个范围中的, 都成为私有IP(内网IP),其余的则称为全局IP(或公网IP)。我们之前所说的IP具有唯一性指的就是公网IP。

路由器的功能有三个:1.对数据进行转发 ,2. DHCP |  组建局域网 3. NAT

        路由器是通过前面三个内网IP组建的局域网, 家用路由器一般都是用192.168这个内网IP,而企业级路由器则一般用另外两个。一个路由器可以配置两个IP地址,一个是WAN口IP,一个是LAN口IP(子网IP)。也就是说一个路由器的WAN口IP对应上层路由器的子网IP,LAN口IP对应下层子网IP如路由器或主机的IP,相当于是一个家用路由器的子网中有多个主机,一个运营商路由器的子网中有多个家用路由器。在运营商路由器的子网中这些家用路由器就相当于是主机,然后层层嵌套在一起。

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

路由

路由就是在复杂的网络结构中, 找出一条通往终点的路线。

        路由就像是在以前没有导航的年代问路一样,比如你要去某一个地方,你找到一个路人,你问XXX怎么走,他此时会有两种情况:1.我不知道怎么走,你问问下一个人吧,2.我知道怎么走,你先去这再去那...就到了。路由也差不多,数据报到一个路由器,这个路由器有两种情况:1.我不知道这个目的IP是哪里,我把你转给下一个路由器,你问问它吧,2.我知道这个目的IP,他在哪哪哪,你去找它吧,该路由器就直接把你转给那个目标路由器了。

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

        IP数据包的传输过程也和问路一样,当IP数据包, 到达路由器时, 路由器会先查看目的IP。路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器,依次反复,一直到达目标IP地址。

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

路由表可以使用route命令查看 , windows可以用 route print 查看

  • 路由表的Destination是目的网络地址,
  • Gateway是下一跳地址,
  • Genmask是子网掩码,
  • Iface是发送接口,
  • Flags中的U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。

        核心字段就这几个,其他的暂时不用管。

目的网络中的default代表默认,而它这行里面有G 所以这行代表默认网关。

        如果目的IP命中了路由表,就直接转发即可。路由表中的最后一行(我的是第一行),主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。

假设某主机上的网络接口配置和路由表如下:

        这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到
192.168.56.0/24网络;

转发过程例1:如果要发送的数据包的目的地址是192.168.56.3

  • 跟第一行的子网掩码做与运算得 到192.168.56.0,与第一行的目的网络地址不符;
  • 再跟第二行的子网掩码做与运算得 到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去;
  • 由于192.168.56.0/24正 是与eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;

转发过程例2: 如果要发送的数据包的目的地址是202.10.1.2

  • 依次和路由表前几项进行对比, 发现都不匹配;
  • 按缺省路由条目,从eth0接口发出去,发往192.168.10.1路由器;
  • 由192.168.10.1路由器根据它的路由表决定下一跳地址;

补充

因为 IP协议报头第二行字段 是可以和上面的内容分开的,所以这部分放到这来说。I

        P协议是在网络层,下一层还有数据链路层,是MAC帧协议,协议规定有效载荷一般不能超过1500字节(MTU,是可以修改的)。那么问题来了,IP 能决定单个报文的大小吗?答案是当然不行,因为IP 上层还有一个传输层,TCP又叫传输控制协议,所以单个报文的大小是由TCP控制的。这几层之间相互是有影响的,不是各自独立的。

        举个例子:TCP说我要发送一个3000字节的报文,MAC帧协议说我最多只能发1500字节,多了搞不了,IP夹在中间两头为难,那没办法呀,所以IP就实现了一个功能叫分片与组装。这里注意:IP的分片与组装不是主流情况!因为分片不可能每次都能组装完好,这代表会有概率出现问题,所以大部分情况不会分片,但架不住有特殊情况。

        这三个字段是用来支撑分片与组装的,分片与组装是IP自己独立完成的,由发送端进行分片,接收端进行组装。而 TCP 和MAC帧 并不关心你 IP是否进行了分片与组装,你只要给我的数据是按我规定的标准给的且没有问题就行,其他的内容并不关心。

那么如何分片?如何组装?

        首先需要考虑几个问题:

  • 一是你怎么知道报文被分片了?
  • 二是对端主机组装的问题,不能随便分片。也就是说同一个报文的分片要有标识,要能被识别出来这些分片是同一个报文的。
  • 三是要能分辨哪个是第一个,哪个是最后一个,有没有收全,有没有丢失分片的情况。
  • 四是在收全的情况下,我们只知道第一个和最后一个,中间的分片怎么排列,如何正确的组装。
  • 五是怎么保证合起来的报文是正确的。

先看第二行的第一个字段:

  • 16位标识:该标识表示主机发送报文的唯一性,如果被分片了,那么每个分片里的标识都是一样的。

这里就可以很好的回答第二个问题,假如报文被分片了,收到几个相同的16位标识的分片,那么就说明这几个属于同一个报文。

  • 三位标志:第一位保留表示暂时不用,第二位为1表示禁止分片,一般用于路由器过滤大报文的,就是说报文长度超过限定值,就会直接将该报文丢弃,第二位一般是设置为0的,第三位表示更多分片,如果分片了的话,最后一个分片置为0, 其他是1,也就是说它是表示我后面还有没有分片了,如果为1证明还有,如果为0证明没有了。

        我们要知道的是分片不仅仅是将报文按固定大小分片就完事了,还要给每个分片加上IP报头,这样每个分片都是一个独立的IP报文,组装只是将多余的IP报头解析之后丢掉。如果没有分片,那么IP报头里这三个标志位,最后一个标志是设为0的。就像字符串的末尾是 '\0'一样。

  • 13位片偏移:是分片相对于原始IP报文开始处的偏移,其实就是表示当前分片在原始报文中的位置。实际偏移的字节数是这个值 * 8 得到的,因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。

那么此时就可以回答上面的问题了。

  • 第一个问题:怎么知道报文被分片了?1.三位标志位中最后一位 “更多分片” 为1,就证明该标识的报文分片了。那么此时会有一个问题:如果只收到最后一个分片,其他的分片都没收到丢失了,怎么确定这是一个分片呢? 2. 如果更多分片的标志位是0,并且13位片偏移 > 0,两个条件都满足,那么说明这是一个分片,否则就不是。
  • 第三个问题:前提是已经分片了,那么第一个分片就是,更多分片的标志位是1,且片偏移是0,最后一个分片是,更多分片的标志位是0,且片偏移 > 0,如何验证分片有没有收全,我们先放一放。
  • 第四个问题:假设已经收全,如何正确的组装呢?只需要按 片偏移 进行升序排列组装即可!组装时从0开始 ,按 当前起始位置 + 自身长度 = 下个报文中填充的偏移量大小,如果下一个报文的偏移量对不上,说明可能有分片丢失了,或者没收全。那么有没有收全的问题就解决了。
  • 第五个问题:怎么保证组装后是正确的?不用担心,TCP/IP有检验和,如果检验出现问题,会直接丢掉。

分片好不好呢?答案是非常不好,前面也说过这不是主流情况。

那分片对TCP和UDP包括IP本身有什么影响?

        一个报文被拆分成了多个,任意一个报文分片丢失,就会造成拼接组装失败,进而导致对端对整个报文进行重传。那么有人会说只是一个分片丢失了,重传一个分片就好了。我们要知道,IP是没有重传能力的,而TCP不关心IP有没有分片,也就是说TCP不知道IP的那个分片丢失了,那怎么重传分片呢?其次组装不成功,检验和通不过就会被丢弃,就相当于是丢包了。一个报文传输的成功率并不是100%,一个报文被分成几片,那么传输成功率就会被降低。丢报的概率高了,需要重传的次数就会增多,传输效率也会被降低,这就是影响。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二、DDL-3.数据类型

分为3种:数值类型、字符串类型、日期时间类型。 一、数值类型 【案例】 年龄: age TINYINT UNSIGNED——范围(0,255)够用 分数:score double(4,1)——分数0-100有小数,4—最高位数&#xff0…

LabVIEW实现基于DCT的野生动物监测无线图像传输

LabVIEW实现基于DCT的野生动物监测无线图像传输 针对野生动物物种数量不断下降的情况,需改进以增强当前野生动物监测系统的能力。目前的系统要求工人进入森林以收集存储在存储卡中的图像数据。这项任务风险很大,而且耗费大量时间。系统也无法提供实时报…

[C语言]if语句详解

C语言初阶系列 分支语句和循环语句(1) 目录 C语言初阶系列 前言 一,什么是语句? 1.1如何理解语句? 二,分支语句(选择结构) 2.1,if语句 2.2,if语句的错误的条件写法 2.2,if语…

python opencv 级联Haar多目标检测

一、基于OpenCV的haar分类器实现笑脸检测 1、Haar分类器介绍 🚀Haar分类器是一种基于机器学习的目标检测算法,它使用Haar特征描述图像中的目标。Haar特征是基于图像亮度的局部差异计算得出的,可以用来描述目标的边缘、角落和线条等特征。 使用…

Linux下Nginx升级

nginx版本升级不会覆盖配置文件,但以防万一升级前请先备份配置文件或者配置文件夹 默认配置文件地址:/usr/local/nginx/conf/nginx.conf 1.下载 wget -c http://nginx.org/download/nginx-1.24.0.tar.gz 2.解压 tar -xvf nginx-1.24.0.tar.gz 3.nginx…

【论文笔记】图像修复MPRNet:Multi-Stage Progressive Image Restoration 含代码解析

目录 一、介绍 二、使用方法 1.推理 2.训练 三、MPRNet结构 1.整体结构 2.CAB(Channel Attention Block) 3.Stage1 Encoder 4.Stage2 Encoder 5.Decoder 6.SAM(Supervised Attention Module) 7.ORSNet(Original Resolution Subnetwork) 四、损失函数 1.Charbonni…

2. DATASETS DATALOADERS

2. DATASETS & DATALOADERS PyTorch提供了两个数据基元:torch.utils.data.DataLoader和torch.uutils.data.data集,允许使用预加载的数据集以及自己的数据。数据集存储样本及其相应的标签,DataLoader在数据集周围包装了一个可迭代项&…

XFTP完全卸载干净教程

一、卸载应用程序 在控制面版中找到XFTP应用程序进行卸载操作。 二、删除注册表 (1)按住winR键打开“运行”并输入regedit打开注册表。 (2)按住ctrlF打开搜索,搜索xftp。 把这个目录下的能搜索到的xftp文件都删掉就行了…

计算机网络——计算机网络体系结构

文章目录 **1 计算机网络概述****1.1 概念****1.2 组成****1.3 功能****1.4 分类****1.5 性能指标** **2 计算机网络体系结构与参考模型****2.1 计算机网络分层结构****2.2 计算机网络协议,接口,服务的概念****2.3 ISO/OSI参考模型和TCP/IP模型** 1 计算…

短视频矩阵系统源码搭建--附赠代码

说明:本开发文档适用于短视频矩阵系统源码开发搭建,短视频seo矩阵源码开发搭建,抖音短视频seo源码开发搭建,抖音矩阵系统源码开发搭建等SaaS类产品开发场景。 短视频矩阵系统开发围绕的开发核心维度: 1. 多账号原理开…

Java框架 Mybatis入门

0目录 Java框架Mybatis 1..框架介绍 2.Mybatis实战 1.框架介绍 补充MVC思想 为什么使用框架? 效率高,成本低 框架是别人写好的,可以直接调用 框架是基于MVC的思想 框架包中含有MVC思想的所有组成模块:控制层;模型…

MVC精讲

前言:框架,架构,设计模式 架构:简单的说架构就是一个蓝图,是一种设计方案,将客户的不同需求抽象成为抽象组件,并且能够描述这些抽象组件之间的通信和调用。 框架:软件框架是项目软件…