【ONE·Linux || 网络基础(五)】

总言

  主要内容:网络层IP协议、数据链路层Mac协议、ARP等介绍。

文章目录

  • 总言
  • 10、IP协议(网络层)
    • 10.1、IP协议报头
      • 10.1.1、预备内容
      • 10.1.2、IP协议报头格式(IPv4)
        • 10.1.2.1、基本报头格式介绍
        • 10.1.2.2、分片(介绍16位标识、3位标志、13位片位移)
    • 10.2、以公网IP为切入点
      • 10.2.1、网段划分
      • 10.2.2、IP地址的划分策略简述
        • 10.2.2.1、IP分类地址
        • 10.2.2.2、CIDR无分类地址
      • 10.2.3、解决IP地址数量限制的问题
    • 10.3、以私网IP为切入点
      • 10.3.1、私有IP地址介绍
      • 10.3.2、运营商与私网IP的搭建
      • 10.3.3、路由(route指令)
        • 10.3.3.1、基本介绍
        • 10.3.3.2、route指令
        • 10.3.3.3、路由表生成算法
  • 11、数据链路层
    • 11.1、数据帧格式
      • 11.1.1、以太网的帧格式
      • 11.1.2、重谈局域网通讯原理
        • 11.1.2.1、局域网转发
        • 11.2.2.2、碰撞问题
        • 11.2.2.3、局域网攻击
    • 11.2、MAC地址和MTU
      • 11.2.1、基础认识
      • 11.2.2、MTU对IP协议的影响
      • 11.2.3、MTU对UDP、TCP协议的影响
        • 11.2.3.1、MTU对UDP协议的影响
        • 11.2.3.2、MTU对TCP协议的影响
    • 11.3、arp协议
      • 11.3.1、问题引入
      • 11.3.2、arp协议的报头格式
      • 11.3.3、arp的工作过程
        • 11.3.3.1、举例说明
        • 11.3.3.2、总结概述
        • 11.3.3.3、演示:获取当前所处的局域网中所有主机的MAC和IP地址
        • 11.3.3.4、arp伪装/arp攻击/arp欺骗
  • 12、其他重要协议或技术
    • 12.1、DNS域名解析服务
      • 12.1.1、背景简述
      • 12.1.2、域名、域名服务器、DNS查询
        • 12.1.2.1、域名
        • 12.1.2.2、域名服务器
        • 12.1.2.3、DNS查询
    • 12.2、NAT技术
      • 12.2.1、技术背景
      • 12.2.2、NAT-IP转换过程
      • 12.2.3、NAPT
      • 12.2.4、技术缺陷与NAT穿越
    • 12.3、代理服务器
      • 12.3.1、基本介绍
      • 12.3.2、类型说明(介绍正向代理和反向代理)
        • 12.3.2.1、正向代理
        • 12.3.2.2、反向代理
      • 12.3.4、代理服务器与NAT区别

  
  
  

10、IP协议(网络层)

10.1、IP协议报头

【ONE·Linux || 网络基础(五)】_第1张图片

10.1.1、预备内容

  1)、问题引入
  问题:IP协议解决什么问题?
  回答: IP协议提供一种能力,即 “将数据从A主机送到B主机”。但需要注意,虽然IP协议有这个能力,但不代表其能保障百分百做到。
  注意事项: IP 协议是无连接的,不可靠的网络层协议,它只负责数据的传输,但是并不能保证数据一定能到达,要想保证数据可靠,需要上层应用处理,例如 TCP协议利用IP协议传输数据,但是丢包、超时等情况还是要靠 TCP 自己解决。
  
  
  
  2)、一些基本概念简介

  IP协议:通过IP地址和路由协议来识别不同的网络和主机,将数据包从源地址传输到目的地址。
【ONE·Linux || 网络基础(五)】_第2张图片
  
  主机: 配有IP地址, 但是不进行路由控制的设备。
  路由器: 即配有IP地址, 又能进行路由控制。
  节点: 主机和路由器的统称。
  
  
  
  

10.1.2、IP协议报头格式(IPv4)

10.1.2.1、基本报头格式介绍

  相关格式如下。附:IPv4 和 IPv6 报头格式说明
【ONE·Linux || 网络基础(五)】_第3张图片

  
  1)、如何封装与解包?
  定长报头+自描述字段(4位首部长度): 和UDP协议一样,IP协议也是采用固定长度的报头,首20字节长度不变,可从中读取到4位首部长度,据此判断出是否含有选项,减去整个首部,剩余部分即有效载荷。

  
  
  2)、如何交付/分用?
  8位协议:IP协议20字节的固定首部中,含有8位协议,用于表示上层协议的类型。根据它即可判断出是要交付给TCP、UDP,还是其它传输层协议。
【ONE·Linux || 网络基础(五)】_第4张图片

  
  
  3)、其它报头介绍
  4位版本号(version): 版本字段的作用是标识IP协议的版本。目前有IPv4和IPv6两个版本,IPv4的版本号为4,IPv6的版本号为6。这里介绍的IP报文格式属于IPv4,长度为4 bit。


  4位首部长度(header length): 长度为 4 bit 。这个字段的作用是为了描述 IP 报头的长度(因为IP报头中有变长的可选部分)。和UDP一样,这里的单位长度为 4 个字节,即本区域填入值 = IP 头部长度(单位为字节)/ 长度单位(4 个字节)。因此,一个 IP 报头的长度最长为 “ 1111 ”(二进制),转换为十进制即15,则说明报头长度为 15 x 4 个字节 = 60 个字节(IP 报头最小长度为 20 字节。)


  8位服务类型: 3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。
  4位TOS分别表示: 最小延时、最大吞吐量、最高可靠性、 最小成本。 这四者相互冲突,只能选择一个。例如:对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。


  16位总长度(total length): 长度为 16 bit 。总长度字段指的是整个IP报文的长度,包括头部以及数据部分,以字节为单位,最大值为65535字节。所以,数据包有效载荷的大小 = IP 包总长度(Total Length)- IP 报头长度(Header Length)。


  8位生存时间间(Time To Live, TTL): 数据报到达目的地的最大报文跳数,长度 8 bit。设计之初是以秒(s)为单位的,但实际以跳数为单位,建议的缺省值为 64 。
  具体说明: 当 IP 包进行传送时,先会对该字段赋予某个特定的值。当 IP 包经过每一个沿途的路由器的时候,每个沿途的路由器会将 IP 包的 TTL 值减少 1 。如果 TTL 减少为 0,则该 IP 包会被丢弃。这个字段可以防止由于路由环路而导致 IP 包在网络中不停被转发。(PS:网络层IP协议将数据包丢弃并无影响,因为上层协议就是来提供可靠的数据传输策略的。如TCP,若IP协议处丢包,在TCP协议上会出发超时重传,再从重新向对方主机发送数据包。)


  8位协议(Protocol): 长度 8 bit 。标识了上层所使用的协议。以下是比较常用的协议号:1 ICMP;2 IGMP;6 TCP;17 UDP;88 IGRP;89 OSPF 。


  起源和目标地址(Source and Destination Addresses): 这两个地址都是 32 bit 。标识了这个 IP 包的起源和目标地址,也就是发送端和接收端的IP地址。要注意除非使用 NAT,否则整个传输的过程中,这两个地址不会改变。


  
  
  
  
  
  

10.1.2.2、分片(介绍16位标识、3位标志、13位片位移)

  1)、是什么和为什么?

在这里插入图片描述1、为什么存在分片行为,什么是分片?

  说明: 网络层的IP包需要借助链路层的本地通信能力,搭载在链路层帧中进行传输。链路层由于物理特征的原因,一般无法转发太大的数据。典型的以太网帧最多可以承载 1500 字节的数据,即链路层有一次可以转发到网络的报文大小的限制(MTU)。一个长度多达 65535 字节的 IP 包显然不可能搭载在运输能力只有区区 1500 字节的以太网帧中。因此,只能将超大的 IP 包分成一个个不超过 1500 的小包,再一一发送出去。各个小包达到目的地后,在目的主机上进行重组,得到原包。这就是所谓的 分片 ( fragmentation )

