IP,提供不可靠,无链接的数据包传送服务.其中:网络
不可靠;即将数据交付给IP协议传送,IP协议并不能保证将数据成功传送过去;若数据在传输过程当中遇到任何错误,IP协议会丢弃数据,并发送ICMP错误报文给信源端.并发
无链接;即在将数据交付给IP协议传送以前,是不须要创建链接的;一个鲜明的对比是TCP协议,将数据交付给TCP协议以前,须要创建链接以后,才能发送数据.学习
此处对 IP 首部的介绍并不涉及 IP 选项部分测试
版本号;4bit;代表当前IP数据包的版本号,当前取值为4,代表是IPV4数据包.spa
首部长度;4bit;代表当前IP数据包的首部长度,单位:4byte,通常状况下,该值为5,代表IP首部长度为5*4byte,即20bytes.net
服务类型;8bit;分为以下子字段:代理
优先权;3bit;已过期;code
TOS;4bit;应用程序可根据须要来设置相应的位,但具体如何解释取决于实现,blog
最小时延,如: telnet/rlogin 交互应用程序通常设置了该位.接口
最大吞吐量,如: FTP 在传输文件时,通常设置了该位.
最高可靠性,如: ICMP 在发送报文时,通常设置了该位.
最小费用.
数据包长度;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 协议可能会从 IGMP,ICMP,UDP,TCP 等上层协议中接受数据,也有可能从一个网络接口接收数据报:
发送 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;/* 找到最佳匹配路由表条目 */ } }
0 表示所有的比特位全为 0;1表示全部的比特位全为 1;netid,subnetid 和 hostid 分别表示不为全 0 或全1的对应字段.
当主机号不进行子网划分时,
TODO 问题: '表示网络上的(特定)主机'中'网络'是指以太网这种局域网,仍是 A,B,C 类这类大网络?(我以为是以太网..),'特定'又是什么意思?
当主机号又进行子网编址时
选路机制,决定了如何从众多路由表条目章肯定匹配的路由表条目;目前的选路机制:根据网络号,子网号,主机号肯定匹配的路由表条目.
选路策略,决定了将哪些路由表条目放在路由表中
当没法为一个 IP 数据包选路,如: 路由表中没有默认项,也没有匹配项
若是 IP 数据包为本机应用程序产生,则就给发送该数据报的应用程序返回一个差错,或者是"主机不可达差错"或者是"网络不可达差错".
不然,就给 IP 数据包的原主机发送一个 ICMP 不可达的差错报文.
TODO,此时只关注了选路机制,对于选路策略没有进行学习...