第五章 网络层(二)

Internet中的网络层

  1. Internet 综述
  2. IP 协议
  3. IP 控制协议
  4. IP 路由
  5. IPv6

Internet 综述

  1. Internet的发展
    1. 1970年:第一个分组交换网ARPA诞生,连接了四所大学
    2. 1972年:ARPA网有40个网点,应用有e-mail、rlogin、FTP,至此,网络的核心技术产生并开始研究网络的互联
    3. 1974年:产生了两个基本的Internet协议:IP协议和TCP协议
    4. 80年代后期:产生了NSF网,它连接了美国所有的超级计算中心,并逐步取代了ARPA网
  2. 技术特点
    1. 使用TCP/IP协议
      1. 因特网是怎样把全球不同的网络互联起来的呢?
      2. 它建立了一个虚拟的网络,他不管这个世界上有多少网络,它提供一个世界语
      3. 你这台机器在你自己的网络传输信息的时候,那就用自己的网络协议去传输,如果你要跟其他的网络交换信息的话,那你要把你这个信息变成世界语的格式来传递,那么这个世界语就是TCP/IP协议
    2. 网络互联结构:各网之间一般采用路由器加专线连接
      1. 各个网络之间是怎样互连起来的呢?
      2. 网络1+路由器—专线—-路由器+网络2
      3. 所有的路由器都认识TCP/IP
      4. 路由器既可以理解子网络的语言,也认识世界语言(TCP/IP)
    3. 层次结构的域名及网络管理
      1. 这么大的一个网络,他是怎样确定他的网络资源呢?请求网络就是为了获取网络的资源
      2. 因特网给他所有资源规定了一个唯一命名的规则-这个名字就是域名
      3. 怎样保证域名的唯一性呢? 采用的就是层次结构
    4. 分布式的管理模式,没有一个Internet管理中心
    5. 开发了通用的应用技术
  3. TCP/IP分层模型
    1. 应用层(应用层+表示层)
    2. 传输层(传输层+会话层)
    3. 互联网层(网络层+网络互联功能)
    4. 主机至网络
    5. 分析:
      1. TCP/IP跟七层网络协议不一样,他是一个四层的协议
      2. 层和层之间是通过网络结构来调用的,层和层之间的接口就相当于是一个函数调用
      3. TCP协议和OSI协议不一样,OSI是一个完整的网络协议,二TCP/IP他只是一个把网络互联起来的协议,他只考虑让两个网络互相认识,至于子网内部的传输,不管
      4. 因此最后一层归纳为主机至网络的一个接口,即网络层到数据链路层的一个接口
  4. Internet的发展方向
    1. Internet 2:美国各大学,主要解决QoS
    2. Ipng:(Next Generation Internet) 美国政府组建机构研究,主要解决已有的Internet的一些限制,如地址、安全和多媒体传输等问题
  5. Internet 中的”I”的注意:
    1. 如果大写,代表全球最大的互联网因特网
    2. 如果小写即internet,代表网络互联技术

IP 协议

  1. 在TCP/IP协议当中他的网络层就是互联网层,互联网层他的主要的协议就是IP协议(当然还有其他协议)
  2. IP协议就是网络互联的协议(Internet Protocol)
  3. IP协议主要就是完成了在不同的网络当中怎样来传递数据包
  4. IP协议提供了一种公共的数据包格式
  5. 在分组交换的网络中怎样来实现网络的互联呢?有3个问题需要解决
    1. 各个不同的网络他的数据包的格式是不一样的
      1. 采用了一种统一的数据包格式-IP包格式
    2. 每一个网络的地址是不一样的,比如:发送方网络地址有2个字节,而接收方网络地址是4个字节,那么怎样把4个字节地址放到2个字节的物理帧里面呢?
      1. 显然是不可行的,因此,在网络互联的情况下,所有的站点都给他赋一个虚拟的地址,不管你在你的物理网络当中的地址是什么,都给他附一个虚拟的地址-IP地址
      2. 举例说明: 就像联合国开大会,每个国家都派代表开会,每个代表在自己的国家都有自己的名字(自己的网络当中的地址),但是在开大会的时候,会给每一个国家的代表起一个名字(**代表),这个名字就是全球唯一的,这就是IP的地址
    3. 不同的网络有不同的长度,就是在IP协议当中怎样解决分段和重组的问题

