网络层:IP、IGMP、ICMP

    网络层,有时也称为互联网层,处理分组在网络中的活动,在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。

IP:网际协议

    IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。TCP/IP对IP提供不可靠、无连接的数据报传送服务,不可靠(unreliable)的意思是它不能保证IP数据报能成功地到达目的地,无连接(connectionless)这个术语的意思是IP并不维护任何关于后续数据报的状态信息。

IP首部

    IP数据报的格式如下所示。
IP首部
    最高位在左边,记为0bit;最低位在右边,记为31bit。
    4个字节的32bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作bigendian字节序。由于TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。以其他形式存储二进制整数的机器,必须在传输数据之前把首部转换成网络字节序。
    目前的协议版本号是4,因此IP有时也称作IPv4。
    首部长度指的是首部占32bit字的数目,包括任何选项。由于它是一个4比特字段,因此首部最长为60个字节。普通IP数据报(没有任何选择项)字段的值是5。
    服务类型(TOS)字段包括一个3bit的优先权子字段(现在已被忽略),4bit的TOS子字段和1bit未用位但必须置0。4bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4bit中只能置其中1bit。如果所有4bit均为0,那么就意味着是一般服务。TOS字段推荐值如下:
TOS字段值
    总长度字段是指整个IP数据报的长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。
    标识字段唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1。
    TTL(time-to-live)生存时间字段设置了数据报可以经过的最多路由器数。它指定了数据报的生存时间。TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。
    根据协议字段可以识别是哪个协议向IP传送数据。
    首部检验和字段是根据IP首部计算的检验和码。它不对首部后面的数据进行计算。
    每一份IP数据报都包含源IP地址和目的IP地址。
    最后一个字段是任选项,是数据报中的一个可变长的可选信息。选项字段一直都是以32bit作为界限,在必要的时候插入值为0的填充字节。这样就保证IP首部始终是32bit的整数倍(这是首部长度字段所要求的)。

IP路由选择

    对于主机来说,如果目的主机与源主机直接相连(如点对点链路)或都在一个共享网络上(以太网或令牌环网),那么IP数据报就直接送到目的主机上。否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报。
    IP层在内存中有一个路由表,路由表中的每一项都包含下面这些信息:
- 目的IP地址;
- 下一站(或下一跳)路由器(next-hoprouter)的IP地址,或者有直接连接的网络IP地址;
- 标志;
- 为数据报的传输指定一个网络接口。
    IP路由选择主要完成以下这些功能:
- 搜索路由表,寻找能与目的IP地址完全匹配的表目(网络号和主机号都要匹配)。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口。
- 搜索路由表,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。目的网络上的所有主机都可以通过这个表目来处置。
- 搜索路由表,寻找标为“默认(default)”的表目。如果找到,则把报文发送给该表目指定的下一站路由器。
    如果上面这些步骤都没有成功,那么该数据报就不能被传送。如果不能传送的数据报来自本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误。

子网掩码

    主机通过子网掩码来确定有多少比特用于子网号及多少比特用于主机号,这个掩码是一个32bit的值,其中值为1的比特留给网络号和子网号,为0的比特留给主机号。

ICMP:Internet控制报文协议

    ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文的格式如下图。所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。
ICMP数据报
    类型字段可以有15个不同的值,以描述特定类型的ICMP报文,如下表所示。
ICMP报文类型

ICMP地址掩码请求与应答

    ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。系统广播它的ICMP请求报文,ICMP地址掩码请求和应答报文的格式如图所示。
ICMP地址掩码请求应答报文
    ICMP报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。这样,发送端就可以把应答与请求进行匹配。

ICMP时间戳请求与应答

    ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间(Coordinated Universal Time, UTC)。这种ICMP报文的好处是它提供了毫秒级的分辨率。ICMP时间戳请求和应答报文格式如图所示。
ICMP时间戳请求应答报文
    请求端填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。实际上,大多数的实现把后面两个字段都设成相同的值。

ICMP端口不可达差错

    ICMP不可达报文的一般格式如图所示。
ICMP端口不可达报文
    ICMP的一个规则是,ICMP差错报文必须包括生成该差错报文的数据报IP首部(包含任何选项),还必须至少包括跟在该IP首部后面的前8个字节。导致差错的数据报中的IP首部要被送回的原因是因为IP首部中包含了协议字段,使得ICMP可以知道如何解释后面的8个字节。

IGMP:Internet组管理协议

    用于支持主机和路由器进行多播的Internet组管理协议(IGMP)让一个物理网络上的所有系统知道主机当前所在的多播组。多播路由器需要这些信息以便知道多播数据报应该向哪些接口转发。如ICMP一样,IGMP也被当作IP层的一部分。IGMP报文通过IP数据报进行传输。IGMP有固定的报文长度,没有可选数据。IGMP报文通过IP首部中协议字段值为2来指明。

IGMP报文

    IGMP报文格式如下图。
IGMP报文
     IGMP类型为1说明是由多播路由器发出的查询报文,为2说明是主机发出的报告报文。检验和的计算和ICMP协议相同。组地址为D类IP地址。在查询报文中组地址设置为0,在报告报文中组地址为要参加的组地址。

IGMP协议

    多播的基础就是一个进程的概念,该进程在一个主机的给定接口上加入了一个多播组。在一个给定接口上的多播组中的成员是动态的—它随时因进程加入和离开多播组而变化。这里所指的进程必须以某种方式在给定的接口上加入某个多播组。进程也能离开先前加入的多播组。
    多播路由器使用IGMP报文来记录与该路由器相连网络中组成员的变化情况。使用规则如下:
- 当第一个进程加入一个组时,主机就发送一个IGMP报告。如果一个主机的多个进程加入同一组,只发送一个IGMP报告。这个报告被发送到进程加入组所在的同一接口上。
- 进程离开一个组时,主机不发送IGMP报告,即便是组中的最后一个进程离开。主机知道在确定的组中已不再有组成员后,在随后收到的IGMP查询中就不再发送报告报文。
- 多播路由器定时发送IGMP查询来了解是否还有任何主机包含有属于多播组的进程。多播路由器必须向每个接口发送一个IGMP查询。因为路由器希望主机对它加入的每个多播组均发回一个报告,因此IGMP查询报文中的组地址被设置为0。
- 主机通过发送IGMP报告来响应一个IGMP查询,对每个至少还包含一个进程的组均要发回IGMP报告。
    使用这些查询和报告报文,多播路由器对每个接口保持一个表,表中记录接口上至少还包含一个主机的多播组。当路由器收到要转发的多播数据报时,它只将该数据报转发到还拥有属于那个组主机的接口上。

发布了75 篇原创文章 · 获赞 1 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章