网络层(二)
IP
IPv4编址
32位,提供$2^{32}$个地址(约40亿)
接口:主机和物理链路之间的边界(主机通常一个或两个,路由器多个接口)
采用点分十进制
子网:具有IP地址相同子网部分(子网位)的设备接口,可以物理上不经过路由器到达对方
6个子网
233.1.1.0/24:/24为子网掩码(表示前24位为1,其余为0)
重点
根据一个IP地址和子网掩码计算
- 子网的网络地址(network address)
- 子网的广播地址(broadcast address)
- 子网中的主机地址范围
- 子网中有几台主机?
当一个主机发送一个带有目的地址为广播地址的数据报,消息被送往所有在同一个子网中的所有主机
1.IP和子网掩码换算为二进制,子网掩码为1的部分为地址的网络部分,为0的部分为地址的主机部分
2.IP地址和子网掩码与运算,结果为网络地址
3.网络地址网络部分不变,主机部分变为全1,结果为广播地址
4.网络地址+1为第一个主机地址,广播地址-1为最后一个主机地址,主机地址范围为网络地址+1~广播地址-1
5.主机数量等于$2^{主机位数}-2$(不包括网络地址和广播地址)
例题
CIDR(classless interdomain routing):无类别域间路由选择——因特网的地址分配策略
地址格式:a,b,c,d/x,x构成了IP地址的网络部分,改地址的前缀
一个组织通常被分配一块连续的地址,即具有相同前缀的一段地址,路由器只考虑前缀进行转发,大大减少了在路由器中转发表的长度
分类编址:IP地址的网络部分被限制为长度为8、16、24比特(实际上有5类)
- C类:24,仅能容纳2^8-2=254台主机,对许多组织来说太少了
- B类:16,能容纳2^16-2=65534台主机,又太多了
为节省可分配的注册IP地址,由一组IP地址被拿出来专门用于私有IP网络,称为私有IP地址
- A类:10.0.0.0~10.255.255.255即10.0.0.0/8
- B类:172.16.0.0~172.31.255.255即172.16.0.0/12
- C类:192.168.70.0~192.168.255.255即192.168.0.0/16
这些地址不会被Internet分配,也不会被路由。尽管不能直接和Internet相连,但通过NAT仍可以和internet通信
一些特殊的IP地址
- 0.0.0.0:保留地址,表示“本网络”的“本主机”(启动设备时又不知道自己的IP情况下)
- 255.255.255.255:受限广播地址,只能在本网络上进行广播(各个路由器均不转发)
IP主机字段全为1,称为直接广播地址,被发送到该网络号的每台主机,路由器可转发
- 127.0.0.1:环回地址(loopback address),一般用来作为本地软件环回测试,本主机的进程之间通信
地址/路由聚合 | 使用单个网络前缀通告多个网络的能力
采用最长前缀匹配,组织1将选择ISPs-R-Us的路由
ICANN:(Internet Corporation for Assigned Names and Numbers,互联网名称与数字地址分配机构)负责
- 分配IP地址块(给ISP)
- 管理DNS根服务器
- 分配域名,解决域名纷争
DHCP
Dynamic Host Configuration Protocol(动态主机配置协议),基于UDP,属于应用层协议
- 主机自动获取一个IP地址
- 允许主机知道子网掩码、第一跳路由器地址(默认网关default gateway)、本地DNS服务器地址
- 即插即用协议(plug-and-play)
步骤
- DHCP服务器发现:客户在UDP分组中向端口67发送DHCP发现报文,使用广播目的地址255.255.2552.255和本主机源地址0.0.0.0
- DHCP服务器提供:DHCP服务器收到一个DHCP发现报文时,用一个DHCP提供报文向客户作出响应,仍使用广播地址,目的端口68,报文中包含发现报文的事务ID、向客户推荐的IP地址、网络掩码、IP地址租用期(address lease time,即IP地址有效期)
- DHCP请求:新到达的客户从一个或多个服务器中选一个,向选中的服务器提供一个DHCP请求报文进行响应
- DHCP ACK:服务器发送DHCP ACK报文
总结DHCP客户-服务器交互过程
- 整个过程中,DHCP客户端源IP地址均为0.0.0.0
- 整个过程中,DHCP客户端和服务端目标IP地址均为255.255.255.255
- yiadrr除第一次DHCP客户端请求时为空,后面三个阶段地址为服务器分配和客户端希望使用的IP地址
- 客户端一般使用UDP 68端口,服务端一般使用UDP 67端口
NAT
network address translation(网络地址转换):子网越来越多,设备需要的IP不够用
特点
- 只需一个IP地址给所有设备
- 可以改变局域网内的设备地址而不需要告诉外界
- 可以改变ISP而不用改变局域网内设备的地址
- 局域网内的设备无法显式寻址,NAT使能路由器对外界隐藏了网络的细节(增强安全)
NAT路由器需要做的
- 出去的数据报需要替换 (source IP address, port #) 为(NAT IP address, new port #),回来的数据报会以这个新的IP地址、端口对作为目标地址
- 在NAT转换表中记录下每个WAN (NAT IP address, new port #)和LAN (source IP address, port #) ,WAN的端口为当前未在NAT转换表中的源端口号
- 回来的数据报需要查找转换表,并替换(NAT IP address, new port #) 为 (source IP address, port #)
如图为一个NAT转换的案例
一个单独的LAN地址可以支持多少个连接?
协议×源地址×源端口×目的地址×目的端口 = $2\times1\times2^{16}\times2^{32}\times2^{16}=2^{65}$个连接
NAT的争议:
- 端口号适用于进程编址的,不应该用于主机编址
- 路由器仅应当处理高达第三层的分组
- NAT协议违反了所谓端到端原则,即主机彼此应相互直接对话,结点不应介入修改IP地址和端口号
- 应该使用IPv6来解决地址耗尽问题而不是打补丁(笑死,我们老师说他大学的时候IPv6都已经开始搞了,到现在了还没有看到IPv6完全替代的迹象,属于成效很低了)
NAT穿透
最好的描述就是图片,如图一个客户想要访问一个子网下的一个地址,但是只能看到它的NAT路由地址
解决方案:
法一:静态指定端口联系,eg:以上图为例,一个客户永远通过138.76.29.7的5000端口联系10.0.0.1
法二:UPnP(通用即插即用,Universal Plug and Play),允许主机发现并配置邻近NAT的协议,能够增加或移除端口映射
法三:中继
ICMP
因特网控制报文协议:提供差错报告(“目的网络不可达”)、响应请求(ping)
属于IP之上(ICMP报文承载在IP分组中,就像TCP/UDP作为IP有效承载)
ICMP报文包含:一个类型字段、一个编码字段、引起该ICMP报文首次生成的IP数据报的首部和前8字节内容(以便发送方能确定引发该差错的数据报)
报文类型如下
Traceroute程序允许跟踪从一台主机到世界上任意一台其他主机之间的路由,使用ICMP实现。源主机发送一系列IP数据报,这些数据报的每个都携带了一个不可达UDP端口号的UDP报文段,第一个数据报TTL为1,第二个为2,源主机为每个数据报启动定时器,当第n个数据报到达第n台路由器时,TTL正好过期,路由器丢弃该数据报并发送一个ICMP告警报文给源主机(类型11编码0),报文包含了路由器的名字和IP地址。ICMP报文返回源主机时,主机得到往返时延和第n台路由器的名字和IP地址
IPv6
IPv6数据报格式
对比IPv4特点
- 扩大的地址容量
- 简化高效的40字节首部(头部长度固定)
- 流标签与优先级
- 结构更简单、更高效(部分IPv4字段被舍弃或作为选项,首部无检验和、分片、选项)
IPv6字段
- 版本:字段值为6(4bit)
- 流量类型:类似IPv4中的TOS字段(8bit)
- 流标签:用于标识一条数据报的流(20bit)
- 有效载荷长度:IPv6数据报中跟在定长的40字节数据报首部后面的字节数量(16bit)
- 源地址和目的地址:128bit
ICMPv6增加了“分组太大”的类型和“未识别的IPv6选项”错误编码;包含了IGMP
从IPv4到IPv6
迁移方法:双栈和隧道
双栈(dual-stack):使用该方法的IPv6结点还具有完整的IPv4实现,有发送和接收IPv4和IPv6两种数据报的能力,方法存在问题
当IPv6传输给IPv4后,部分字段被去除,从IPv4再传输给IPv6时会出现字段丢失,如图中A传输往F
隧道(tunneling):可将整个IPv6数据报放入一个IPv4数据报的数据(有效载荷)字段中
相当于忽略了IPv6之间传输时,将中间的IPv4都看作了隧道,始终传输的都携带有IPv6的数据报