Linux网络基础--网络层与数据链路层

Posted 蓝乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux网络基础--网络层与数据链路层相关的知识,希望对你有一定的参考价值。

网络基础--网络层与数据链路层详解


本文将介绍TCP/IP结构模型中的最后两层–网络层与数据链路层。

🌴网络层

🌿网络层概念

网络层介于传输层与数据链路层之间,在数据链路层提供的两个相邻端点之间的数据帧的传送功能上,进一步管理网络中的数据通信,将数据设法从源端经过若干个中间节点传送到目的端,从而向传输层提供最基本的端到端的数据传送服务。

🌵网络层主要功能

一、 负责相邻计算机之间的通信
处理来自传输层的分组发送请求,收到请求后,将分组请求装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。
二、 处理输入数据报
首先检查其合法性,然后进行寻径——假如该数据报已到达信宿机,则去掉报头,将剩下部分递达给上层的传输协议;假如该数据报尚未到达信宿,则转发该数据报。
三、 处理路径、流控、拥塞等问题
简单来说,网络层负责在复杂的网络环境中确定一个合适的路径。

🌿网络层协议

网络层协议包括:

  • IP(Internet protocol)协议
  • ICMP(Internet Control Message Protocol)控制报文协议
  • ARP(Address resolution protocol)地址转换协议
  • RARP(Reversearp)反向地址转换协议

IP是网络层的核心,通过路由选择将下一跳IP封装后交给接口层;IP数据报是无连接服务。ICMP是网络层的补充,可以回送报文,用来检测网络是否通畅;Ping命令就是发送ICMP的echo包,通过回送的echo relay进行网络测试。
至于ARP和RARP协议,并不能简单的说是网络层协议,而是介于网络层与数据链路层之间的协议。
下面将详细介绍IP协议,简单了解ICMP协议,至于ARP协议将在数据链路层介绍。

🌵IP协议

在介绍IP协议之前,我们知道IP地址为网络地址 + 主机地址,即确定了某个网段上的某台主机。因此,IP协议提供了一种能力,一种能将数据从主机A传输到主机B的能力。

🍁基本概念

IP是一种网络层协议,提供的是一种不可靠(无连接的)的服务,它只是尽可能快地把分组从源结点送到目的结点,但是并不提供任何可靠性保证。
我们知道IP协议有能力把数据从源主机传输到目的主机,但有能力不代表一定能做到,也就是说IP地址大概率能完成它的任务,却不提供可靠性保证。
[其他相关概念]

  • 主机:配有IP地址, 但是不进行路由控制的设备
  • 路由器: 即配有IP地址, 又能进行路由控制。由于路由器工作在网络层,因此路由器本身包含网络层和链路层
  • 节点: 主机和路由器的统称

🍁协议头格式

在谈及IP协议头格式之前,我们依旧先思考那两个问题:

  1. 如何保障报头和有效载荷分离
  2. 如何保证有效载荷能够成功的交付给上层

为了解决上面的问题,IP协议需要保证自己的报头格式中至少保护报头长度和接收端地址。下图为IP协议头的格式:

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

🍁网段划分

我们之前说过,IP地址分为网络号和主机号。

  • 网络号:保证相互连接的两个网段具有不同的标识。
  • 主机号:同一网段内,主机之间具有相同的网络号,但必须有不同的主机号。
  • 不同的子网就是将网络号相同的主机放在一起。
  • 如果在子网中新增一台主机,那么这台主机的网络号与子网中其他主机网络号一致,但是主机号必须与其他主机号不同。

通过合理主机号和网络号,可以保证相互连接的网络中,每台主机的IP地址不同。

但是问题来了,手动管理子网的IP,是一件相当麻烦的事情。

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

过去曾经提出过一种划分网络号和主机号的方案,把所有IP地址分为五类,如下图所示:

  • 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类无关;

下面举两个划分子网的例子:
划分子网的例子1:

IP地址140.252.20.688C FC 14 44
子网掩码255.255.255.0FF FF FF 00
网络号140.252.20.08C FC 14 00
子网地址范围140.252.20.0 ~ 140.252.20.255-

由于IP地址与子网掩码按位与得到网络号,子网掩码的前3个8bit均为1,因此子网地址的前3个8bit均与IP地址相同;而子网掩码的最后8bit均为0,故子网地址的后8位任意,可以为1,也可以为0,故范围是0~255.
划分子网的例子2