IP包格式

  1. 它是在整个因特网上每个路由器都认识的数据包的格式
  2. IP数据包格式如下

    图1

  3. 数据包分为报头部分+SDU部分(真正的传输层交过来的数据)
    1. 数据包的报头又分为固定部分和可变部分
      1. 固定部分是每一个数据包都有这些字段
      2. 而可变部分是如果你需要由这个功能你可以增加
      3. 因此IP包的报头最小长度是,最短的长度是前面的固定部分(有五行,每行4个字节)20个字节(20B)
  4. 报头20个固定字节的内容
    1. IP协议的版本号
      1. 版本为4(Ipv4)
    2. 头部的长度
      1. 头部长以32位字长(即4个字节)为单位, 即一行
    3. 服务类型(基本没用)
      1. 8位(两位保留)
    4. 总长:
      1. 包括报头和数据报,最长216 –1(2个字节),即 65535个字节
    5. 标识、标志、段偏移:
      1. 用于数据报的分段
    6. 生存时间:
      1. 以秒为单位也,可以经过路由器的个数为单位
    7. 类型或协议
      1. 指的是承载的数据是什么类型的
      2. IP协议通过这个字段把数据包解析,判断交给上层的哪个协议(UDP/TCP…)
        1. TCP: 6
        2. UDP: 17
        3. ICMP: 1
        4. OSPF: 89
    8. 头部校验和
      1. 按16位相加,结果求反
    9. 源和目的地址:32位
    10. IP可选项:用于控制和测试 图1
    11. 充填域:凑成32位的整倍数

P包的分段与重组

  1. 从上面可以看出,IP数据包最长可达65535的长度,但是事实上不是每一个物理网络都支持65535的长度数据,如果物理网络不支持65535长度,这就需要分段与重组
分段
  1. 分段过程
    1. 按MTU的及数据包的实际负载长度计算所需段数并划分,分段应满足两个条件:
      1. 各段在不大于MTU的前提下,尽可能地大,即按照这个物理网络的最大长度分段
      2. 段的长度为8的整倍数
    2. 原数据包的报头作为每段的数据包报头,并修改其中的某些字段,指明:
      1. 属原来的哪个分组(分组标示)
      2. 属原来段中的第几个分段 (偏移量)
      3. 哪一个是段尾(最后一段标志)
  2. 通过标志、标识和段偏移实现
    1. 标识(identifier):16位
      1. 发送方每发送一个分组(IP包)编号加一 (其实就是IP包的编号)
      2. 各分段的标识相同
      3. 源地址加标识来区分各个分段
    2. 标志(flag):3位(一位保留)
      图1
      1. DF
        1. = 0 表示本分组允许分段
        2. = 1 表示本分组必须完整到达,途中不允许分段
      2. MF
        1. = 0 表示本段为本分组的最后一个段
        2. = 1 表示本段后面还有更多的分段
    3. 段偏移(fragmentation offset):13位
      1. 实际偏移量 = 段偏移值 x 8 Byte
  3. IP包分段举例
    1. 一个物理网络的MTU为1500B,现要传输一个IP分组(IP包)(其IP分组头为20B,数据区长度为1400B)到MTU为620B的另一个物理网络,其分段情况为:
    2. 上面的意思是一个数据包的长度为1420B,经过的是一个1500B的网络(这个是没问题的),但是传到下一个网络只有620个字节,因此需要分段发送
    3. 分段如下 图1
      1. 将1400B分为600/600/200这3个分段(600,600,200都是8的整数倍遵循前面讲的规则)
    4. 每个分段的头部其基本部分(如源地址、目的地址等)是copy原IP分组(IP包)的头部,与分段相关的域则应重新生成 图1
