网际协议(IP)
协议介绍
IP (Internet Protocol)协议是TCP/IP最核心的协议,它承载着TCP,UPD,ICMP,IGMP等协议的数据传输功能,计算机网络路由机制的核心协议。
RFC 791定义IP首部格式如下图:
4位版本:值位4表示IPV4,现在还有IPV6。
4位首部长度:单位DWORD(4字节),最大首部长度为60(15*4)字节。
IP最小首部长度为20字节,因此IP首部选项最多40字节。
8位服务类型:不常用,参见RFC 1349对其对说明。
16位总长度: 单位Byte(字节),包括IP首部长度和IP数据长度,最大长度65535。
16位标识:是每个IP数据包的唯一标识,对于需要分片的IP报文,每个分片的标识是一致的。
3位标记: 第一位未使用。
第二位DF(不允许分片),路径MTU发现机制使用IP这一特性。
第三位MF (是否有更多分片),IP报文分片时,除最后一个分片不设置该标记,其他分片设置该标记为1。
13位偏移:是指当前分片在整个IP报文中的位置,比如0表示是第一个IP分片。
8位生存时间:每经过一个路由器减1,防止广播风暴,目前常用64。
8位协议:区分上层协议,比如ICMP,IGMP,TCP,UDP。
16位首部校验和:交换IP首部数据是否正确。
32位源IP地址: 源端IP地址。
32位目的IP地址:目的端IP地址。
选项:不常用。可选择如下项。
安全和处理限制、记录路径、时间戳、宽松的源站路由、严格的源站路由。
IP地址为我们所熟知,通常使用点分十进制表示,譬如我的主机IP地址为(192.168.1.104),一个看似简单的数字却包含了不少学问。
1)IP地址可以按照网络类型进行划分,还可以在网络号上进行子网划分。
2)IP是路由的基础,路由机制又涉及更多机制,ARP, 路由表,ICMP重定向,动态选路等等。
3)有了IP协议和路由机制,可以让主机互相进行通讯,发展后来出现安全隐患,人们开始建立安全意识,就有了防火墙、NAT、DMZ等等安全措施,
这些衍生功能都建立在IP协议的基础之上。随着这些衍生功能又发展了更多的应用层协议DNS、DDNS、UPNP、DHCP等等。
可以说IP协议是网络的核心,本章只是初识IP协议,更多IP协议的详细分析会在后面的章节陆续进行阐述。
ICMP协议
协议介绍
ICMP(Internet Control Message Protocol)Internet控制报文协议。 基于IP协议,提供网络控制的服务,TCP、UDP等都会使用该协议控制报文进行对应处理。ICMP协议又服务于IP协议,比如网络重定向、需要进行分片导致传输失败、子网掩码获取等等。因此ICMP协议定位为网络层协议是比较合适的。经典的ping,traceroute命令就是基于ICMP协议进行开发的客户端。
RFC 792定义ICMP首部格式如下图:
8位类型:描述不同的ICMP控制。
8为代码:相同类型的ICMP分为不同的代号。
16为校验和: 检测整个ICMP报文的数据一致性。
数据部分:根据不同类型,数据部分长度不同。
下图列举ICMP的类型和代码。
应用
ping
ping命令主要用途是用于测试目的主机是否可达到,ping的请求ICMP类型0,代码0,回应类型8,代码0。大多数情况下可以使用ping命令检测对方主机是否可达到,为什么说是大多数,出于安全性的目的,会禁止对ping的请求进行应答,防止主机IP地址暴露。
ping命令还可以用于测试达到对方主机的往返时间,用于验证网络情况好坏。
ping命令可以使用IP记录路径选项的功能,获得达到对方主机所经过路由器的IP地址。ping命令也可以使用IP时间戳选项的功能记录路径路由器的时间戳。
如果网络不可达到、主机不可达到、端口不可达到会使用ICMP协议返回一个差错报文,这个是上层协议经常使用到的ICMP报文。
traceroute
traceroute命令主要用途是跟踪达到目的主机经过的路由选择。实际上ping利用IP记录路径也可以实现相同工作,为什么traceroute还需要支持该功能?
原因在于IP记录路径有两点限制,一是有些路由器可以不实现该功能,二是记录IP路由地址存放在IP首部,IP首部只有40个字节可供使用,去掉4个字节的记录路径选项,最多可以记录9个IP地址。
traceroute跟踪达到目的主机的原理是这样的,通过设置IP头部的TTL字段,依次设置TTL值为1,2。。。,由于路由器检测到TTL值为1时就会产生一个ICMP报文,类型11,意为超时,如此就能够通过ICMP报文的源地址获得路由器的地址,因此可以依次获取到第一跳,第二跳。。。的路由地址,但是应该如果判断目的地址已经达到目的主机了呢?traceroute还需要发送一个UDP报文,端口是一个随机的较大值,假设目的主机没有利用该端口,会回复一个ICMP报文,类型3,代码3,意为端口不可达到。如此可以通过ICMP端口不可达到的报文获得对方的IP地址,如果IP地址和目的地址一致,则表示寻路结束。
traceroute命令还可以用于发现路径MTU,上一讲提到过路径MTU概念,路径MTU同样重要,如果中间路由器不主动进行IP分片,它可能影响到报文是否能够送达,就算中间路由器进行IP分片,不影响包的达到,那还是会影响到传输效率。
traceroute发现路径MTU的原理是这样的,通过设置IP头部标记DF(不允许分片),发送源端MTU大小的报文,如果中间路由有MTU小于该值,并且判断出DF标记,会向源主机发送一条ICMP报文,类型3,代码4,意为不分片无法通过。并且有些路由器会返回它的MTU值,如此源端获得这条iCMP报文后会使用返回的MTU大小进行再次尝试,直到不再产生由于不分片无法通过的ICMP报文。
广播与多播
有时我们需要向同一网络的所有主机发送报文,这就是广播,上一讲的ARP,RARP的请求就是广播。但是也有这样的需求,向网络的一部分主机发送报文,就不适合使用广播,因为使用广播的话,那些并不关心该广播报文的主机却要处理报文,实在是浪费,因此可以使用多播。
广播
广播主要分为下面四种IP地址类型,我们依次进行介绍。
1)受限的广播
受限的广播地址为255.255.255.255。该地址用于主机启动过程,此时主机还不知道自己的IP和网络掩码。理论上路由器收到该类型的广播后,不在进行广播,使它只出现本地网络内。
2)指向网络的广播
指向网络的广播地址主机号全为1。比如A类网络的广播是 *.255.255.255。C类网络则是*.*.*.255。
3)指向子网的广播
假设B类网络是128.1.0.0,划分一个子网为128.1.1.0,子网掩码就是255.255.255.0。如此改子网的广播地址就是128.1.1.255。
4)指向所有子网的广播
还是上面的那个例子,如果划分了子网128.1.1.0,子网掩码是255.255.255.255,那么指向子网的广播地址,子网号和主机号全为1,因此128.1.255.255就是所有子网的广播地址。
例子:
我的主机号192.168.1.104,网络号192.168.1.0,网络掩码是255.255.255.0。是一个局域网,没有划分子网,因此可以使用192.168.1.255进行局域网内广播。
ping 192.168.1.255
PING 192.168.1.255 (192.168.1.255): 56 data bytes
64 bytes from 192.168.1.104: icmp_seq=0 ttl=64 time=0.061 ms
64 bytes from 192.168.1.1: icmp_seq=0 ttl=64 time=27.772 ms
64 bytes from 192.168.1.100: icmp_seq=0 ttl=64 time=263.093 ms
64 bytes from 192.168.1.104: icmp_seq=2 ttl=64 time=0.167 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=4.617 ms
64 bytes from 192.168.1.100: icmp_seq=2 ttl=64 time=97.854 ms
^C
--- 192.168.1.255 ping statistics ---
2 packets transmitted, 2 packets received, +4duplicates, 0.0% packet loss
发现除了自己有回复外,路由器1.1,另一台主机1.100都对其进行回复。
应用案例:
我们公司有一个实际使用广播的案例,我们公司的产品型号有很多种,提供客户一全套的解决方案,假设产品都在同一个局域网内,如何获取到局域网内我公司的产品和产品类型呢?这就是一个比较适合使用广播的应用场景,开发了一个XXXSearch的客户端,向局域网内发送广播报文,有对应报文格式,公司的每种产品都必须接收广播报文并且进行处理,返回自己的型号等等信息。
多播
IP地址分为(A,B,C,D,E)五类,多播属于D类IP地址。D类地址的划分是最高字节的前4个bit是1110,多播组ID为28位,如下图。
根据D类IP地址规则,多播组的地址范围是224.0.0.0 - 239.255.255.255。
一些多播组地址被IANA确定为知名地址,被当做永久主机组。例如224.0.0.1代表“该子网内的所有系统组”,224.0.0.2代表“该子网内的所有路由器”,224.0.1.1用于网络时间协议NTP。
多播理论上可以划分2的28次方个多播组,每个多播组可以让主机自由的加入和退出,这就涉及到后续的IGMP协议。
多播实际上是对广播的一种补充,形成一个主机组,如果主机组内的主机相互通信就可以使用多播进行,而不至于影响其他不在多播组内的其他主机的性能。多播还可以在使两个不同网络的主机加入到一个多播组,实现不同网络上主机的交互。
应用案例:
我们公司一个实际的多播多播案例,在同一个局域网内,有N个视频源(实时视频流),有M个客户端(用户),当有M个客户端同时播放同一个视频源时,最差的实现方式是发出M路视频流,其次的方案是可以利用服务器,负载均衡的分发出视频源,更好的方案可以利用客户端P2P互相传输(互联网时经常使用),我们提供一套方案就是将M个客户端和这个视频源加入一个多播组,然后由视频源发送多播报文,M个用户能够同时收到该视频源的实时流(局域网内很有效),可以很好的减少局域网内的网络流量。
IGMP协议
协议介绍
IGMP (Internet Group Management Protocol) Internet组管理协议,基于IP协议,用于管理主机的多播组。
RFC 1112定义IGMP协议首部格式如下图:
4位版本:目前该值为1。
4位类型: 1为查询报文,2为报告报文。
16校验和:校验IGMP数据一致性。
32组地址:多播组地址。
主机如何加入和退出多播组:
1)当第一个进程加入组时,主机就发送一个IGMP报告。如果有多个进程加入同一个组,只需发送一次即可,路由器只关心是否有主机加入了多播组。
2)进程离开时无需发送任何报文,如果所有进程都离开,那么路由器发送组查询报文时,不对其进行报告即可。
3)多播路由器定时发送IGMP查询来了解是否还有主机还属于多播组。多播路由器必须对每个接口都进行查询,查询报文的组地址被设置为0,表示查询主机所有的多播组。
4)主机通过发送报告相应多播路由器的查询请求,对至少有一个进程加入的多播组均要报告。
多播路由对每个接口保存一直记录表,记录是否还存在一个主机属于该多播组,如果存在,收到多播报文时就通过该接口转发多播报文,以到达向另一个网络传输的功能。
其工作原理如下图:
小结
本章主要介绍了IP协议,重点介绍ICMP协议及其应用,广播和多播简单的入门概念讲解,IGMP作为多播协议的基础进行介绍。实际上可以大致的看出网络层协议主要负责工作和其分工,为日后使用上层协议打好基础。IP协议作为核心协议,主要分析IP协议的首部字段,IP主要工作,并没有深入的对其进行讲解,后续会陆续的进行各个击破,如果没有站在一个更高的抽象层面去看待网络协议,就无法领略网络协议的全貌。所以我计划几个章节对网络协议进行一个概况,不一定面面俱到,希望可以将描绘整张蓝图。
参考
《TCP/IP详解-协议》卷一 W.Richard Stevens
修订
初稿 2014-10-25 Simon