zoukankan      html  css  js  c++  java
  • TCP/IP 笔记

    在之前第二章介绍IP寻址的时候有介绍到,IP地址有4种:单播、组播、广播、任播。

      单播,客户端与服务器之间点到点连接通信;

      组播,在发送者和多个接收者(如某个特定的分组)之间实现点对多点的连接通信;

      广播,在网络(广播地址范围内的子网)内广播数据包,网络内的每一台主机都将受到这些数据包;

      任播,使得数据包可以根据路由拓朴来决定送到“最近”或“最好”的目的地。

    广播和组播为应用程序提供两种服务:数据分组交付至多个目的地、通过客户端请求/发现服务器。一个广播请求会影响在广播域范围内的所有可达主机,而组播只影响那些可能对该请求有兴趣的主机。使用者需要追求的是广播的高开销和简单性与组播的高效率和复杂性之间找平衡。

    在IPv4中,有两种类型的广播地址:受限(255.255.255.255)和定向。定向广播地址基于网络前缀和它的长度,通过创建一个初始位和网络前缀相等、低序位被置1的32位地址形成。通常使用定向广播代替受限广播地址是更可选的。选择哪些接口用于发送传出的广播流量依赖于操作系统。一个典型的例子是使用一个主接口用于有限广播流量,使用保存在主机的转发表中的信息来选择传出定向广播和组播的接口。

    组播

    比如有数组[1,2,3,4,5,6,7,8,9,10],广播的通知可以认为取了整个数组,而组播可能只是取数组中能够被2整除的数据[2,4,6,8,10],这就是广播和组播的区别。

    需要达到网络内部分主机接收数据,要么是通过发送方指定接收方,要么就是通过接收方指明对数据类型的兴趣,然后网络只负责向预期的/感兴趣的接收方发送流量。

    在组播中,由主机和路由器来保持组播状态信息,以说明哪些接收方对哪类流量感兴趣。在组播TCP/IP模型中,接收方通过指明组播地址和可选源列表来表明它们希望接收流量的兴趣。这个信息作为主机和路由器中的软状态来维持,则它必须定期更新或超时删除。

    IP组播地址并不通过使用协议报文来确定,而是简单的讲一个IP组播地址直接映射到一些对应的MAC地址。IANA拥有IEEE组织唯一标识符00:00:5e。有了它,IAN就被赋予权限去使用以01:00:5e开始的组MAC地址以及以01:00:5e开始的单播地址。该前缀被用作以太网地址的高序24位,意味着此块包括范围00:00:5e:00:00:00到00:00:5e:ff:ff:ff的单播地址,以及范围在00:00:5e:00:00:00到00:00:5e:ff:ff:ff的组播地址。除了IANA的其他组织也拥有地址块,但只要IANA将其空间的一部分用于支持IP组播。IANA分配一半的组地址块用于识别 IEEE 802 LAN 上的IPv4组播流量。

    IPv4地址到他们对应的IEEE 802 形式的链路层地址的映射如图所示:

    除去前缀,还有32-4=28位可用于编码空间,即2的28次方,268435456个组播地址。对于IPv4,IANA的政策是分配一半的组地址用于支持IPv4组播,那么就是268435456个组播地址将被映射到2的23次方,8388608个唯一条目的链路层地址空间。因此,映射不是唯一的,多个IPv4组ID被映射到相同MAC层地址。具体计算,有2的28-23次方,即32个不同的IPv4组播地址被映射。

    IPv6到IEEE 802 MAC组播地址映射使用IPv6组播地址的低序32位作为以33:33开始的MAC地址的后缀。因为只使用了112个组播地址位中的32位,所以2的80次方个组映射到相同的MAC层地址。

    组播的应用过程大致如下图:

    上图组播路由中,两个主要的协议用于允许组播路由器了解附近的主机感兴趣的组:IPv4使用的互联网组管理协议(IGMP)和IPv6使用的组播侦听发现协议(MLD)。

    IGMP和MLD

    IGMP和MLD都由支持组播的主机和路由器使用,并且协议非常相似。IGMP已发展到v3版本,而MLD发展到v2版本。IGMPv1是第一个广泛使用的IGMP版本,v2添加了更迅速地离开组的能力,IGMPv3和MLDv2添加了选择组播流量源的能力,并要求部署SSM。然而IGMP是IPv4使用的一个单独的协议,而MLD是ICMPv6的真正的一部分。

    下图显示了IPv4(IPv6)具有组播功能的路由器如何使用IGMP(MLD):

    组播路由器定期向每个连接的子网发送IGMP(MLD)请求,以确定哪些组和源对连接的主机来说是感兴趣的。主机使用IGMP(MLD)报告响应,说明哪些组合源是感兴趣的。

    IGMP和MLD的封装如图:

    与ICMP类似,IGMP被认为是IP层的一部分,且报文也在IPv4数据报中传输。IGMP使用一个固定的为1的TTL值,所有数据分组仅限于本地子网。IGMP数据分组也使用IPv4路由警告选项,并使用6位值0x30的DS字段来代表网间控制。在IPv6中,MLD是ICMPv6的一部,它的封装使用了IPv6的逐跳扩展头部以保持路由器警告选项。

    IGMP和MLD定义了两组协议处理规则:由组成员的主机执行的、由组播路由器执行的。

    组成员的工作是自发的报告对组播组和源的兴趣改变,以及响应定期的查询;组播路由器发送查询,以确定连接链路上的对于任意组或是特定的组播组和源是否有兴趣。

    组成员的工作

    IGMP和MLD组成员的部分被设计为允许主机指定它们对什么样的组有兴趣,以及从特定源发送的流量是否应该接受或过滤掉。这是通过向一个或多个连接到同一子网的组播路由器(和参与主机)发送报告完成的。

    组成员的报告信息如下格式:

    IGMPv3成员资格报告包含IV组的组记录。每个组记录表明一个组播地址和可选源列表。每个组记录中包含一个类型、主题组的地址,以及要包含或是排除的源地址列表,此外还包括辅助数据(IGMPv3中未使用)。

    组记录信息格式:

    IGMP和MLD源列表的类型值指明过滤模式(包含/排除)以及源列表是否已改变

    当收到一个查询时,组成员没有立即回应,它们设置一个随机计时器来决定何时响应。在此期间,进程可能会改变它们的组/源兴趣,任何这样的变化可以在计时器到期前一起处理来触发报告。这样做节省了一定量的开销。

    组播路由器的工作

    在IGMP和MLD中,组播路由器的工作是为每个组播组、接口和源列表确定是否至少有一个组成员目前在接收相应的流量。这是通过发送查询,以及基于成员发送的报告,建立描述成员存在性的状态来完成的。

    路由器的信息如下格式:

    IGMPv3查询包含组播组地址和可选源列表。当组播路由器希望了解所有组播组的兴趣时,组地址字段被设置为0,并被发送到所有主机组播地址224.0.0.1。S和QRV用于容错和报告重传,QRV值编码发送方将使用的最大重传次数,QQIC字段编码定期查询间隔。

    有三种查询报文的变体可以由组播路由器发送:一般查询、特定组查询、特定组和源查询。一般查询被组播路由器用于更新任意组播组的信息,对于这样的查询,组列表是空的;特定组查询与一般查询类似,但对于识别的组是特定的;特定组合源查询是一个包含一组源的特定组查询。

    对于IGMPv3和MLDv2,主机除了维护它们的应用和系统软件感兴趣的组播组的过滤器状态,还维护被排除或包含的源列表。为了了解什么流量需要被转发到链路上以便有兴趣的主机收到,组播路由器维护类似的状态。反之也是如此:一个组播路由器可以停止转发在每个接收方的排除列表中的主机发送的组播流量。实践经验证明,应用程序很少需要屏蔽特定源,并且支持此功能也比较复杂。然而主机往往希望包含一个与一个组相关联的特定源,尤其是当SSM在使用时。因此有了简化版的(轻量级)IGMPv3和(轻量级)MLDv2。

    完整版本与轻量级的对比

    多个组播路由器实现的第一种类型的协调是查询器选举。每个组播路由器可以侦听其他的查询,当一个组播路由器启动时,它认为自已是查询器并发送一般查询以确定在子网中哪些组是活跃的。当一个路由器收到另一个路由器的组播查询时,它比较源IP地址和它自已的地址。如果在所接收的查询中的源IP地址小于它自已的地址,接收路由器进入备用模式。因此,具有最小IP地址的路由器被认为是获胜者,并成为单一的查询器,负责向它连接的子网中发送查询。备用的路由器设置计时器,如果它们在一个指定的时间(称为其他查询器出现计时器)内没有看到更多的查询,它们再次成为查询器。

    为了帮助防止丢失协议报文,有些报文被重传多次(由QRV查询器鲁棒性变量决定)。QRV值在包含于查询中的QRV字段中编码,非查询路由器采用查询路由器的QRV作为自己的该字段值。如果查询器发生改变,则这帮助保持了稳定性。重传中保护的报文类型包括状态改变报告和特定查询,其他报文通常不会导致转发状态的变化,而是只涉及通过调整计时器刷新软状态,所以使用重传无法保护它们。预计更容易出现丢失的链路,可能需要以生成额外的流量为代价,增加鲁棒性变量以增强分组丢失的健壮性。
    当处理特定查询时,为了帮助组播路由器保持同步,查询报文中S位字段表明路由器端(计时器)处理应被抑制。当一个特定的查询由查询器发送时,应该安排一个重传次数(QRV)。在发送的第一个查询中,S位字段被清除。基于重传或这种查询的接收,组播路由器会为随后的重传降低它的计时器到LMQT。此时,为感兴趣的主机提供一个报告以指出它对一个组或源的持续的兴趣。如果没有报文丢失,该报告使每个组播路由器重置它的计时器为普通值,并保持不变。然而,预定的重传不会被放弃。相反,特定查询的重传被发送时,S位字段被设置,这将导致接收路由器不会降低它们的计时器到LMQT。在收到表示有兴趣的报告之后,仍保持查询重传的原因,是为了使跨越所有组播路由器的组的超时时间是一致的。然后,S位字段的目的是为了让特定的查询被(重新)发送,也为了避免降低计时器到LMQT,因为一个表示兴趣的合法的报告可能已经被接受了,即使它或初始查询被非查询器路由器丢失了。没有这种能力,重传的特定查询会导致非查询器路由器不正确地降低它们的计时器(因为已经收到一个表明兴趣的合法报告)。

      IGMP和MLD的配置参数和计时器的值如下:

    一些交换机支持一种称为IGMP探听的功能,该功能监控主机和组播路由器直接的IGMP(MLD)流量,并且能记录哪些端口需要哪些特定的组播流动,这样做能够实质地影响在一个交换网络中正在被承载的不需要的组播流量数量。在IGMPv3和MLDv2中,生成报告响应查询。支持早期版本的IGMP和MLD的IGS交换机避免向所有的接口广播报告,它们只向最近的组播路由器转发报告。

    IGMP(MLD)探听避免了"交互机沿着所有交换机形成的生成树的所有分支广播消息来发送链路层流量"的情况。

    由于IGMP和MLD都是信令协议,可以控制其他流量的流动,针对它们的攻击往往会引起额外的资源消耗,可能导致拒绝服务。其他形式攻击利用已经发现的实现漏洞,导致执行由攻击者提供的不需要的代码。

    参考:

    《TCP IP 详解卷1:协议》

    RFC官方文档

  • 相关阅读:
    Python使用SMTP模块、email模块发送邮件
    harbor搭建及使用
    ELK搭建-windows
    ELK技术栈之-Logstash详解
    【leetcode】1078. Occurrences After Bigram
    【leetcode】1073. Adding Two Negabinary Numbers
    【leetcode】1071. Greatest Common Divisor of Strings
    【leetcode】449. Serialize and Deserialize BST
    【leetcode】1039. Minimum Score Triangulation of Polygon
    【leetcode】486. Predict the Winner
  • 原文地址:https://www.cnblogs.com/ys-ys/p/10263523.html
Copyright © 2011-2022 走看看