网络 | 07. IP数据报与IP协议

  • IPv4数据报(IP数据报)首部格式

    • IP数据报是实现IP协议主要功能的基础,其结构如下

      • /image/image-20250807005136-eexolqu.png

      • 有两部分组成,20字节的固定部分(必须包含的部分),和最大40字节的可变部分(可选的字段用于增加额外的功能)

      • IP数据报常以32个比特(4字节)为单位进行表述,即图中的1行

      • 图中每个小格子称为字段/域,每个字段或某些字段的组合用来表达IP协议的相关功能

        • 版本,占4比特,表示IP协议的版本,通信双方所使用的IP协议版本必须一致,目前广泛使用的IP协议版本号为4(即IPv4)

        • 首部长度字段, 占4比特,表示IP数据报收首部的长度,其取值以4字节为单位,最小十进制值为5(20字节的固定部分/4),最大十进制值为15(20+40字节/4)

        • 可选字段,长度从1-40字节不等,用来支持排错、测量及安全等措施;可选字段增加了IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的,这增加了每一个路由器处理IP数据报的开销,实际上可选字段很少被使用

        • 填充字段,可变字段长度不一定是4的整数不,用该字段填充0,确保首部长度为4字节的整数倍

        • 区分服务字段,占8比特,用来获得更好的服务

          • 该字段在就就标准中叫做服务类型,但实际上一直没有被使用过;
          • 1998年,因特网工程任务组IEFT把这个字段改名为区分服务,利用该字段的不同数值,可提供不同等级的服务质量;
          • 只有在使用区分服务时,该字段才起作用,一般情况下都不使用该字段
        • 总长度字段占16比特,用于表示IP数据报的总长度(首部+数据载荷),以字节为单位,最大取值为65535(实际上很少传送这么长的IP数据报)

          • /image/image-20250807010518-vyxsubb.png
        • 标识、标志、片偏移

          • /image/image-20250807010625-lge8m9s.png

          • 标识字段,占16比特,属于同一个IP数据报的各分片数据报应该具有相同的标识;IP软件维持一个计数器,每产生一个数据报,计数器值加1,并将此值赋给标识字段

          • 标志字段,占3比特,各比特含义如下

            • DF位:1表示不允许分片,0表示允许分片
            • MF位:1表示后面还有分片,0表示这是最后一个分片
            • 保留位:必须设置为0
          • 片偏移字段,占13比特,指出分片数据报的数据载荷部分偏移其在原始数据报的位置有多少个单位(以8个字节为单位)

          • 举例

            • /image/image-20250807011349-5nnuqo6.png
            • /image/image-20250807011450-m187an1.png
        • 生存时间TTL,占8比特,最初以秒为单位,最大生存周期为255秒

          • 由路由器转发IP数据报时,将IP数据报首部中的该字段值减去IP数据报在本路由器上所耗费的事件,若不为0就转发,否则丢弃
          • 现在以“跳数”为单位,路由器转发IP数据报时,将IP数据报首部中的该字段值减1,若不为0就转发,否则丢弃
        • 协议字段,指明IPv4数据报的数据部分是何种协议数据单元,常用的一些协议和相应的协议字段值如下

          • /image/image-20250807012831-2kbomrd.png
        • 首部检验和,占16比特,用于检测首部在传输过程中是否出现差错,其原理比CRC检验码(循环冗余检错码)简单,称为因特网检验和

          • IP数据报每经过一个路由器,路由器都要重新计算首部检验和,因为某些字段(生存时间、标志、片偏移等)的取值可能发生变化
          • 由于IP层本身不提供可靠传输服务,摒弃计算首部校验和是一项耗时的操作,因此在IPv6中,路由器不在计算首部检验和,从而更快转发IP数据报
        • 源IP地址和目的IP地址字段,各占32比特,用来填写IP数据报发送的源主机和目的主机的IP地址

        • 练习

          • /image/image-20250807013715-kudqynw.png
          • /image/image-20250807013957-9n9yk5n.png
          • /image/image-20250807014056-1xcbw7i.png
          • /image/image-20250807014130-i1kmuub.png
  • 网际控制报文协议ICMP

    • 为了更有效地转发IP数据报,并提高交付成功的机会,在网际层是用了网际控制报文协议ICMP(Internet Control Message Protocol)

    • 主机或路由器使用ICMP协议来发送差错报告报文和询问报文,其被封装在IP数据报中发送

      • ICMP差错报告报文有以下5种

        • 终点不可达

          • 当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。具体可再根据引CMP的代码字段细分为目的网络不可达
            目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等13种错误
          • /image/image-20250807021713-tp5lyf8.png
        • 源点抑制

          • 当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢
          • /image/image-20250807021805-6r23h5n.png
        • 时间超过

          • 当路由器收到一个目的IP不为自己的IP数据报时,会将其生存时间TTL字段值减1,若结果不为0,则转发该IP数据报;若结果为0,除丢弃该IP数据报外,还要向源点发送事件超过报文
          • /image/image-20250807022117-i5pq4hm.png
          • 另外,当重点在预先规定的事件内不能收到一个数据报的全部报片时,就把已收到的数据报片全都丢弃,也会向源点发送事件超过报文
        • 参数问题

          • 当路由器或目的主机收到IP数据报后,根据其首部中的检验和字段,发现首部在传输过程中出现了误码,就丢弃该数据报,并向源点发送参数问题报文
          • /image/image-20250807022259-p66ww24.png
        • 改变路由(重定向)

          • 路由器把改变路由报文发送给主机,让主机知道下次应将数据发送给另外的路由器(可通过更过的路由进行转发)
          • /image/image-20250807022346-ut4d5um.png
        • 以下情况,不应发送ICMP差错报告报文

          • 对ICMP差错报告报文不再发送ICMP差错报告报文
          • 对第一个分片的数据报片的所有后续数据报片,都不发送ICMP差错报告报文
          • 对具有多播地址的数据报都不发送ICMP报告报文
          • 对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报不发送ICMP差错报告报文
        • 练习

          • /image/image-20250807022825-dztn7nv.png
      • 询问报文有2种

        • 回送请求和回答

          • ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问,收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文
          • 这种询问报文用来测试目的站是否可达,及了解其有关状态
        • 时间戳请求和回答

          • ICMP事件戳请求报文是请某个主机或路由器回答当前的日期和时间
          • 在ICMP时间戳回答报文中,有一个32位的字段,其中写入的整数代表从1900年1月1日起,到当前时刻一共有多少秒
          • 这种询问报文用来进行时钟同步和测量时间
    • ICMP应用举例

      • 分组网间探测PING(Packet InterNet Groper)

        • 用来测试主机或路由器之间的连通性
        • 应用层直接使用网际层的ICMP(没有通过运输层的TCP或UDP)
        • 使用的ICMP回送请求和回答报文
      • 跟踪路由(trace route,tracert)

        • 用来测试IP数据报从源主机达到目的主机都要经过哪些路由器

        • windows版本使用tracert​命令,应用层也是直接使用了网际层ICMP的回送请求和回答报文,以及差错报告报文

        • 在unix版本中,使用traceroute​命令,在运输层使用UDP协议,仅使用ICMP的差错报告报文

        • 实现原理

          • 可以直接发送一个TTL=1的回送请求报文,其在达到第一个路由器后,会返回一个差错报告(时间超过),这样主机就知道第一个路由器是谁了
          • 下一轮则发送TTL=2的请求,知道下一个节点
          • 当到达最后目的主机之后,解析该数据,发现其内部是一个ICMP回送请求报文,于是向源主机返回ICMP回送请求回答报文,由此知道最后一站在哪里
  • 虚拟专用网VPN(Virtual Private Network)

    • 若需要让两个异地的网络之间相互通信

      • 最简单方便的方法是租用电信公司的通信线路,但租金很高
      • 也可以通过公用的因特网,作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网
    • 虚拟专用网内部的各主机,如何分配IP地址

      • 由于IPv4地址的紧缺,一个机构能申请到的IPv4地址数量往往小于本机构所拥有的主机数量;因此,虚拟专用网中的各主机所分配的地址应该是本机构可自由分配的专用地址,而不是需要申请的、在因特网上使用的公有地址

      • 可以在因特网数字分配机构IANA的官方网站,查看IPv4地址空间中特殊地址的分配方案

        • /image/image-20250807123511-95pdk1a.png
        • /image/image-20250807123553-lg28ije.png
        • 如图所示的三个网络地址,就是无需申请的、可自由分配的专用地址,也称为私有地址
        • 私有地址只能用于一个机构的内部通信,不能用于和因特网上的主机进行通信(即是说,只能用做本地地址,而不能用于全球地址)
        • 在因特网中的所有路由器,对目的地址是私有地址的IP数据报一律不进行转发
    • 作用过程

      • /image/image-20250807135946-vyyi292.png
      • 两个子网络,各自至少需要一个路由器具有合法的全球IP地址,这样他俩才能利用因特网进行通信
      • 当需要通信时,源主机会将数据封装为IP数据报发送给路由器R1,其填写的IP地址为内部IP地址
      • 路由器R1收到该数据报后,发现其目的网络必须通过因特网才能到达,就将该IP数据报进行加密(确保安全),重新添加IP数据报的首部,封装称为在因特网上发送的外部数据报,其IP地址填写为全球地址
      • 当路由器R2在收到该信息后,将其解密,恢复出内部的IP数据报,提取出目的地址,将其发送给相应的主机
      • 这样做之后,虽然数据报可能通过因特网的多个路由器,但从逻辑上看,就像R1和R2之间有一条直通的点对点链路一样,在本机构的专用网上进行传输,因而该技术也被称为IP隧道技术
    • 不同类型

      • 同一机构内,不同部门的内部网络所构成的虚拟专用网VPN,又称为内联网VPN
      • 有时一个机构的VPN需要有某些外部机构(通常是合作伙伴)参加进来,这样的VPN称为外联网VPN
      • 在外地工作的员工需要访问公司内部的专用网络时,只要在任何地点接入到因特网,运行驻留在员工PC中的VPN软件,在员工PC和公司的主机之间建立VPN隧道,即可访问专用网络中的资源,这种VPN称为远程接入VPN
  • 网络地址转换NAT(Network Address Translation)

    • 虽然因特网采用了无分类编址方式来减缓IPv4地址空间耗尽的速度,但由于因特网用户数目的激增,特别是大量小型办公室网络和家庭网络接入因特网的需求不断增加,IPv4地址空间即将面临耗尽的危险仍然没有被解除

    • 1994年提出了一种网络地址转换NAT的方法再次缓解了IPv4地址空间即将耗尽的问题

    • NAT能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源 #Q#​ 没看懂这句话

    • 举例

      • 核心问题:内部专用网络中的主机,如何访问外部因特网上的主机?

        • 这需要在连接外部因特网的路由器上,安装NAT软件,此时路由器称为NAT路由器,其至少拥有1个有效的全球IP地址
        • 此时,所有使用私有地址的主机,在和外界通信时,都要在NAT路由器上将其私有地址转换成全球IP地址
      • 当私有地址主机需要跟因特网主机发送IP数据报时,该主机将数据报发送给NAT路由器,此时源地址为私有地址,目的地址为全球地址

      • NAT路由器从自己的全球IP地址池中,为该主机分配一个临时的全球IP地址,并将IP数据报的源地址修改为该地址,然后将私有地址和全球地址的对应关系记录在NAT转换表中,随后转发该IP数据报

      • /image/image-20250807143917-backxqh.png

      • 当外部主机给源主机发回数据报时,其填写的源地址和目的地址都是全球IP地址;NAT路由器收到后,在NAT转换表中进行查找,找到该数据报的目的地址所对应的私有地址,于是修改该IP数据报的目的地址为私有地址,并将其发送给相应的主机

      • /image/image-20250807144205-i2hn9ok.png

      • 多个内部主机在通信时,需要有多个临时全球IP地址的记录

      • => 问题:如果NAT路由器具有n个全球IP地址,那么至多只能有n各内网主机能够同时和因特网上的主机通信

        • 由于绝大多数的网络应用都是使用运输层协议TCP或UDP来传送数据,因此可以利用运输层的端口号和IP地址一起进行转换
        • 这样,用一个全球IP地址就可以使多个拥有本地地址的主机同时和因特网上的主机进行通信,这种将端口号和IP地址一起进行转换的技术叫做网络地址与端口号转换NAPT(Network Address and Port Translation)
        • /image/image-20250807153913-e3dk7qw.png
      • 值得一提的是,外网主机不能够首先发起通信,因为路由器在收到外网的IP数据报后,在NAPT转换表中找不到相应的记录

      • 位于网络内部(使用私有地址)的主机,也不能直接充当因特网服务器

      • 对于一些点对点网络应用,需要外网主机主动与内网主机进行通信,在通过NAT时会遇到麻烦,需要网络应用自己使用一些特殊的NAT穿越技术来解决问题(内网穿透

      • 反过来想,由于NAT对外网屏蔽了内网主机的网络地址,能为内网的主机提供一定的安全保护

      • /image/image-20250807154342-gny9eq0.png