【ONE·Linux || 网络基础(五)】_第5张图片

  
  

在这里插入图片描述2、MTU是什么?为什么以太网MTU通常被设置为1500?

  最大传输单元MTU(Maximum Transmission Unit):指网络能够传输的最大数据包大小,以字节为单位。MTU的大小决定了发送端一次能够发送报文的最大字节数。如果MTU超过了接收端所能够承受的最大值,或者是超过了发送路径上途经的某台设备所能够承受的最大值,就会造成报文分片甚至丢弃,加重网络传输的负担。如果太小,那实际传送的数据量就会过小,影响传输效率。
  
  
  RFC标准定义以太网的默认MTU值为1500。那么这1500的取值是怎么来的呢?

  • 早期的以太网使用共享链路的工作方式,为了保证CSMA/CD(载波多路复用/冲突检测)机制,所以规定了以太网最小有效帧长为64字节,最大为1518字节。最小64字节是为了保证最极端的冲突能被检测到,64字节是能被检测到的最小值;最大不超过1518字节是为了防止过长的帧传输时间过长而占用共享链路太长时间导致其他业务阻塞。所以规定以太网帧大小为64~1518字节,虽然技术不断发展,但协议一直没有更改。
  • 以太网最大的数据帧是1518字节,这样刨去帧头14字节和帧尾CRC校验部分4字节,那么剩下承载上层IP报文的地方最大就只有1500字节,这个值就是以太网的默认MTU值。这个MTU就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片,如果单个IP报文长度大于MTU,则会在发送出接口前被分片,被切割为小于或等于MTU长度的IP包。
      
      

在这里插入图片描述3、为什么由网络层IP进行分片和组装,而不是由链路层来执行该操作?

  根据之前内容可知,数据包的大小是由传输层决定的,网络层无权决定,而下层数据链路层对数据包又有大小限制,为了解决两层间的数据传输,网络层提供了分片行为,同样的,组装行为也必须有对方的网络层做。
  为什么需要组装? 协议具有一致性,对方给自己的网络层是一个完整的TCP报文,我接收方后,网络层向上交付时,也必须是一个完整的报文相当于不能只管杀,不管埋。

  
  
  
  
  2)、怎么办到的?

在这里插入图片描述1、简述这三个报头信息作用

  16位标识符(Identifier): 长度 16 bit 。该字段与 Flags 、 Fragment Offest 字段联合使用,对较大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,其拆分开的所有小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。(即,属于同一个报文,则该分片的这个id都是相同的)


  3位标志字段(Flags):
  第一位保留位: 保留的意思是现在不用,但是还没想好说不定以后要用到。
  第二位DF位(Don’t Fragment): 设为 1 时表示禁止分片,此使路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发(如报文长度超过MTU),则路由器会丢弃该上层数据包并返回一个错误信息。
  第三位MF位(More Fragments): 表示"更多分片",当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的 IP 包的报头中将 MF 位设为 1 。


  13位片偏移(Fragment Offset): 长度 13 bit。表示该 IP 包在该组分片包中位置(即分片相对于原始IP报文开始处的偏移位置),其以 8 个八位组为单位,实际偏移的字节数是这个值 × 8 ×8 ×8 得到的。接收端靠此来组装还原 IP 包,因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。


  
  
  

在这里插入图片描述2、相关说明

  1、建立一个意识:分片行为不是主流的。 实际分片增加了丟包的概率。

  
  


  2、IP协议能识别报文与报文间的不同。 可根据16位标识来区分,不同报文,标识不同。相同报文的分片,标识是相同的。
  问题:标识只有16位,会不会存在id不够分配的现象?
  回答:网络层不像传输层一样具有缓冲区暂时性存储数据,即不存在数据积压问题,即使是一次涌入大量数据,也会立即执行处理,因此这种由于报文过量导致分配id不够的现象,基本不会存在,且IP协议也有其他的方法处理区分标志。
  
  


  3、IP协议能识别报文是否被分片,以及当前被分片的报文位于整个报文中的哪一段。 这正是3位标志字段中的第三位MF位、结合13位片偏移共同完成的。根据上述介绍可知:
  Ⅰ、如果MF更多分片标志位为1,表明该报文属于分片报文。(其有对应偏移量,首个分片偏移量为0。
  Ⅱ、如果是某一个完整报文中的最后一个分片,则更多分片的标志位为0,但其13位片偏移一定不为0。

  以代码的形式表述如下:

if(报文->更多分片 && 0x1) 
	return 分片报文;
else if(报文->13位片偏移 > 0)
	return 分片报文;
else return 独立完整的报文;

  也可以反过来判断,先检查偏移量,不为零代表分片存在,为0则检查MF位,为1则表示分片(首个分片报文)。
  
  


  4、IP协议需要能处理异常行为:组装过程中,要能识别到分片是否完整/是否丢失。
  根据上述,可以将分片报文分为三类:
  ①起始分片报文:更多分片为1,片偏移为0;
  ②中间分片报文:更多分片为1,片偏移不为0;
  ③结尾分片报文:更多分片为0,片偏移不为0。

  
  


  问题1: 上述三类报文中,起始分片、结尾分片都只有一个,而中间分片可以有很多,因此就存在一个问题,组装时,如何判断一个分片报文组装是否完整?
【ONE·Linux || 网络基础(五)】_第6张图片
  
  解决方法:
  ①可根据偏移量,对同ID的分片进行升序排序。
  ②结合当前偏移量+自身大小=下一个报文的偏移量 这一特点,扫描整个报文。
  ③如果不匹配,说明分片不完整,中间存在丢失的情况;如果成功计算到结尾,说明收取到的报文已经完整了。
  
  以下为一个举例:
【ONE·Linux || 网络基础(五)】_第7张图片
  
  


  问题2:超过MTU的报文如何进行分片?
  以上只是对如何判断组装是否完整进行说明,下述举例说明分片情况。根据之前内容可知:
  MTU=1500字节,这是以太网接口对IP层的约束。①如果IP层要发送的数据包<=1500字节,只需要一个IP包就可以完成发送任务;②如果IP层数据包>1500字节,则需要分片才能完成发送。
  
  
  举例: 以主机发送一个数据载荷长度为2980字节的报文为例,假设出接口的MTU值为1500。 在网络层会对报文进行封装,其结构组成:IP头部20字节+数据载荷长度2980字节。报文封装后,整个报文长度为3000字节,在出接口进行转发的时候,发现IP报文的长度超过了MTU的值1500,因此要进行分片处理。
【ONE·Linux || 网络基础(五)】_第8张图片

  
  相关的分片过程如下:
  

错误的分片演示:

【ONE·Linux || 网络基础(五)】_第9张图片

  

正确的分片演示:

  Ⅰ、第一片报文,取整个报文前1500字节。 其中IP报文头固定20字节,数据载荷可以封装1480字节(MTU值1500字节-IP报文头20字节,数据载荷长度须是8的倍数);

  Ⅱ、第二片报文,复制第一片的IP头, IP报文头固定20字节,剩余的1480字节填入数据载荷。

  Ⅲ、第三片报文, 与第二部分 相同操作。若最后一片报文的长度不足46字节,会自动填充至46字节。
【ONE·Linux || 网络基础(五)】_第10张图片

  所有分片报文在发送至目的主机后,在目的主机进行分片重组,恢复为原报文。在进行重组时,通过IP标志位中的MF用来分辨这是不是最后一个分片,片偏移用来分辨这个分片相对原数据报的位置。通过这几个字段,可以准确的完成数据报的重组操作。

  
  
  
  
  

10.2、以公网IP为切入点

  公网地址:IP地址是由IANA统一分配的,以保证任何一个IP地址在Internet上是唯一的。
  

10.2.1、网段划分

  1)、为什么网段需要划分

