网络层
概述
IP协议
ICMP协议
ARP协议与RARP协议
IP地址的子网划分
网络地址转换 - NAT技术
概述
网络层的设计不关注物理层和数据链路层的实现细节
网络层:解决数据路由问题,决定数据在网络中传输的路径,实现跨节点的数据传输
路由器是网络层非常重要的设备
本章学习索引
- 网络层IP协议相关:
IP协议、子网划分、简单路由过程 - 网络层其他协议:
ARP协议与RARP协议、ICMP协议 - IP的路由算法:
路由的概述、内部网关路由协议、外部网关路由协议
IP协议
虚拟互联网络
回顾问题:
MAC表只能实现相邻物理节点的传输,若传输需要跨多个路由时怎么办??
实际的计算机网络是错综复杂的;物理设备通过IP协议,屏蔽了物理网络之间的差异;当网络中的主机使用IP协议连接时,则无需关注网络细节;
如下,A通过IP协议向C发送报文
IP协议使复杂的实际网络变为一个虚拟互连的网络;使网络层可以屏蔽底层细节而关注网络层的数据转发;解决虚拟网络中数据报传输路径问题
IP协议
IP地址
链路层使用MAC地址来标识唯一的一个物理地址;
网络层也有一个地址的概念:IP地址
IP地址一共32位,常分为4个8位,共能表示
2
32
2^{32}
232 = 4294961296个地址;
IP地址是可变的,MAC地址是永久不变的是和网卡绑定;
IP地址常用点分十进制来表示(0255.0255.0255.0255)。
IP数据报
前面链路层介绍中,链路层将物理层的比特流分成帧首部、帧数据、帧尾部,其中的帧数据内容通常情况下就是IP数据报,如下;
IP数据报分两部分:IP首部、IP数据报的数据。
IP首部 | 固定 | 版本(4) | 首部长度(4) | 服务类型 TOS(8) | 总长度-字节(16) | ||||
标识(16) | 标志(3) | 片偏移(13) | |||||||
生存时间(8) | 协议(8) | 首部校验和(16) | |||||||
源IP地址(32) | |||||||||
目的IP地址(32) | |||||||||
可变 | 可选字段(长度可变) | 填充 | |||||||
数据部分 | IP数据报的数据 |
IP首部
IP首部长度最小是20字节(上表IP首部固定部分),最大60字节(固定 + 可变,同时首部长度为4位也限制了首部大小)
- 版本:
占4位,指的是IP协议的版本,通信双方的版本必须一致,当前主流的版本是4,即IPv4,也有IPv6 - 首部长度:
占4位,表示IP首部总长度,最大值为15,单位是4字节(32位),意味着IP首部最大长度为15 × 4 = 60字节 - 服务类型
- 总长度:
占16位,表示IP数据报总长度(IP首部(4*首部长度) + IP数据),最大值为65535字节
IP数据最大长度比链路层MTU大很多,数据链路层会将IP数据报分片为多个数据帧发送
- 标识
占16位,协议内部具体所使用的 - 标志
占3位,只有两位有意义,标记当前IP报文是否可以分片 - 片偏移
占13位,当IP报文被分片时,片偏移记录的是当前数据帧是第几个偏移的IP数据报分片数据 - 生存时间TTL(Time to live)
占8位,表明IP数据报文在网络中的寿命,每经过一个设备,TTL减1,当TTL=0时,网络设备必须丢弃该报文
防止IP数据报找不到目标地址时,在网络中无限的传输。同时也代表该IP数据报要在有限跳发送到目标,否则将被丢弃
- 协议
占8位,表明IP数据所携带的数据具体是什么协议(如:TCP、UDP等)
协议名 ICMP IGMP IP TCP UDP OSPF … 协议字段值 1 2 4 6 17 89 …
- 首部校验和
占16位,校验IP首部是否有出错 - 源IP地址
- 目的IP地址
IP报文抓取分析:
IP协议的转发流程
逐跳(hop-by-hop):数据报文传输过程中每过一个节点称为一跳,IP报中的TTL值为报文最大可经过的跳数
路由表
路由表记录的是目的IP地址和下一跳IP地址的映射
目的IP地址 | 下一跳IP地址 |
---|---|
IP1 | IP4 |
IP2 | IP5 |
IP3 | IP6 |
… | … |
注意:映射的是下一跳IP地址,而不是目的IP地址
转发流程
- 只从网络层来看
A发出目的地址为C的IP数据报,查询路由表得到下一跳为E
A将数据报发送给E
E查询路由表发现下一跳为F,将数据报发送给F
F查询路由表发现目的地址C,直接连接发送数据报给C - 结合网络层和数据链路层来看
A发出目的地址为C的IP数据报,查询路由表得到下一跳为E
A将数据报交给数据链路层,并告知目的MAC地址是E
数据链路层填充源MAC地址和目的MAC地址E
数据链路层通过物理层将数据发送给E
E的数据链路层接收到数据帧,把帧数据交给网络层
E查询路由表,发现下一跳F
E把数据报交给数据链路层,并告知目的MAC地址为F
E的数据链路层封装数据帧并发送给F
F的数据链路层接收到数据帧,把帧数据交给网络层
F查询路由表,发现下一跳为C
F把数据报交给数据链路层,并告知目的MAC地址为C
F的数据链路层封装数据帧并发送
数据帧每一跳的MAC地址都在变化
IP数据报每一跳的IP地址始终不变
ICMP协议
一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。
所以我们就需要一种协议来协助IP协议完成这样的功能 – ICMP协议。
- ICMP是基于IP协议工作的,但是它并不是传输层的功能,因此仍然把它归结为网络层协议
- ICMP只能搭配IPv4使用,如果是IPv6的情况下, 需要是用ICMPv6
- ICMP报文作为IP报文数据去使用,对应IP首部协议字段值为1
ICMP功能
- 确认IP包是否成功到达目标地址
- 通知在发送过程中IP包被丢弃的原因
ICMP报文
ICMP报文包含在IP数据报中(见上面IP报文抓取案例)
格式
类型(8位) | 代码(8位) | 校验和(16位) |
ICMP报文数据(不同的类型和代码,内容不同) |
报文类型
ICMP报文种类 | TYPE | 描述 | CODE |
差错报告报文 | 3(终点不可达) | 网络不可达 | 0 |
主机不可达 | 1 | ||
5(重定向) | 对网络重定向 | 0 | |
对主机重定向 | 1 | ||
11 | 传输超时 | - | |
12 | 坏的IP头 | 0 | |
缺少其他必要参数 | 1 | ||
询问报文 | 0或8 | 8:表示请求0:表示回答 | -正常响应为0??? |
13或14时间戳请求 | 13:表示请求14:表示回答 | - | |
17或18地址码请求 | 17:表示请求18:表示回答 | - | |
10或9 | 路由检查通告一般指的是返回路由的状态信息 | - |
ICMP协议的应用
-
ping
type:0、8- Ping回环地址127.0.0.1
- Ping网关地址
- Ping远端地址
-
traceroute
type:3
探测IP数据报在网络中走过的路径
原理:
- 当前主机向目标IP发送若干个TTL递增的探测UDP包;
- 当UDP包到达某节点TTL耗尽时该节点会向源IP回应一个ICMP的差错报文(携带当前节点信息);
- 目标地址收到探测UDP包后,返回ICMP Port Unreachable(端口不可达)通知;
traceroute默认使用大于30000的目标端口,保证目标地址收到UDP报文后返回端口不可达的ICMP报文
- A获得B返回的ICMP Port Unreachable回应后得知B在链路上的位置,停止traceroute。
例:
上例抓取的数据包如下
ARP协议与RARP协议
ARP和RARP协议是TCP/IP协议栈里面基础的协议,ARP和RARP的操作对程序员是透明的,理解®ARP协议有助于理解网络分层的细节
ARP(Address Resolution Protocol)地址解析协议
ARP协议用于 将网络层IP32位地址映射为数据链路层MAC48位地址
ARP缓存表
ARP缓存表保存IP地址和MAC地址的映射关系
ARP缓存表是ARP协议和RARP协议运行的关键;
ARP缓存表缓存了IP地址到硬件地址之间的映射关系;
ARP缓存表存在生命周期TTL,缓存表记录并不是永久有效的,因为一个机器的IP地址是会变化的;
查看ARP缓存表
arp -a
ARP报文结构
ARP协议类型为0806,RARP协议类型为8035
用wireshark抓取的arp报文结构如下,注意以太网首部的帧类型和ARP首部的协议类型的值均为0806,即ARP
ARP首部最后的op字段用于记录ARP操作的类型,分别是:
- ARP请求,其值为1。
- ARP应答,其值为2。
- RARP请求,其值为3。
- RARP应答,其值为4。
ARP使用情景
1. 主机A与主机B通信,A Ping B,图1:A-交换机-B,AB同一子网
(1) ping数据包用的是ICMP协议,IP协议的一个子协议,位于三层,包含A的IP,B的IP,三层进行IP封装成包,进入二层
(2_1) A查询ARP表通过目的IP获取对应MAC地址,若查询不到看下面。
(2_2) 如果不存在B的MAC,A广播一个ARP请求(目标MAC地址为FF-FF-FF-FF-FF-FF,目的IP为B),B收到广播ARP请求后发现目的IP和自己吻合就会返回一个ARP应答,A收到B的ARP应答获得B的MAC地址后建立ARP表项。
(3) 将B的MAC地址作为数据帧的目标地址组装数据帧由链路层发送出去。
(4) 当再进行A与B之间数据包转发,将直接用B的MAC地址封装,数据转发得以高速交换
路由器似乎会维护ARP表?上面的描述应该是A通过交换机连接B的情况!我也不确定!!
2. 主机A与主机C通信,A Ping C,图:A-交换机-路由器M-路由器N-交换机-C,AC不同子网,处于不同网段
(1)A查询自己的路由表,C和自己不在同网段,则用网关MAC作为目标MAC封装数据帧由链路层发送给网关
(2)网关获得合法以太帧,接收以太帧后递交给IP层,
(3)网关查询路由表寻找MAC,若没找到MAC则广播ARP请求到C上,C回应ARP应答,网关维护C的ARP映射关系(这个细节感觉也不太对??)
(4)通过映射MAC组装数据帧发给C
疑问??
当前路由器的所有下一跳地址都不是目的IP地址,这时怎么办?
IP数据包传输的完整过程
ARP协议原理
演示:主机A:10.252.22.141 ping 主机B:10.252.23.22 的过程(A主机arp表中没有B的IP/MAC映射),主机A抓取的报文分析
- A主机ARP表中找不到BIP的映射,这时会广播ARP请求
- B收到广播后,返回给A的ARP响应报文
- A接收到B的ARP响应后建立ARP映射,可以发送ping数据包了(ICMP协议)
ICMP协议为IP协议的子协议,上面的报文解析也能看出来,也可详见上面IP协议报文内容分析
- B返回给A的ICMP响应
RARP(Reverse Address Resolution Protocol)逆地址解析协议
将MAC地址转换为IP32的协议,RARP的协议类型为8035,上面已介绍
RARP现在已很少使用了
IP地址的子网划分
IP地址的分类
- A类地址网络号为八位第一位必须是0
- B类地址网络号为16位,前两位必须为10
- C类地址网络号为24位,前三位必须为110
- D类地址,前四位为1110
- E类地址,前四位为1111
D和E类一般用于特殊用途
分类 最小网络号 最大网络号 子网数量 最小主机号 最大主机号 主机数量 A类地址 0(00000000) 127(01111111) 2 7 2^7 27 0.0.0 255.255.255 2 24 2^{24} 224 B类地址 128.0 191.255 2 14 2^{14} 214 0.0 255.255 2 16 2^{16} 216 C类地址 192.0.0 223.255.255 2 21 2^{21} 221 0 255 2 8 2^8 28
特殊的主机号(区分网络号)
- 主机号全为0表示当前网络段,不可分配为特定主机
- 主机号为全1,表示广播地址,向当前网络段所有主机发送消息
前面介绍的ARP请求广播的目标MAC地址位也全为1,即FF-FF-FF-FF-FF-FF
如1.2.3.4
为一个普通A类地址,1.0.0.0
表示网络号为1的网段,1.255.255.255
表示网络号为1网段的广播地址
特殊的网络号
- A类地址网络段为0表示特殊网络
- A类地址网络段为127,即网络段后七位为1(01111111),表示回环地址
- B类地址网络段其他位为0(10000000.00000000:128.0)是特殊地址,不可使用
- C类地址网络段192.0.0不可使用
基于上述特殊网络号和主机号,可以得到更准确的各类地址详情表格
分类 | 最小网络号 | 最大网络号 | 子网数量 | 最小主机号 | 最大主机号 | 主机数量 |
---|---|---|---|---|---|---|
A类地址 | 1 | 127(01111111) | 2 7 2^7 27-2 | 0.0.1 | 255.255.254 | 2 24 2^{24} 224-2 |
B类地址 | 128.1 | 191.255 | 2 14 2^{14} 214-1 | 0.1 | 255.254 | 2 16 2^{16} 216-2 |
C类地址 | 192.0.1 | 223.255.255 | 2 21 2^{21} 221-1 | 1 | 254 | 2 8 2^8 28-2 |
回环地址
127.0.0.1,通常被成为本地回环地址(Loopback Address),不属于任何一个有类别地址类。它代表设备的本地虚拟接口,所以默认被看作是永远不会宕掉的接口。
安装网卡前就可以ping通这个本地回环地址,一般都会用来检查本地网络协议、基本数据接口等是否正常
划分子网
划分子网可以节省IP资源
划分子网时,网络号组成被分为三个部分,网络号、子网号、主机号
例如将一个C类地址192.10.10.0
分为两个子网
子网掩码
子网掩码用于表示某个IP号中网络号和子网号的所占的位数;
子网掩码和IP一样,都是32位;由连续的1和连续的0组成;
连续的1表示目标IP的对应位为子网号
A、B、C类网络号的子网掩码就是对应网络号位数的1和主机号位数的0组成,如下
上文例中C类地址192.10.10.0
分为两个子网,其子网掩码如下:
IP域掩码进行与运算,就得到子网号
无分类编制CIDR
- CIDR中没有A、B、C类网络号和子网划分的概念
- CIDR将网络前缀相同的IP地址称为一个CIDR地址块
- 网络前缀是任意位数的
斜线记法
格式:IP/子网掩码位数
如:193.10.10.129/25
表示的IP及掩码如下
CIDR前缀长度 | 掩码点分十进制 | 地址数 |
---|---|---|
/13 | 255.248.0.0 | 512K |
/14 | 255.252.0.0 | 256K |
/15 | 255.254.0.0 | 128K |
/16 | 255.255.0.0 | 64K |
/17 | 255.255.128.0 | 32K |
/18 | 255.255.192.0 | 16K |
/19 | 255.255.224.0 | 8K |
子网和超网
网络地址转换 - NAT技术
IPv4最多只有40亿+个IP地址,早期的IP地址的不合理规划导致大量IP号浪费,导致IP号不够使用,NAT技术用来解决IP号不够用的问题
概念
- NAT
Network Address Translation,网络地址转换,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术,如下图所示。因此我们可以认为,NAT在一定程度上,能够有效的解决公网地址不足的问题。
NAT就是在局域网内部网络中使用内部地址,而当内部节点要与外部网络进行通讯时,就在网关(可以理解为出口,打个比方就像院子的门一样)处,将内部地址替换成公用地址,从而在外部公网(internet)上正常使用。 - 公有IP地址
也叫全局地址,是指合法的IP地址,它是由NIC(网络信息中心)或者ISP(网络服务提供商)分配的地址,对外代表一个或多个内部局部地址,是全球统一的可寻 址的地址。 - 私有IP地址
也叫内部地址,属于非注册地址,专门为组织机构内部使用。因特网分配编号委员会(IANA)保留了3块IP地址做为私有IP地址:
10.0.0.0 ——— 10.255.255.255
172.16.0.0——— 172.16.255.255
192.168.0.0———192.168.255.255
- 端口号
进程和外部网络进行交互时的入口 - NA(P)T表
内网IP:端口和外网IP:端口的映射关系表
分类
- 静态NAT(Static NAT)
- 动态地址NAT(Pooled NAT)
- 网络地址端口转换NAPT(Port-level NAT)
- 源NAT(Source NAT,SNAT)
修改数据包的源地址。源NAT改变第一个数据包的来源地址,它永远会在数据包发送到网络之前完成,数据包伪装就是一具SNAT的例子。 - 目的NAT(Destination NAT,DNAT)
修改数据包的目的地址。Destination NAT刚好与SNAT相反,它是改变第一个数据包的目的地地址,如平衡负载、端口转发和透明代理就是属于DNAT。
- 源NAT(Source NAT,SNAT)
TODO 这个NAT介绍的也太简单了?????待补充
网络资料:
NAT技术基本原理与应用