什么是网际层?其主要作用是什么?
TCP/IP体系结构中的网际层(internet layer)就是网络层,核心协议为IP(Internet Protocol)协议,但是为了避免名字冲突而将internet翻译为了“网际”,同时也可以体现出其作用:解决网络(局域网)与网络互连的问题。
什么是“面向连接”、“可靠地”?什么是“无连接”、“尽最大努力的”?
所谓面向连接、可靠,就是通信双方在通信时必须确保建立连接,如果连接建立了就可以确定消息能发送到目标方,如果连接没有建立好,就不可以将消息发送到目标方,类似于“打电话”
所谓无连接、尽最大努力的,就是通信双方在不确定能否发送成功的情况下依然可以将消息发出去,负责转发的中间方(路由器)会尽可能的将消息送到目标方,但是不保证一定成功,类似于“发短信”
TCP/IP体系结构中的网际层采用的是“尽最大努力”的通信方式。(下图分别为提供可靠服务的网络层和提供最大努力的网络层)
为什么网际层要采用“尽最大努力”的方式?
相比于传统电话网络,计算机网络中的结点均为具有一定处理能力的主机,可以处理好通信出错的情况,比如三个数据报,丢失了中间的一份,主机可以发现。所以计算机网络中网络层提供可靠的通信并没有太大的意义,相比之下尽最大努力的通信更适合计算机通信的突发性特点,并且能节省更多的网络资源。
网际层有哪些协议?
最主要的就是IP(Internet Protocol)协议,除此之外还有3个“配套使用”的协议:
ARP协议(Address Resolution Protocol),即地址解析协议
ICMP协议(Internet Control Message Protocol),即网际控制报文协议
IGMP(Internet Group Management Protocol),即网际组管理协议
这三个配套协议的用途之后介绍。
既然MAC地址已经是唯一的,为什么还需要网际层或者说IP地址?
因为网络中的路由器不可能存下网络中所有主机的MAC地址,但却可以根据IP地址知道消息下一步该转发给哪个路由器,直到转发到目标主机所在网络的路由器,然后由该路由器直接交付给目标主机。
为什么路由器可以根据IP地址确定消息该转发给哪个路由器?
简要回答就是IP地址中声明了“该IP地址所属的网络”,所以路由器只需要将消息向该网络转发即可,当转发至该网络的路由器后,该网络的路由器再负责将消息传递给目标主机。
要想知道为什么路由器可以根据IP地址知道下一步转发至何处,就得看看IP地址的组成和历史。
IP地址的发展经过了三个阶段:
1.分类的IP地址
2.对分类的IP地址再次“划分”出子网
3.构成超网,也就是不再对IP地址进行分类,或者可以理解为将IP地址“自由划分”
※不论在上述哪个阶段,IP地址长度都是32位(准确的说是IPv4,IPv6有128位长,IPv就是IP version,即IP版本,目前常见为IPv4,其地址于2011年宣布耗尽,IPv6注定是下一代,1、3、5版本均未使用)
※在第一阶段,IP地址的结构为{<网络号>,<主机号>},可理解为:网络号部分用于标明该IP地址位于哪个网络,主机号部分用于标明该IP地址为该网络中的哪个主机。
在此基础上分出5种类型,其中以A,B,C类最常见,这三类用于点对点通信。D类地址用于一对多通信(多播),不常见。
不难看出C类地址可以分出最多的网络(2^21),但单个网络中能拥有的主机数量少,A类地址可以分出较少的网络(2^7),但单个网络中能拥有的主机数量最多。
※IP地址为32位,但是用32位来表示一个IP地址“太长”,所以手写或表达时往往采用“点分十进制”来表示IP地址
IP地址划分出“网络号”和“主机号”以及分类有什么优点和缺点?
优点就是可以方便IP地址管理机构的IP地址分配任务,其只需要负责分配网络号给各个“单位”即可,主机号部分可以由“单位”自行划分。
此外,IP地址中有“网络号”可以极大的减轻路由器的压力,因为路由器只需要以网络为目标来转发分组。
缺点就是浪费了很多位(比如C类地址浪费了3位),使得IP地址的32位并不能被充分利用,此外,由于第一阶段的分类IP地址划分过于“粗枝大叶”,导致了更多的IP地址浪费。比如一个“单位”有数百万台主机需要连接互联网,请求B类网络号需要几十个,不便管理,于是请求了一个A类网络号,但是其内部只有几百万台主机,而一个A类网络号支持一千多万台主机号,该A类网络号中剩下的IP地址就被浪费掉了。
IP数据报的传输过程是怎样的?
在网络之间传送时,是这样的:主机将IP数据报传给本网络的路由器,本网络的路由器根据IP地址将IP数据报传递给下一路由器,直至传递到目标网络的路由器,然后由目标网络的路由器将该IP数据报传给目标主机
那么,目标主机就位于本网络,或IP数据报到达目标网络路由器后,是如何传递给目标主机的?
不论是目标主机就位于本网络,还是目标网络路由器将数据报传给目标主机,都是同一性质的问题:局域网传递消息。
此时我们需要用到地址解析协议ARP,其作用就是将IP地址转换为MAC硬件地址。
当源主机(也可以是本网络路由器)准备发送IP数据报时,其先在本机中的ARP缓存地址中查找是否有该IP地址,若有,则直接将该IP地址对应的MAC地址写入MAC帧,然后通过局域网传递给目标主机。若没有,则在局域网内广播一个ARP请求分组,其形式、过程如下
若目标主机不在本局域网内,则源主机将IP数据报传递给本网络的路由器。
※路由器至少有两个IP地址,路由器的每一个接口对应一个IP地址
路由器是如何实现转发分组的?
路由器存有一个路由表,其根据IP数据报中的IP地址和路由表,判断出分组应该传递给谁
IP数据报的组成是怎样的?
如图
1.版本:说明该IP数据报使用的IP协议的版本,通信双方必须使用同一个IP协议版本
2.首部长度:因为IPv4中首部存在可变部分,所以需要指出首部的长度以划分首部与数据部分
3.区分服务:一般不用
4.总长度:说明该IP数据报的总长度。IP数据报封装为MAC帧时受限于MAC帧的长度上限,所以IP数据报还存在“分片”操作,即将IP数据报分为多片,封装进多个MAC帧。
5.标识:IP数据报若存在分片,则接收方需要将各分片组合出原IP数据报,相同标识号的IP数据报就说明它们其实是同一个源IP数据报。
6.标志:占3位,目前只有前两位有意义,最低位为MF(More Fragment),若MF=1则说明该数据报后面“还有分片”。中间一位为DF(Don‘t Fragment),若DF=1则没有分片,只有DF=0才可以分片
7.片偏移:用于说明该IP数据报(已分片)在源IP数据报中的相对位置(相对于数据字段的起点),单位是字节。
8.生存时间:IP分组在网络中传递时有可能出现“兜圈子”的情况,所以需要对IP数据报进行一定的限制,生存时间的单位是“跳数”,最大值为255,每经过一个路由器,路由器便将IP数据报的生存时间-1,当IP数据报中的生存时间为0时,路由器丢弃该分组。
9.协议:说明该IP数据报的上层协议类型,如TCP对应6,UDP对应17
10.首部校验和:验证首部是否存在传输错误
11.源地址
12.目的地址
※IP地址中的可变部分可用于支持很多操作,但很多情况都用不上,而且会增加路由器处理分组的开销,所以IPv6中的数据报首部做成了固定长度
如何解决IP地址分类带来的浪费问题?
历史上解决该问题有两个阶段,分别是划分子网和无分类编址(CIDR)。我们逐一讨论。
划分子网即在原有分类IP地址的基础上进行进一步划分网络,如B类网络143.13.0.0,可以再次划分出255个子网络,即从143.13.1.0到143.13.255.0。这么做的话会带来一个小问题,就是像143.13.3.10这样的IP地址,如何从中提取出目标子网络143.13.3.0?解决的方法是子网掩码,即一串32位的掩码,将IP地址与子网掩码进行按位与即可得出IP地址中的子网络号。例如下:
同时,路由器中的路由表改为如下格式:
当IP分组传递至某个路由器后,路由器将该IP地址与路由表中的子网掩码逐一按位与,然后比较是否与对应的目的网络地址相同,若相同则说明该分组的目标子网是该行。
但是划分子网依然有缺陷,因为划分子网的基础依然是分类的IP地址,所以网络号的分配依然不够灵活,所以IP地址又发展为了CIDR无分类编址的阶段。
在CIDR中,原“网络号”对应了CIDR的“网络前缀”,原“子网号”对应了“CIDR地址块”。CIDR的最大特点就是“无分类”,其IP地址可抽象看为{网络前缀,主机号},在分类IP地址中,网络号长度是固定的(即使划分子网也是在某一类地址中进行划分),而CIDR中网络前缀长度则是不固定的,如143.13.24.23/17,该IP地址后接了一个/17,用于说明其网络前缀的位数,我们要想知道该IP地址的网络前缀就需要令该IP地址与11111111 11111111 10000000 00000000进行按位与,然后得出网络前缀。
CIDR的方式可以减少路由器中路由表的大小,因为CIDR地址块的大小是不固定的,一个CIDR地址块有可能包含了多个C类或B类地址,这样一来路由表中只需要一行CIDR地址,就相当于分类IP地址中的多个网络号地址。
CIDR的方式带来了另一个问题,那就是如何确定一个IP地址的网络前缀?基础思路是将IP地址与子网掩码按位与,然后找出符合的“最长网络前缀”。
什么是ICMP网际控制报文协议?
ICMP的意义是IP数据报的转发效率和交付成功的几率。说白了就是封装于IP数据报中的一种特殊报文,用于测试主机间的连通性等。
ICMP报文分为两大类:ICMP差错报告报文和ICMP询问报文。
ICMP有两种常见应用:PING和路由探测
PING即Packet InterNet Groper,用于探测两台主机间是否连通,源主机向目标主机发送ICMP的回送请求报文(封装在IP数据报中),目标主机若接收到该报文则返回回送回答报文。Windows中可如下操作:打开命令行操作界面,输入“ping hostname”(hostname即目标主机名或IP地址),按Enter
路由探测即源主机向目标主机发送无法交付的UDP数据报(封装于IP数据报,若目标主机接收到该数据报,则会返回ICMP终点不可达报文),第一次发送时将IP数据报的生存时间设为1,这样一来第一个路由器接收到后将生存时间-1就会直接判断该IP分组需要丢弃,并返回ICMP时间超过报文,源主机接下来发送第二个IP数据报(依然为不可交付UDP数据报),此次将生存时间设为2……以此类推,直至接收到ICMP终点不可达报文,或生存时间达到上限为止。
在windows中路由探测的命令为tracert,用例如下