在这里插入图片描述从世界范围的角度

  要知道IP地址是如何分配的,需要先了解一个机构——国际互联网号码分配机构 (The Internet Assigned Numbers Authority,简称IANA)。它是互联网名称与数字地址分配机构(The Internet Corporation for Assigned Names and Numbers,简称ICANN)旗下的一个机构,主要负责 IP地址和ASN 自治系统号的全球分配、DNS根区域的管理和协议分配
  
【ONE·Linux || 网络基础(五)】_第11张图片

  在IP地址管理方面,为了确保跨地区的IP地址公平分配,IANA 会根据全球政策将未分配的IP块池分配给5个区域性互联网注册管理机构(Regional Internet Registries,简称RIRs):

  • ARIN 美洲区:包含北美洲和部分加勒比海地区
  • APNIC 亚太区:包括亚洲和太平洋地区
  • RIPE NCC 欧洲区:包括欧洲、中东、中亚地区
  • LACNIC 拉美区:包括拉丁美洲和部分加勒比海地区
  • AFRINIC 非洲区:包括非洲地区

  再由有需要IP地址的机构向这些RIR提出申请,由他们来协调分配。
  
  
  

在这里插入图片描述国内角度

  说明:中国IP地址分配是由中国互联网信息中心(CNNIC)负责,CNNIC是亚太互联网络信息中心(APNIC)下一级机构,是国家级IP地址注册机构成员(NIR)。
  
  
  如此层层往下,可以知道的是,①网络号的位数是变化的(国家–>地区–>XXX)。②网络号在不断分级查找的过程中,是不断变大,并且收敛的
  这种方式能够解决漫无目的寻找拉低效率的问题,其优点是①方便定位,②提高查找效率。
  
  
  
  
  2)、IP地址 = 网络号 + 主机号

  MAC地址用来标识同一个链路中不同计算机,IP地址则是用来标识网络层中主机的通信地址 。对于IPV4,IP地址是一个32位的正整数,由网络号和主机号 两部分标识构成。

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

【ONE·Linux || 网络基础(五)】_第12张图片
  不同的子网:其实就是把网络号相同的主机放到一起。此外,如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复。
  
  
  
  
  

10.2.2、IP地址的划分策略简述

  问题说明: IP地址分为网络和主机两部分组成。那么,从第几位到第几位是网络标识,又是从第几位到第几位是主机标识?目前,对于IP地址的划分,主要有两种划分方式:IP分类地址和子网掩码区分。
  
  

10.2.2.1、IP分类地址

  1)、基本说明
  这是过去曾经提出的一种划分网络号和主机号的方案。把所有IP 地址分为五类:A类、B类、C类、D类、E类。

【ONE·Linux || 网络基础(五)】_第13张图片

  其中,A、B、C类由两个固定长度的字段组成:第一个字段为网络号,标志主机所连接的网络;第二个为主机号,标志着主机。主机号全位0定义为广播地址,不可随意使用。
  D、E类为特殊地址。

  IP地址分为四个字节,以x.x.x.x表示,每个x代表一个8位二进制数,全1和全0的都保留不用。实际中常用点分十进制记法,即将每个8位二进制数转换为十进制数,数与数之间以“."分割,数值范围为0-255

A类 0.0.0.0127.255.255.255 
B类 128.0.0.0191.255.255.255 
C类 192.0.0.0223.255.255.255 
D类 224.0.0.0239.255.255.255 
E类 240.0.0.0247.255.255.255

  
  
  2)、展开

  A类地址:首位以 “0(二进制)” 开头的地址。
  网络标识与主机标识: 1~8位是网络标识,后24位是主机标识。(即1字节的网路地址和3字节主机地址。)
  范围: 1.0.0.0 到127.0.0.0。(最高位必须是“0”,最高字节网络的地址范围从00000000-01111111)
  容纳量: 一个网段内可容纳的主机地址上限为16777214( 2 24 = 16777216 2^{24} =16777216 224=16777216,去掉全0和全1保留地址),一般用于大型网络。
  默认子网掩码: 255.0.0.0
  PS: A,0-127。其中0代表任何地址,127为回环测试地址(例如,127.0.0.1是一个特殊的IP地址,表示主机本身,用于本地机器的测试),因此,A类IP地址的实际范围是1-126。

在这里插入图片描述


  B类地址: 前两位以“10”开头的地址。
  网络标识与主机标识: 1~16是网络标识,后16位是主机标识。(即2字节的网路地址和2字节的主机地址)
  范围: 128.0.0.0~191.255.0.0。(网络地址的最高位必须是“10”,网络的地址范围从:1000 0000.0000 0000 - 1011 1111.1111 1111)
  容纳量: 一个网段内可容纳的主机地址上限为65534( 2 16 = 65536 2^{16}=65536 216=65536,去掉全0和全1保留地址)。一般用于中等规模网络,如大学、科研所等。需要注意的是,只要超过254台主机,就会分配到B类IP地址,而空余IP并不能被其v网络下的主机使用,极易造成浪费。
  默认子网掩码: 255.255.0.0
  PS: B,128-191。其中128.0.0.0和191.255.0.0为保留IP,实际范围是128.1.0.0–191.254.0.0。
在这里插入图片描述


  C类地址: 前三位以“110”开头的地址。
  网络标识与主机标识: 1 ~ 24是网络标识,后8位是主机标识。(即3字节的网路地址和1字节主机地址。)
  范围: 192.0.0.0~239.255.255.255。(网路地址的最高位必须是“110”,也即网络地址的范围是:1100 0000.0000 0000.0000 0000 -1101 1111.1111 1111.1111 1111)
  容纳量: 一个网段内可容纳的主机地址上限为254( 2 8 = 256 2^8=256 28=256,去掉全0和全1保留地址)。一般用于小型网络,如公司、家庭网络(wifi)。
  默认子网掩码: 255.255.255.0
  PS: C,192-223,其中192.0.0.0和223.255.255.0为保留IP,实际范围是192.0.1.0–223.255.254.0。
在这里插入图片描述


  D类地址: 前四位以“1110”开头的地址。
  网络标识与主机标识: 1~32是网络标识,D类地址没有主机标识,是一个保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播中。
  范围: 224.0.0.0~239.255.255.255,用于多点广播。
在这里插入图片描述


  E类地址: 前五位以“11110”开头的地址,为将来使用保留。在这里插入图片描述


  
  
  3)、特殊IP地址
  将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网;
  将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包;
  127.* 的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。
【ONE·Linux || 网络基础(五)】_第14张图片

  
  
  
  
  4)、存在问题
  随着Internet的飞速发展,这种划分方案的局限性很快显现出来:大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址。

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

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

10.2.2.2、CIDR无分类地址

  CIDR的全称是无类别域间路由(Classless Inter-Domain Routing),是一个用于给用户分配IP地址以及给路由分配IP地址的方法。在CIDR中,消除了之前划分IP地址以及划分子网的概念,它可以将好几个IP网络结合在一起,使用一种无类别的域际路由选择算法,使它们合并成一条路由从而较少路由表中的路由条目减轻Internet路由器的负担。

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

  CIDR将IP地址分为两部分,第一部分称之为最高有效位或者网络前缀,它用来标识一个网络;第二部分称之为最低有效位或者主机标识符,它用来标识主机。也就是说,允许IP地址的网络号长度是可变的,不再按照以前IP地址的网络号只能是8、16、24位。
  
  
  

10.2.3、解决IP地址数量限制的问题

  1)、问题说明
   IP地址(IPv4)是一个4字节32位的正整数,那么一共只有 2 32 2^{32} 232个IP地址,大概是43亿左右。 而TCP/IP协议规定,每个主机都需要有一个IP地址,这意味着一共只有43亿台主机能接入网络么? 实际中,由于一些特殊的IP地址的存在,数量远不足43亿;另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址。因此会存在IP地址数量不够的问题

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

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

