3-IP:网际协议

  • IP,提供不可靠,无连接的数据包传送服务.其中:

    • 不可靠;即将数据交付给IP协议传送,IP协议并不能保证将数据成功传送过去;若数据在传输过程中遇到任何错误,IP协议会丢弃数据,并发送ICMP错误报文给信源端.

    • 无连接;即在将数据交付给IP协议传送之前,是不需要建立连接的;一个鲜明的对比是TCP协议,将数据交付给TCP协议之前,需要建立连接之后,才能发送数据.

IP 首部的格式

此处对 IP 首部的介绍并不涉及 IP 选项部分

3-IP:网际协议

  • 版本号;4bit;表明当前IP数据包的版本号,当前取值为4,表明是IPV4数据包.

  • 首部长度;4bit;表明当前IP数据包的首部长度,单位:4byte,一般情况下,该值为5,表明IP首部长度为5*4byte,即20bytes

  • 服务类型;8bit;分为如下子字段:

    • 优先权;3bit;已过时;

    • TOS;4bit;应用程序可根据需要来设置相应的位,但具体如何解释取决于实现,

      1. 最小时延,如: telnet/rlogin 交互应用程序一般设置了该位.

      2. 最大吞吐量,如: FTP 在传输文件时,一般设置了该位.

      3. 最高可靠性,如: ICMP 在发送报文时,一般设置了该位.

      4. 最小费用.

  • 数据包长度;16bit;指明了当前IP数据包的长度(包括IP首部,以及数据),单位:字节

  • 标识;16bit;唯一标示主机发送的每一个IP数据包,

  • 标志;3bit;参考 IP 分片

    • More Fragments 1 bit,若 IP 数据包在发送过程中被分成若干片,则除了最后一片外,其余片中的该位必须置位,表明该片不是最后一片.

    • Don't fragment 1 bit.若设置则表明该 IP 数据包在发送中不能被分片.如果 IP 数据包无法在不分片的情况下进行转发,则路由器会丢弃该 IP 数据包并通过 ICMP 将一个错误信息发送至源端.

  • 片偏移;13bit;参考 IP 分片.

  • TTL;8bit;指名了当前IP数据包在网络中的生存时间,网络中的节点对TTL的处理大致如下:

if(ip数据包.目的IP地址 == 节点自身地址)
    将ip数据包交付给节点的上层协议进行处理;
else
    --ip数据包.ttl;
    if(ip数据包.ttl == 0)
        丢弃该 ip数据包;
    转发给 ip 数据包;
  • 上层协议;8bit;指名了IP数据包应该交付的上层协议.

  • 首部检验和;16b;该检验和只是用来验证ip数据包的首部,即只使用ip数据包的首部计算得来.

  • 源IP地址;目的IP地址

子网编址,子网掩码

  • 子网编址,即不把 IP 地址看成由单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号.即此时 IP 地址由网络号,子网号,主机号组成.

    • 一般情况下,一个子网中仅能容纳一个物理网络,但当使用 ARP 代理后,多个物理网络可以共享一个子网号.

    • 全为 0,或全为 1 的子网号,主机号具有特殊的意义,所以不可以被使用.

  • 子网编址的优点(TODO 由于没有实际例子,所以显得抽象...):

    • 子网对外部路由器来说隐藏了内部网络组织(一个校园或公司内部)的细节

    • 子网划分缩减了路由表的规模.

  • 子网掩码,用来确定在主机号中有多少位用于子网号,又有多少位用于主机号.是一个 32 bit的值,值为 1 的比特留给网络号和子网号,为 0 的比特留给主机号.

    • 根据 IP 地址的前缀可以确定 IP 地址所属类,即确定网络号的位数.

    • 根据子网掩码来确定子网号以及主机号的位数.

  • 网络接口(即网络适配器)与 IP 地址,IP 子网掩码一一对应.即一个网络接口具有唯一的 IP 地址以及子网掩码.

变长子网

  • 即允许含有子网的网络使用多个子网掩码,子网编址是将主机号分为子网号与主机号,而变长子网则是在分配后的主机号中再一次进行分配子网号与主机号.

  • 一般情况下,一个 A,B,C 类网络中只有一个子网掩码,所以当两个 IP 地址具有相同的网络号,一般就可以肯定他们具有相同的子网掩码,因此可以分析出这 2 个 IP 地址的子网号,以及主机号.

