IP路由选择

  当一个IP数据包准备好了的时候,IP数据包(或者说是路由器)是如何将数据包送到目的地的呢?它是怎么选择一个合适的路径来"送货"的呢?

  最特殊的情况是目的主机和主机直连,那么主机根本不用寻找路由,直接把数据传递过去就可以了。至于是怎么直接传递的,这就要靠ARP协议了,后面会讲到。

  稍微一般一点的情况是,主机通过若干个路由器(router)和目的主机连接。那么路由器就要通过ip包的信息来为ip包寻找到一个合适的目标来进行传递,比如合适的主机,或者合适的路由。路由器或者主机将会用如下的方式来处理某一个IP数据包

  如果IP数据包的TTL(生命周期)以到,则该IP数据包就被抛弃。

  搜索路由表,优先搜索匹配主机,如果能找到和IP地址完全一致的目标主机,则将该包发向目标主机

  搜索路由表,如果匹配主机失败,则匹配同子网的路由器,这需要“子网掩码(1.3.)”的协助。如果找到路由器,则将该包发向路由器。

  搜索路由表,如果匹配同子网路由器失败,则匹配同网号(第一章有讲解)路由器,如果找到路由器,则将该包发向路由器。

  搜索陆游表,如果以上都失败了,就搜索默认路由,如果默认路由存在,则发包

  如果都失败了,就丢掉这个包。

  这再一次证明了,ip包是不可靠的。因为它不保证送达。

子网寻址

  IP地址的定义是网络号+主机号。但是现在所有的主机都要求子网编址,也就是说,把主机号在细分成子网号+主机号。最终一个IP地址就成为 网络号码+子网号+主机号。例如一个B类地址:210.30.109.134。一般情况下,这个IP地址的红色部分就是网络号,而蓝色部分就是子网号,绿色部分就是主机号。至于有多少位代表子网号这个问题上,这没有一个硬性的规定,取而代之的则是子网掩码,校园网相信大多数人都用过,在校园网的设定里面有一个255.255.255.0的东西,这就是子网掩码。子网掩码是由32bit的二进制数字序列,形式为是一连串的1和一连串的0,例如:255.255.255.0(二进制就是11111111.11111111.11111111.00000000)对于刚才的那个B类地址,因为210.30是网络号,那么后面的109.134就是子网号和主机号的组合,又因为子网掩码只有后八bit为0,所以主机号就是IP地址的后八个bit,就是134,而剩下的就是子网号码--109。

ARP协议

  还记得数据链路层的以太网的协议中,每一个数据包都有一个MAC地址头么?我们知道每一块以太网卡都有一个MAC地址,这个地址是唯一的,那么IP包是如何知道这个MAC地址的?这就是ARP协议的工作。

  ARP(地址解析)协议是一种解析协议,本来主机是完全不知道这个IP对应的是哪个主机的哪个接口,当主机要发送一个IP包的时候,会首先查一下自己的ARP高速缓存(就是一个IP-MAC地址对应表缓存),如果查询的IP-MAC值对不存在,那么主机就向网络发送一个ARP协议广播包,这个广播包里面就有待查询的IP地址,而直接收到这份广播的包的所有主机都会查询自己的IP地址,如果收到广播包的某一个主机发现自己符合条件,那么就准备好一个包含自己的MAC地址的ARP包传送给发送ARP广播的主机,而广播主机拿到ARP包后会更新自己的ARP缓存(就是存放IP-MAC对应表的地方)。发送广播的主机就会用新的ARP缓存数据准备好数据链路层的的数据包发送工作。

  一个典型的arp缓存信息如下,在任意一个系统里面用“arp -a”命令:

  Interface: 192.168.11.3 --- 0x2

  Internet Address Physical Address Type

  192.168.11.1 00-0d-0b-43-a0-2e dynamic

  192.168.11.2 00-01-4a-03-5b-ed dynamic

  都会得到这样的结果。

  这样的高速缓存是有时限的,一般是20分钟(伯克利系统的衍生系统)。

最新文章

  1. jQuery 根据值或者文本选中select
  2. python模块引用梳理
  3. MyISAM 和InnoDB 区别 转
  4. visual studio code + Nodejs + Typescritpt + angularjs2 + bootstrap 环境搭建/Elementary os
  5. 关于myeclipse中maven项目转换相关设置
  6. hashCode()和toString()
  7. Windows Service的官方描述,抄下来(不写obj就是LocalSystem)
  8. 循环多少次? 【杭电--HDOJ-1799】 附题+具体解释
  9. JVM类加载以及执行的实战
  10. Go语言基础之接口
  11. [Swift]LeetCode826. 安排工作以达到最大收益 | Most Profit Assigning Work
  12. js考察this,作用域链和闭包
  13. work-7.2
  14. sourceTree 代码冲突解决
  15. position 小结
  16. C/S 开发框架 ----- 广州本地
  17. spring ,springmvc,mybatis 最基本的整合,没有多余的jar包和依赖 2018.9.29日
  18. (转)测试rootvg卷组的镜像的官方做法
  19. Spring Security构建Rest服务-1200-SpringSecurity OAuth开发APP认证框架
  20. 《python 经典实例》 分享 pdf下载

热门文章

  1. Codeforces 776 A.Serial Killer-String直接比较是否相同
  2. AHOI2009中国象棋
  3. 训练指南 UVALive - 4287 (强连通分量+缩点)
  4. thinkpad win8.1 无线连接受限
  5. 【欧拉函数】BZOJ2190-[SDOI2012]longge的数学问题
  6. 8.5(java学习笔记)8.5 字节码操作(javassist)
  7. TabHost
  8. 国内流行的开源.net微信公众平台SDK对比分析
  9. 使用.Net中的WeakDictionary — ConditionalWeakTable
  10. 客户端JavaScript加密数据,服务端Java解密数据