Internet Protocol
IP: Internet Protocol
互联网中的网络层
主机,路由器中的网络层功能:
ip协议主要规定了 数据平面的转发功能
ICMP协议:
- 对于网络的信号,报错等的规定
- 路由器信令。
**ping应用程序的的本质: **
- 形成ICMP分组, 发给目标节点
- 目标节点反转回来形成ping的request的对应的respose
- 然后就可以知道目标ip是活跃的。
ip数据报格式
头部是可变长的,20字节的固定长度+ 选项部分
IP数据报的载荷部分(body): 也就是数据部分。
16bit identifier: id表示 ; flgs ;fragment offset; 中间这三个字段是分片用的
ttl(time to live):最大剩余段数,每经过一个路由器减一。
upper layer :将载荷部分交给上层的哪个协议(TCP/)
Internet CheckSum : 校验和 ,校验数据报的头部
Options 经过路由器的时候,交换节点会将option打在ip之中
分片和重组
** 网络链路有MTU (最大传输单元) -链路层帧所携带的最大数据长度 **
- 不同的链路类型
- 不同的MTU
** 大的IP数据报在网络上被分片 (“fragmented”) **
一个数据报超过了最大载荷量(1500bit) 所以就需要进行分片传输, 按照不同的id、偏移量等等
- 一个数据报被分割成若干个小 的数据报
- 相同的ID
- 不同的偏移量
- 最后一个分片标记为0
- ** “重组”只在最终的目标主机 进行 (最后到了目标主机,就会重组之前切分的部分)**
- **IP头部的信息被用于标识,排序相关分片 **
分片的细节:
例子 : 4000 字节数据报 有20字节头部 、 3980字节数据
** MTU = 1500 bytes **
- 第一片:20字节头部+1480字 节数据 【 偏移量:0 】
- 第二片:20字节头部+1480字 节数据(1480字节应用数据) 【 偏移量:1480/8=185 】
- 第三片:20字节头部+1020字 节数据(应用数据) 【 偏移量:2960/8=370 】
路由器将每片都当成独立的分组进行转发, 最后所有的信息都到目标主机, ,到了目标主机之后就会进行重组(根据数据报的头部, 及其偏移量进行排序重组 ; fragflag=0就是最后一片)
IPv4地址
**IP地址: 32位标示(对设备进行标识),对主机或者路由器的接口 编址 **
接口: 主机/路由器和物理链路的连接处(223.1.3.27)
- 路由器通常拥有多个接口 (多个路由器之间进行转发)
- 主机也有可能有多个接口(多个网卡进行虚拟ip转发)
- IP地址和每一个接口关联
** 一个IP地址和一个接口相关联 ,一个接口(接口)和多个IP相连**
子网
什么是子网(subnet) ?
一个子网内的节点(主 机或者路由器)它们的** IP地址的高位部分相同 **,这些节点构成的网络 的一部分叫做子网
**无需路由器介入,子网 内各主机可以在物理上 相互直接到达 **【在一个子网的内部,ip之间是一跳可达的。(具体的在链路层实现)】
包括三个子网网络
**IP地址: **
- **子网部分(高位bits) **
- **主机部分(地位bits) **
判断是否为子网的方法:
- 要判断一个子网, 将每一个接口从主机或者路由器上分开,构成了一个个网络的孤岛
- **每一个孤岛(网络)都是一个都可以被称之为subnet(子网). **
子网掩码:11111111 11111111 11111111 00000000
Subnet mask: /24
图中有6个子网
子网孤岛: 几个主机构成的一个网络孤岛(相当于欧盟,对外就是一个整体),网络的传输跳过了路由器。
IP地址分类
- Class A:126 networks ,16 million hosts
- Class B:16382networks ,64 K hosts
- Class C:2 million networks ,254 host
- Class D:multicast
- Class E:reserved for future
以A类为例解释:
地址的最高位为0;第一个字节的其他七个bit代表网络号 ; 后面三个字节的24个bit代表主机号
A类地址一共2的7次方 - 2= 126个网络(减少的2个是全0 和全1 的网络号不用)。每个网络有2的24次方 - 2 个主机。
同理 B类网络有 2的14次方 - 2 ; 主机有 2的16次方 -2
依次类比
C类IP地址有 200多万个网络, 一般我们获取到网络都是C类地址网络。(A、B类的都被分配完了)
D类部分是组波(具体有点不太明白,但是就是)
E类都是预留的
特殊IP地址:
一些约定:
- 子网部分: 全为 0—本网络
- 主机部分: 全为0—本主机
- 主机部分: 全为1–广播地址,这个网络的所有 主机
所以全0 和 全1不被分配
**特殊IP地址: **
内网(专用)IP地址
专用地址:地址空间的一部份供专用地址使用
永远不会被当做公用地址来分配, 不会与公用地址重复
只在局部网络中有意义,区分不同的设备
路由器不对目标地址是专用地址的分组进行转发
**专用地址范围 **
- Class A 10.0.0.0-10.255.255.255 MASK 255.0.0.0
- Class B 172.16.0.0-172.31.255.255 MASK 255.255.0.0
- Class C 192.168.0.0-192.168.255.255 MASK 255.255.255.0
IP 编址: CIDR&& 子网掩码
** CIDR: Classless InterDomain Routing(无类域间路由) **
- 子网部分可以在任意的位置
- **地址格式: a.b.c.d/x, 其中 x 是 地址中子网号的长度 **
可以自己分配机构的子网掩码
子网掩码(subnet mask)
** 32bits , 0 or 1 in each bit **
- 1: bit位置表示子网部分 (代表网络号部分)
- 0:bit位置表示主机部分(代表主机号部分)
原始的A、B、C类网络的子网掩码分别是
- A类:255.0.0.0 :11111111 00000000 0000000 00000000
- B类:255.255.0.0:11111111 11111111 0000000 00000000
- C类:255.255.255.0:11111111 11111111 11111111 00000000
** CIDR下的子网掩码例子:11111111 11111111 11111100 00000000
** 另外的一种表示子网掩码的表达方式 : /#
例:/22:表示前面22个bit为子网部分
转发表和转发算法
图中的端口改为接口
**获得IP数据报的目标地址(IP DesAddress) **
**对于转发表中的每一个表项 **
- 如 (IP Des addr) & (mask)== destination 得到的是网号, 则按照表项对应的接口匹配并 转发该数据报
- 如果都没有找到,则使用默认表项转发数据报
如何获得一个IP地址
主机如何获得一个IP地址?
系统管理员将地址配置在一个文件中
Wintel: control-panel->network- >configuration->tcp/ip->properties
UNIX: /etc/rc.config
** DHCP: Dynamic Host Configuration Protocol: 从服务器中动态获得一个IP地址 **
“plug-and-play”—> 动态主机配置协议
**对于一个机构(ISP)怎么获取IP地址 ? **
- 首先某个机构会获取相对的一大块ip地址(前面若干位为网络号;后面的为主机号)
- 就假设前20位为网络号, 后面的12位为主机号
- 将后面的12位进行分割范围【前3位再表示网络号;后9位表示子网号】
- 这样就有23位为网络号。 9位子网号。 然后再对9位进行分割
- 分成2位为网络号,7为子网号
- …..
- 按照这样进行无限的套娃, 最后得到的就是某个具体的IP地址。
总的来说就是你的老大从国家那里申请了一个完整的蛋糕, 你想要拥有这块蛋糕的一部分,他人也想要,那就只能从这个老大那里去切了。除非你也能从国家那里获取最初的那块完整的蛋糕
ISP’s block 11001000 00010111 00010000 00000000 200.23.16.0/20
- Organization 0 11001000 00010111 00010000 00000000 200.23.16.0/23
- Organization 1 11001000 00010111 00010010 00000000 200.23.18.0/23
- Organization 2 11001000 00010111 00010100 00000000 200.23.20.0/23
- … ….. …. ….
- Organization 7 11001000 00010111 00011110 00000000 200.23.30.0/23
最初的ip地址(蛋糕)可以到ICANN机构去申请(这是在中国的)
DHCP: Dynamic Host Configuration Protocol(协议)
**允许主机在加入网络的时候,动态地从服务器那里获得IP地址: **
- 可以更新对主机在用IP地址的租用期-租期快到了
- 重新启动时,允许重新使用以前用过的IP地址
- 支持移动用户加入到该网络(短期在网)
** DHCP工作概况: **
- 主机广播“DHCP discover” 报文[可选]
- DHCP 服务器用 “DHCP offer”提供报文响应[可选]
- 主机请求IP地址:发送 “DHCP request” 报文
- DHCP服务器发送地址:“DHCP ack” 报文
**上述的详细解释: **
- 主机上线的时候要广播一下(寻找DHCP server)
- DHCP server收到之后,就会分配上网的一些子网掩码等等的配套信息
- 主机向DHCP server发送单波的请求, 请求获取某个ip地址及其相应的配套信息。
- DHCPserver就会登记相应的信息(ip的租用日期)。如果过期就会收回这个ip
** DHCP: 不仅仅是IP addresses DHCP 返回的有:**
- IP 地址
- 第一跳路由器的IP地址(默认网关)
- DNS服务器的域名和IP地址
- 子网掩码 (指示地址部分的网络号和主机号)
实例:【解释上图中的两次交互】
层次编址: 路由聚集(route aggregation)
** 层次编址允许路由信息的有效广播: **
NAT: 网络地址交换
** Network Address Translation **
动机: 本地网络只有一个有效IP地址:
- 不需要从ISP分配一块地址,可用一个IP地址用 于所有的(局域网)设备–省钱
- 可以在局域网改变设备的地址情况下而无须通知 外界
- 可以改变ISP(地址变化)而不需要改变内部的 设备地址
- **局域网内部的设备没有明确的地址,对外是不可见的–安全 **
相当于对外公开一个, 内部的ip是不需要分配的,用本地网络即可
当然,缺点就是外网的ip想要访问内网的ip建立连接是不行的, 需要进行内网的穿越
实现: NAT 路由器必须:
- 外出数据包:替换源地址和端口号为NAT IP地址 和新的端口号,目标IP和端口不变 …远端的C/S将会用NAP IP地址,新端口号作为目标地址
- **记住每个转换替换对(在NAT转换表中) .. 源IP,端口 vs NAP IP ,新端口 **
- ** 进入数据包:替换目标IP地址和端口号,**采用存 储在NAT表中的mapping表项,用(源IP,端口)
** 16-bit端口字段:** 6万多个同时连接,一个局域网!
** 对NAT是有争议的: **
- 路由器只应该对第3层做信息处理,而这里对端口号(4层)作了处理(团长拆了师长的信…)
- 违反了end-to-end 原则(端到端的原则)
- 端到端原则:复杂性放到网络边缘
- 无需借助中转和变换,就可以直接传送到目标主机
- NAT可能要被一些应用设计者考虑, eg, P2P applications
- 外网的机器无法主动连接到内网的机器上
- 地址短缺问题可以被IPv6 解决
- **NAT穿越: 如果客户端需要连接在NAT后面的服务器,如何操作 **
可以用IPv6的方式来解决内网穿越的问题
NAT 穿越问题
** 客户端需要连接地址为 10.0.0.1的服务器 **
- 服务器地址10.0.0.1 LAN**本地地 址 **(客户端不能够使用其作为目标地址)
- 整网只有一个外部可见地址: 138.76.29.7
方案1: 静态配置NAT:转发 进来的对服务器特定端口连接 请求
e.g., (123.76.29.7, port 2500) 总是转发到10.0.0.1 port 25000
方案2: Universal Plug and Play (UPnP) Internet Gateway Device (IGD) 协议. 允许 NATted主机可以:
- 获知网络的公共 IP地址 (138.76.29.7)
- 列举存在的端口映射
- 增/删端口映射 (在租用时间内 )
i.e., 自动化静态NAT端口映射配 置
方案 3: 中继 (used in Skype)
- NAT后面的服务器建立和中继的连接
- 外部的客户端链接到中继
- 中继在2个连接之间桥接
IPv6
** 初始动机: 32-bit地址空间将会被很快用完 **
** 另外的动机: **
- 头部格式改变帮助加速处理和转发
- TTL-1
- 头部checksum
- 分片
- 头部格式改变帮助QoS
IPv6 数据报格式:
- 固定的40 字节头部
- **数据报传输过程中,不允许分片 **
Priority: 标示流中数据报的优先级
Flow Label: 标示数据报在一个“flow.” ( “flow”的概念没有被严格的定义)
Next header: 标示上层协议
和IPv4的其它变化
- **Checksum: **被移除掉,降低在每一段中的处理 速度
- **Options: **允许,但是在头部之外, 被 “Next Header” 字段标示
- **ICMPv6: **ICMP的新版本
- 附加了报文类型, e.g. “Packet Too Big”
- 多播组管理功能
IPv5是一个实验性的, 已经被废除
** 从IPv4到IPv6的平移 **
- 不是所有的路由器都能够同时升级的
- 没有一个标记日 “flag days”
- 在IPv4和IPv6路由器混合时,网络如何运转?
** 隧道: 在IPv4路由器之间传输的IPv4数据报中携 带IPv6数据报 **
**隧道: **
IPv6的应用
- Google: 8% 的客户通过IPv6访问谷歌服务
- NIST: 全美国1/3的政府域支持IPv6
- 估计还需要很长时间进行部署