IP地址140.252.20.688C FC 14 44
子网掩码255.255.255.240FF FF FF F0
网络号140.252.20.648C FC 14 40
子网地址范围140.252.20.64 ~ 140.252.20.79-

同样的子网掩码最后4bit为0,故子网地址的前28bit均与IP地址相同,最后4bit取值范围是0 ~ 15.故子网地址最后8位范围是64 ~ 79.

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

🍁路由

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

其实我们去外面旅游寻路时,就是一个路由的过程。比如,我们在浙江杭州游玩时,想要去西湖观赏但却不认识路,这时我们可以在路上找一个路人问路。而路人的回答可能有以下几种:

  1. 告诉我们下一站去哪里
  2. 路人不知道西湖在哪,但知道旁边保安室的大爷知道怎么去西湖,让我们找大爷问路
  3. 路人告诉我们这里就是西湖
  4. 路人不知道怎么去西湖,并且说别问他
  • 其实路由的过程, 就是这样一跳一跳(Hop by Hop) “问路” 的过程. 所谓 “一跳” 就是数据链路层中的一个区间.
  • 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间.

我们的IP数据包就是这样一跳一跳的在网络中寻路。第一种情况为根据查询结果,将报文发送给下一跳路由器;第二种情况为根据查询结果,将报文发送给默认路由器;第三种情况为根据查询结果,到达目的网络,再根据主机号,将数据转交给目的主机;而第四种情况是不存在于网络中的,因为这种一问三不知的路由器设置在网络中就是多余的。
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

  • 首先和第一行的子网掩码255.255.255.0做与运算得到192.168.56.0,与第一行的目的网络地址192.168.10.0不匹配,
  • 再和第二行的子网掩码做与运算,也为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路由器根据它的路由表决定下一跳地址

路由表生成算法:路由表可以由网络管理员手动维护(静态路由), 也可以通过一些算法自动生成(动态路由). 常见的生成算法有:距离向量算法, LS算法, Dijkstra算法等。本文不作详细介绍,读者可以自行了解。

🌵ICMP协议

ICMP协议是一个网络层协议,上面我们说了IP协议不提供可靠性传输,因此如果发生丢包了,IP协议并不能通知传输层是否丢包以及出现丢包的原因。然而一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否通畅,而ICMP协议正是提供这种功能的协议。

🍁ICMP协议主要功能

  • 确认IP包是否成功到达目标地址;
  • 通知在发送过程中IP包被丢弃的原因;
  • ICMP也是基于IP协议工作的,但是它并不是传输层的功能,因此人们仍然把它归结成网络层协议;
  • ICMP只能搭配IPv4使用,如果是IPv6的情况下,需要使用ICMPv6.
    下图为ICMP协议的实现过程:

    关于这里的ARP请求,将在数据链路层中详细介绍。

🍁ICMP的报文格式(简单了解)

关于ICMP协议报文格式,我们不作详细了解。

ICMP协议报文中类型大致分为以下内容:

ICMP大概分为两类报文:

  • 一类是通知出错原因。
  • 一类是用于诊断查询。

🍁ping命令

  • 注意,这里ping + 域名,而非url,一个域名可以通过域名解析协议解析成IP地址。
  • ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期).
  • ping命令会先发送一个 ICMP Echo Request给对端.
  • 对端接收到后,会返回一个ICMP Echo Reply.

在面试中面试官可能会问telnet是23端口, ssh是22端口, 那么ping是什么端口?
值得注意的是,ping命令基于ICMP,是属于网络层的内容,而端口号是传输层的内容,在网络层中并不关注端口号这样的信息。

🍁traceroute命令

也是基于ICMP协议实现, 能够打印出可执行程序主机, 一直到目标主机之前经历多少路由器。

🌴数据链路层

数据链路层是我们介绍的TCP/IP协议结构模型中的最后一层,用于两个设备(同一种数据链路节点)之间进行传递,属于计算机网络体系的底层.
首先我们来回顾一下数据在网络中数据是如何流动的(不考虑物理层):

此处我们研究数据链路层,因此只关心链路层即可,那么上图中主机B到主机C的数据流动就可以看作是数据从左到右的传递,如下图:

那么为什么要有数据链路层呢?