10.3、以私网IP为切入点

10.3.1、私有IP地址介绍

  1)、基本介绍
  如果一个组织内部组建局域网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)。
  
  
  

10.3.2、运营商与私网IP的搭建

  1)、历史渊源与基础认识
  1、家里新居需要接网,一般会做什么?(简单了解)

a.家庭附近有运营商,有网络覆盖
b.联系运营商进行光纤入户
C.工作人员上门,调制解调器(),无线路由器
d.开户,账号,密码,配置路由器(账号密码+运营商认证你们的密码)
e.配置路由器--设置路由器的wifi名称+密码(路由器认证各种设备的密码)
f.正常上网,按月按年缴费

【ONE·Linux || 网络基础(五)】_第15张图片

  
  
  
  2、日常上网我们会使用各种app,可是到了月底充话费却给了运营商?为什么?
  回答:基础设施是运营商铺设的。

类似于高速公路与收费站,对方提供公路环境,我方向对方缴用一定费用。

  与互联网公司的关系:(简单理解) 。运营商主要是从各个使用网络传输系统的用户收费,其中包括网络数据传输的双方。
  1、各大互联网公司,需要用到运营商的网络传输系统,为用户提供内部服务,故互联网公司需要想运营商支付一定的费用。(一种互利合作共赢的关系)
  2、作为用户,我们需要访问各应用程序的资源(如上传下载,那么就会有上传下载流量),这个过程就用到了运营商的网络系统,所以,用户需要支付一定的网费,这个网费就归运营商所有。

  
  
  
  3、(初步理解)我们经常听到,访问不了国外一些网站,为什么?
  
  
  
  
  2)、路由器天然构建局域网(子网)

在这里插入图片描述前情回顾与基本认知

  公网地址:(Public address) 指在因特网上直接可达的地址。公有地址由 Inter NIC(Internet Network Information Center 因特网信息中心)负责。这些 IP 地址分配给注册并向Inter NIC提出申请的组织机构,公有 IP 全球唯一,通过它直接访问因特网(只能上网)。
  PS: 如果你有一个公网地址,那就意味着你不但能访问别人,还能被人访问。公网地址是架设各种服务器必不可少的条件。
  
  私网地址:(Private address) 私网地址产生的一个原因是因为公网地址非常缺乏,大家不得不使用同一个公网IP地址上网,这就是共享上网的由来。同样,私网地址仍然可以被再次共享。私有地址属于非注册地址,专门为组织机构内部使用。


  
  一个基本认知: 日常生活中,除了使用手机流量,也能通过wifi上网。需要知道的是,路由器分出来的 IP ,都是私有 IP(局域网 IP),真正拥有公有 IP 的是运营商(当然,我们可以租用一个公有 IP )。这里存在一个问题,为什么我们持有私有IP却能够上网?这是因为运营商提供了公有IP(当然,其中牵扯到各种IP分配问题,这里不考虑。),也正因此,缴费是向运营商缴费。

  PS:私有网络对应的IP是局部的,可以在不同的子网中出现重复。 所以,A 家庭的局域网IP 和 B家庭的局域网IP相同很正常,但是,最终 A 和 B 能上网(数据走出去),还是通过运营商的公有 IP。
【ONE·Linux || 网络基础(五)】_第16张图片
  

在这里插入图片描述路由器的两套IP地址。

  由此,可以知晓:一个路由器可以配置两个IP地址。 ①对内,路由器要构建自己的子网;②对外,路由器本身也是别人构建的子网中的一个主机。即:LAN口IP(自身构建的子网IP)WAN口IP(所在上级子网所分配的IP)
  对内:路由器LAN口连接的主机都从属于当前这个路由器的子网中。不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1)。子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复。
  对外:每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器WAN口IP就是一个公网IP。
  
  

在这里插入图片描述如何建立通信?

  子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成WAN口IP),这样逐级替换,最终数据包中的IP地址成为一个公网IP。这种技术称为NAT(Network Address Translation,网络地址转换)。
  如果希望我们自己实现的服务器程序能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上(这样的服务器一般可以在阿里云/腾讯云上进行购买)。

【ONE·Linux || 网络基础(五)】_第17张图片

  思考问题:
  1、为什么需要进行WAN口IP替换?直接使用LAN口IP不行吗?
  2、上述过程中,我们只讲述了如何出去的问题,那么如何回来呢?(NAPT,后续将会讲解到)
  
  
  
  
  

10.3.3、路由(route指令)

10.3.3.1、基本介绍

  1)、介绍路由控制和路由表

  路由,是将网络数据包从一个网络节点传递到另一个网络节点的过程。在网络中,路由器是负责路由数据包的设备。当一个数据包进入路由器时,路由器会根据其目标IP地址来确定数据包应该转发到哪个网络节点。
【ONE·Linux || 网络基础(五)】_第18张图片

1、当IP数据包到达路由器时,路由器会先查看目的IP;
2、路由器决定这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器;
3、依次反复, 一直到达目标IP地址。

  
  问题:如何判定当前这个数据包该发送到哪里?
  这就要依靠每个节点内部维护的路由表来完成。

  在路由的过程中,路由器需要查找路由表以确定数据包应该转发到哪个节点。路由表是一个数据结构,它包含了网络中的所有节点和它们之间的联系。当一个数据包到达路由器时,路由器会将其目标IP地址与路由表中的地址进行匹配,以便找到下一个节点的地址。
【ONE·Linux || 网络基础(五)】_第19张图片
  
  
  
  

10.3.3.2、route指令

  1)、使用route命令查看路由表

在这里插入图片描述相关指令、默认网关

  route 命令用于查看和操作Linux操作系统中的路由表。它允许添加,删除和修改路由表的条目,以确定数据包从一台计算机到另一台计算机的传输路径。

[wj@VM-4-3-centos ~]$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 eth0
10.0.4.0        0.0.0.0         255.255.252.0   U     0      0        0 eth0
link-local      0.0.0.0         255.255.0.0     U     1002   0        0 eth0

  
  route -n:以数字格式显示路由表。即以 IP 地址和网络掩码的数字形式,而非主机名和网络掩码的形式来显示路由表的内容。(其它选项可根据需求扩展学习)

[wj@VM-4-3-centos ~]$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.4.1        0.0.0.0         UG    0      0        0 eth0
10.0.4.0        0.0.0.0         255.255.252.0   U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0

  
  默认网关:始终与目标0.0.0.0一起显示。 如果未使用-n,则单词“ Default”出现在输出的Destination列中。 默认网关的网络掩码为0.0.0.0意味着,无论网络类别如何,路由表中未通过附加条目寻址到本地网络或另一个出站路由器的任何数据包,都将发送到默认网关。
  
  

在这里插入图片描述路由表格式介绍

  路由表中:
  Destination:是目标网段或者主机。
  Gateway:是下一跳地址(网关地址),”*” 表示目标是本主机所属的网络,不需要路由。
  Genmask:是子网掩码。
  Iface:是发送接口/输出接口。
  Flags:标记。U标志表示此条目有效(可以禁用某些条目),当前路由为启动状态(Used),G标志表示此条目的下一跳地址是某个路由器的地址。没有G标志的条目,表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。H 表示该路由是一个主机路由(host)。
  Metric:路由距离,到达指定网络所需的中转数(linux 内核中没有使用)。
  Ref: 路由项引用次数(linux 内核中没有使用)
  Use:此路由项被路由软件查找的次数,
  Iface:该路由表项对应的输出接口。
  
  
  

