CIDR
无类域间路由 Classless InterDomain Routing。
把 NetID 和 SubID 统一使用 NEwork Prefix 表示,可以任意长度。a.b.c.d/x
x 为前缀长度。
- 消除了传统的 A 类、B 类和 C 类地址界限
- 融合子网地址与子网掩码,方便子网划分
- 提高 IPv4 地址空间分配效率
- 提高路由效率
- 将多个子网聚合为一个较大的子网
- 构造超网(supernetting)
- 路由聚合(route aggregation)
- 如果地址不连续就会造成路由黑洞
DHCP
主机如何获得 IP 地址
静态配置,硬编码
默认网关:当一个子网内的数据报要离开子网时,应该发送到哪个接口上进行转发。
动态配置 DHCP
Dynamic Host Configuration Protocol 。
- 从服务器动态获取
- IP 地址
- 子网掩码
- 默认网关
- DNS 服务器名称与 IP 地址
- 即插即用
- 允许地址重用 (一个主机离开网络,IP 可以分给别的主机)
- 支持在用地址续租
- 支持移动用户加入网络
报文:
- 主机广播 DHCP discover 发现报文
- DHCP 服务器利用 DHCP offer 提供报文进行响应
- 主机广播请求 IP 地址 DHCP request 请求报文
- DHCP 服务器分配 IP 地址 DHCP ack 确认报文
第二次广播告诉其他 DHCP 服务器已经有服务器为我分配地址了,如果你们已经分配了地址就可以收回。
DHCP工作流程
DHCP 协议在应用层实现
- 请求报文封装到 UDP 数据报中
- IP 广播
- 链路层广播
DHCP 服务器构造 ACK 报文
- 包括分配给客户的 IP 地址、子网掩码、默认网关、DNS服务器地址
NAT
网络地址转换。
动机
- 只需/能从 ISP 申请一个 IP 地址
- IPv4 地址耗尽
- 本地网络设备 IP 地址的变更,无需通告外界网络
- 变更 ISP 时,无需修改内部网络设备 IP 地址
- 内部网络设备对外界网络不可见,即不可直接寻址(安全)
实现
- 替换:利用(NAT IP 地址,新端口号)替换每个外出 IP 数据报的(源 IP 地址,源端口号)
- 记录:将每对(NAT IP 地址,新端口号)与(源 IP 地址,源端口号)的替换信息存储到 NAT 转换表中
- 替换:根据 NAT 转换表,利用(源 IP 地址,源端口号)替换每个进入内网 IP 数据报的(目的 IP 地址,目的端口号),即(NAT IP 地址,新端口号)
16 bit端口号字段可以同时支持 6W 多并行连接,一般没问题。
争议
- 路由器应该只处理第三层功能,不应该去处理传输层的端口号字段,违背了层次关系
- 违背端到端通信原则:应用开发者必须考虑到 NAT 的存在,如 P2P 应用
- 地址短缺问题应该由 IPv6 来解决
NAT 穿透/打洞
方案一 静态配置
静态配置 NAT,将特定端口的请求转发给服务器
方案二 IGD 协议
利用 UPnP(Universal Plug and play)互联网网关设备协议(IGD-Internet Gateway Device)自动配置学习到 NAT 公共 IP 地址,在 NAT
抓换表中,增删端口号映射。
方案三 中继 relay
如 Skype
- NAT 内部的客户与中继服务器建立连接
- 外部客户也与中继服务器建立连接
- 中继服务器桥接两个连接的分组
ICMP
Internet Control Message Protocol
ICMP 功能
支持主机或路由器完成
- 差错(或异常)报告
- 网络探询
两类 ICMP 报文
- 差错报告报文(5种)
- 目的不可达
- 源抑制(Source Quench)(缓存已满,希望源主机降低发送速率)
- 超时/超期 (TTL)
- 参数问题 IP 协议头参数设置错误
- 重定向(Redirect)路由器发现报文中目的 IP 不应该由自己转发,而通过别的路由器转发
- 网络探询报文(2组)
- 回声(Echo)请求与应答报文(Reply)ping
- 时间戳请求与应答报文 (NTP?)
例外情况
几种不发送 ICMP 差错报告报文的特殊情况
- 对 ICMP 差错报告报文不再发送 ICMP 差错报告报文
- 除第一个 IP 数据报分片外,对所有后续分片均不发送 ICMP 差错报告报文
- 对所有多播 IP 数据报均不发送 ICMP 差错报告报文
- 对具有特殊地址(如127.0.0.0 或 0.0.0.0)的 IP 数据报不发送 ICMP 差错报告报文
不再使用的
早期定义的
- 信息请求与应答报文
- 子网掩码请求和应答报文
- 路由器询问和通告报文
报文格式
ICMP 报文封装到 IP 数据报中传输
ICMP 差错报告报文数据部分的封装
Traceroute
1.源主机向目的主机发送一系列 UDP 数据报
- 第1组 IP 数据报 TTL=1
- 第2组 IP 数据报 TTL=2 etc
- 目的端口号为不可能使用的端口号
- 当第 n 组数据报(TTL=n)到达第 n 个路由器时
- 路由器丢弃数据报
- 向源主机发送 ICMP 报文(type=11,code=0)
- ICMP 报文携带路由器名称和 IP 地址信息
- 当 ICMP 报文返回到源主机时记录 RTT
- 停止准则
- UDP数据报最终到达目的主机
- 目的主机返回目的端口不可达 ICMP 报文
- 源主机停止
短期内的探测,路由表信息不会很快更新。
IPv6
动机
- 32位 IPv4 地址空间已分配殆尽
- 改进首部格式
- 快速处理/转发数据报
- 支持 QoS
数据报格式
- 固定长度的40字节基本首部
- 不允许(路由器)分片,由主机分片,目的主机重组
路由器不需要处理扩展首部,只需要处理固定40字节的首部。
优先级 priority
标识数据报的优先级,QoS,为了区分不同的数据报。
流标签 Flow Label
标识同一流中的数据报,还在讨论中。
下一个首部 next header
标识下一个选项首部或上层协议首部(TCP首部)
跳步限制 TTL
VS IPv4
- 校验和(checksum)彻底移除,以减少每跳处理时间
- 选项(options),允许,但是从基本首部移出,定义多个选项首部,通过下一个首部字段指示
- ICMPv6:新版本 ICMP
- 附加报文类型,比如 Packet Too Big,因为 IPv6 不分片,如果数据报太大会向源主机发送该 ICMPv6 报文,由源主机决定是否分片;
- 多播组管理功能;
地址表示形式
128 位按 16 bit 一组划分 8 组 16 进制数用:
连接。
压缩形式
由于 IPv6 地址空间很大,有些地址中有很多0,所以采用压缩格式书写:FF01:0:0:0:0:0:0:43
压缩为 FF01::43
。
IPv4 嵌入形式
IPv4 和 IPv6 会共存一段时间,为了兼容 IPv4,把前 80 个 bit 固定为 0,接下来 16 bit 为 1,剩下的 32 位写成点分十进制。
0:0:0:0:0:FFFF:192.168.68.2
或 ::FFFF:192.168.68.2
地址前缀
2002:43c:476b::/48
IPv6不再使用子网掩码,使用 CIDR。
URLs
冒号会出现歧义,用中括号包起来:http://[3FFE::1:800:200C:417A]:8000
IPv6 基本地址类型
单播 unicast
一对一通信,地址能出现在发送和接收端。
多播 multicast
一对多通信,地址只能出现在接收端,没有广播地址,广播被定义为特殊的多播。
任意播 anycast
一对一组之一(最近一个通信),数据报会被送到其中之一。
Ipv4 过度 IPv6
不可能在某个时刻所有路由器同时被更新为 IPv6,不会有标志性日期,也做不到。
IPv4 和 IPv6 路由器共存的网络如何运行?
隧道 tunneling
IPv6 数据报在传输过程中经过 IPv4 网络时,把 IPv6 数据报作为 IPv4 数据报的载荷进行封装,穿越 IPv4 网络。