🌿数据链路层的意义

我们知道,物理层的线路是由传输介质与通信设备组成,而比特流在传输介质上传输时肯定会存在误差的。因此就需要引入数据链路层在物理层之上,采用差错检测、差错控制和流量控制等方法,向网络层提供高质量的数据传输服务。也就是说,对于网络层,由于链路层的存在,就不需要关心物理层具体采用了那种传输介质和通信设备。
链路层的具体功能有:**链路管理,帧同步 ;流量控制,差错控制。**需要实现:数据和控制信息分开;透明传输和寻址。

🌿以太网

以太网是现实世界中最普遍的一种计算机网络。以太网实现了网络上无线电系统多个节点发送信息的想法,每个节点必须获取电缆或者信道的才能传送信息,有时也叫作以太(Ether)。每一个节点有全球唯一的48位地址也就是制造商分配给网卡的MAC地址,以保证以太网上所有节点能互相鉴别。由于以太网十分普遍,许多制造商把以太网卡直接集成进计算机主板。

  • “以太网” 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的 内容.
  • 例如: 规定了网络拓扑结构,访问控制方式, 传输速率等; 以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
  • 以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;

🌵以太网帧格式

以太网的帧格式如下:

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

🍁认识MAC地址

MAC地址用来识别数据链路层中相连的节点;
长度为48位, 即6个字节. 一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
MAC地址在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突; 也有些网卡支持用户配置mac地址).

简单对比IP地址和MAC地址:

  • IP地址描述的是数据传输整个过程的起点和终点。
  • 而MAC地址则是在这个路途上的每一个区间的起点和终点。
    拿唐僧取经的例子来说,唐僧自东土大唐而来,到西天取经,那么对于这整个旅程来说,相当于东土大唐是IP地址的源IP地址,西天则是目的IP地址;而唐僧在西天取经的途中,途径女儿国到小雷音寺,那么女儿国是源mac地址,小雷音寺是目的mac地址。

🍁认识MTU

MTU为最大传输单元(Maximum Transmission Unit),是用来通知对方所能接受数据服务单元的最大尺寸,说明发送方能够接受的有效载荷大小。MTU是包或帧的最大长度,一般以字节记。
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层产生的.

  • 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;
  • 最大1500字节称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。
  • 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
  • 不同的数据链路层标准的MTU是不同的;
🌱MTU对IP协议的影响

由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包.

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

🌱MTU对UDP协议的影响

我们知道UDP协议是不可靠的,也就是说UDP协议只管将数据发送出去,而不管对端是否接受到。

  • 那么一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.
  • 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了.
🌱MTU对TCP的影响
  • TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size);
  • TCP在建立连接的过程中, 通信双方会进行MSS协商.
  • 最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).
  • 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值. 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS.
  • MSS的值就是在TCP首部的40字节变长选项中(kind=2);

查看硬件地址与MTU:

使用ifconfig命令,即可查看ip地址,mac地址,MTU。

🌿ARP协议

虽然我们在这里介绍ARP协议,但我们上面已经提到过, ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议;

🌵ARP协议的作用

ARP(Address resolution protocol)即地址转换协议,其作用为建立了主机 IP地址 和 MAC地址 的映射关系.

  • 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
  • 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
  • 因此在通讯前必须获得目的主机的硬件地址;而ARP协议便是解决这个问题的。

🌵ARP协议的工作流程

  • 源主机发出ARP请求,询问“IP地址是172.20.1.2的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);
  • 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;
  • 每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。

    【思考】为什么要有ARP缓存表呢?而为什么表项要有过期时间并非一直有效呢?
    ARP缓存表无非是方便我们短时间内再次发送数据时无需去询问目的主机的物理地址了。而为什么要清楚ARP缓存,我们上面提到ARP请求是广播出去的,那么就不止目的主机能接收到这个请求,于是不是正确的主机也能够响应我们的请求,从而让数据发送到错误的主机上,这就是“ARP欺骗”,即利用了ARP协议设计上的缺陷,防止方法是设置静态“IP-MAC对照条目”。而清除ARP缓存防止对照表欺骗,可能解决因ARP攻击导致的不能上网或链接错识的问题.其次,ARP缓存如果不清除的话,占用的内存会越来越多,导致机器越来越卡。

🍁ARP数据报的格式

