Internet Protocol
互联网中的网络层
主机、路由器中的网络层功能
IP数据报格式
项目 | 说明 |
---|---|
ver | 版本号,如Ipv4就是0100 |
head len | 头部的长度,一般头部是20个字节(也就是上图中的5行),但是也有可选项,也就是头部是变长的,因此可以使用head len来计算可选项 |
type of service | 数据段的类型,本来为输出队列的调度机制提供参考的,但后来废弃了 |
length | 数据报总厂 |
16-bit的id,flags fragment offset | 后面的分片/重组 |
time to live(TTL) | 可用以ICMP协议 |
upper layer | 将负载交给的上层协议,比如说TCP,还是UDP,还是ICMP,实际上是根据端口号区分的 |
Internet checksum | 校验头部的 |
IP分片和重组
- 网络链路有MTU (最大传输单元) –链路层帧所携带的最大数据长度
- 不同的链路类型
- 不同的MTU
- 大的IP数据报在网络上被分片 (“fragmented”)
- 一个数据报被分割成若干个小 的数据报
- 相同的ID
- 不同的偏移量
- 最后一个分片标记为0
- “重组”只在最终的目标主机进行:减少路由器的负担,要是每个路由器都重组再分片压力太大
- IP头部的信息被用于标识,排序相关分片
- 一个数据报被分割成若干个小 的数据报
例子:
- (接受到了)4000 字节数据报:
- 20字节头部
- 3980字节数据
- MTU = 1500 bytes
- 第一片:20字节头部+1480字节数据;偏移量:0
- 第二片:20字节头部+1480字节数据(1480字节应用数据);偏移量:1480/8=185
- 第三片:20字节头部+1020字节数据(应用数据);偏移量:2960/8=370
IP编址:引论
- IP地址: 32位标示,对主机或者路由器的接口编址
-
接口: 主机/路由器和物 理链路的连接处
- 路由器通常拥有多个接口
- 主机也有可能有多个接口
- IP地址和每一个接口关联
- 一个IP地址和一个接口相关联
子网
- IP地址:
- 子网部分(高位bits)
- 主机部分(低位bits)
- 什么是子网?
- 一个子网内的节点(主 机或者路由器)它们的IP地址的高位部分相同 ,这些节点构成的网络的一部分叫做子网
- 子网内节点的分组的收发无需路由器介入(借助交换机即可),子网内各主机可以在物理上相互直接到达 ——只需要交换机即可,一跳可达
划分子网方法
- 要判断一个子网, 将每一个接口从主机或者路由 器上分开,构成了一个个网络的孤岛
- 每一个孤岛(网络)都 是一个都可以被称之为 subnet.
IP地址类型
IP地址分类
特殊IP地址
- 一些约定:
- 子网(网络)部分全为0,表示本网络
- 主机部分全为0,表示本主机
- 主机部分全为1表示,广播地址,这个网络的所有主机
- 除了前面的类号 全为1——在本地网络广播
内网(专用)IP地址
- 专用地址:地址空间的一部份供专用地址使用
- 永远不会被当做公用地址来分配, 不会与公用地址重复
- 只在局部网络中有意义,区分不同的设备
- 路由器不对目标地址是专用地址的分组进行转发
- 专用地址范围
IP类型 | 专用地址范围 | MASK |
---|---|---|
A类 | 10.0.0.0-10.255.255.255 | 255.0.0.0 |
B类 | 172.16.0.0-172.31.255.255 | 255.255.0.0 |
C类 | 192.168.0.0-192.168.255.255 | 255.255.255.0 |
CIDR(无类域间路由)
- 子网部分可以在任意的位置(而不必是固定的位置)
- 地址格式: a.b.c.d/x, 其中 x 是 地址中子网号的长度
实例:
转发表和转发算法
Destination Subnet Num | Mask | Next hop | Interface |
---|---|---|---|
202.38.73.0 | 255.255.255.192 | IPx | Lan1 |
202.38.64.0 | 255.255.255.192 | IPy | Lan2 |
… | |||
Default | IPz | Lan0 |
- 获得IP数据报的目标地址IP Des addr
- 遍历转发表中的每一个表项
- 如 (IP Des addr) & (mask) == destination, 则按照表项 对应的接口转发该数据报
- 如果都没有找到,则使用默认表项转发数据报,一般是整个网络的出口 default Gateway
如何获得一个IP地址
- 系统管理员将地址配置在一个文件中
- Wintel: control-panel->network- >configuration->tcp/ip->properties
- UNIX: /etc/rc.config
- DHCP:从服务器中动态获取一个IP地址
- “plug-and-play”
DHCP: Dynamic Host Configuration Protocol
目标:
- 允许主机在加入网络的时候,动态地从服务器那里获得IP地址
- 可以更新对主机在用IP地址的租用期-租期快到了
- 重新启动时,允许重新使用以前用过的IP地址
- 支持移动用户加入到该网络(短期在网)
DHCP工作概况:
阶段 | 含义 | 源地址 | 目标地址 |
---|---|---|---|
主机上限时广播“DHCP discover”报文 | 问一下有活着的DHCP服务器吗 | 0.0.0.0,32全0的本机地址,因为此时还没有分配ip地址 | 255.255.255.255,(32位全1的广播地址,因为不知道DHCP服务在哪) |
DHCP服务器用“DHCP offer”单播提供报文响应 | DHCP服务器表明自己的存在;并且包含分配给主机的关于ip的配套信息(包括那四项) | DHCP服务器的地址 | 255.255.255.255,也是全局广播,根据事务号来区分 |
主机单播请求IP地址:发送“DHCP request”报文 | 主机向DHCP服务器确定ip配置信息 | 0.0.0.0,也是表示自己的地址 | 255.255.255.255,也是广播 |
DHCP服务器发送地址:“DHCP ack”报文 | DHCP把配置信息给主机 | DHCP服务器的地址 | 255.255.255.255,广播 |
示例:
机构获取ip子网部分
假设某个学校,有八个校区,要获取ip子网
- 首先从ISP获取大的网络,ISP’s block 11001000 00010111 00010000 00000000 200.23.16.0/20
- 然后再划分,由于有8个校区,也就是要划分成8个部分,用原有的20位后面的3位来表示子网,从而进行划分
ISP获取地址块
Q:一个ISP如何获得一个地址块?
A:向ICANN申请
- 分配地址
- 管理DNS
- 分配域名,解决冲突
IP层次编址/路由聚集
路由聚集
最长精确匹配
NAT: 网络地址转换
原理
特点:本地网络只有一个有效IP地址
NAT 路由器必须:
- 外出数据包:替换源地址:端口号为 NAT的IP地址:新的端口号,目标IP和端口不变;远端的C/S将会用NAP IP地址,新端口号作为目标地址
- 记住每个转换替换对(映射)(在NAT转换表中)源IP:端口 vs NAP IP:新端口
- 进入数据包:替换目标IP地址和端口号,采用存储在NAT表中的mapping表项,用(源IP,端口)
流程
优点
省钱:不需要从ISP分配一块地址,可用一个IP地址用于所有的(局域网)设备
可以在局域网改变设备的地址情况下而无须通知外界
可以改变ISP(地址变化)而不需要改变内部的设备地址
安全:局域网内部的设备没有明确的地址,对外是不可见的
NAT的争议和问题
NAT能够篡改接受的分组的端口信息
- 路由器只应该对第3层做信息处理,而这里对端口号(4层)作了处理
- 违反了end-to-end 原则
- 端到端原则:复杂性放到网络边缘
- 无需借助中转和变换,就可以直接传送到目标主机
- NAT可能要被一些应用设计者考虑, eg, P2P applications
- 外网的机器无法主动连接到内网的机器上
- 端到端原则:复杂性放到网络边缘
- 问题,NAT穿越: 如果客户端需要连接在NAT后面的服务器,如何操作
地址短缺问题可以被IPv6 解决(因为NAT一开始解决的就是地址短缺的问题)
NAT 穿越问题
客户端需要连接地址为 10.0.0.1的服务器
- 服务器地址10.0.0.1 LAN本地地址 (客户端不能够使用其作为目标地址)
- 整网只有一个外部可见地址: 138.76.29.7
静态配置NAT
方案1: 静态配置NAT:转发 进来的对服务器特定端口连接 请求
- (123.76.29.7, port 2500) 总是转发到10.0.0.1 port 25000
IGD/UPnP
方案2: Universal Plug and Play (UPnP) Internet Gateway Device (IGD) 协议. 允许 NATted主机可以: 动态分配端口
- 获知网络的公共 IP地址 (138.76.29.7)
- 列举存在的端口映射
- 增/删端口映射 (在租用时间内)
中继
方案3:中继(used in Skype)
IPV6协议
目的
- 初始动机: 32-bit地址空间将会被很快用完,为了增加地址数量
- 另外的动机:
- 改变头部格式,帮助加速处理和转发
- TTL-1(之前的ICPM协议每次都要TTL-2)
- 头部checksum (之前都会校验头部)
- 分片 (当MTU小于分组的时候,要分片)
- 头部格式改变帮助QoS
- 改变头部格式,帮助加速处理和转发
IPV6数据报
IPv6 数据报格式:
- 固定的40字节头部
- IP地址由原先的32位改成了128位(16个字节)
- 数据报传输过程中,不允许分片
IPV6头部
- Priority: 标示流中数据报的优先级(优先级是与非技术方面结合的,比如收费等)
- Flow Label: 标示多个数据报在一个“flow” ( “flow”的概念没有被严格的定义)
- Next header: 标示上层协议(就是网络层以上传给哪个协议,TCP/UDP)
和IPv4的其它变化
- Checksum: 被移除掉,降低在每一段中的处理 速度
- Options: 允许,但是在头部之外, 被 “Next Header” 字段标示 (Next Header的格式是TLV type-length-value)
-
ICMPv6: ICMP的新版本
- 附加了报文类型, e.g. “Packet Too Big”
- 多播组管理功能
从IPv4到IPv6的过渡:隧道
隧道: 在IPv4路由器之间传输的IPv4数据报中携带IPv6数据报
IPv6的应用
- Google: 8% 的客户通过IPv6访问谷歌服务(当然现在还在增加)
- NIST: 全美国1/3的*域支持IPv6
- 估计还需要很长时间进行部署 (20年)