在这里插入图片描述路由决策

  对于大多数主机而言,路由决策如下:

  • 如果目标主机在本地网络上,则将数据直接发送到目标主机。
  • 如果目标主机位于通过路由表中列出的本地网关可访问的远程网络上,则将其发送到显式定义的网关。
  • 如果目标主机位于远程网络上,并且没有其他条目定义到该主机的路由,则将数据发送到默认网关。这些规则只是意味着,如果由于不匹配而导致所有其他操作失败,则将数据包发送到默认网关。
      
      
      
      
10.3.3.3、路由表生成算法

  常见的路由表生成算法包括以下几种,这些算法都有其优点和局限性,网络管理员需要根据网络拓扑、带宽、延迟等因素来选择适合的路由表生成算法。

  静态路由: 管理员手动配置的路由,它们不会自动更新或更改。静态路由比较容易实现,但需要管理员手动配置,并且不适用于复杂的网络环境。

  RIP(Routing Information Protocol): 是一种距离向量路由协议,使用跳数作为距离指标,每个路由器将其邻居的路由表传递给其它路由器,以便每个路由器都能获得整个网络的路由信息。

  OSPF(Open Shortest Path First): 是一种链路状态路由协议,每个路由器将其连接到的所有路由器和网络的信息发送给其它路由器,以便每个路由器都能计算出整个网络的最短路径。

  BGP(Border Gateway Protocol): 是一种路径向量路由协议,用于在互联网上交换路由信息。它使用AS路径作为路由选择的标准,每个AS(自治系统)都将其拥有的网络告知其它AS,以便确定全局路由。
  
  
  
  
  

11、数据链路层

11.1、数据帧格式

  传输层只工作在两端主机上(端到端),中间进行数据传输的实则是网络层以下的环节。故才有了最初所说的 【TCP协议则提供数据传输可靠性的策略,IP协议提供将数据从A主机送到B主机的策略,而实际物理上进行数据转发的是链路层】。

【ONE·Linux || 网络基础(五)】_第20张图片
  

11.1.1、以太网的帧格式

  1)、认识以太网
  “以太网” 不是一种具体的网络, 而是一种技术标准既包含了数据链路层的内容, 也包含了一些物理层的内容

例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
例如:以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;

  以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网, 无线LAN等;
  
  
  扩展知识:"Mbps”
  "Mbps” ,其全称为Million bits per second,为每秒传输百万位(比特)数量的数据,这里的bit (比特,比特等于1个位)是表示数字信号数据的最小单位。Mb/s中的Mb与Mbps中的Mb意义相同,均表示百万位(此特) 数据数量,所以Mbps = Mb/s
  对于MB/s,其中的MB表示Million Bytes (百万字节),Byte (字节)是计算机用于计量存储容量的一种计量单位,比如计算机中文件的大小就是用字节来表示的。
  宽带运营商常说的100M宽带,实则指的是100Mbps。因为1 Byte = 8 bit,换算一下就可以得出8Mbps= 8Mb/s= 1MB/s(即,要除以8)。
【ONE·Linux || 网络基础(五)】_第21张图片

  
  
  
  2)、RFC 894(以太网)帧格式
  如图所示:
【ONE·Linux || 网络基础(五)】_第22张图片

  源地址目的地址:是网卡的硬件地址(也叫MAC地址)。 长度是48位,是在网卡出厂时固化的。
  2个字节的类型字段:帧协议类型字段有三种值,分别对应IP、ARP、RARP。
  4字节校验和:帧末尾是CRC校验码。
  
  

  思考问题:如何解包和如何交付?(固定长度的报头)
  
  
  
  

11.1.2、重谈局域网通讯原理

11.1.2.1、局域网转发

  帧的生成:当一台计算机要向另一台计算机发送数据时,它会将数据封装成一个数据帧,包括目标地址、源地址、数据内容等信息。
  帧的传输:生成的数据帧会通过计算机的网卡发送到以太网上,然后通过以太网的传输介质(如双绞线或光纤)传输到目标计算机。
  帧的接收:当目标计算机接收到数据帧时,它会检查帧的目标地址是否与自己的地址匹配,如果匹配,则接收数据帧并将其解封装,提取出数据内容。

【ONE·Linux || 网络基础(五)】_第23张图片
  
  
  

11.2.2.2、碰撞问题

  问题引入: 如果局域网中同时有多台主机都在发送数据,数据之间就发生了碰撞问题!
  
  相关说明:
  ①发生碰撞,作为数据发送的主机自身也能知道(类比:我向别人传递消息,我自己也能听到自己的声音)
  ②如何解决数据碰撞问题?可通过碰撞避免算法:发送主机会休息随机时间,然后再重新发送!
  ③从这角度,局域网本质是一个临界资源

【ONE·Linux || 网络基础(五)】_第24张图片

  相关扩展:局域网|以太网|碰撞(数据链路层)、数据链路层| 广播信道 碰撞检测CSMA 争用期
  
  
  

11.2.2.3、局域网攻击

  1)、两个问题
  问题1:局域网中主机越多越好,还是主机越少越好?
  回答:主机越少越好,同一个网段主机越多,碰撞发生的机率越大。为了避免此现象,引入交换机(网桥),可用于划分碰撞域
【ONE·Linux || 网络基础(五)】_第25张图片

  
  问题2:局域网数据帧发送的时候,数据帧越长越好,越短越好?
  回答:数据帧太长,容易造成碰撞;数据帧太短,效率低。(这就是为什么MTU有 [ 46 , 1500 ] [46,1500] [46,1500]的限制)
  
  
  
  2)、了解Mac泛洪攻击

  MAC泛洪攻击:是一种针对局域网的攻击方式,其原理是利用MAC地址欺骗技术,向网络中广播大量伪造MAC地址的数据包,导致网络拥堵或瘫痪。该攻击方式主要针对交换机类型的网络,因为交换机是根据MAC地址进行数据转发的。

  MAC地址欺骗技术:攻击者伪造自己的MAC地址,使得交换机将数据包误认为是来自于合法主机而进行转发。在局域网中,每个主机都有一个唯一的MAC地址,交换机通过记录主机的MAC地址和端口号来实现数据转发。因此,当攻击者伪造了一个已经存在于网络中的MAC地址,并且发送了大量数据包时,交换机会将这些数据包误认为是合法主机发送的,并将其广播到整个网络中。

  泛洪攻击:向网络中发送大量无效或重复信息以占用带宽和系统资源。在MAC泛洪攻击中,攻击者利用伪造的MAC地址向网络中发送大量无效信息,导致网络拥堵或瘫痪。
  
  PS:实际局域网中有做相关防御措施,但要知道攻守相生。
  
  
  
  
  
  

11.2、MAC地址和MTU

11.2.1、基础认识

  1)、认识MAC地址
  MAC地址用来识别数据链路层中相连的节点,长度为48位(6个字节), 一般用16进制数字加上冒号的形式来表示。(例如: 08:00:27:03:fb:19
  MAC地址在网卡出厂时就确定了,不能修改,通常是唯一的。(虚拟机中的mac地址不是真实的mac地址,可能会冲突;也有些网卡支持用户配置mac地址)
  
  
  
  2)、认识MTU(在之前10.1.2.2中讲解IP分片时介绍过)
  类似于发快递时对包裹尺寸的限制,MTU是不同的数据链路对应的物理层产生的限制。以太网帧中的数据长度规定最小46字节,最大1500字节。 最大值1500称为以太网的最大传输单元(MTU),需要注意,不同的网络类型有不同的MTU。
  ①若ARP数据包的长度不够46字节,要在后面补填充位
  ②如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation),不同的数据链路层标准的MTU是不同的。
  
  
  
  3)、查看硬件地址和MTU

【ONE·Linux || 网络基础(五)】_第26张图片

  
  
  
  
  
  

