IPv4详解



IPv4数据报

一个IP分组由首部和数据两部分组成。首部的前一部分是固定长度的, 共20B, 是所有IP分组必须具有的。在首部固定部分后面是一些可选字段, 其长度是可变的。 IP数据报的格式如下图所示:

IPv4

IP首部的字段含义如下:

  • 版本: IP协议的版本,目前的IP协议版本号为4,下一代IP协议版本号为6。
  • 首部长度: IP报头的长度, 固定部分的长度(20B)和可变部分的长度之和。共占4位, 以4字节(32bit)为单位, 即报头的最大长度可以为15*4B=60B, 除去固定部分的长度20字节, 可变部分的长度最大为40字节
  • 服务类型: Type Of Service(TOS), 占8位, 其中的前3位表示报文的优先级, 后面的几位分别表示要求更低时延、更高的吞吐量、更高的可靠性、更低的路由代价等。对应位为1即有相应要求, 为0则不要求。
    • bit 0~2: 优先级
    • bit 3: 延迟, 0 = Normal Delay, 1 = Low Delay
    • bit 4: 吞吐量, 0 = Normal Throughput, 1 = High Throughput
    • bit 5: 可靠性, 0 = Normal Relibility, 1 = High Relibility
    • bit 6~7: Reserved for Future Use. 6: 开销(路由代价); 7: 仍为保留
  • 总长度: 报文的总长度, 单位为字节, 所以一个IP报文的的最大长度为65535B。
  • 标识: 每产生一个报文就加1, 通常与标记字段和分片字段一起用于数据包的分段。当IP报文长度超过传输网络的MTU(最大传输单元)时, 必须分片, 此时这个标识字段的值被复制到所有数据分片的标识字段中, 以便这些分片在达到最终目的地时可以重新组合起来。
  • 标志: 共3位, 分别为R(Reserved)、DF(Don't Fragment)、MF(More Fragment), 目前只有后两位有效, DF=1表示不分片, DF=0表示分片; MF=1表示后面还有分片,MF=0表示这是最后一片。
  • 片偏移: 本分片在原先数据报文中相对首位的偏移位, 13位, 以8B为偏移单位, 所以一个分片的长度一定是8B(64bit)的整数倍
    • 举例: 若MTU=1500时, 一个大小为3000字节的数据经过该接口, 会被分为3段, 第一段分组总长度为1480+20, 第二段也为1480, 第三段为40, 那么第一段的分段偏移为0, 第二段分段偏移为1480/8=185, 第三段为185+185=370
  • 生存时间: TTL(Time to Live), 标识分组在网络中的寿命, 以确保分组不会永远在网络中循环。路由在转发分组之前, 先把TTL减1, 为0时则丢弃该分组。推荐的初始值由分配数字RFC指定, 当前值为64, 发送ICMP回显应答时经常把TTL设为最大值255
  • 协议: 标识IP分组携带的数据使用的是那种协议, 以便目的主机的IP层能知道要将数据报上交到哪个进程(与端口号类似, 这里采用的是协议号)
    • 1: Internet Control Message Protocol (ICMP)
    • 2: Internet Group Management Protocol (IGMP)
    • 4: IP in IP (encapsulation)
    • 6: Transmission Control Protocol (TCP)
    • 17: User Datagram Protocol (UDP)
    • 45: Inter-Domain Routing Protocol (IDRP)
    • 46: Resource Reservation Protocol (RSVP)
    • 47: Generic Routing Encapsulation (GRE)
    • 54: NBMA Next Hop Resolution Protocol (NHRP)
    • 88: Cisco Internet Gateway Routing Protocol (IGRP)
    • 89: Open Shortest Path First (OSPF)
  • 首部校验和: 首部的校验和, 检查首部的完整性(只校验首部, 不校验数据部分)
  • 源IP地址: 发送方IP地址
  • 目的IP地址: 接收方IP地址
  • 可选字段: 包括源点产生的信息和其它路由器加入的信息, 可选字段, 主要用于测试, 长度可变
  • 填充: 通过在可选字段后面添加0来补足32位, 确保报头长度是32的倍数

IPv4地址分类

现在的IP网络使用32位地址表示, 以点分十进制表示. IP地址由网络号主机号两部分组成, 根据网络号的不同分为A类地址、B类地址、C类地址、D类地址和E类地址5种类型, 如下图:

IPv4

  • 主机号全0表示网络本身, 如202.98.174.0
  • 主机号全1表示本网络的广播地址, 如202.98.174.255
  • 127.0.0.0网络保留作为环路自检地址
  • 32位全0, 即0.0.0.0表示本网络上的本主机
  • 32位全1, 即255.255.255.255表示整个TCP/IP网络的广播地址, 由于路由器对广播域的隔离, 所以等效为本网络的广播地址

网络地址转换NAT

网络地址转换(NAT)通过将专用地址转换为公用地址, 隐藏了内部网络结构, 节省了IP地址消耗. 私有IP必须经过NAT转换成公网IP才可用于互联网. NAT路由器使用NAT转换表(存放着私有IP:端口全球IP:端口的映射)可以把多个私有IP都映射到同一个公网IP上.

私有IP地址网段如下:

  • A类: 1个网段, 即10.0.0.0 ~ 10.255.255.255
  • B类: 16个网段, 即172.16.0.0 ~ 172.31.255.255
  • C类: 256个网段, 即192.168.0.0 ~ 192.168.255.255

注意: 普通路由器转发IP数据报时不改变源和目的IP地址, 而NAT路由转发时一定会改变其IP地址, 而且需要查看传输层的端口.


子网与CIDR

子网划分

  • 从1985年起, 在IP地址中又增加了一个子网号字段, 两级IP地址变成三级, 即三级IP地址由网络号, 子网号主机号三部分组成。
  • 划分子网只是把IP地址的主机号这部分进行再划分, 不会改变原来的网络号, 从IP数据报中无法判断源或目的主机是否进行了子网划分

子网掩码

子网掩码是跟IP地址相对应的32位二进制串, 1对应网络号及子网号, 0对应主机号。子网掩码与IP地址按位相与(AND)即可得到相应子网的网络地址。 如果一个网络没有划分子网, 那就使用默认子网掩码, A、B、C类地址默认的子网掩码分别为255.0.0.0, 255.255.0.0255.255.255.0

子网掩码是一个网络中的重要属性, 路由之间交换信息时, 必须把自己所在网络的子网掩码告诉对方。在使用子网掩码的情况下:

  1. 一个主机在设置IP地址信息的同时, 必须设置子网掩码
  2. 同属于一个字网的所有主机及路由器的相应端口, 必须设置相同的子网掩码
  3. 路由器的路由表中包含的主要信息必须有: 目的网络地址, 子网掩码, 下一跳地址

无分类编址CIDR

CIDR(Classless Inter-Domain Routing)消除了传统的A、B、C类地址以及划分子网的概念, 更加有效地分配IPv4的地址空间, 提高了IP地址空间利用率, 减小路由表大小, 提高路由转发能力。 它有如下特点:

  • CIDR使用“斜线记法”(又称为CIDR记法), 即IP地址/网络前缀位数, 如128.14.32.5/20表示掩码为前20位全1和后12位全0, 即网络前缀为128.14.32.0
  • 网络前缀县通的连续的IP地址组成CIDR地址块, 一个CIDR地址块可以包括多个ABC类地址
  • 使用CIDR时, 在路由表可能得到多个匹配结果, 应采用最长前缀匹配原则, 选取最长的网络前缀匹配