分段的重组
  1. 途中的任意一台路由器都无法重组,重组必须在各分段都到达目的地之后才能进行
    1. 每个分段可以走不同的路径
    2. 每个分段不能保证按顺序到达
    3. 减少路由器中保存的信息量及路由器的工作量
  2. 互联网层是遵循尽力而为来传送IP包的,也存在力不从心的时候,此时只能丢弃
  3. IP协议采用非透明重组,主机将遵循:要么重组成功,要么全部丢弃的原则

IP地址

  1. 在Internet网络当中,每一个数据包在寻找路径的时候,都是根据目的站点的地址来寻找路径的
  2. 也就是说每一台机器要上Internet,必须有一个全网唯一的一个IP地址
  3. 如何保证这个IP地址是全网唯一的呢?采用了分层的方法
IP地址分类与表示
  1. 层次结构和分类 图1

    1. IP地址把地址分成了2个部分,NetID(网络号)/HostID(主机号)
      1. 网络号: Internet主机机构控制的是网络号,一个单位组建一个网络需要向Internet申请网络号(NetID),分配的是惟一的
      2. 主机号:由这个单位自己为自己分配的主机号,也是唯一的
      3. 因为Internet机构不会把一个网络号分给2个单位,惟一的;一个网络内部也不会把一个主机号分配给两台主机,也是惟一的;上面两种一组合就是全球唯一了
    2. 按照网络号和主机号不同的长度,可以把IP地址分为A/B/C/D/E类
      1. 常见的是A/B/C三大类
        1. 每一个IP地址唯一的对应了一个网络接口(单址传输)
      2. D类: 一个IP地址对应了一组接口(多组传输),当发送一个消息,多个接口同时收到
      3. E类: 保留着没有使用的那一部分
    3. ABC三类特点:
      1. A类:刚开始做互联网时,认为在互联网当中网络不会很多很多,所以把1个字节划分给网络号(0-127),3个字节划分给主机号
      2. B类: 后来越来越多,网络号为2个字节,主机号长度2个字节
      3. C类: 网络号为3个字节,主机号长度2个字节
      4. 网络/主机号总长4个字节
      5. 如何判断ABC类
        1. 看第一个字节如果小于127就是A类,前1个字节为网络号,最后一个字节为主机号
        2. 大于127就是B类,前2个字节为网络号,最后一个字节为主机号
        3. 大于191就是c类,那么前3个字节为网络号,最后一个字节为主机号
        4. 例如: 202.120.1.154,C类,主机号为154
  2. IP地址的表示
    1. 由于IP地址是32位二进制,如果直接表示是记不住的,因此,采用点分十进制表示,如:202.120.1.154
      1. 什么是点分十进制?
        1. IP地址4个字节,每个字节看成一个10进制的数,所以每个字节的值是0-255,每个字节之间用”.”分开,因此这种方法称为点分十进制表示方法.
    2. 当组网的时候,要给每台主机分配一个IP地址,但是在这些IP地址当中有些IP地址是不分配个任何主机的–特殊地址 图1
      1. 前缀是指: 网络号
      2. 后缀指: 主机号
  3. 私有网络IP地址
    1. 除了特殊地址不能用外,还有一些地址也不用-私有IP地址,
    2. Internet也是一种网络互联的技术,很多单位比如规模比较大,内部也有很多小的网络,我想把这些小的网络互联起来,但是为这个单位是一个独立的孤岛,我不想与互联网连接,那么我就没有必要想Internet申请IP地址,但是我需要用IP的技术来互联,那么每台机器也必须有一个地址,那么Internet机构就留出了这些用户.
    3. 即自己组了一个网络,但是有不想跟Internet相连,但是有用到IP的技术,那么就可以用这些地址 图1
      1. 如果建的私有网络比较大,那么在A类中选择