由此,结合上述所说工作流程,我们可以给出ARP数据报的格式:

  • 注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,这对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
  • 硬件类型指链路层网络类型,1为以太网; 协议类型指要转换的地址类型,0x0800为IP地址; 硬件地址长度对于以太网地址为6字节;
  • 协议地址长度对于和IP地址为4字节; op字段为1表示ARP请求,op字段为2表示ARP应答。

🌴其他重要协议或技术

🌿DNS(Domain Name System)

DNS是一整套从域名映射到IP的系统,即域名系统。
其中主机域名组成为:主机名.结构名.网络名.最高层域名。比如abc.de.edu.cn中,abc为主机名,de为结构名,edu为网络名,cn为最高层域名。

🌵DNS的背景

TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆.于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系.

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

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

但这样就太麻烦了, 于是产生了DNS系统:

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

其实,至今 我们的计算机上仍然保留了hosts文件. 在域名解析的过程中仍然会优先查找hosts文件的内容.

需要注意的是:DNS协议规范使用UDP进行传输.此外,DNS的默认端口为53。

🌵域名简介

主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称.

www.baidu.com
  • com:一级域名. 表示这是一个企业域名. 同级的还有 “net”(网络提供商), “org”(非盈利组织) ,“edu”(教育组织)等.
  • baidu:二级域名,公司名.
  • www:只是一种习惯用法. 之前人们在使用域名时,往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格 式, 来表示主机支持的协议.

🍁使用dig工具分析DNS

安装dig工具:

yum install bind-utils

使用dig指令查看域名解析过程:

  1. 开头位置是 dig 指令的版本号
  2. 第二部分是服务器返回的详情, 重要的是 status 参数, NOERROR 表示查询成功
  3. QUESTION SECTION 表示要查询的域名是什么
  4. ANSWER SECTION 表示查询结果是什么. 这个结果先将 www.baidu.com 查询成了 www.a.shifen.com, 再将 www.a.shifen.com 查询成了两个 ip 地址.
  5. 最下面是一些结果统计, 包含查询时间和 DNS 服务器的地址等.

🌿NAT(Network Address Translation)技术

🌵NAT技术背景

之前我们讨论了, IPv4协议中, IP地址数量不足的问题。
NAT技术是当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;

  • NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:
  • 很多学校, 家庭,公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP; 全局IP要求唯一, 但是私有IP不需要;
  • 在不同的局域网中出现相同的私有IP是完全不影响的;

🌵NAT:IP转换过程

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

🌵NAPT技术

如果同一个局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同
的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了,即使用IP+port来建立这个关联关系。

这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项。

🌵NAT技术的缺陷

由于NAT依赖这个转换表, 所以有诸多限制:

  • 无法从NAT外部向内部服务器建立连接;也就是说只能从客户端去访问服务器,而外部服务器并不能够直接访问客户端,必须建立好连接后才行。
  • 转换表的生成和销毁都需要额外开销。
  • 通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开。

🌵NAT和代理服务器

路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程.
代理服务器看起来和NAT设备有一点像. 客户端像代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端.
那么NAT和代理服务器有什么区别呢?

  • 从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行翻墙, 另外像游戏加速器, 也是使用代理服务器.
  • 从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.
  • 从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网.
  • 从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上.

代理服务器是一种应用比较广的技术.

  • 翻墙: 广域网中的代理.
  • 负载均衡: 局域网中的代理

代理服务器又分为正向代理和反向代理:

拿代购举例子,我想买国外的iphone,于是让在国外的表姐到当地的实体店中购买后邮递给我,此时实体店老板看到买东西的是我表姐,于是我表姐就是“正向代理”。
后来找我表姐买iPhone的人太多了,于是我表姐就买了许多iPhone屯在家里,只要有人来找她代购,她就直接把囤着的iPhone邮递过去,这时我表姐就是“反向代理”。

正向代理用于请求的转发(例如借助代理绕过反爬虫).
反向代理往往作为一个缓存.

以上是关于Linux网络基础--网络层与数据链路层的主要内容,如果未能解决你的问题,请参考以下文章

Linux网络基础--网络层与数据链路层

网络层与数据链路层

网络层与数据链路层

网络层与数据链路层

TCP_IP协议(网络层与数据链路层)笔记

(*长期更新)软考网络工程师学习笔记——数据链路层与网络层的相关计算题