11.2.2、MTU对IP协议的影响

  由于数据链路层MTU的限制,对于较大的IP数据包要进行分包。其基本步骤如下所述:(可回顾10.1.2.2节)

  • 将较大的IP包分成多个小包,并给每个小包打上标签。每个小包IP协议头的 16位标识(id) 都是相同的。
  • 每个小包的IP协议头的3位标志字段中,第2位置为0表示允许分片,第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0)。
  • 到达对端时,再将这些小包按顺序重组,拼装到一起返回给传输层。
  • 注意事项:一旦这些小包中任意一个小包丢失,接收端的重组就会失败,但是IP层不会负责重新传输数据。(由上层决定)

【ONE·Linux || 网络基础(五)】_第27张图片

  
  
  
  
  
  

11.2.3、MTU对UDP、TCP协议的影响

11.2.3.1、MTU对UDP协议的影响

  说明: UDP协议的特点是:无连接、不可靠和面向数据报。一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)),就会在网络层分成多个IP数据报。若这多个IP数据报有任意一个丢失,都会引起接收端网络层重组失败。
  这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了。
  
  
  

11.2.3.2、MTU对TCP协议的影响

  与UDP相同,TCP的数据报也受到MTU的限制。只是丢包是会触发相应重传机制。
  

  1)、认识MSS
  TCP的单个数据报的最大消息长度,称为MSS(Max Segment Size)

【ONE·Linux || 网络基础(五)】_第28张图片

  如上图所示, M T U = M S S + T C P 首部长度 + I P 首部长度 MTU = MSS + TCP首部长度 + IP首部长度 MTU=MSS+TCP首部长度+IP首部长度
  故在以太网中(网络层以IPv4为例): M S S = 以太网 M T U − T C P 首部长度 − I P v 4 首部长度 = 1500 − 20 − 20 = 1460 字节 MSS = 以太网MTU - TCP首部长度 - IPv4首部长度 = 1500 - 20 - 20 = 1460字节 MSS=以太网MTUTCP首部长度IPv4首部长度=15002020=1460字节

  说明:未指定MSS时默认值为536字节,这是因为在Internet中标准的MTU值为576字节,576字节MTU = TCP首部长度20字节 + IPv4首部长度20字节 + 536字节MSS。
  
  
  2)、MSS协商
  TCP在建立连接的过程中,通信双方会进行MSS协商。最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)。
  双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值,然后双方得知对方的MSS值之后,选择较小的作为最终MSS。
  MSS的值就是在TCP首部的40字节变长选项中(kind=2)。
  
  
  
  
  
  
  

11.3、arp协议

【ONE·Linux || 网络基础(五)】_第29张图片

11.3.1、问题引入

  1)、问题
  ip =目标网络+目标主机,根据目标IP可以获取目标网络/主机。
  但要知道,数据包首先是被网卡接收到再传送到上层协议(物理层–>数据链路层–>IP层–>……)。因此,要发送给该网段中的哪一台主机,则必须的知道目标主机的MAC地址,封装MAC帧后再向上交付。如果没有MAC地址,就无法封装MAC帧,因此就需要通过一定方法,知道对方的MAC地址。

  如何做到?
【ONE·Linux || 网络基础(五)】_第30张图片
  
  
  2)、介绍
  ARP协议,即地址解析协议(Address Resolution Protocol,ARP):可以将IPv4地址(一种逻辑地址)转换为各种网络所需的硬件地址(一种物理地址)。换句话说,所谓的地址解析的目标就是发现逻辑地址与物理地址的映射关系

在TCP/IP分层体系结构中,数据链路层和物理层使用的地址是物理地址。
而网络层、传输层和应用层使用的地址是IP地址(逻辑地址)

  需要强调,ARP不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议。

ARP协议是封装在帧中的,就像IPv4协议封装在以太网帧一样,从这个角度讲,ARP协议像网络层协议。
但是ARP协议是为网络层协议服务的,从服务的角度讲,它又像链路层协议。

  目前,ARP协议最广泛应用于寻找32位IPv4地址与以太网的48位MAC地址之间的映射,通常,其仅用于IPv4协议,IPv6则使用邻居发现协议(NDP)替代。

  
  
  
  

11.3.2、arp协议的报头格式

  1)、基本介绍
  ARP格式如下:
【ONE·Linux || 网络基础(五)】_第31张图片

  硬件类型: 该字段有16bit。指定运行ARP协议的物理网络类型,ARP协议可以运行在任何物理网络上。以太网是类型1。
  协议类型: 该字段有16bit。指定高层协议的类型。ARP可用于任何高层协议。IPv4协议的值为0x0800。
  硬件地址长度: 该字段有8bit。定义物理地址的长度,以字节为单位。对于以太网,该值为6字节。
  协议地址长度: 该字段有8bit。定义逻辑地址的长度,以字节为单位。对于IPv4,该值为4字节。
  
  
  操作/op: 该字段有16bit。用于定义分组类型,目前常用2种。ARP请求分组和ARP响应分组,op字段为1表示ARP请求,op字段为2表示ARP应答。
  
  
  发送方硬件地址/发送端以太网地址: 记录发送方的物理地址。
  发送方协议地址/发送端IP地址: 记录发送方的逻辑地址。
  接收方硬件地址/目的以太网地址: 如果是ARP请求报文,由于不知道接收方的物理地址(请求报文就是通过广播询问接收方物理地址,当然事先不知道),该字段全部填充为全F。
  接收方协议地址/目的IP地址: 记录接收方的逻辑地址。
  
  
  
  2)、对于OP字段的解释
  问题:为什么OP字段要区分类型?(为了知道当前arp报文是请求还是应答)
  1、任何主机,可能之前向目标主机发起过ARP请求,注定了未来会收到对应的ARP应答。
  2、任何一台主机,也可能被别人发起ARP请求。

  这说明:局域网中,任何一台主机收到ARP的时候,可能是一个应答,也可能是一个请求!请求和应答,后续的动作是不一样的,为了方便处理,对于收到的arp需要区分其类型,即有了op字段。
  
  
  
  

11.3.3、arp的工作过程

11.3.3.1、举例说明

  我方–>对方:发送一个arp请求。目的Mac地址填充FFFF*。该过程中,子网段发生了什么?

【ONE·Linux || 网络基础(五)】_第32张图片

  
  
  对方–>我方: 发生一个arp应答。目的Mac地址确定。该过程中,子网段发生了什么?

【ONE·Linux || 网络基础(五)】_第33张图片

  
  注意事项:这一段往返的过程中,发生了2次数据包的丢弃,但丢弃的场景是不一样的。

首次:在ARP层丢的。
第二次:在MAC层丢弃。

  
  
  
  