子网划分
  1. 分好一个一个网络后,在主干网上的路由器就有一张路由表,这张路由表不是对每台机器有个路由向,而是每个网络有个路由向,因为路由器的端口连着的是一个网络,因此主干路由器的路由表上面是每一个网络的地址.
  2. 一个数据包过来要进行路由的步骤:
    1. 拿出数据包的目的IP地址,从目的IP地址抽取出网络号(IP地址是由网络号+主机号组成)
    2. 用这个号到路由表中去找
    3. 如何判定网络号的长度呢?
      1. 判断目的地址是A/B/C类然后在分别取值(A类:1个字节,B类2个字节,C类3个字节),因此主干网上面的路由器放的是每个网络,不是一台主机
  3. 为什么好子网划分?
    1. 比如这个单位比较大,向Internet申请了一个B类地址,一个B类地址可以支持65535台主机
    2. 如果这个单位的主机组网用以太网,65535台主机用一个一台网组,那就会一直竞争,数据无法正常传输,解决办法:对于以太网来说规模不能够大,要把它分成一个一个的小网络
    3. 若把以太网分成一个一个的小网络,对于主干网他是只认网络的,因此,这就需要向Internet申请多个网络的B类IP地址,这样就回造成地址的浪费.
    4. 现象: 原来只需要一个B类地址就可以搞定65535台主机的,但是现在把主机分成1000个主机一个的小网络,那么就需要1000个B类地址,这就造成了很大的浪费.
    5. 那么如何解决这个问题呢?
      1. 关键问题是Internet分配一个地址只能对应一个网络,主干网查找路由就是通过这个地址的网络号,来查找对应的网络
      2. 如果这个网络地址能够对应一组网络呢? 问题就解决了
      3. 子网划分就是用来解决这个问题的.
  4. 简介
    1. 随着网络规模的扩大,虽然能为一个网络提供大量的IP地址(如B类地址),但通常在一个网络(如以太网)内支撑不了那么多的主机
    2. 如果再申请一个IP地址,那将造成地址的浪费
    3. 问题在于一个网络ID(网络号),只能对应一个网络,而不是一组网络
    4. 解决的方法是允许在内部将一个网络分成若干个子网,而对外仍像一个网络
    5. 一个网络中的主机都必须具有相同的网络ID
    6. 然而子网之间的数据传输,必须通过路由器
  5. 如下图:
    图1
    1. 如上图,中央路由器接到数据包,要根据中央路由器的路由表查找是哪一个端口的那一台主机,那么这个路由表就非常长了
    2. 那么如何解决这个问题呢?能不能像Internet一样,主干网路由器下面连着是子网的路由器呢?只要把数据包,转送给子网路由就行了呢? 那么中央路由器只需要8个路由就行了.
    3. 那么就存在一个问题,中央路由器如何确定每个子网的网络号呢?Internet中是通过目的地址,拿到网络号寻找对应的子网,但是中央路由器如何找到对应的子网呢?那就需要每个内部的子网也需要有一个网络号-子网号
    4. 在内部的网络号成为子网号,实现方法跟Internet一样,把内部地址也分成网络号(ID)+主机号(ID)
    5. 那么如何划分呢?
      1. 我们知道中央路由器的地址是由Internet分配的—网络号(ID)+主机号(ID)
      2. 网络号(ID)是由Internet分配的,不可以自定义的,但是主机号是由我们自己定义的
      3. 因此我们可以这样定义: 网络号+(子网号(内部网络号)+ 主机号(内部主机号)),即把Internet分配的IP的主机号部分自定义成:子网号+内部主机号
  6. 主机的IP地址分配
    1. 任意指派
      1. 对B类网络,主路由器上的路由表中至少有65536个表项
    2. 按子网划分
      1. 从IP地址的主机号的高位部分取出若干位作为子网的标识(子网号(ID)),其余作为子网中的主机标识(主机 号(ID)),在子网中,主机标识可任意指定 图1
  7. 子网掩码
    1. (假设当前为B类地址,那么子网长2个字节)子网中的网络号多长,主机号多长呢? 每个单位的划分不一样的,有可能2个byte给子网号,剩下的给主机号,或者其他,那么如何知道一个单位的子网号有多长呢? – 子网掩码
    2. 子网掩码的作用
      1. 因为子网地址长度不是固定的,所以必须说明设备地址中的哪一部分是包含子网的网络地址段,地址中哪一部分是主机地址段
    3. 子网掩码使用与IP编址相同格式
      1. 子网掩码的网络地址部分和子网地址部分全为1,它的主机部分全为0
    4. 一个标准C类IP地址网络号3个字节,主机号1个字节,那么他的的掩码为:(前面3个字节全部为1,后面一个字节为0)
      1. 子网掩码的表示方法也是用点分十进制表示
      2. 255.255.255.0
    5. 例1
      1. 一个C类主机地址为202.120.3.99,子网号为 011,其掩码应为:255.255.255.224
      2. 划分方法如下图:

        图1

      3. 包含子网地址的网络号 = IP地址∧掩码
      4. 掩码也可用更简洁的方式表示:202.120.3.99/27,其中27表示掩码中1的个数
    6. 例2
      1. 某单位有三个部门,分别有自己的网络,虽然每个部门的主机数都比较少,但也需要三个C类地址(因为没有比C类地址更小的了),掩码为:255.255.255.0
      2. 如下图 图1
        1. 可以看出向Internet申请了3个C类地址,201.120.1.*/201.120.2.*/201.120.3.*
        2. 一个C类地址可以连接256台主机,这样就造成了极大的浪费.
      3. 采用子网划分
        1. 选择子网号长度
          1. 三个子网一共只有10台主机,因此一个C类地址就足够了
          2. 子网和主机所需位数的分配:可以根据子网数或者每个子网中的主机数来决定
          3. 如按子网数来决定:3个子网需要2位编码:00,01,10,11,但一般00和11保留,因此3个子网需要3位编码,则子网掩码为:202.120.1.0/27
        2. 采用子网划分技术,可节约IP地址,图中掩码为:255.255.255.224
        3. 如下图 图1
    7. 例3
      1. 某单位有多个部门,每个部门的机器数为20个左右,现申请有一个C类地址 202.10.23.0,问: 就目前而言,如何划分子网较为合理,请确定子网掩码,每个子网中主机数最多为多少台?
      2. 析:用3位表示子网号,5位表示主机号是合理的,所以:掩码为:255.255.255.224;最多的子网个数:8(6)个每个子网中主机数最多可接:32 – 2 = 30(台)某个主机IP地址及其掩码也可写成:202.10.23.47/27
    8. 例4
      1. 某主干网(通信子网)使用一个C类地 200.120.8.0,主干网的结构如下图所示,图中有A、B、C、… … H、I 等9个路由器,所示的两个子网分别通过其边界路由器X和Y与主干网连接,应如何设计主干网的子网划分策略,即确定掩码,以分配路由器的端口地址

        图1

      2. 析:

        1. 两个原则:
          1. 两个路由器上相互连接的两个端口必须在同一个子网
          2. 该子网中不可能包含第三个端口
        2. 每个子网中仅有两个有效地址
        3. 所以,掩码为:255.255.255.252
