前言: 在计算机网络基础(二)中,我们着重学习了应用层,传输层的知识。在 本文,就要介绍网络层,数据链路层,这两块内容细节也很多。这是计算机网络基础篇的最后一文,系统的学习后,就可以对 数据在网络中的传输 有一个 清晰的认识。
1. 网络层
1.1 IP协议
IP协议它是网络传输过程中,重要的一环,它的核心目的就是在网络中找到一条合适的路径去传输数据。网络是被划分的,由众多的局域网构成的,IP协议就能告诉你,你该去哪个局域网,这是一种执行策略。但是 你具体怎么到那个局域网,这块是数据链路层来实现的。注意:IP协议提供了一种能力,就是大概率能够把数据发送到对端,但是没有可靠机制,可靠机制是TCP来提供的。可靠就是:报文有丢失呀,这种问题,IP协议不管。
1.1.1 IP报文格式
- 第一行:
- 4位版本号:IPV4,IPV6,就这俩版本。
- 4位首部长度:报头的大小,单位是4字节,长度*单位长度 = 报头大小
- 8位服务类型:前3位表示8个优先级,优先考虑什么,比如:000普通,001优先,010快速等,接下来4位分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4 位中只能置其中1 位。如果所有4 位均为0,那么就意味着是一般服务。还剩下最后一位,必须置为0。
16位总长度:报文的总大小,单位是4字节,总长度*单位长度 = 报文总大小
- 第二行:
这一行,后文讲,它是负责IP报文切片以及组装这块的。
- 第三行:
- 8位生存时间(TTL):数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL -= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环。它指的并不是时间,而是可以在路由器中 被转发的次数,每被转发一次就TTL减一,减为0后,会丢弃报文。
- 8位协议:表示的是上层协议,UDP或者TCP?ICMP,IGMP?
- 16位首部检验和:使用CRC进行校验, 来鉴别报头是否损坏。
- 第四行以及第五行: 源IP地址,目的IP地址 没啥可说的哈
- 第六行:选项最多40字节
- 剩余部分:数据段
1.1.2 IP地址详谈
IP地址是分为两部分:
- 网络号:用于区分不同的网段
- 主机号:同一网段内,用于区分不同的主机
通过合理的设置网络号和主机号,就可以保证相互连接的网络中, 每台主机的IP地址都不相同.这句话要注意昂,是相对IP地址都不同。
子网:网络号都相同;如果在子网中新增一台主机,那么 主机的网络号和一样,但是主机号不可以与子网内的其他主机重复。
问题1:那么IP地址是需要被分配给主机的,怎么分配?
- 有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.
- 一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器
- 这就表明,主机加入子网,会自动分配IP地址,不需要人去管
问题2:IP地址如何划分?
其实这个划分方案是不断的改进的:
- 方案:IP地址划分为A,B,C,D,E五类。然后根据某个地区所需要的主机号多少,来划分。
范围:
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
A类明显它的主机号更大,所以适用于大型网络;B类中型网络;C类小型网络;D类是多播地址,一般用于多路广播用户;E类是保留地址,留待后用。
但是这样划分是存在弊端的,一个子网中,一般是不需要这么多的主机号的,也就是说存在IP大量被浪费的情况。
- 方案改进:在上面的基础上使用
子网掩码
,对主机号进一步控制,从而减少一个子网中IP被浪费的情况。
注意我说的IP浪费,指的是一个子网中的哈,比如:A类,网络号相同的情况下,它的主机号有24位,2的24次方,非常庞大昂,一个子网可以有这么多的主机号。实际情况用不了这么的主机号,所以浪费了。
子网掩码:一个32位的正整数. 通常用一串 “0” 来结尾,子网掩码和IP做按位与可以得出网络号,从而区分 IP是否在此子网中。
举个例子:
C类 192.166.0.1-192.166.0.254 ,192.166.0.0 这个是网络号码,而1~254表示这个网段中最大能容纳254台电脑主机。它的默认子网掩码就是 255.255.255.0。32位的,用.
分成了4部分,每一部分都是二进制八位整数,255就是1111 1111,192就是1100 0000。
图解:
IP地址和子网掩码按位与,即可得到网络号:
主机号已经规定是1~ 254,那么我们对子网掩码稍作改动,便可以对这254台主机继续划分,C类的主机号总共有8位,那么我占用主机号的第一位,也就是子网掩码变为:255.255.255.128 = 11111111.11111111.11111111.10000000。这样的子网掩码和IP地址按位与,得到的网络号就分为了两组,这样说不好理解昂,也就是说根据主机号是否为1,可以将原来的1 ~ 254,分为 1 ~ 127,128 ~ 254两组。
比如IP是192.160.0.64 ,它的主机号是64 = 0100 0000 ,它和子网掩码中的后八位按位与,01000000&10000000=00000000。IP是192.160.0.232,它的主机号是11101000,它的按位与结果:11101000&10000000=10000000。也就是说网络号被分为两组,那么子网必然也被分为两组:192.160.0.0 和192.160.0.128。
再举个例子还是上面的,但是子网掩码变为1100000,也就是说主机号我占用前2位,那么原来的1 ~ 254 被分成了几组?答案是 4组,第一个网段为192.166.0.1-192.166.0.63,第二个网段为192.166.0.64-192.166.0.127,第三个网段192.166.0.127-192.166.0.191,第四个网段为192.166.0.192-192.166.0.254。
对吧,是有规律的。占用前n位,就被分成2的n次方组,每组有2的(8-n)次 个IP,这是针对C类。
子网掩码就是这么操作的,通过占用主机号(设置为1),通过与IP按位与来分成不同的子网,每个子网的IP数也得到了控制,这是高效分配IP嘛,减少浪费。
补充:
IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0。
问题3:IP地址即便通过子网掩码减少了浪费,但是IP地址够用吗?
如果单纯的靠子网掩码,是不行的。子网掩码提高了IP地址的利用率,但本质IP地址并没有增多,所以IP地址依旧是不够用。
IP地址是每个网卡都有一个或者多个,其实对IP的需求是庞大的,为了解决不够用的问题,提供了三种方式:
- 动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的,每次入网都动态分配。
- IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 升级IP地址。
- NAT技术,地址转换技术,这个后面讲。但是为了铺垫一下,我们需要了解两个概念私有IP和公有IP。
私有IP vs公有IP:
(1)私有IP范围:
A类私有IP:10.0.0.0~10.255.255.255
B类私有IP:172.16.0.0~172.31.255.255
C类私有IP:192.168.0.0 ~192.168.255.255
(2)其他范围的IP均为公有IP地址
(3)请注意,只有“172”和“192”地址范围的一部分被指定为私人使用,其余地址被认为是“公共的”,可以在全球互联网上路由。
私有IP是用于私人,家庭使用的,只在本地网络上使用,不可以在网上路由。私有IP的出现有效的缓解了IPV4的IP耗尽。
一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP)。WAN口是对公网的,LAN口是对子网内的。私有IP在不同的子网中是可能重复的,但是在同一子网中是唯一的。运营商提供一个公有IP,它可以向内部不断的划分成多级。
图解:
假如运营商提供一个公有IP路由器,它下面有俩个家用路由器:
- 圈1:里的俩个主机是家用路由器1子网下的两台主机,它们的IP的网络号和家用路由器1是一样的,但是它俩的主机号一个是201,一个是200 这个是不同的。
- 圈2和圈1同理,但是圈2的主机的IP和圈1主机的IP重复了,有关系吗?没事的,私有IP允许重复,在同一子网中,私有IP不能重复,不同子网,重复了也没事。
- 圈3:家用路由器1和家用路由器2处于运营商路由器下的同一子网,它俩的WAN口IP是对外的,很明显,网络号都是10.1.1.0,主机号分别是2,3。但是它俩对内的LAN口IP是重复的,这也没关系,只要WAN口IP不重复就可以。
- 最后看运营商路由器,它也有对内的私有IP,和对外的WAN口IP。
通过这样的划层理解,大家也明白了,私有IP和公有IP,它是一种相对公有,相对私有。
但是这里其实是有问题需要被处理的,就是私有IP无法在网上路由,因为在公网上它不具备唯一性,那么怎么使用私有IP进行网络服务呢?这就用到了NAT技术。后面详细讲。
补充知识:特殊的IP地址
(1) 将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
(2)将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
(3)127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
1.1.3 路由 —— 路由表
路由就是拿着目的IP在网络中,找寻合适路径的过程。
主机A向主机B发送数据,经过层层协议的封装,发送给了路由器1,路由器1进行解包,在网络层也就是IP协议,分析IP报头中的目的IP地址,用目的IP地址和路由器中的路由表
里的子网掩码做按位与,如果发现目的IP地址的网络号和路由表中保存IP地址一样,那么就将此报文发送到那个IP处。
先看一看路由表: Linux的指令route可以查看
- Destination:目的网络地址,注意的就是0.0.0.0这是默认使用的网络地址。
- Gateway:网关,发送IP数据包时,网关定义了针对特定的网络目的地址,数据包将要被发送到的下一跳IP地址。
- Genmask:子网掩码,用于判断目的IP是否和路由表中的Destination网络号一致。
- Flags:标记,多种路由表项标记含义如下:
(1) U:路由是动态的,目的网络和主机直接相连,不需要通过路由器再去转发。
(2) H:目标是一个主机;
(3) G:路由指向网关;
(4) R:恢复动态路由产生的表项;
(5) D:由路由的后台程序动态安装;
(6) M:由路由的后台程序修改;
(7) !:拒绝路由。 - Metric:跳数,记不记得上面讲的IP报头里的8位生存时间(TTL)。
- Ref:引用次数,Linux内核未使用一般是0。
- Use:此路由项被路由软件查找的次数
- IFace:发送接口,接口定义了针对特定的网络目的地址,路由器用于转发数据包的网络接口(路由器的物理端口)。
这就是路由表的内容。
路由表灰常重要,我举俩个例子:
例子1:
- 路由器接收到了一个报文,分析IP报文,并取出了目的IP:169.254.0.3
- 目的IP和路由表中的每一行的子网掩码作按位与,发现其网络号与第三行的一致
- 那么从接口eth0发出,Flags是U表明与主机直接相连,所以直接发往目的主机,不需要经过路由器。
例子2:
- 路由器接收到了一个报文,分析IP报文,并取出了目的IP:140.252.20.68
- 目的IP和路由表中的每一行的子网掩码作按位与,发现其网络号都不一样,所以按缺省路由情况,使用默认的网络地址,发往下一跳。
- 那么从接口eth0发出,Flags是UG表明不与主机直接相连,需要经过路由器,发送到10.0.24.1(Gateway是10.0.24.1)。
问题1:路由器这里解决了什么问题?
路由器服务网络层,它维护了一个路由表,通过目的IP和路由表中的子网掩码作按位与,从而判断出,目的IP的下一跳发往何处。
问题2:如何发往下一跳?
这个问题,不是IP能管的,IP可以告诉你要发往具体某个子网去,但是怎么发过去?这是数据链路层的事。数据链路层,是解决怎样发送到那个子网的。
问题3:路由表如何生成?
路由表可以由网络管理员手动维护(静态路由), 也可以通过一些算法自动生成(动态路由).
相关的生成算法, 例如距离向量算法, LS算法, Dijkstra算法等.
1.2 ICMP协议
因特网控制报文协议ICMP(Internet Control Message Protocol)是一个差错报告机制,是TCP/IP协议簇中的一个重要子协议,通常被IP层或更高层协议(TCP或UDP)使用,属于网络层协议,主要用于在IP主机和路由器之间传递控制消息,用于报告主机是否可达、路由是否可用等。这些控制消息虽然并不传输用户数据,但是对于收集各种网络信息、诊断和排除各种网络故障以及用户数据的传递具有至关重要的作用。
因为IP协议不提供可靠机制,IP协议只是尽力将数据传输到目标地址。为了更有效地转发IP数据包和提高数据包交付成功的机会,ICMP应运而生。使用ICMP,当网络中数据包传输出现问题时,主机或设备就会向上层协议报告差错情况和提供有关异常情况的报告,使得上层协议能够通过自己的差错控制程序来判断通信是否正确,以进行流量控制和差错控制。
注意ICMP协议只能搭配IPV4版的IP协议,如果是IPV6版IP则需要搭配使用,ICMPV6。
1.2.1 ICMP协议报文格式
ICMP协议是内嵌在IP报文中的数据段内的,它相当于一个IP的错误侦测与回报机制
。因为它是内嵌在IP报文数据段内,所以它不会把错误信息反馈给中间的网络设置,而是只能反馈给发送的源端,因为中间的网络设置不会对IP的数据段做处理,这是好理解的吧,因为路由器那里一般到网络层也就是分析IP报头,而不是分析IP数据段。
内嵌在IP的格式:
网络层在接收到IP报文后,解析数据段,分析ICMP报文,根据类型+代码(代号),来判读发送数据的情况:
注意
:IP报文是怎么知道数据段携带ICMP报文的,IP报头中有一个8位协议,这个8位协议可以用于判断这个昂,它协议号对应的是1。
TYPE 就是类型,CODE 就是 代码,Description就是内容,大家对应下表即可。
简言之,通过ICMP协议就可以判断出,报文在网络中的传输情况,发送端拿到ICMP反馈后,会做出相应的应对措施。
1.2.2 ICMP协议的应用
IP数据报及其他应用程序通过ICMP报文可以实现多种应用,其中Ping程序和Tracert(Traceroute)程序最为常见。此外,在网络管理和监测中,网络质量分析NQA(Network Quality Analysis)技术更加充分应用了ICMP。
- Ping程序:这个是最为常见的判断网络设备是否可达数据的调试手段。
在vs环境下cmd使用ping程序,返回的情况都中文的,看到的还蛮清晰的。Ping程序,其实就是IP报文中内嵌ICMP报文请求,对端收到后再反馈一个ICMP报文响应。
- Tracert程序:主要用于查看数据包从源端到目的端的路径信息,从而检查网络连接是否可用。当网络出现故障时,用户可以使用该命令定位故障点。其实就是路由器的跟踪,用于确定 IP数据包访问目标所采取的路径。
大家对访问一个网址,经过了哪些路由器?它的路径怎样?就可以用这个程序,还是cmd下使用:
注意:路由跟踪,其实有点小耗时间。traceroute命令和这个一样,不过是Linux环境下的。
- NAQ网络质量分析是一种实时的网络性能探测和统计技术,可以对响应时间、网络抖动、丢包率等网络信息进行统计。NQA能够实时监视网络服务质量,在网络发生故障时进行有效的故障诊断和定位。这个大家感兴趣,下去了解一下。(选学)
1.3 IGMP协议
IGMP协议全称(Internet Group Management Protocol)因特网组管理协议,是TCP/IP协议簇中负责IP组播成员管理的协议,在组播网络中,IGMP协议在最后一跳路由器与组播接收者间运行,通俗说即:“IGMP协议运行于主机与主机直接相连的组播路由器之间,主要用于维护组播成员关系。”
简言之:IGMP协议,提供组播功能。
1.3.1 单播,广播,组播
- 单薄:点对点传输,一个发送发对应一个接收方
- 广播:一个发送方,向子网中的所有网络设备传输
- 组播:一个发送方,有选择性的,传输给多个接收发
1.3.2 IGMP的协议格式
IGMP共有三个版本,服务不同的场景:
分别是:IGMPV1,IGMPV2,IGMPV3。它们有自己的报文格式,这里不详细谈了,大家只要知道它们服务什么场景就好了。
- IGMPV1:主机可以加入组播组。没有离开信息(leave messages)。路由器使用基于超时的机制去发现其成员不关注的组。
- IGMPV2:该协议包含了离开信息,允许迅速向路由协议报告组成员终止情况,这对高带宽组播组或易变型组播组成员而言是非常重要的。
- IGMPV3:与以上两种协议相比,该协议的主要改动为:允许主机指定它要接收通信流量的主机对象。来自网络中其它主机的流量是被隔离的。 IGMPv3 也支持主机阻止那些来自于非要求的主机发送的网络数据包。
服务场景:
所有版本的IGMP 都支持ASM(Any-Source Multicast,任意信源组播)模型;IGMPv3 可以直接应用于SSM(Source-Specific Multicast,指定信源组播)模型,而IGMPv1 和IGMPv2 则需要在IGMP SSM Mapping 技术的支持下才能应用于SSM 模型。
1.3.3 IGMP工作原理
组播:就是发送方 向 一组主机发送一条消息,组播路由器有责任将消息复制并转发给组播组的每个主机,组播组的每个主机都会收到消息。
IGMP协议工作的最核心部分就是管理主机在组播组中的成员关系,在管理组播组中主机或路由器的成员身份时,协议必须处理以下过程:
- 加入组播组
- 离开组播组
- 监控组成员
- 延迟响应
也就是说:IGMP是控制组播
组成员,以及监控它们的一个协议。IGMP也是内嵌在IP报文数据段的,它的协议号是2。
2. 数据链路层
用于两个设备(同一种数据链路节点)之间进行传递。网络层规划路线,数据链路层实现走路的过程,网络层下一站在东北,数据链路层我走着去?开个玩笑,数据链路层是实现到东北这个具体过程的一层。
2.1 以太网
以太网是应用最普遍的局域网技术,在计算机网络基础(一)中,有介绍,大家感兴趣可以去看看。
看到把主机连接在一起的那根线了吧,可以抽象的看待成以太网。以太网不是网
,而是一种技术,它是完成局域网之间通信的,最为广泛的技术,既包含了数据链路层的内容,又包含了物理层的内容(物理层不讲)。
2.1.1 以太网帧格式
应用层把数据交到传输层,传输层封装它的报头,可以是UDP报头或者TCP报头等,再交付到网络层,网络层再封装它的报头,IP报头,IP报头是服务UDP还是TCP亦或是ICMP协议,这个会在IP报头中的8位协议里填写,如果是服务ICMP或是IGMP,那么还会再IP数据段继续封装其报头。那么交到数据链路层,链路层 它是要明确的 把这个报文给传输出去的,它该传输给谁?IP说了目的IP地址给你了,具体怎么过去你想办法。
重点:
以太网环境下,同一网段内主机想要完成通信,必须要知道对方的MAC地址。
MAC地址,才是数据链路层关注的。什么所谓的IP路线规划?数据链路层实现走路线?必须要有MAC地址,才能起步。
认识一下MAC地址:
- MAC地址是物理地址,工作在数据链路层,一旦出厂时由厂商确定并烧制入网络设备的EPROM中就具有了固定的全球唯一的地址,任何时候任何条件都不会改变,虽说使用起来不太方便,且描述的是较低层的数据链路通信细节,但在任何时候都可用于数据通信寻址。
- 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示。
IP地址 vs MAC地址:
- IP地址是网络层协议给划分的,而且现在还是动态划分,你去不同的地域上网或是不同时间段上网,IP地址都会变。
- MAC地址是服务数据链路层的,服务以太网的,以太网就是局域网嘛,同一网段的主机都是物理相互连接,只有物理连接才能实现网络传输,比如:主机A到主机B发送数据,中间有多个路由器连接,是通过路由器,不断转发的,可不是 信息直接飞过去。
- 可以这样理解:IP地址相当于电话号,通过电话号可以联系到某人,但是电话号不是固定不变的;MAC地址是身份证号,这是不变的,通过身份证号永远都能对应到某人。
有了以上认识,我们来看 以太网帧格式:
这里的目的地址,源地址 都是 MAC地址,根据类型的变化,以太网帧格式也有变化:
- 类型为 0800 ,这是服务IP:
- 类型为 0806 ,这是服务ARP:
- 类型为 0835 ,这是服务RARP:
2.1.2 MTU那些事以及IP切片组装
关于以太网数据段这块,也是有要求的,数据块的大小不能超过1500字节,这个1500字节其实就是MTU。如果IP报文超过了1500字节,那么数据链路层不会转发此报文,而是交付回去,要求IP对它的报文进行切片
。
IP报文有一行是没讲的,在这里补充,该怎么切片?切片后在对端如何组装?
- 16位标识:这是用于标识IP报文的,没切片的情况下,具有唯一性;如果被切片,那么- 被切成多个小报文,且每个小报文的16位标识都是一样的。
- 3位标志:第一位保留不用。第二位表示是否可以对报文切片操作?可以切片就是1,不能切片就是0。第三位表示是否是最后一个切片,如果是切片的最后一个小报文,那么此报文的标志第三位就是1,其余小报文是0。
- 13位片偏移:这是组装的重要标志,它相当于是相对数据段开头,偏移了多少,就是在原始数据段的位置。根据这个可以对小报文进行排序,从而有序组装。
一般的情况是不需要切片的,切片之后变成了多个小报文,只要丢失一个小报文,就会导致数据包被整个丢弃。
以太网的MTU一般是1500,但是发送主机的MTU比较大,这个可以自己查看,使用指令ifconfig
:
那么就讲述一下切片的具体过程:
(1)发送主机它的MTU很大,所以发送一个IP报文大小超过1500字节
(2)中间的路由器它的MTU是1500,发现这个IP报文太大了,我不能转发,我要进行切片。
(3)去IP报头中查看3位标志中的第二位,如果是1,那么就可以进行切片;如果是0,这个IP报文不允许切片,直接丢弃报文,发送一个ICMP报文给源主机,意思就是你这个报文太大,我不能切割。
(4)源端如果收到了ICMP报文里面有信息说,报文太大了需要被切割,那么它会重新封装IP报头,把报头的3位标志位的第二位设置为1,表明可以被切割,再发送过去。
(5)路由器要进行切片,就是把IP报文的数据段给分成几部分,每个部分都要重新加上IP报头,这些IP报头的16位标识都一样,最后的一个切割部分的3位标志符的第三位是1,然后分别填上片偏移。最后再把每个IP报文封装成以太网帧格式,发送出去。
(6)对端主机收到了这些IP报文后,根据16位标识分组,然后根据片偏移量排序,看看最后一个小报文收到没,收到了就组装发送到上层,没收到就会等待,不过等待也是有时间限制的,超出时间限制就丢弃所有包。交付上层后,上层传输层有可靠机制,进行检测丢包么之类,丢包就可以要求重传呗。
避免切片,MSS:
其实是应该避免发送切片的,这其实应该对传输层做处理,你少传点就好了呀,IP层也不需要进行切片了。
- UDP协议:它就没法避免了,要想它避免,那就只能是应用层少传点数据。UDP只能听天由命,如果被切片,那么丢包概率增大。
- TCP协议:它是可以避免的,靠的就是MSS来进行控制,它提前就把数据流切段,每段长度不超过MSS。
TCP报文的长度是受制于MTU的,MTU = MSS + IP报头 + TCP报头。TCP的数据段必须要小于MSS。
MSS是可以双方协商的,建立连接三次握手中,两次SYN中TCP报头中的选项有MSS,它们都填好了,双方接收到对方MSS后,会比较一下,然后取较小值作为之后MSS。这相当于预防被切片的手段。而且MSS是变化的,比如不允许被切片后,突然有个路由器发来了ICMP报文说我要切片,我的MSS值是600,那么TCP把报头的那个标志位置1,然后允许它切片,并且MSS值也发生变化。
2.1.3 重新认识单播,广播 —— 查MAC表
数据链路层,子网之间跑的是以太网帧,报头里填的是MAC地址。
我直接举例子,主机A要发给主机B,中间要经过两个路由器1,路由器2。
以太网帧发送到路由器1中,路由器中有交换机,交换机维护了一个MAC表(转发表),每次有以太网帧发来,转换机都会储存它的源MAC地址和目的MAC地址,这是自学习的过程。转换机会在表中对应的查找,看看MAC_B : MAC_C 这有没有存在表中,如果存在就会把这个以太网帧发往对应端口,这个就是单播
。如果表中没有,那么就把这个以太网帧从全部端口都发出去,这就是广播
。
注意:MAC表,存的是源MAC地址和目的MAC地址的记录还有对应的发送端口,这是方便,下次接收到以太网帧后,直接就从相应的发送端口发出,而不是广播出去,广播出去的话是会影响其他的主机的,假设路由器1之前没有存表,所以就是广播,路由器1和主机C都会收到此以太网帧,主机C收到后,发现它的目的MAC地址不是我,所以直接丢弃报文;路由器2收到后,会对其解包到IP报头,看目的IP地址,然后与它的子网掩码做按位与,发现是在我的网段,那么我就将此以太网帧发送到我下面那台主机C,主机C接收到后,发现就是给我的,它拿到了。
那么以太网帧在网络中走这么一圈,路由器1和路由器2中的转换机
会把源MAC地址和目的MAC地址以及相应发送端口记忆,那么下一次,两方发送数据,直接就是单播了。
2.2 ARP协议
那么以太网帧的格式在路由器中发送,它的报头是MAC地址,我提一个问题:MAC地址你知道嘛?你肯定是知道IP地址的,别问我为啥知道啊?就像我们访问一个网址:www.baidu.com,其实这个是可以转换成IP的,反正你是知道人家IP,才有了后续故事。
但是MAC地址,你不一定知道,所以ARP协议,被称为地址解析协议,能够完成通过IP地址找到它的MAC地址。向上面讲的单播和广播的前提是知道了对端的MAC地址,我们来讲讲,如何通过IP地址来获取MAC地址。
ARP协议服务数据链路层,一台主机收到ARP请求后,会把ARP请求广播到局域网内。
简化过程:
- 主机1想要知道主机2的MAC地址,已经知道主机2的目的IP,发送ARP请求包
- 主机2收到ARP请求包,把MAC地址封装到ARP响应包,发送给主机1
2.2.1 ARP协议格式
总格式:
ARP协议:
它是要被封装成以太网帧的,所以封装后这样:
然后介绍一下ARP协议的报文:
- 硬件类型:指的是链路层网络类型,以太网是1
- 协议类型:协议类型指要转换的地址类型,0x0800为IP地址
- 硬件地址长度和协议地址长度:分别指出硬件地址和协议的长度,以字节为单位。对于以太网上的请求或应答来说,它们的值分别为6和4。
- OP:op字段为1表示ARP请求,op字段为2表示ARP应答。
总结一句就是:ARP协议是为了获取MAC地址而存在的,并且还有ARP缓存表,用于存放,IP和MAC地址的映射关系。
这个ARP缓存表可以用arp -a
指令查看。
2.2.2 ARP协议的请求和响应过程
讲这个ARP协议,我以这一块简单的寻找MAC地址为例子:
假如主机B是新增到路由器里的,路由器里面并没有保存ARP缓存表,但是根据发来的以太网帧中的目的IP可以判断出这个报文就是发送到路由器2下的某个主机的,但是路由器2并不知道主机B的MAC地址,所以要广播的发送ARP请求,从而得到主机B的MAC地址。
那么路由器2肯定要构建ARP请求的,我们来看看这个ARP请求:
好好对应上面的ARP协议格式,这里是能看懂的,关键点有俩个:MAC目的地址不清楚,所以报头要设为FFFF……F这是广播地址,OP设置为1,表示的是请求。
那么主机B收到后,会看目的IP地址和本机做比较,发现一样,构建ARP响应包,发送给路由器2,路由器2收到后会缓存ARP请求表,从而方便以后得到MAC地址。因为是广播,所以主机D也会收到此ARP请求,然后也做对比,但是不一样,所以直接丢弃报文。
构建ARP响应包:
对吧,ARP响应是单播。这就是ARP协议的运作过程。
注意:在拿到ARP报文,先看的是OP判断它是请求还是响应,请求的话就要构建响应;响应的话就拿到MAC地址,然后缓存到ARP表,再将原来收到的以太网帧(找不到MAC地址的情况)重新封装发送给主机。
2.3 RARP协议
反向地址转换协议(RARP:Reverse Address Resolution Protocol) 允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。网络管理员在局域网网关路由器里创建一个表以映射物理地址(MAC)和与其对应的 IP 地址。当设置一台新的机器时,其 RARP 客户机程序需要向路由器上的 RARP 服务器请求相应的 IP 地址。假设在路由表中已经设置了一个记录,RARP 服务器将会返回 IP 地址给机器,此机器就会存储起来以便日后使用。 RARP 可以使用于以太网、光纤分布式数据接口及令牌环 LAN。
它就是ARP协议的逆过程,它是知道MAC地址想要得到IP地址。用户用到这个很少,只有RARP服务器可以做应答。它的工作原理和ARP很一样,不过这次缺省不是MAC地址,而是IP地址,同一个局域网知道MAC地址,想要获取IP地址是非常简单的事情。
看一下,RARP的报文格式,这个和ARP报文格式一样,但是填充的内容是有区别的:
主要差别在于帧类型代码为0x8035(ARP为0x0806),操作码为3请求(ARP为1),4应答(ARP为2)。
这个是选学内容,大家感兴趣下去再研究一下,其实过程和ARP大同小异。
3. 其他的重要协议(技术支持)
3.1 DNS协议
DNS是一整套从域名映射到IP的系统,这个存在完全是为了方便用户。其实访问网站,我们只需要输入IP地址:端口号就能访问,但是不人性对吧。有默认的端口号,直接输入IP地址也可以访问网站。
比如:www.baidu.com 和14.215.177.39比较,你觉得哪个好记?
很明显是www.baidu.com。
DNS系统的概念:
一个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系。
DNS系统的运作过程:
- 如果新计算机接入网络, 将这个信息注册到数据库中;
- 用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.
- 这就是完成了域名到IP的转换。
3.1.1 域名介绍
通过域名其实也能够读出服务网站的不少信息。
比如:www.baidu.com
域名是从后往前看的:
- com:一级域名,表示这是一个企业域名。
- baidu:二级域名,公司名
- www:只是一种习惯用法.
一级域名又被叫做顶级域名,这个域名可以体现企业的性质,或者网站的性质:
常见的有:
- .com- 供商业机构使用,但无限制最常用,被大部分人熟悉和使用
- .net- 1985年1月,原供网络服务供应商使用,现无限制
- .org- 1985年1月,原供不属于其他通用顶级域类别的组织使用,现无限制(非盈利)
一级域名还在不断增加:
- .post- 供邮政服务使用
- .xxx- 供色情网站使用
- .mail- 供邮件网站使用
这几个不久将来可能会被使用。
二级域名就是公司名,自己起的命名。甚至还有三级,四级域名,就是往前不断叠加。
DNS是一种服务,它帮助你把域名和IP完成转换,所以域名是收费的:一般.com域名直接买的价格1个在人民币50元/年。
3.1.2 域名解析过程
客户端输入一个域名,它是要被解析成IP的,解析过程如上图:
- 发出解析请求
- 在本地缓存服务器中找不到解析结果,则首先会向根服务器查询,根服务器里面记录的都是各个顶级域所在的服务器的位置,当向根请求http://www.zdns.cn的时候,根服务器就会返回.cn服务器的位置信息。
- 递归服务器拿到.cn的权威服务器地址以后,就会寻问cn的权威服务器,知不知道http://www.zdns.cn的位置。这个时候cn权威服务器查找并返回http://zdns.cn服务器的地址。
- 继续向http://zdns.cn的权威服务器去查询这个地址,由http://zdns.cn的服务器给出了地址:202.173.11.10
- 最终才能进行http的链接,顺利访问网站,注意这里会在本地缓存服务器中做缓存的,以后就不会这么一层一层的查了。
在Linux下,我们可以使用指令dig
+ 域名 ,来看域名解析过程:
这里有一篇博文,讲的dig的使用方法:dig的使用。
大家感兴趣可以去看看哈。
3.2 NAT技术
在本文的IP地址详谈部分的问题3中的第三个答案:我说过是用NAT技术,我那里只说了私有IP和公有IP的概念,大家可以去上文中在看一下。
还是这副图,我们直接用例子讲:
- 主机1要往外发送数据,需要路由器进行转发,目的IP地址是163.221.120.9
主机1往外发送数据是要进行源IP地址转换的,利用的就是NAT技术,主机1发送到家用路由器1中,NAT设备会把源IP地址从192.168.1.201替换成10.1.1.2,家用路由器发送到运营商路由器会把源IP地址从10.1.1.2替换成122.77.241.4。这样不断的往外替换,直到替换成真正的公有IP,这可不是相对的啊,是那种在网上跑具有唯一性的那种。在这里假如122.77.241.4就是真正的公有IP,那么报文的源IP地址就不会再变了,就用它来通信。
这是因为私有IP在局域网内还好区分,到了相对它来说的外网就不好区分了。只有真正的公有IP才能在广域网上具有唯一性。
这个例子就是动态NAT技术,但是它存在弊端。
我现在就提一个问题:它是通过公有IP发出去了,怎么回来?
在路由器中维护一张NAT转换表,这个表是一张映射表,它映射了私有IP到公有IP的每一次转换。回来的时候,就查表就行,我是公有IP,和谁转换的非常清楚。
简画一下这个表:
通过查表就能返回从公有IP163.221.120.9转换回来,假如就是公有IP运营商路由器收到了报文,这个报文是要发送给私有IP为192.168.1.201的,所以还得继续转发这个报文,怎么转发?查表,通过查表可以判断出是由10.1.1.2转换的,那就发到10.1.1.2处,然后再由它去转发。也是查表,对吧?
- 但是我说过这里存在弊端,就是私有IP重复性较高,如果私有IP+端口号,重复性就很低了。尤其是对转换表来说非常好看,怎么说呢,就比如主机1和主机3都访问同一个网址,它俩的私有IP是一样的。
会导致转换表出现这样的情况:
看到了吧,重复了,122.77.241.4拿回报文后,到底是要发送个处在10.1.1.2下的主机1,还是发送给10.1.1.3下的主机3。
所以有了NAPT技术,就是转换表里,源IP+端口号这种形式。
- 主机1和主机3都要往外发送数据
这个情况,必须得使用NAPT技术,过程和NAT一样,就是转换表发生变化
比如这样的:
NAT技术缺陷:
由于NAT依赖这个转换表, 所以有诸多限制:
- 无法从NAT外部向内部服务器建立连接;
- 装换表的生成和销毁都需要额外开销;
- 通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;
4. 总结
1. 数据链路层
- 数据链路层的作用: 两个设备(同一种数据链路节点)之间进行传递数据
- 以太网是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
- 以太网帧格式
- 理解mac地址
- 理解ARP协议
- 理解MTU
2.网络层
- 网络层的作用: 在复杂的网络环境中确定一个合适的路径.
- 理解IP地址, 理解IP地址和MAC地址的区别.
- 理解IP协议格式.
- 了解网段划分方法
- 理解如何解决IP数目不足的问题, 掌握网段划分的两种方案. 理解私有IP和公网IP
- 理解网络层的IP地址路由过程. 理解一个数据包如何跨越网段到达最终目的地.
- 理解IP数据包分包的原因.
- 了解ICMP协议.
- 了解NAT设备的工作原理
3.传输层
- 传输层的作用: 负责数据能够从发送端传输接收端.
- 理解端口号的概念.
- 认识UDP协议, 了解UDP协议的特点.
- 认识TCP协议, 理解TCP协议的可靠性. 理解TCP协议的状态转化.
- 掌握TCP的连接管理, 确认应答, 超时重传, 滑动窗口, 流量控制, 拥塞控制, 延迟应答, 捎带应答特性.
- 理解TCP面向字节流, 理解粘包问题和解决方案.
- 能够基于UDP实现可靠传输.
- 理解MTU对UDP/TCP的影响.
4.应用层
- 应用层的作用: 满足我们日常需求的网络程序, 都是在应用层
- 能够根据自己的需求, 设计应用层协议.
- 了解HTTP协议.
- 理解DNS的原理和工作流程.