11.3.3.2、总结概述

  对上述演示过程加以描述。
  
  1)、ARP工作机制:
   当一台设备需要发现另一台设备的数据链路的数据链路标识符时,它将建立一个ARP请求数据包,这个请求数据包中包括目标设备的IPv4地址请求设备(发送者)的源点IPv4地址数据链路标识符(MAC地址)。然后ARP请求数据包被封装在数据帧中,其中带有作为源的发送者的MAC地址和作为目标的广播地址
  广播地址意味着数据链路上的所有设备都将收到该帧,并且要检查帧内封装的数据包。 除了目标机可以识别此数据包外,其他所有设备都会丢弃此数据包。目标机将向源地址发送ARP响应数据包,提供它的MAC地址。
  

  以下为工作过程步骤举例:

  1、通讯时,主机A确定主机E的IP地址后,A主机A在自己的本地ARP缓存中检查主机E的匹配MAC地址。

  2、如果主机A在ARP缓存中没有找到映射,它将询问主机E的IP地址的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。

  3、主机E确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。

  4、主机E将包含其MAC地址的ARP单播回复主机A。

  5、当主机A收到从主机E发来的ARP回复消息时,会用主机E的IP和MAC地址映射更新ARP缓存。本机缓存有生存期(180S),生存期结束后,将再次重复上面的过程。主机E的MAC地址一旦确定,主机A就能向主机E发送IP通信了。

  
  
  
  2)、其它问题说明

  问题1: arp看起来至少进行一个请求和一个应答,才能获取到对方Mac地址,建立起通信关系。那么,是不是每一次发送数据都要这么干?

  回答:不需要。arp请求成功之后,请求方会暂时将IP: MAC地址的映射关系暂时保存下来。
  每台主机都维护一个ARP缓存表,可以用arp -a命令查看。 缓存表中的表项有过期时间(ARP表项的老化超时时间:一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。

  如下是在云服务器上使用该指令后的演示结果,实则也可以在windows的命令行提示符中使用该指令。

[wj@VM-4-3-centos ~]$ arp -a
? (169.254.0.2) at fe:ee:8f:bf:86:99 [ether] on eth0
? (169.254.0.35) at fe:ee:8f:bf:86:99 [ether] on eth0
? (169.254.0.3) at fe:ee:8f:bf:86:99 [ether] on eth0
? (169.254.0.82) at fe:ee:8f:bf:86:99 [ether] on eth0

  
  
   问题2: 上述演示的是目的子网中进行的arp,但实际中通信两端中间会经过多个路由器,那么这些过程是不是也需要发生arp呢?
  
  回答:要,arp的过程会在网络中可能随时在路径中发生。例如,局域网外,如果目的主机不在同一网段,那么就将目的mac设置为网关的mac。网关拿到这个数据帧,查看目的mac是自己,在查看目的ip,查看自己的ip地址表,将下一跳的mac地址为目标地址,将自己的mac地址为源地址。

【ONE·Linux || 网络基础(五)】_第34张图片

  
  
  
  
  
  

11.3.3.3、演示:获取当前所处的局域网中所有主机的MAC和IP地址

  1)、这里演示在windows下的操作流程
  1、打开命令提示符,输入ipconfig查看当前主机的IP。这里查看的是IPv4。

【ONE·Linux || 网络基础(五)】_第35张图片

  
  
  2、使用ping指令遍历局域网其他IP。
  输入指令以下指令,回车并等待:

for /L %i IN (1,1,254) DO ping -w 2 -n 1 192.168.1.%i

  注意:末尾的192.168.1.%i,要根据查看到的本机IP决定,如果你的本机IP是192.168.0.12,那么这个指令的后缀就是192.168.0.12

【ONE·Linux || 网络基础(五)】_第36张图片

  
  
  3、输入arp -a查看局域网其他已使用的IP

【ONE·Linux || 网络基础(五)】_第37张图片

  
  
  

11.3.3.4、arp伪装/arp攻击/arp欺骗

  ARP(地址解析协议)欺骗是一种网络攻击技术,攻击者利用这种技术向网络中发送虚假的ARP响应,从而欺骗其他计算机的网络配置。当攻击成功时,攻击者可以将数据流量重定向到自己的计算机上,同时可以窃取敏感信息。

  具体来说,ARP欺骗攻击主要有两种方式:

  • MAC地址欺骗: 攻击者在网络中发送虚假的ARP响应,将自己的MAC地址伪装成目标计算机的MAC地址,使其他设备将数据包发送到攻击者的计算机上。
  • 双边ARP欺骗: 攻击者在网络中发送虚假的ARP请求和ARP响应,将两台计算机的MAC地址都伪装成对方的MAC地址,从而使它们之间的通信流量经过攻击者的计算机。

  
  
  ARP攻击: 使局域网或局域网中的某一台终端无法与外网或其他终端通信。
  伪造ARP应答报文,告诉源主机一个不存在的mac地址,然后源主机就会将消息发送给不存在的目的主机,从而实现网络中断,无法通信。
  
  
  
  

12、其他重要协议或技术

12.1、DNS域名解析服务

  TCP/IP网络中要求每一个互连的计算机都具有其唯一的IP地址,并基于这个IP地址进行通信。然而,我们平时需要访问网站的时候,输入的是网址或者中英文名称,而不是直接输入一个IP地址(当然,你如果记得IP的话,也可以直接输入IP)。DNS就是一整套从域名映射到IP的系统,能将网址转换成具体的IP地址。
  
  

12.1.1、背景简述

  TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序, 但是IP地址不方便记忆,于是人们发明了一种叫主机名的东西,是一个字符串,并且使用hosts文件来描述主机名和IP地址的关系。这样在通信时就可以直接使用主机名称,而不需要输入IP。
【ONE·Linux || 网络基础(五)】_第38张图片

  最初,通过互连网信息中心(SRI-NIC)来管理这个hosts文件:

  如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件。
  其他计算机也需要定期下载更新新版本的hosts文件才能正确上网。

  

  随着网络规模的不断扩大,接入的计算机个数不断增加,这种处理方式就变得不可行。在此背景下,就产生了一个可以有效管理主机名和IP地址之间对应关系的系统,这就是DNS系统。在这个系统中,主机的管理机构可以对数据进行变更和设定:

  一个组织的系统管理机构,可以维护系统内的每个主机的IP和主机名的对应关系。
  如果新计算机接入网络,将这个信息注册到数据库中。
  用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址。

  
  至今,我们的计算机上仍然保留了hosts文件。在域名解析的过程中仍然会优先查找hosts文件的内容。cat /etc/hosts指令演示:

[wj@VM-4-3-centos ~]$ cat /etc/hosts
127.0.0.1 VM-4-3-centos VM-4-3-centos
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4

::1 VM-4-3-centos VM-4-3-centos
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6

  
  
  

12.1.2、域名、域名服务器、DNS查询

  源于《图解TCP/IP》、计算机网络微课堂。
  

12.1.2.1、域名

  域名:是指为了识别主机名称和组织机构名称的一种具有分层的名称。

【ONE·Linux || 网络基础(五)】_第39张图片

  顶级域名:

【ONE·Linux || 网络基础(五)】_第40张图片

  域名的层次结构举例:

【ONE·Linux || 网络基础(五)】_第41张图片

  
  
  
  

12.1.2.2、域名服务器

  域名服务器是指管理域名的主机和相应的软件,他可以管理所在分层的域的相关信息。
  各个域的分层上都设有各自的域名服务器。各层域名服务器都了解该层以下分层中所有域名服务器的IP地址,因此,他们从根域名服务器开始呈树状结构相互连接。所有域名服务器都了解根域名服务器的IP地址。所以若从根开始按照顺序追踪,可以访问世界上所有域名服务器的地址。
【ONE·Linux || 网络基础(五)】_第42张图片

  DNS服务器类型:
【ONE·Linux || 网络基础(五)】_第43张图片

  
  

12.1.2.3、DNS查询

  如下图所示,解析器向域名服务器进行查询,接收这个查询请求的域名服务器首先会在自己的数据库进行查询,如果有该域名所对应的IP地址则返回,没有则域名服务器再向上一层根域名服务器进行查询。
  因此,如图所示,从根开始对这棵树按照顺序进行遍历,直到找到指定的域名服务器,并由这个域名服务器返回想要的数据。解析器和域名服务器会将最新了解到的信息暂时保存在缓存里面。
【ONE·Linux || 网络基础(五)】_第44张图片
  
  
  
  
  

12.2、NAT技术

12.2.1、技术背景

  根据之前对IP协议的学习可知,IPv4使用32bit整数表达一个地址,32bit大约可以排列成43亿的不同的数据,这就意味着IP地址存在数量不充足的问题。

   NAT技术Network Address Transfer 网络地址转换):当前解决IP地址不够用的主要手段,是路由器的一个重要功能。 它是一种将私有IP和全局IP相互转化的技术方法 ,能够在对外通信时,将私有IP转为全局IP。

  根据之前的介绍, 私有网络对应的IP是局部的,可以在不同的子网中出现重复, 因此,在不同的局域网中出现相同的私有IP是完全不影响的。例如:以学校、家庭、公司为单位,内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP。
  
  
  

12.2.2、NAT-IP转换过程

  如下图所示:
【ONE·Linux || 网络基础(五)】_第45张图片
  相关过程说明:

