文章目录
- 前言
- 网络层
- 网络层提供的两种服务
- 网际协议——IP
- 虚拟互联网络
- IP数据报格式
- 逐一理解
- 整体理解
- IP数据报分片与长度精算
- IP地址
- IP地址概述
- 分类的IP地址——ABCDE
- 分类IP的子网划分
- 不分类的IP地址——CIDR
- IP地址总结
- IP分组的转发
- 网际控制报文协议——ICMP
- 下一代网络协议——IPV6
- 路由选择协议
- IP多播
- 虚拟专用网VPN和网络地址转换NAT
- 多协议标记交换MPLS
- 软件定义网络SDN
前言
这学期学计算机网络,但是我感觉我们学校的某位任课老师讲的不太行,听完introduction部分以后,我决定脱离学校课程,直接按照408去学习,备战考研。
我购买了408推荐参考教材《计算机网络》,是谢希仁版本的第八版,网上对应的视频不是很多,我找到了方诗虹老师的课程,他用的书就是408的。虽然方老师的任职学校并不是很好,但是就我的经历来说,408本来就没什么特别深的东西,关键在于能不能讲好,经过我的调查,方老师评价还不错,所以我就直接来听她的课,搭配书籍食用。
本文是系列笔记中的第二篇,内容为网络层、传输层、应用层。
计算机网络笔记——概述、物理层、链路层(方老师408课程)
计算机网络笔记——网络层、传输层、应用层(方老师408课程)
[考研整理——还没写]
网络层
最重要的一层,没有之一。
链路层解决了局域网
内部帧
的传输,而网络层的关键任务是将世界上不同的局域网连接在一起,即异构网络之间的连接和资源共享问题,细分为如下方面:
- 跨局域网互联
- 主机标识。如何区分不同主机
- 路由选择。选择哪条道路
- 分组转发。数据如何转发
网络层提供的两种服务
在设计网络层前,关键的问题是网络层到底要实现什么功能?进一步说,就是网络层是否应该负责可靠传输
因为全球互联网络的传输路径太长了,每一个节点都有一定概率出问题,叠加起来难以保证传输质量。因此现在是以不可靠传输为主,可靠传输为辅:
- 少数——网络负责
- 首先建立虚电路逻辑连接,占领资源,沿着这条路进行存储转发,结束后释放资源
- 成本较高,容易出错
- 绝对主流——端系统负责
- 向上层提供简单的灵活地、
无连接的
、尽最大努力交付的数据报服务
- 由主机上运行的传输层协议保证可靠传输
- 向上层提供简单的灵活地、
最开始人们认为分组交换比较好,后面大家觉得为语音、视频服务的电路交换更好,现在随着互联网邮件,web应用的出现,大家又觉得为这种突发流量服务的分组交换更好。
时至今日,分组交换已经占据绝对主流,物理网络也已经定型。改变硬件是很困难的,所以现在的应用程序也都是在适应分组交换网络,不需要保证带宽。
目前使用虚电路网络的只有MPLS和租用专线等,很少,很贵。
网际协议——IP
虚拟互联网络
不同局域网使用的技术不同,无法直接通信。把世界的所有网络技术统一不够现实,也会限制技术发展,不如就使用中间设备转发。
这个中间设备叫路由器,IP协议运行在路由器上。
使用路由器将世界上的局域网连在一起后,就形成了一个虚拟互联网络,即互联网,用户只需要接入互联网,就可以和另一台接入互联网的设备通讯。
网络层其实不止有一个IP协议,而是有三大类:
- 下层协议
- ARP(Address Resolution):负责IP地址和MAC地址的解析转换
- 核心协议
- IP(Internet):网际协议
- 上层辅助协议
- ICMP(Internet Control Message):网际控制报文协议
- IGMP(Internet Group Message):网际组管理协议
下图中,一个信息要经过5跳,前4跳都是交付给路由器,是间接交付。而最后一跳是交付给目标主机,这是直接交付。
IP数据报格式
逐一理解
IP数据报有如下部分:
- 首部
- 固定部分,有20B(5行,为5×8字节=5×32bit)
- 可变部分,最长40B,原因后面说
- 数据部分
接下来逐步解析首部:
- 版本(4):
- 0100代表IPv4
- 0110代表IPv6
- 首部长度(4):
- 范围为5-15
- 实际要×4,即首部长度范围是20-60,且必须是4的倍数
- 区分服务(8):略,不怎么用
- 总长度(16):
- 范围为0-65535。
- 总长度指的是一个完整的IP数据报长度,但是链路层MTU长度会限制这个,所以IP数据报可能被先分片后合并。
- TODO 实际应用中,切分了以后总长度可以超过1500吗?
- 标识(16):
- 来自于同一个IP数据报的IP报文分片的标识相同
- 标志(3):
- 有三位,保留位无意义
- DF=1代表不分片,此时MF位无意义,当DF=0,MF才有意义
- MF=1代表后面还有分片
- 片偏移(13):
- 用来表达报文片的先后顺序
- 偏移=当前片段的第一个bit在原始数据报数据部分中的bit位/8。
- 之所以÷8,是因为标志位占了3bit,为了扩大13位片偏移的表达范围,就弄成8倍。巧合的是,上述计算一定可以整除。
- 生存时间(8):
- TTL,给定初始值,通过一个路由器就-1。
- TTL=64代表最多经过64个路由器,之后再经过路由器就会被丢弃,防止无休止路由浪费资源。
- TTL=0还是可以被主机接收的,只是不能转路由器了
- 协议(8):
- 表示应该交付给上层的哪个协议
- 表示应该交付给上层的哪个协议
- 首部检验和(16):
- 只考虑首部计算的校验码
- 检验流程类似于CRC,但是计算方法不同。
- 源地址(32)。源头IP
- 目的地址(32)。目标IP
- 可选部分功能丰富,但是一般不用,成本较大
整体理解
核心其实就是3个,从哪里来,到哪里去,干什么用。
其他的各种字段都是用来辅助的。
IP数据报分片与长度精算
举个具体的例子。一个ICMP数据报,20B的首部,8B的ICMP首部,3500B的其他数据,所以数据部分为3508B。
以太网MTU=1500字节(以太网帧最大是1518字节,MTU只是其数据部分,即IP数据报),所以假设报头只有20B,则IP数据报片的数据部分最多只有1500-20=1480B
所以3508B切分为3片,bit位为0-1479,1480-2959,2960-3507。
逐部分解析:
- 标志位。分片,所以DF=0。前两个MF=1,代表后面还有片,最后一片MF=0
- 偏移量。1480恰好是8的倍数,我们分片的第一个bit所在的位置恰好是1480的倍数,自然也一定能整除8
IP地址
IP地址概述
IP地址和接口
一一对应,不会重复。一般一台电脑只有一个接口,也就只有一个IP地址,但是一个路由器有很多接口,则会有很多IP地址。
IP地址是32位的,人手一个都不够用,更别说一个人有好几台设备了,毕竟当时也没想着给全世界的人用。于是现在诞生了128位的IPv6,号称给地球的每一粒沙子一个IP地址,但是此处我认为,现在的视野还是局限在地球的,万一以后扩展到了宇宙,IPv6还是不够用,还得用新的网络协议。
因为IPv4不够用,所以在管理方面是很严格的。最上面是世界,之后是地区级(RIR),地区下面是国家(NIR),国家下面是ISP(比如移动联通电信)
ISP拿到一批IP,之后根据自己的业务自行分配。
基本的IP地址结构分为两部分,网络号代表了你在哪个局域网,主机号代表了你是这个局域网里的哪个设备。
这种分级结构优点如下:
- 便于管理。IP地址管理机构分配网络号,单位内部分配主机号。
- 减轻路由负担。路由转发是在局域网之间的,因此其负担和网络号数量正相关。主机号的存在将一部分压力分到了局域网内部。
32位2进制太难记,于是切分成4部分记录,即点分十进制记法。每一部分占8bit,所以其范围是0-255。
分类的IP地址——ABCDE
一个地址对应一个局域网,两个局域网是不可以合并的,所以一个IP地址的主机号位数越多,那么其所在的局域网可以容纳的主机数量(IP数量)也就越多,由此根据位数对IP地址分级,通过开头的bit位特殊序列区分类别,A最高,C最低。
除此之外,还有一个1110开头的多播地址,后面会说。1111开头的特殊地址保留备用。
IP地址细节很多,首先要理解固定位以及两类特例:
- 固定位。每一类网络都会固定特殊前缀
- A类固定一位(0),B两位(10),C三位(100)
- 去掉固定的前缀剩余的bit位才是这一类IP网络号的可变部分
- 网络号特例,只存在于A类网络
- 0代表本网络
- 127代表本地软件环回测试
- 主机地址特例,存在于所有网络
- 全0代表本机IP的主机号,即默认值(比如本机是192.168.199.108,那么全0就代表108)
- 全1代表该网络的所有主机,即广播。
由上即可得出下表,括号里是具体计算过程,先解释一下1,4列:
- 考虑固定位计算2次幂,那么A类是8-1=7,B类是16-2=14,C类是24-3=21
- 考虑网络号特例,因为只有A类有,所以A损失了两个网络号,BC类没有损失,直接就是2的n次方
- 考虑主机号特例,ABC类都有,所以就都是先计算2的24,16,8次幂后减2。
再解释2,3列:
刚开始学,可能会认为这三类分法会浪费掉一些网络号,其实不完全是,ABC三类的IP地址的范围是连续的
- A:
0
000 0000到0
111 1111,即0-127 - B:
10
00 0000.0到10
11 1111.255,即128.0到191.255 - C:
110
0 0000.0.0到
110
1 1111.255.255,即192.0.0到223.255.255 - D(多播):
1110
0000.0.0.0到
1110
1111.255.255.255,即224.0.0.0到239.255.255.255 - E(预留):
1111
0000.0.0.0到
1111
1111.255.255.255,即240.0.0.0到255.255.255.255
也就是说,从0.0.0.0到255.255.255.255,这5大类网络的划分理论上是连续的,只不过具体上有一些浪费,浪费在哪里呢?
- 网络号特例:A类地址头尾损失了两个网络号,所以实际范围是1-126
- 主机号特例:ABC类地址每个网络损失了两个主机号
- A类区间是x.0.0.1到x.255.255.254
- B类区间是x.x.0.1到x.x.255.254
- C类区间是x.x.x.1到x.x.x.254
- 多播:其实这不算浪费,2.6亿个多播组并没有那么多。
- E类:预留其实也不算是浪费
所以说到头,实际上没有浪费,只需要知道两个特例让IP地址不完全连续,并且知道断在哪里即可。
分类IP的子网划分
一个网络号里主机号太多,可以划分几个子网出来,便于管理。
简单来说,子网号就是取原来主机号的前m位,因此,m取决于你要分的子网数量。如果是5-8个子网,那么就取m=3
可以看出,子网划分会浪费一些IP地址:
- 子网号特例:
- 一开始子网号不允许全0,全1
- 现在可以,所以子网号特例不浪费
- 不够2的n次幂个子网
- m位子网号对应2的m次幂个子网号,如果要的子网不够这个数量,就会浪费一些子网号
- 主机号特例
- 每个子网内部,主机号都是不允许全0全1的
- 不分子网,其实就是子网数量=1
- 假设子网号m bit,则子网数量为 2 m 2^{m} 2m,则浪费的主机号数量为 2 m × 2 2^m\times 2 2m×2,m越大,浪费的数量指数上升
因为路由器是以网络号转发的,那么可变长度的子网号就是个问题。由此,干脆就制造一个固定长度的子网掩码,网络号部分全1,其他全0,只需要让IP地址与子网掩码进行与运算即可得到网络号+子网号=当前子网的网络地址
如何判断多个IP地址是否在同一个网络?其实就是从子网掩码上下手:
- 子网掩码长度相同
- 网络地址相同
这两个是充要条件,代表两个IP的网络地址位数与值一样,其实就是网络地址完全一样。
不分类的IP地址——CIDR
IPv4分类IP地址便于管理,在前期做出巨大贡献,但是缺点很多,后期逐渐凸显:
- IPv4设计有缺陷,数量不够
- 大地址块(A类)浪费地址
- 大变小浪费:大网络划分子网只是便于管理,并不增加IP地址,反而浪费地址
- 小变大不行:不同网络号之间的网络无法合并
CIDR做了若干改变:
- 合并:网络号和子网号=网络前缀,子网不复存在
- 改名:一个网络前缀对应一个地址块,对应一片局域网
- 斜线记法:子网掩码直接用斜线记法十进制数字表示,比如255.255.1111 0000.0,有20个1则就写20
前缀长度灵活可变,因此地址块大小是任意的,而不是ABCDE这几类大小。其中有三个特殊前缀长:
其中注意31,其实按照规定,主机号是不能全0全1的,但是31比较特殊,就允许这么做了。所以用30替代31也是可以的,30的话,就有4个主机,按规定去除00和11,同样是只剩下两个主机号可用。
总的来说,30和31都可以用,老习惯用30,新规定可以用31。
连续的网络前缀可以合并(路由聚合,构成超网),变成一个更大的局域网,而网络号不可以,两个C类就是两个C类。
下图中,四个25长度的前缀先两两合并,变成两个24长度前缀,再两两合并成一个23前缀。
聚合有什么好处呢?虽然没办法解决IP地址不足的问题,但是可以让网络前缀总量变少,这样就可以减轻路由表的条目数量,提高路由速度。
IP地址总结
- 网络前缀+主机号=IP地址,网络前缀不分等级,只有地址块大小之分
- 一个IP对应一个接口,一条链路两端有两个接口,其IP各不相同
- 局域网内部使用交换机连接,局域网之间只能用路由器连接
- 一个局域网对应一个网络前缀,网里除了和外部打交道的接口,其他接口的IP地址网络前缀必须一样。
- 一个网络前缀可以分多个局域网(用路由器隔离,交换机起不到局域网隔离作用),但是一个局域网内部网络前缀一定一样
- 网络号(网络前缀)不同,则一定代表两个局域网,必须用路由器连接
来个真实的例子:
- 局域网。
- L A N 1 LAN_1 LAN1是一个局域网,其网络前缀是10.0.0.0/24。
- 内部的所有机器网络前缀都是一样的
- 网关。
- 10.0.0.1是 L A N 1 LAN_1 LAN1和外接交流的唯一(有待考证)接口,因此叫“关”。
- 记住,网关这个接口IP也是属于局域网的,所以前缀也要保持一致。
- 网关IP,一般来说,我们习惯于把网关配成局域网的第一个IP,所以主机号往往是1
- 路由器之间的局域网。
- 路由器之间的每对接口都是一个局域网,网络前缀长度是31,代表点对点,用30也行。
- 图中似乎是有一点小问题,网络前缀重复,也可能是我不知道的知识点,有待考证。