IP 路由选择,及发送过程

  • 接受 IP 数据包,IP 协议可能会从 IGMP,ICMP,UDP,TCP 等上层协议中接受数据,也有可能从一个网络接口接收数据报:

3-IP:网际协议

  • 发送 IP 数据包

搜索内核 IP 路由表,由匹配路由条目,或者默认路由条目,确定下一跳的地址以及网络接口;
if(下一跳的地址 == 0) /* 直接路由 */
    将 (IP 数据包目的地址,IP 数据包) 发送给指定的网络接口;
else /* 间接路由,此时下一跳地址是默认路由器的 IP 地址,由该路由器负责转发分组. */
    将 (下一跳的地址,IP 数据包) 发送给指定的网络接口;
/* 内核 IP 路由表一般如下: */
$ route -n
内核 IP 路由表
目标             网关(下一跳地址)  子网掩码          接口
0.0.0.0         192.168.16.1    0.0.0.0         wlan0 /* 默认路由条目 */
192.168.16.0    0.0.0.0         255.255.255.0   wlan0 /* 直接路由 */
    • 即如果目的主机与源主机直接相连(如点对点链路)或都在一个共享网络上(以太网或令牌环网),那么IP数据报就直接送到目的主机上.否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报.

  • 网络接口发送数据帧

发送 ARP 请求报文获取下一跳地址的 MAC 地址;
/* 此时下一跳地址可能是 IP 数据包的目的地址,也可能是默认路由器的 IP 地址 */
构建数据帧,然后发送该数据帧;
  • 如何搜索内核 IP 路由表

var 匹配路由表条目=默认条目;
var 匹配优先级=0;  
/* 用来表示匹配路由表条目的匹配程度.
 * 若匹配路由表条目是默认条目,则优先级为 0.
 * 若仅网络号匹配(即匹配路由表条目.网络号==下一跳地址.网络号),则优先级为 1;
 * 若网络号与子网号都匹配,则优先级为 2;
 * 若网络号,子网号,主机号都匹配,则优先级为 3;
 */
for(路由表条目 in 内核 IP 路由表) /* 遍历内核 IP 路由表 */
    if(路由表条目.目标.类别 == 下一跳地址.类别 && 
    路由表条目.目标.网络号 == 下一跳地址.网络号 ) /* 具有相同的网络号 */
        if(匹配优先级 < 1){  /* 原匹配路由表条目匹配程度不高 */
            匹配路由表条目=路由表条目;
            匹配优先级 = 1;
        }
        if(路由表条目.目标.子网号 == 下一跳地址.子网号){
            匹配路由表条目=路由表条目;
            匹配优先级=2;
        }else continue;/* 子网号不相同,直接测试下一个路由表条目 */
        if(路由表条目.目标.主机号 == 下一跳地址.主机号) {
            匹配路由表条目=路由表条目;
            break;/* 找到最佳匹配路由表条目 */
        }
}

特殊的 IP 地址

  • 0 表示所有的比特位全为 0;1表示所有的比特位全为 1;netid,subnetid 和 hostid 分别表示不为全 0 或全1的对应字段.

  • 当主机号不进行子网划分时,

3-IP:网际协议

    • TODO 问题: '表示网络上的(特定)主机'中'网络'是指以太网这种局域网,还是 A,B,C 类这类大网络?(我觉得是以太网..),'特定'又是什么意思?

  • 当主机号又进行子网编址时

3-IP:网际协议

IP 选路

  • 选路机制,决定了如何从众多路由表条目章确定匹配的路由表条目;目前的选路机制:根据网络号,子网号,主机号确定匹配的路由表条目.

  • 选路策略,决定了将哪些路由表条目放在路由表中

  • 当无法为一个 IP 数据包选路,如: 路由表中没有默认项,也没有匹配项

    • 如果 IP 数据包为本机应用程序产生,则就给发送该数据报的应用程序返回一个差错,或者是"主机不可达差错"或者是"网络不可达差错".

    • 否则,就给 IP 数据包的原主机发送一个 ICMP 不可达的差错报文.

  • TODO,此时只关注了选路机制,对于选路策略没有进行学习...

你可能感兴趣的:(3-IP:网际协议)