1、NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37; 
2、NAT路由器收到外部的数据时, 又会把目标IP从202.244.174.37替换回10.0.0.10;
3、在NAT路由器内部, 有一张自动生成的, 用于地址转换的表;
4、当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系;

  关于相关步骤,我们也在之前10.3.2章节简述过,但在那里遗留过一个问题:若局域网内有多个主机都访问同一个外网服务器,那么对于服务器返回的数据中,目的IP都是相同
。那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?

【ONE·Linux || 网络基础(五)】_第46张图片

  
  
  

12.2.3、NAPT

  1)、基本介绍
  为了克服上述这种限制,NAT被进一步扩展到在进行IP地址转换的同时进行Port的转换,这就是网络地址端口转换NAPT(Network Address Port Translation)技术

NAPT也被称为“多对一”的NAT
PAT(Port Address Translations,端口地址转换)
地址超载(address overloading)

  
  
  2)、过程说明

  路由器在NAT转换的过程中,除了单纯的替换IP和端口号,还会根据报文请求的四元组,构建一个映射关系。即NAT映射表
  NAT映射表记录了源ip:端口 + 转换后的ip : 端口 目的ip:目的端口。这个映射关系是互为KEY值的,无论从内向外,还是从外向内,都能在各自的网络中表示唯一性。
  PS:由于linux的NAT转换功能是linux内核完成的,所以NAT映射表在内核里面。而从硬件角度,这种关联关系是由NAT路由器自动维护的。例如在TCP的情况下,建立连接时就会生成这个表项,在断开连接后就会删除这个表项。

【ONE·Linux || 网络基础(五)】_第47张图片
  由于源IP表示唯一的一台主机,源端口表示该主机上唯一的一个进程,源IP+源端口可以表示唯一的一个进程,由此保证了当前主机进程在内网中的唯一性。
  
  
  NAPT与NAT的区别: NAPT不仅转换IP包中的IP地址,还对IP包中TCP和UDP的Port(端口号)进行转换。这使得多台私有网主机利用1个NAT公共IP就可以同时和公共网进行通信。(也就是说,NAPT多了对TCP和UDP的端口号的转换。)
  
  
  
  
  

12.2.4、技术缺陷与NAT穿越

  1)、基本介绍
  由于NAT依赖转换表,其具有诸多限制,如:

无法从NAT外部向内部服务器建立连接;
装换表的生成和销毁都需要额外开销;
通信过程中一旦NAT设备异常,即使存在热备,所有的TCP连接也都会断开;

  
  
  2)、内网穿透

在这里插入图片描述认识:是什么

  扩展:为什么我在公司里访问不了家里的电脑?
  
  问题引入: 使用了NAT上网,前提得内网机器主动请求公网IP,这样NAT才能将内网的IP端口转成外网IP端口。反过来,公网的机器想主动请求内网机器,就会被拦在NAT路由器上,此时由于NAT路由器并没有任何相关的IP端口的映射记录,因此也就不会转发数据给内网里的任何一台机器。那么,有没有办法让外网机器访问到内网的服务?

  大家应该听过一句话叫,“没有什么是加中间层不能解决的,如果有,那就再加一层”。放在这里,依然适用。

  • 说到底,因为NAT的存在,我们只能从内网主动发起连接,否则NAT设备不会记录相应的映射关系,没有映射关系也就不能转发数据。所以我们就在公网上加一台服务器x,并暴露一个访问域名,再让内网的服务主动连接服务器x,这样NAT路由器上就有对应的映射关系。接着,所有人都去访问服务器x,服务器x将数据转发给内网机器,再原路返回响应,这样数据就都通了。这就是所谓的内网穿透。

  
【ONE·Linux || 网络基础(五)】_第48张图片
  
  
  

在这里插入图片描述运用:场景举例

  远程办公:比如,在家里工作时需要访问公司内部网络中的资源,如文件服务器、邮件服务器等。这时,内网穿透技术就可以帮助在家里访问公司内部网络中的资源,从而实现远程办公。
  
  云服务器访问:在云计算时代,很多应用都运行在云服务器上。但是,在某些情况下,需要从本地访问云服务器上的应用。这时,内网穿透技术就可以帮助在本地访问云服务器上的应用,从而提高应用的可访问性。
  
  游戏服务端访问:在游戏开发中,游戏服务端通常都运行在内部网络中,但是,玩家需要从外部网络访问游戏服务端。这时,内网穿透技术就可以帮助在外部网络访问游戏服务端,从而提高游戏的可访问性。
  
  
  
  

12.3、代理服务器

12.3.1、基本介绍

  1)、定义
  网络代理(Proxy): 又称代理服务器,是一种位于客户端和目标服务器之间的中间服务器。它可以接收客户端的请求,然后代表客户端与目标服务器进行通信,最后将目标服务器的响应返回给客户端。

  1)、基本原理
  网络代理的工作原理基于客户端—代理服务器—目标服务器模型。在这个模型中,客户端需要配置代理服务器的地址和端口,然后将网络请求发送给代理服务器;代理服务器接收请求后,根据客户端的要求进行处理(如更改IP地址、缓存资源等),然后将请求转发给目标服务器;目标服务器将响应发送给代理服务器,代理服务器再将响应转发给客户端。整个过程中,代理服务器充当了一个中介角色。

  
  

12.3.2、类型说明(介绍正向代理和反向代理)

12.3.2.1、正向代理

  1)、基本介绍
  正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器。之后代理向目标服务器转发请求,将获得的内容返回给客户端。
【ONE·Linux || 网络基础(五)】_第49张图片

  1、在正向代理的情况下,客户端必须要进行一些特殊的设置才能使用(如:主动设置代理服务器ip或者域名)。
  2、正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见。
  3、正向代理的典型用途是为防火墙内的局域网客户端提供访问服务器的途径,正向代理还可以使用缓冲特性减少网络利用率。
  
  
  2)、使用场景
  1、科学上网:当用户出于需求需要访问某国外网站,而该网站无法在国内直接访问,这时,就会使用到正向代理服务器。代理服务器向该国外网站转发用户的请求,并将请求的响应再返回给用户,这个上网的过程就是上述讲述的正向代理。
  
  
  

12.3.2.2、反向代理

  1)、基本介绍
  反向代理:通过代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端。此时代理服务器对外表现为一个反向代理服务器。

  对于客户端来说,反向代理就相当于目标服务器,只需要将反向代理当作目标服务器一样发送请求就可以了,并且客户端不需要进行任何设置。
【ONE·Linux || 网络基础(五)】_第50张图片

  
  区别于正向代理需要配置,反向代理不需要用户做任何设置。其代理的是服务端,用于为服务器收发请求,使真实服务器对客户端不可见。
  
  
  2)、使用场景
  1、反向代理的典型用途是将防火墙外的服务器提供给客户端访问。
  2、反向代理还可以为后端的多台服务器提供负载均衡,或者为后端较慢的服务器提供缓冲服务。
  
  
  
  

12.3.4、代理服务器与NAT区别

  路由器往往都具备NAT设备的功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程。
  代理服务器看起来和NAT设备有一点像:客户端像代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器,服务器返回结果后, 代理服务器又把结果回传给客户端。
  那么,二者之间有何区别?
  
  
  1、从应用上讲,NAT设备是网络基础设备之一,解决的是IP不足的问题。代理服务器则是更贴近具体应用,比如通过代理服务器进行,另外像迅游这样的加速器也是使用代理服务器。
  2、从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换。代理服务器往往工作在应用层。
  3、从使用范围上讲,NAT一般在局域网的出口部署。代理服务器可以在局域网,也可以在广域网,甚至可以跨网。
  4、从部署位置上看,NAT一般集成在防火墙、路由器等硬件设备上。代理服务器则是一个软件程序,需要部署在服务器上。
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  

你可能感兴趣的:(#,【ONE·,Linux】,linux)