• Linux知识点 -- 网络基础 -- 网络层


    Linux知识点 – 网络基础 – 网络层


    一、IP协议

    1.概念

    IP协议:提供一种能力,将数据从A主机送到B主机的能力;

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

    2.IP协议如何封装和解包

    IP协议有定长包头和自描述字段;

    3.IP协议如何交付

    IP协议报头中有8位协议,表明上层使用的是TCP协议还是UDP协议;

    3.IP协议报头

    在这里插入图片描述

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

    16位标识、3位标志和13位片偏移这个三个报头属性与报文的分片和组装有关,下面介绍;

    4.IP报文的分片与组装

    • 为什么要分片:
      数据链路层由于物理特征的原因,一般无法转发太大的数据,有一次可以转发到网络的报文大小的限制,因此,需要对大小超过限制的报文进行分片;
    • 分片是什么:
      分片是将一个比较大的IP报文拆分成多个小的报文,由发送方的网络层进行的;
      由于发送方的传输层给网络层的是一个完整的数据,因此接受方的网络层交付给传输层的也必须是一个完整的报文;
      分片好的数据发送给数据链路层,再发送给接收方的链路层,报文的组装工作是由接收方的网络层来完成的;
      所以,IP报文的分片和组装的行为,TCP协议是不知道且不关心的;
    • 如何进行分片和组装:
      IP包头中有三个属性:16位标识、3位标志和13位片偏移,这三个属性就是用来描述分片和组装的属性;
      16位标识(id):唯一的标识主机发送的报文;如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的;
      3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到);第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文;第三位表示“更多分片”,如果分片了的话,最后一个分片置为1,其他是0,类似于一个结束标记;
      13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移;其实就是在表示当前分片在原报文中处在哪个位置;实际偏移的字节数是这个值 * 8得到的;因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了);

    关于分片的几个问题:

    1. 分片行为不是主流,因为数据分片就意味着网络中将存在着更多的报文,丢包是有概率的,分片增加了丢包的概率;
    2. 相同报文的分片,16位标识是相同的;
    3. 识别报文是否被分片:
      如果更多分片标志位是1,就证明此报文是被分片的;
      如果更多分片标志位是0,但是13位片偏移不为0,就证明该报文是分片的,并且是最后一个分片;
      如果更多分片标志位是0,13位片偏移也是0,就证明该报文是没有分片的;
    4. 中间报文有多个,怎么保证收全了:
      根据偏移量,来进行升序排序;
      偏移量 + 自身大小 = 下一个报文的偏移量;
      扫描整个报文,如果不匹配,中间一定有丢失;如果成功计算到结尾,就一定收取完整了;
    5. 异常处理:识别组装过程中,任何一个分片丢失,都要识别出来;
    • 分片demo:
      分片之前,一定是一个独立的IP报文,有报头+数据;
      分片之后,每一个分片都要有IP报头
      下面是一个分片demo:一共3000字节的IP报文,链路层能接收报文的大小是1500字节,因此需要对原报文进行分片;
      在这里插入图片描述
      第一个分片是1500字节,其中包括了原始的报头数据;
      第二个分片是1500字节,但是需要另加一个20字节的报头,相当于原始报文的1480字节+20字节的报头;
      由于原始报文还剩下20字节,因此还需要一个分片,第三个分片是40字节,包括20字节的报头和20字节的数据;

    5.网段划分

    • IP地址分为两个部分:网络号和主机号;
      网络号:保证相互连接的两个网段具有不同的标识,表征的是不同区域;
      主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号;
      这样便于定位,且能提高查找效率;

      在这里插入图片描述

    每个国家的IP地址,在开始的时候,就已经被划分好了,国际上的路由器都有自己的路由表,可以进行国家和国家的转发;

    • DHCP方法:(了解)
      有一种技术叫做DHCP,能够自动的给子网内新增主机节点分配P地址,避免了手动管理IP的不便;
      一般的路由器都带有DHCP功能,因此路由器也可以看做一 个DHCP服务器;
      过去曾经提出一种划分网络号和主机号的方案,把所有IP地址分为五类,如下图所示:
      在这里插入图片描述
      随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址;
      例如,申请了一个B类地址,理论上一个子网内能允许6万5千多个主机A类地址的子网内的主机数更多;
      然而实际网络架设中,不会存在一个子网内有这么多的情况,因此大量的IP地址都被浪费掉了;

    • CIDR方法:
      针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing):
      引入一个额外的子网掩码(subnet mask)来区分网络号和主机号:
      子网掩码也是一个32位的正整数,通常用一串"0"来结尾;
      将IP地址和子网掩码进行“按位与"操作,得到的结果就是网络号;
      网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

      在这里插入图片描述
      IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围;
      IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68,子网掩码的高24位是1,也就是255.255.255.0;
      因为不同的路由器一定至少要级联2个网络,每一个网络的网络号可能是不同的;每个路由器都要给自己直接链接的网络都要配置对应的子网掩码! !

    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地址的绝对上限并没有增加),仍然不是很够用,这时候有三种方式来解决:

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

    8.私有IP和公网IP

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

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

    在这里插入图片描述

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

    9.路由

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

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

    • 第一种情况:问路的时候,路由器知道目的IP,会转发到下一跳网络对应的路由器(常见于公网IP);
    • 第二种情况:路由器不认识目的IP,将数据送到默认路由器(局域网内网转发,一般转发到公网入口路由器)
    • 第三种情况:路由器就是目的IP入口路由器

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

    • IP地址在路由器中的查找过程:将目的IP与子网掩码按位与,拿得到的目的网络与路由表中的网络地址对比,有相等的就转发到目的网络路由器,如果没有相等的,就转发到默认路由器,进行默认转发
      在这里插入图片描述

    路由表如下:
    在这里插入图片描述

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

    路由过程:
    在这里插入图片描述

    10.总结

    IP协议没有提供设备转发的具体功能,IP协议提供的是转发的策略;
    宏观上,我们的网络本质就是一个一个的子网构成的;数据转发的问题,本质都是子网转发;
    决定将数据交给下一跳路由器的时候,下一跳路由器一定和此主机在同一个局域网;

  • 相关阅读:
    Flask框架配置celery-[1]:flask工厂模式集成使用celery,可在异步任务中使用flask应用上下文,即拿即用,无需更多配置
    tf.lite
    海光异构智能计算专区上线飞桨AI Studio!
    SpriteShapeProfile
    嵌入式Linux(树莓派)环境设置及应用
    二十、MySQL多表关系
    Vue3 开发实战分享——打印插件 Print.js 的使用(Vue3 + Nodejs + Print.js 实战)以及 el-table 与 el-pagination 的深入使用(下)
    并行前缀和计算——MPI SCAN算法的C语言实现
    项目经理领导力提升与塑造:从自己干到团队干
    低代码维格云甘特视图入门教程
  • 原文地址:https://blog.csdn.net/kissland96166/article/details/133281224