邻居子系统简析

来源:岁月联盟 编辑:exp 时间:2012-06-04

邻居:如果一台主机和你的计算机连接在同一个LAN上(也就是说,你和这台主机通过一个共享介质相连或点对点直接相连),那么它就是你的邻居,而且他们有相同的L3网络配置。定义邻居的另一种方式是,一台主机到其邻居必须有且仅有一个L3跳跃点,并且它的L3路由表必须提供可以直接和其邻居通信的一条路劲。不是邻居的主机间通信必须通过网关或路由器。 共享介质:在共享介质中,任一主机发出的任何帧都会被直接连接到该介质上的所有主机收到。由于这个原因,在共享介质中使用的链路层协议需要定义一种寻址机制,以便发送方可以指定每个帧的接收方,接收方也可以识别发送方。通常这个寻址地址也定义一些特殊地址,通过这些地址可以发送一个帧到多个主机或到所有主机:多播地址和广播地址。当使用共享介质的多个主机同时要进行数据传输时,链路层协议必须提供一种方式,以保证所有连接到共享介质的主机都可以检测到这种情况(冲突),冲突有可能导致帧发生错误。以太网使用的冲突检测机制称为(CSMA/CD).  www.2cto.com  solicitation请求和应答:当无法使用上节提到的静态翻译完成L3到l2的地址映射时,就需要邻居协议来完成这个映射。solicitation请求,这个术语表示在网络中发送一个封包并询问所有的主机,是否有主机知道这个L3地址对应的了L2地址。根据不同的协议和实际情况,该请求可以以单播、多播或广播的方式发送出去。solicitation应答,一般来说,这个术语指发送一个封包为solicitation应答。但该封包也可以独立生成。在正常条件下,与目的L3地址关联的主机会产生这个应答,但也有可能有另一台主机替它产生应答。该封包通常使用单播方式发送,特殊情况下,也可以使用广播。 Linux实现 image 当传送一个封包时,执行下面的步骤: 本地主机的路由子系统选择L3目的地址根据路由表,如果下一个越点在同一个网络中(也就是说下一个跃点是邻居),邻居层就把目的L3地址解析为跃点的L2地址。这个关联被放入缓存以便将来再次使用。这样的话,如果某个应用程序短期内发送多个封包给另一个应用程序,那么只在发送第一个封包的时候使用一次邻居协议。最后,一个函数,比如dev_queue_xmit负责发送完成,将封包传递给流量控制或者QoS层。

image
 Linux通用基础结构提供的部分服务: 为每个协议提供一个缓存来存放L3到L2转换的结构提供在缓存中添加、删除、改变和查找一个特定映射的函数。查找函数必须要快,因为它会影响整个系统的性能。为每个协议缓存的数据项提供一种老化机制当缓存已满时并且正好要创建新的映射项时,提供选择替换策略为每个邻居提供一个请求队列。当准备要发送一个封包且其L2地址还不在地址缓存中时,就必须把这个封包放在缓冲区中,直到发送出solicitation请求,并收到应答。为了让每种协议都适应邻居子系统的行为,Linux中定义了一组占位符或虚函数,这样每个协议都可以在其中插入它想要的函数。邻居层也提供了一组参数可对其进行配置。配置参数可以通过用户空间命令、/proc文件系统或协议本身进行配置。  www.2cto.com   邻居协议代理: 若一台主机将发往另一台主机的流量拦截下来,并且代替后者处理这些流量,那么这台主机就是一个代理。如果主机和应用程序不需要精确配置成代理提供的服务获益,这种代理称为透明代理。 使用代理的条件: 请求的地址和代理服务器收到请求的接口上的配置的地址不属于同一个子网。必须启动代理功能在接收请求的代理服务器上已开启转发功能   作者 我是*李世民*