
本文共 5990 字,大约阅读时间需要 19 分钟。
【网络通信 -- 直播】网络通信协议简介 -- IP 网际协议
【1】IP 部首
(1) 版本号(Version) : IP 协议的版本, 对于 IPv4 来说值是 4
(2) 头部长度(IHL) : 4 位最大为 0xF,注意该字段表示单位是字 (4 字节)
(3) 服务类型(Type Of Service,TOS) : 3 位优先权字段(现已被忽略) + 4 位 TOS 字段 + 1 位保留字段(须为0)
4 位 TOS 字段分别表示最小延时、最大吞吐量、最高可靠性、最小费用,其中最多有一个能置为1,应用程序根据实际需要来设置 TOS 值,如 ssh 和 telnet 这样的登录程序需要的是最小延时的服务,文件传输 ftp 需要的是最大吞吐量的服务
(4) 总长度(Total Length) : 指整个 IP 数据报的长度,单位为字节,即 IP 数据报的最大长度为 65535 字节(2 的 16 次方),由于 MTU 的限制,长度超过 MTU 的数据报都将被分片传输,所以实际传输的 IP 分片数据报的长度远远没有达到最大值
下来的 3 个字段则描述如何实现分片 :
(5) 标识(Identification) : 唯一地标识主机发送的每一个数据报,其初始值是随机的,每发送一个数据报其值就加 1,同一个数据报的所有分片都具有相同的标识值
(6) 标志(Flags) : 位 1 保留,位 2 表禁止分片(DF),若设置了此位,IP 模块将不对数据报进行分片,在此情况下若 IP 数据报超过 MTU,IP 模块将丢弃数据报并返回一个 ICMP 差错报文;位 3 标识更多分片(MF),除了数据报的最后一个分片,其他分片都要把它设置为 1
(7) 位偏移(Fragment Offset) : 分片相对原始 IP 数据报数据部分的偏移,实际的偏移值为该值左移 3 位后得到的,所以除了最后一个 IP 数据报分片外,每个 IP 分片的数据部分的长度都必须是 8 的整数倍
(8) 生存时间(Time to Live, TTL) : 数据报到达目的地之前允许经过的路由器跳数,TTL 值被发送端设置,常设置为 64,数据报在转发过程中每经过一个路由该值就被路由器减 1,当 TTL 值为 0 时,路由器就将该数据包丢弃,并向源端发送一个 ICMP 差错报文,TTL 可以防止数据报陷入路由循环
(9) 协议(Protocol) : 区分 IP 协议上的上层协议,在 Linux 系统的 /etc/protocols 文件中定义了所有上层协议对应的协议字段, ICMP 为 1,TCP 为 6,UDP 为 17
(10) 头部校验和(Header Checksum) : 由发送端填充,接收端对其使用 CRC 算法校验,检查 IP 数据报头部在传输过程中是否损坏
(11) 源 IP 地址(Source Address)和目的 IP 地址(Destination Address) : 表示数据报的发送端和接收端,一般情况下这两个地址在整个数据报传递过程中保持不变,不论中间经过多少个路由器
(12) 选项(Options) : 可变长的可选信息,最多包含 40 字节,选项字段很少被使用,可用的 IP 可选项有 :
a. 记录路由 : 记录数据包途径的所有路由的 IP,这样可以追踪数据包的传递路径
b. 时间戳 : 记录每个路由器数据报被转发的时间或者时间与 IP 地址对,这样就可以测量途径路由之间数据报的传输的时间
c. 松散路由选择 : 指定路由器的 IP 地址列表数据发送过程中必须经过所有的路由器
d. 严格路由选择 : 数据包只能经过被指定的 IP 地址列表的路由器
e. 上层协议(如 TCP/UDP )的头部信息
【2】子网编址
子网编址 : 主机号再分成一个子网号和一个主机号。
在剩下的16 bit中,8bit用于子网号,8bit用于主机号,这样就允许有254个子网,每个子网可以有254台主机。
子网掩码 : 一个32 bit的值,其中值为1的比特留给网络号和子网号,为0的比特留给主机号。
给定IP地址和子网掩码以后,主机就可以确定IP数据报的目的:
(1)本子网上的主机;
(2)本网络中其他子网中的主机;
(3)其他网络上的主机;
如果知道本机的IP地址,那么就知道它是否为A类、B类或C类地址(从IP地址的高位可以得知),也就知道网络号和子网号之间的分界线,而根据子网掩码就可知道子网号与主机号之间的分界线;
【3】ICMP Internet 控制报文协议
ICMP经常被认为是IP层的一个组成部分,传递差错报文以及其他需要注意的信息,ICMP报文通常被IP层或更高层协议(TCP或UDP)使用,一些ICMP报文把差错报文返回给用户进程;
ICMP 在 IP 数据报中的封装以及 ICMP 报文的构成图示
ICMP 报文的类型
不同类型由报文中的类型字段和代码字段来共同决定
ICMP 地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码,ICMP 地址掩码请求和应答报文的格式图示
ICMP 报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回,从而发送端就可以把应答与请求进行匹配。
ICMP 时间戳请求允许系统向另一个系统查询当前的时间,ICMP 时间戳请求和应答报文格式图示
ICMP 目的不可达差错
ICMP 的一个规则是,ICMP 差错报文必须包括生成该差错报文的数据报 IP 首部,还必须至少包括跟在该 IP 首部后面的前 8 个字节;
ICMP 重定向差错
1. 假定主机发送一份IP数据报给R1,这种选路决策经常发生,因为R1是该主机的默认路由
2. R1收到数据报并且检查它的路由表,发现R2是发送该数据报的下一站,当它把数据报发送给R2时,R1检测到它正在发送的接口与数据报到达接口是相同的(即主机和两个路由器所在的LAN),这样就给路由器发送重定向报文给原始发送端提供了线索
3. R1发送一份ICMP重定向报文给主机,告诉它以后把数据报发送给R2而不是R1
ICMP 重定向报文格式
ICMP重定向报文的接收者必须查看三个IP地址
(1) 导致重定向的IP地址(即ICMP重定向报文的数据网络重定向,主机重定向,位于IP数据报的首部);
(2) 发送重定向报文的路由器的IP地址(包含重定向信息的IP数据报中的源地址);
(3) 应该采用的路由器IP地址(在ICMP报文中的4~7字节);
ICMP重定向报文的规则
1. 重定向报文只能由路由器生成,而不能由主机生成;
2. 重定向报文是为主机而不是为路由器使用的;
3. 假定路由器和其他一些路由器共同参与某一种选路协议,则该协议就能消除重定向的需要
在生成ICMP重定向报文之前需要满足的条件
1. 出接口必须等于入接口
2. 用于向外传送数据报的路由不能被ICMP重定向报文创建或修改过,而且不能是路由器的默认路由
3. 数据报不能用源站选路来转发
4. 内核必须配置成可以发送重定向报文
主机收到 ICMP 重定向报文后所做的检查
1. 新的路由器必须直接与网络相连接
2. 重定向报文必须来自当前到目的地所选择的路由器
3. 重定向报文不能让主机本身作为路由器
4. 被修改的路由必须是一个间接路由
ICMP 路由器发现
ICMP 路由器请求报文格式
ICMP 路由器通告报文格式
主机在引导以后要广播或多播传送一份路由器请求报文,一台或更多台路由器响应一份路由器通告报文;
路由器定期地广播或多播传送它们的路由器通告报文,允许每个正在监听的主机相应地更新路由表;
【4】IP 静态选路
IP 选路的一般流程 :
在一般的体制中,IP可以从TCP、UDP、ICMP和IGMP接收数据报(即在本地生成的数据报)并进行发送,或者从一个网络接口接收数据报(待转发的数据报)并进行发送;
IP层在内存中有一个路由表,当收到一份数据报并进行发送时,它都要对该表搜索一次,当数据报来自某个网络接口时,IP首先检查目的IP地址是否为本机的IP地址之一或者IP广播地址;
如果确实成立则数据报就被送到由IP首部协议字段所指定的协议模块进行处理;
如果数据报的目的不是这些地址,那么如果IP层被设置为路由器的功能,那么就对数据报进行转发;否则数据报被丢弃;
路由表中的每一项包含的信息:
1. 目的IP地址,既可以是一个完整的主机地址,也可以是一个网络地址,由该表目中的标志字段来指定,主机地址有一个非0的主机号,以指定某一特定的主机,而网络地址中的主机号为0,以指定网络中的所有主机;
2.下一站路由器(next-hop router)的IP地址,或者有直接连接的网络IP地址,下一站路由器是指一个在直接相连网络上的路由器,通过它可以转发数据报,下一站路由器不是最终的目的,但是它可以把传送给它的数据报转发到最终目的;
3. 标志,其中一个标志指明目的IP地址是网络地址还是主机地址,另一个标志指明下一站路由器是否为真正的下一站路由器,还是一个直接相连的接口
4. 为数据报的传输指定的一个网络接口
IP 路由选择主要完成以下这些功能:
1. 搜索路由表,寻找能与目的IP地址完全匹配的表目(网络号和主机号都要匹配),如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值);
2. 搜索路由表,寻找能与目的网络号相匹配的表目,如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值),目的网络上的所有主机都可以通过这个表目来处置;
3. 搜索路由表,寻找标为“默认(default)”的表目,如果找到,则把报文发送给该表目指定的下一站路由器,如果上面这些步骤都没有成功,那么该数据报就不能被传送;
注意:
选路机制 : 搜索路由表并决定向哪个网络接口发送分组,由 IP 执行
选路策略 : 一组决定把哪些路由放入路由表的规则,由路由守护程序提供
IP 层工作流程图示
路由表
Destination : 目的地址;
Gateway : 网关地址;
Flags : 标志;
U 该路由可以使用
G 该路由是到一个网关(路由器),如果没有设置该标志,说明目的地是直接相连的。
H 该路由是到一个主机,也就是说,目的地址是一个完整的主机地址,如果没有设置该标志,说明该路由是到一个网络,而目的地址是一个网络地址即一个网络号,或者网络号与子网号的组合
D 该路由是由重定向报文创建的
M 该路由已被重定向报文修改
Refcnt : 参考计数,给出的是正在使用路由的活动进程个数
Use : 通过该路由发送的分组数
Interface : 本地接口名称
【5】IP 动态选路
当相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络,这时就出现了动态选路,路由器之间必须采用选路协议进行通信,路由器上有一个进程称为路由守护程序(routing daemon),它运行选路协议,并与其相邻的一些路由器进行通信,同时根据它从相邻路由器接收到的信息,更新内核中的路由表
路由守护程序将选路策略(routing policy)加入到系统中,选择路由并加入到内核的路由表中,如果守护程序发现前往同一信宿存在多条路由,那么它将选择最佳路由并加入内核路由表中;如果路由守护程序发现一条链路已经断开,便删除受影响的路由或增加另一条路由以绕过该问题
【5.1】RIP 选路信息协议
报文格式
命令字段为1表示请求(请求表示要求其他系统发送其全部或部分路由表),2表示应答(应答则包含发送者全部或部分路由表),还有两个舍弃不用的命令(3和4),两个非正式的命令,轮询(5)和轮询表项(6)
版本字段通常为1,而第2版RIP将此字段设置为2
紧跟在后面的20字节指定地址系列(address family)、IP地址以及相应的度量(RIP的度量是以跳计数的)
采用这种20字节格式的RIP报文可以通告多达25条路由,上限25是用来保证RIP报文的总长度为20×25+4=504,小于512字节,由于每个报文最多携带25个路由,因此为了发送整个路由表,经常需要多个报文
RIP 正常运行的步骤
1. 初始化:在启动一个路由守护程序时,先判断启动了哪些接口,并在每个接口上发送一个请求报文,要求其他路由器发送完整路由表;在点对点链路中,该请求是发送给其他终点的,如果网络支持广播,这种请求将以广播形式发送;目的UDP端口号是520, 这种请求报文的命令字段为1,地址系列字段设置为0,而度量字段设置为16,是一种要求另一端完整路由表的特殊请求报文;
2. 接收到请求:如果这个请求是特殊请求,那么路由器就将完整的路由表发送给请求者,否则,就处理请求中的每一个表项,如果有连接到指明地址的路由,则将度量设置成相应的值,否则将度量置为16(度量为16是一种称为“无穷大”的特殊值,它意味着没有到达目的的路由),然后发回响应;
3. 接收到响应:使响应生效,可能会更新路由表,可能会增加新表项,对已有的表项进行修改,或是将已有表项删除;
4. 定期选路更新:每过30秒,所有或部分路由器会将其完整路由表发送给相邻路由器,发送路由表可以是广播形式的(如在以太网上),或是发送给点对点链路的其他终点;
5. 触发更新:每当一条路由的度量发生变化时,就对它进行更新,此时不需要发送完整路由表,而只需要发送那些发生变化的表项;
RIP 版本 2
报文格式
路由域(routing domain)是一个选路守护程序的标识符,它指出了这个数据报的所有者;在一个Unix实现中,它可以是选路守护程序的进程号,该域允许管理者在单个路由器上运行多个RIP实例,每个实例在一个选路域内运行;
路由标记(routing tag)是为了支持外部网关协议而存在的,它携带着一个EGP和BGP的自治系统号;
每个表项的子网掩码应用于相应的IP地址上;
下一站IP地址指明发往目的IP地址的报文该发往哪里,该字段为0意味着发往目的地址的报文应该发给发送RIP报文的系统;
RIP-2提供了一种简单的鉴别机制,可以指定RIP报文的前20字节表项地址系列为0xffff,路由标记为2。表项中的其余16字节包含一个明文口令;
RIP-2除了广播外,还支持多播,这可以减少不收听RIP-2报文的主机的负载;
参考致谢
本博客为博主的学习实践总结,并参考了众多博主的博文,在此表示感谢,博主若有不足之处,请批评指正。
【1】TCP/IP详解 卷1:协议
发表评论
最新留言
关于作者