CIDR-Classless InterDomain Routing
  1. CIDR:无类域间路由
  2. 为什么要引入CIDR
    1. 一个B类地址对大多数机构来说还是太大,C类地址又太小,网络地址本身又非常紧缺
  3. 解决办法:(RFC1519)
    1. 以可变长分块的方式分配所剩的C类网络,把若干个C类地址(必须是连续的)捆绑成一个组地址,作为一个分配单元
    2. 甚至也可把256个C类地址合成一个B类地址
  4. 引入CIDR的好处
    1. 提高IP地址的利用率
    2. 缩短路由表
NAT-Network Address Translation
  1. 简介
    1. 网络地址转换产生的原因: IP地址不够,引起的一种补救的方法
    2. 一般来说每台主机都有一个IP地址才能进入Internet网络,但是现在很多时候申请不到IP地址,比如有1000台机器,但是却值申请到了一个C类地址(256),那怎么办呢?—NAT就是一种补救的方法
    3. 形象举例: 一个穷人家有10个人,却只有3套新衣服,为了让每个人出去都有新衣服穿,那么这十个人,出去就传这3套中的一套,回来之后再换给其他人.这就是NAT的思想
    4. 那么问题来了,假设目前只有一个C类地址,最多256个机器,目前有1000台机器,但是如何来组网呢?因为每台机器必须有一个IP地址.那就需要使用–私有地址了.
    5. 还有一种情况使用私有地址: 单位为了安全而不向Internet公开单位内部的地址,所以企业内部的主机通常都使用私有地址,当内部主机要访问Internet时,必须进行“网络地址转换”,即把私有IP地址转换成公开IP地址
    6. 私有地址是大家都能用,并且不需要想Internet申请的.但是私有地址只能内部使用,不能出去,主干网不识别.
    7. 因此,在单位内部用私有地址为每台主机分配一个IP,在内部通信时大家都用这个唯一第IP地址来通信,一旦访问外部网络,需要转换成合法IP,用完之后在让下个用
  2. NAT的工作过程
    1. 要实现网络地址转换,在这个单位的出口的路由器上要具备NAT功能
      1. 有了这个NAT功能,它就能检查这个机器是否出去,出去就给一个合法地址,不出去就用原来的私有地址.
    2. 假设内部网络使用内部网络地址192.168.44.0,并已申请到公开IP地址为202.120.8.65-202.120.8.79,内部主机PC3的IP地址为192.168.44.89
    3. PC3发出一个请求通过ISP访问Internet,目的IP地址为202.120.1.154
    4. Router(Firewall)(路由器)将对请求IP包和返回的应答IP包作NAT(网络转换) 图1
    5. 回来的IP包如何到达源端
      1. 如果PC3发送数据包出去,分配的IP为202.120.8.70,使用完毕后,PC2也发送数据包出去,如果分配的地址也为202.120.8.70,当服务器分别对PC3/PC2返回数据包,此时这两个包的目的地址都是202.120.8.70,那么如何知道哪个返回给PC3,那个返回给PC2呢? 更深入一点,同一台主机上的不同应用进程之间呢?
      2. 解决办法:
        1. 利用传输层(传输层的数据包记录了源/目的端口号)的源端口号字段(区分不容的应用进程)
          1. IP包承载的数据主要就是TCP或UDP
          2. TCP/UDP里面标识的是源进程/目的进程
          3. TCP/UDP通过端口号来标识源进程/目的进程
        2. 在NAT中有一张映射表 图1
          1. 这个表中记录了源地址/源端口号
        3. 请求IP包和应答IP包的NAT
          1. 当请求IP包到达路由器时,将IP包中的源IP地址和源端口号信息填入NAT表(映射表),同时将对应的NAT表表项序号(0,1,2….65535)取代IP包中的源端口号字段,并将选定的合法地址(即公开IP地址)取代IP包中的源IP地址字段,重新计算校验和并发送
            1. 比如:上图中的192.168.44.89:33030,映射到NAT表中,为第12051项,选定的合法IP为:202.120.8.70,因此NAT后IP地址为: 202.120.8.70 : 12051
          2. 当应答IP包从ISP发回来时,路由器将抽取该应答IP包中目的端口号字段,查NAT表将表中对应的内容放回目的IP地址字段和目的端口号字段,发回源节点
  3. NAT存在的问题
    1. NAT违反了IP的体系结构
      1. IP规定一个IP地址对应一个网络接口,而在NAT中,某个地址可能会对应成千上万个地址
    2. NAT将Internet的无连接服务变成了有连接服务
      1. 因为NAT必须包含所有经过它的连接信息
    3. NAT违反了网络分层原则
      1. 在第三层用了第四层协议格式中的字段(端口号)
    4. 如果IP包的载荷不是TCP或UDP,则NAT无法工作
      1. 因为在其他协议的信息中不包含源端口号
    5. 在有些应用中NAT可能会出错
      1. 在有些应用中,发送方会将源IP地址嵌在它的消息中,接收方必须从信息中取用源IP地址,但NAT不作此类处理,因而将导致错误
  4. 综上所述,IP如何发送数据包呢?
    1. 一个数据包在源站点看一下目的站点是不是跟我是同一个网络(只要看源地址与目的地址的网络号是否相同即可),如果相同就直接通过这个当前子网传递过去,反之,发送到NAT
    2. NAT根据目的地址在路由表中查找,找到下一站的地址
    3. 下一站再经过地址解析找到下一站…
Table of Contents