IP地址

首先说一说IP地址,IP地址由4字节32bit构成,可以分为5类,A,B,C,D,E

其中

  • A类地址:0 + 7位网络号 + 24位主机号
  • B类地址:10 + 14位网络号 + 16位主机号。也就是2^7-(2^7+2^6)开头的IP地址,128-191
  • C类地址:110 + 21位网络号 + 8位主机号。也就是(2^7+2^6)-(2^7+2^6+2^5)开头的IP地址,192-223
  • D类地址:1110 + 28位多播组号。也就是(2^7+2^6+2^5)-(2^7+2^6+2^5+2^4)开头的IP地址,224-239
  • E类地址:11110 + 27位。也就是240以上的IP地址

IP首部

普通IP首部长为20个字节

  • 4位版本

    网络字节序是以大端传输,即最高有效字节在前面的方式(10010000 01010001)

  • 4位首部长度

    指的是首部占32bit字的数目,所以首部最长是60个字节。普通IP数据报字段的值是5,即20字节。

  • 8位服务类型(TOS)

    3位的优先权子字段,4bit的TOS子字段和1bit未用位但是必须置于0

    TOS字段分别代表最小时延,最大吞吐量,最高可靠性和最小费用

  • 16位总长度(字节数)

    所以IP数据报最长是65535字节,但是即使可以这么长,链路层也会对它进行分片,而且主机并不要求接收超过576字节的数据报。

  • 16位标志字段

    唯一的标识主机发送的每一份数据报,通常每发一份报文它的值就会加一

  • 8位生存时间字段

    设置了数据报可以经过的最多路由器数,每经过一个路由器,值就减一。如果值为0,报文就会被丢弃,并且发送ICMP报文通知源主机。

  • 8位协议字段

  • 16位首部检验和字段

    根据IP首部计算的检验和,检验和字段首先置为全0,首部中每16bit进行二进制反码求和,存在检验和字段中。接收方同样对16bit进行二进制反码求和,如果结果是全1,说明没有问题,否则就丢弃。

    路由器会修改TTL字段(减1),因此路由器转发一次报文需要在检验和加1.

  • 每一份IP数据报都包含32位源IP地址和32位目的IP地址。

IP路由选择

如果目的主机和源主机直接相连或者在一个共享网络上,那么IP数据报就直接送到目的主机上,因为已经知道了物理网卡地址。否则,主机将数据报发送到一个默认的路由器上,由路由器来转发该数据报。

几乎所有的Unix系统,都可以配置成一个路由器。本质区别在于主机从不把数据报从一个接口转发到另一个接口,而路由器则要转发数据报。

IP层可以从TCP, UDP, ICMP和IGMP来接收数据报并且进行发送,或者从一个网络接口来接收数据报并且进行发送。IP层在内存中有一个路由表,在收到一份数据报并且进行发送的时候,都要对该表搜索一次。

路由表包含以下

  • 目的IP地址
  • 下一站路由器的IP地址,或者是直接连接的网络IP地址
  • 标志,指明目的IP地址是网络地址还是主机地址,另一个标志指明下一站路由器是否为真正的下一站路由器,还是一个直接相连的接口。
  • 为数据报传输指定一个网络接口

所有IP路由选择只为数据报传输提供下一站路由器的IP地址。IP路由选择完成:

  • 搜索路由表,寻找能够与目的IP地址完全匹配的表目,网络号和主机号
  • 搜索路由表,寻找能够与目的网络号相匹配的表目
  • 寻找标为默认的表目

子网寻址,IP地址会分成网络号,子网号和主机号。这样缩减了路由表的规模。

子网掩码,值为1的比特留给网络号和子网号,为0的比特留给主机号。