IP: Internet Protocol

互联网中的网络层
主机,路由器中的网络层功能:
image.png
ip协议主要规定了 数据平面的转发功能
ICMP协议:

  • 对于网络的信号,报错等的规定
  • 路由器信令。

**ping应用程序的的本质: **

  1. 形成ICMP分组, 发给目标节点
  2. 目标节点反转回来形成ping的request的对应的respose
  3. 然后就可以知道目标ip是活跃的。

ip数据报格式

image.png
头部是可变长的,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 **

image.png

  • 第一片:20字节头部+1480字 节数据 【 偏移量:0 】
  • 第二片:20字节头部+1480字 节数据(1480字节应用数据) 【 偏移量:1480/8=185 】
  • 第三片:20字节头部+1020字 节数据(应用数据) 【 偏移量:2960/8=370 】

路由器将每片都当成独立的分组进行转发, 最后所有的信息都到目标主机, ,到了目标主机之后就会进行重组(根据数据报的头部, 及其偏移量进行排序重组 ; fragflag=0就是最后一片)

IPv4地址

**IP地址: 32位标示(对设备进行标识),对主机或者路由器的接口 编址 **
image.png
接口: 主机/路由器和物理链路的连接处(223.1.3.27)

  • 路由器通常拥有多个接口 (多个路由器之间进行转发)
  • 主机也有可能有多个接口(多个网卡进行虚拟ip转发)
  • IP地址和每一个接口关联

** 一个IP地址和一个接口相关联 ,一个接口(接口)和多个IP相连**

子网

什么是子网(subnet) ?

一个子网内的节点(主 机或者路由器)它们的** IP地址的高位部分相同 **,这些节点构成的网络 的一部分叫做子网

**无需路由器介入,子网 内各主机可以在物理上 相互直接到达 **【在一个子网的内部,ip之间是一跳可达的。(具体的在链路层实现)】

image.png
包括三个子网网络

**IP地址: **

  • **子网部分(高位bits) **
  • **主机部分(地位bits) **

判断是否为子网的方法:

  1. 要判断一个子网, 将每一个接口从主机或者路由器上分开,构成了一个个网络的孤岛
  2. **每一个孤岛(网络)都是一个都可以被称之为subnet(子网). **

子网掩码:11111111 11111111 11111111 00000000
Subnet mask: /24
image.png
图中有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

image.png

以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地址: **
image.png

内网(专用)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 是 地址中子网号的长度 **

image.png
可以自己分配机构的子网掩码

子网掩码(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为子网部分

转发表和转发算法

image.png

图中的端口改为接口

**获得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地址 ? **

  1. 首先某个机构会获取相对的一大块ip地址(前面若干位为网络号;后面的为主机号)
  2. 就假设前20位为网络号, 后面的12位为主机号
  3. 将后面的12位进行分割范围【前3位再表示网络号;后9位表示子网号】
  4. 这样就有23位为网络号。 9位子网号。 然后再对9位进行分割
  5. 分成2位为网络号,7为子网号
  6. …..
  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工作概况: **

  1. 主机广播“DHCP discover” 报文[可选]
  2. DHCP 服务器用 “DHCP offer”提供报文响应[可选]
  3. 主机请求IP地址:发送 “DHCP request” 报文
  4. DHCP服务器发送地址:“DHCP ack” 报文

image.png
**上述的详细解释: **

  1. 主机上线的时候要广播一下(寻找DHCP server)
  2. DHCP server收到之后,就会分配上网的一些子网掩码等等的配套信息
  3. 主机向DHCP server发送单波的请求, 请求获取某个ip地址及其相应的配套信息。
  4. DHCPserver就会登记相应的信息(ip的租用日期)。如果过期就会收回这个ip

image.png

** DHCP: 不仅仅是IP addresses DHCP 返回的有:**

  • IP 地址
  • 第一跳路由器的IP地址(默认网关)
  • DNS服务器的域名和IP地址
  • 子网掩码 (指示地址部分的网络号和主机号)

实例:【解释上图中的两次交互】
image.png
image.png

层次编址: 路由聚集(route aggregation)

** 层次编址允许路由信息的有效广播: **
image.png
image.png

NAT: 网络地址交换

** Network Address Translation **
image.png

动机: 本地网络只有一个有效IP地址:

  1. 不需要从ISP分配一块地址,可用一个IP地址用 于所有的(局域网)设备–省钱
  2. 可以在局域网改变设备的地址情况下而无须通知 外界
  3. 可以改变ISP(地址变化)而不需要改变内部的 设备地址
  4. **局域网内部的设备没有明确的地址,对外是不可见的–安全 **

相当于对外公开一个, 内部的ip是不需要分配的,用本地网络即可
当然,缺点就是外网的ip想要访问内网的ip建立连接是不行的, 需要进行内网的穿越

实现: NAT 路由器必须:

  1. 外出数据包:替换源地址和端口号为NAT IP地址 和新的端口号,目标IP和端口不变 …远端的C/S将会用NAP IP地址,新端口号作为目标地址
  2. **记住每个转换替换对(在NAT转换表中) .. 源IP,端口 vs NAP IP ,新端口 **
  3. ** 进入数据包:替换目标IP地址和端口号,**采用存 储在NAT表中的mapping表项,用(源IP,端口)

image.png
** 16-bit端口字段:** 6万多个同时连接,一个局域网!
** 对NAT是有争议的: **

  1. 路由器只应该对第3层做信息处理,而这里对端口号(4层)作了处理(团长拆了师长的信…)
  2. 违反了end-to-end 原则(端到端的原则)
    1. 端到端原则:复杂性放到网络边缘
    2. 无需借助中转和变换,就可以直接传送到目标主机
    3. NAT可能要被一些应用设计者考虑, eg, P2P applications
    4. 外网的机器无法主动连接到内网的机器上
  3. 地址短缺问题可以被IPv6 解决
  4. **NAT穿越: 如果客户端需要连接在NAT后面的服务器,如何操作 **

可以用IPv6的方式来解决内网穿越的问题

NAT 穿越问题

image.png
** 客户端需要连接地址为 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个连接之间桥接

image.png

IPv6

** 初始动机: 32-bit地址空间将会被很快用完 **
** 另外的动机: **

  • 头部格式改变帮助加速处理和转发
    • TTL-1
    • 头部checksum
    • 分片
  • 头部格式改变帮助QoS

IPv6 数据报格式:

  • 固定的40 字节头部
  • **数据报传输过程中,不允许分片 **

Priority: 标示流中数据报的优先级
Flow Label: 标示数据报在一个“flow.” ( “flow”的概念没有被严格的定义)
Next header: 标示上层协议
image.png

和IPv4的其它变化

  • **Checksum: **被移除掉,降低在每一段中的处理 速度
  • **Options: **允许,但是在头部之外, 被 “Next Header” 字段标示
  • **ICMPv6: **ICMP的新版本
    • 附加了报文类型, e.g. “Packet Too Big”
    • 多播组管理功能

IPv5是一个实验性的, 已经被废除

** 从IPv4到IPv6的平移 **

  • 不是所有的路由器都能够同时升级的
  • 没有一个标记日 “flag days”
  • 在IPv4和IPv6路由器混合时,网络如何运转?

** 隧道: 在IPv4路由器之间传输的IPv4数据报中携 带IPv6数据报 **
image.png
**隧道: **
image.png

IPv6的应用

  • Google: 8% 的客户通过IPv6访问谷歌服务
  • NIST: 全美国1/3的政府域支持IPv6
  • 估计还需要很长时间进行部署