IP是TCP/IP协议族中最为核心的协议,所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。

IP提供不可靠、无连接的数据报传送服务。

不可靠是指它不能保证IP数据报能成功地到达目的地,IP仅提供最好的传输服务,如果期间数据传输发生了错误,IP的处理算法是:丢弃该数据报,然后发送ICMP(IPv4协议簇中的一个子协议,用于在IP主机、路由器之间传递控制消息,控制消息是指网络通不通。主机是否到达、路由是否可用等网络本身的消息,不包括用户数据)消息报给信源端。任何要求的可靠性必须由上层来提供。

无连接是指IP并不维护任何关于后续数据报的状态信息,每个数据报的处理是相互独立的。每个数据报都是独立地进行路由选择,可能选择不同的路线。

1、IP首部

IP数据报的格式我们已经在网络层那里介绍过了:网络层-四-报文格式。这里就不赘述了。

2、IP路由选择

在之前的网络层中有说到,在不同的两个网络之间的数据传输需要经过网关,现在路由器集成了网关的功能,通过路由器来转发数据报到另一个网络,主机只需要把数据报发送一默认的路由器上,后续就交给路由器来处理了。

IP层在内存中有一个路由表,当收到一份数据报并进行发送时,它都要对该表搜索一次,当数据报来自某个网络接口时,IP首先检查目的IP地址是否为笔记地址之一或者IP广播地址。如果是这样,数据报就被送到由IP首部协议字段所指定的协议模块进行处理,如果数据报的目的地址不是这些,那么如果IP层被设置为路由器的功能,那么就对数据报进行转发,否则数据报就被丢弃。

上面简单的说就是,IP层既可以配置成主机的功能,也可以配置成路由器的功能,如果数据,报是发往本机的,就交由对应的协议模块处理,如果不是,且IP层被设置为路由器的功能,也就表明该数据报要通过IP层进行数据报转发,如果两者都不是,那就出错了,丢弃该数据报。

IP路由选择是逐跳式进行的,IP并不知道到达任何目的的完整路径,所有的IP路由选择只为数据报传输提供下一站路由器的IP地址。

IP路由选择主要完成以下功能:

1)搜索路由表,优先搜索匹配主机,寻找能与目的IP地址完全匹配的表目(网络号和主机号都要匹配),如果找到,则把报文直接发给目标主机。

2)搜索路由表,如果匹配主机失败,则匹配同子网的路由器。寻找能与目的网络号相匹配的表目,这必须考虑可能的子网掩码,如果找到就发给指定的路由器。

3)搜索路由表,如果匹配子网路由器失败,就去匹配同网络号路由器(不同子网)如果找到就发给指定的路由器。

4)搜索路由表,如果上面都失败了,就搜索默认路由,如果找到,就把报文发给该表目指定的下一站路由器。

5)如果都失败了,那就真的失败了,就丢弃这个包。

慢慢扩大范围,这和我们常规的寻找思路是一样一样的。

可以看出,IP包是不可靠的,因为它不保证到达。

3、IP地址,网络地址,网络地址,主机号

这里解释下这几个易混淆的概念。IP地址是TCP/IP网络中用来标识每台主机或设备的地址,由32位(通常写成四个十进制的数,每个整数对应一个字节)二进制组成。IP地址分为两部分,左边网络编号部分用来标识主机所在的网络,成为网络地址;右边部分用来标识主机本身,这部分称为主机地址。那么一个32位的IP地址,到底网络地址占多少位,主机地址又占多少呢?这个就取决于子网掩码了,子网掩码只有一个作用,就是将某个IP地址划分为网络地址和主机地址两部分。

子网掩码也是32位,左边是网络位,由二进制数1表示,1的数目等于网络位的长度,右边是主机位,用二进制0表示,0的数目等于主机位的长度,这样将IP地址与子网掩码相与,直接的结果就是网络地址,

举个栗子:

一个主机的IP地址为222.21.160.73,子网掩码为255.255.255.192,那么它的网络地址和主机地址分别是什么呢?

73=01001001B,192=11000000B。网络地址 = IP地址&子网掩码 = 255.255.255.64。主机地址的长度是子网掩码0的数目(后面6位),所以子网掩码后面0对应IP地址的部分就是该IP地址的主机地址1001B = 9,即主机地址为9。

扩展一下,那么广播地址是多少呢?之前说过,子网掩码0的部分为主机地址的长度,所以主机地址的长度为111111B+1 = 64,即子网的大小为64,该IP地址对应的主机号9的意思就是说这个IP地址是子网中的第9个地址。广播地址就是将子网掩码对应IP地址的网络地址部分不变,将主机地址部分全置位1,所以该IP地址的广播地址就是222.21.160.127。网络地址+1为第一个主机地址,广播地址-1为最后一个主机地址。

只要清楚一点,子网掩码1的数目对应的是网络地址的长度,0的数目对应的是主机地址的长度。

IP地址有ABCDE五类,根据前面8位来判断,A:0~127;B:128~191;C:192~223;D:224~239;E:240~255。很容易鉴别,依次相差128,64,32,16,16。

回到前面的IP层中的路由表。路由表中的每一项都包含下面这些信息:

1.目的IP地址,它可以是一个完整的主机地址,也可以是一个网络地址。主机地址(非0主机号)用以指定某一特定的主机,网络地址的主机号为0,以指定该网络中的所有主机。

2.下一站(或下一跳)路由器的IP地址,或者有直接连接的网络IP地址。

3.标志,其中一个标志指明目的IP地址是网络地址还是主机地址,另一个标志指明下一站路由器是否为真正的下一站路由器,还是一个直接相连的接口。

4.为数据报的传输指定一个网络接口。

IP路由选择是逐跳地进行的,从上面的路由表信息可以看出,IP并不知道到达任何目的的完整路径(除了那些与主机直接相连的目的,因为就一条路径),不然要路由器路由选择干嘛,所有的路由选择只为数据报传输提供下一站路由器的IP地址,它假定下一站路由器比发送数据报的主机更接近目的,而且下一站路由器与该主机是直接相连的。

多个网络交错相连构成一个大的网状结构网络,从主机A到主机Z,通过路由选择一条最短路径,中间有很多路径,先找出A到中间结点1的最短路径,该条路径到Z的距离最短,然后再找出节点1到节点2的最短距离,同样到Z的距离最短,直到最后直接到达Z。(具体的路由算法,这里就不介绍了)

下面主要介绍IP协议最为复杂的两方面IP寻址和路由。

一、IP寻址

IP寻址实际上就是ARP地址解析过程,(包括本地网络寻址和非本地网络寻址):首先看本地网络实现IP 寻址,也就是我们所说的同一网段通信过程,现在我们假设有2个主机,他们是属于同一个网段。主机A和主机B,首先主机A通过本机的hosts表或者wins系统或dns系统先将主机B的计算机名转换为IP地址,然后用自己的IP地址与子网掩码计算出自己所出的网段,比较目的主机B的IP地址与自己的子网掩码netmask,发现与自己是出于相同的网段,于是在自己的ARP缓存中查找是否有主机B 的MAC地址,如果能找到就直接做数据链路层封装并且通过网卡将封装好的以太网帧发送有物理线路上去:如果ARP缓存中没有主机B的的MAC地址,主机A将启动ARP协议通过在本地网络上的ARP广播来查询主机B的MAC地址,获得主机B的MAC地址后写入ARP缓存表,进行数据链路层的封装,发送数据。

上面是同一网段IP寻址,判断两个主机是否是与同一网段,就是借助子网掩码来判断。若两个主机处于不同的两个网段,那么就需要借助路由器(网关),路由器充当中间节点,将其拆分为两个网段的ARP地址解析过程。路由器(网关)也有ARP缓存,把同一网段下的IP寻址中的主机理解为路由器,然后路由器再扮演一下主机的角色,就是两个不同网段的IP寻址了。

关于ARP,具体步骤参见博文:详解ARP

二、路由

我们已经知道网络层的主要功能就是将分组从源节点路由到目的节点中,而且在大多数计算机网路中,采用的是数据报分组交换方式(每个报文分组添加信息),数据包分组需要经过多跳(经过多少个路由器)才能到达目的地。

路由功能其实是一种数据报分组交换路径选择行为,是网络层的一种基本功能。路由选择要综合考虑许多因素,如路线长度、信道带宽、线路稳定性、途经端口的开销等。也就衍生了针对不同考虑因素而诞生的各种路由算法。

路由是把信息从源节点通过网络传递到目的节点的行为,简单地说路由就是指三层设备(网络层)从一个接口上收到数据包,根据数据包的目的地址进行定向,并转发到另一个接口的过程。在这条路有路径上,至少需要遇到一个中间结点,那就是提供路由功能的设备,如路由器和三层交换机(前面博文我们说的交换机是值两层交换机,不具备路由功能,不能连接两个不同的网络,三层交换机则可以)。

路由功能的实现是依靠路由器或三层交换机中的路由表进行的,其中,路由又分为静态路由和动态路由两大类。

1、静态路由

1)手动配置。静态路由需要管理员根据实际需要一条条自己手动配置,路由器不会自动生成所需的静态路由。静态路由中包括目的节点或目的网络的IP地址,及数据包从当前路由器开始路由的第一个下一跳所对应的接口或IP地址。所以允许对路由的行为进行精确的控制。

2)路有路径固定不变。因为其是手动配置的,且是静态的,一旦网络的拓扑结构或链路的状态发生变化,要使路由能重新运作,则需要管理员重新手动配置。

3)不可通告性。静态路由在默认请款修改是私有的,不会通告其他路由器。也就是当路由器上配置了某条静态路由是,它不会被通告网络中相连的其他路由器。

4)单向性。不提供反向路由。

5)接力性。如果某条静态路由中间经过的跳数大于1,则必须在除最后一个路由器外的其他路由器上依次配置到达相同目的节点或目的网络的静态路由。比如总共有4个路由器,A到B后,你还得告诉B,怎么到C,然后C怎么到D,而不是单纯的只告诉A怎么到D。

6)优先级较高。明确指定了路有路径,当然比走一步看一步(动态路由)优先级高,但比直接路由优先级低。

7)适用小型网络。因为需要网络管理员手动配置,所以管理员要易于清楚了解网络的拓扑结构,太过复杂,无疑配置工作量太大。

2、动态路由

1)自动生成。在网络中某条路由所包含的路由器同时启动了某种动态路由协议,通告了各自所直接连接的网点后,则这些路由器间就会自动生成这些路由器直接连接的网络间的路由表项,管理员无须一一创建。

2)自动调整。网络拓扑结构发生变化之后,动态路由可以随时根据网络拓扑结构的变化调整路由表项,同时i还会自动删除无效的动态路由表项。

3)可通告性。

4)双向路由。

5)仅生成网络间的路由表项。静态路由是直接由管理员手动配置了一条从源节点到目的节点的路有路径。而动态路由仅生成各路由器所直接连接的各个网络或子网间的路由表项,不能生成到达具体节点或主机的动态路由表项。

6)不同动态路由不兼容。采用不同路由算法的动态路由协议间不兼容。

三、路由算法基础

路由算法是在给定一组路由器及连接路由器链路的情况下,找出一条从源节点到目标节点的最佳路径。就是把路由器选择最佳路径的策略称为路由算法,是路由器的关键功能所在。为了完成这项工作,在路由器中需要收集和保存着各种与传输路径的相关数据,如拓扑结构、端口度量、端口速率等,然后根据相应的路由算法生成一个个路由表项,在数据包转发时提供路由选择。

路由算法从大的方面分为:非适应路由算法和自适应算法

1、非自适应路由算法

非自适应路由算法是指那些不能根据网络流量和拓扑结构的变化更新路由表,仅使用静态路由表的路由算法。

主要包括以下几种:

1)静态路由(一般不认为是真正的路由算法),管理员手动创建的路由表项,在静态路由表项中包括目的节点或网络IP地址、下一跳IP地址或接口。

2)扩散法,当一个路由接口收到一个报文分组后,即向它所有接口(包括接收该分组的源接口)进行复制扩散。好比一个围棋盘,放下一粒黑子,然后黑子的周围八个点全被染黑(放下黑子),然后放下黑子的,继续这样复制扩散,即使有的地方已经有黑子了,照放不误,最后基本上整个棋盘都被染黑了(如果目标点最后访问到的话)。所以该算法的特点是大量重复分组加重网络负担,但因为有多条可能的路径,所以可靠性高。

3)随机走动法,当节点收到分组后,向所有与之相邻的节点中随机选择出一个将分组转发出去。结果就是分组会在网络中乱窜,直到到达目的节点。可想而知通信效率低,分组传输延迟,但可靠性还是可以的。

4)最短路径法(Dijkstra算法),只考虑网络拓扑结构,将源节点到网络中所有节点的最短路径都找出来,作为这个节点的路由表。具体说来就是,首先找出源节点到网络中所有节点的最短路径,然后到达最短的那个节点,再找出这个节点到网络中其余节点(源节点已标记路径,不计算在内)的最短路径,以此类推,仔细的想一下,光凭前面说的,还不足以找到源节点到目的节点的最短路径,因为有时候这几个相邻的节点的最短路径加起来会比之前淘汰的单挑路径比较长,但总路径比较短的长(比较拗口。。),就是4个2相加大于2个3。虽然2比3小。可以想象,该算法的计算量。

5)基于流量的路由算法,结合网路拓扑结构和通信流量两方面的因素进行路由选择。

2、自适应路由算法

动态路由均属于自适应路由算法类型,可根据网络流量和拓扑结构的变化更新路由表。主要有分散式路由算法和总体式路由算法。采用分散式路由算法时,每个路由器只与直接相连的路由器交换路由信息,每个路由器只有相邻路由器的路由信息,而没有网络中其他路由器的路由信息。采用总体式路由算法时,每个路由器都拥有网络中某个区域或者整个网络中所有其他路由器的全部信息以及网络的流量状态。

1)距离矢量路由算法(分散式路由算法)

距离矢量就是有方向的距离,对应路由条目中源和目的节点间的距离。

2)链路状态路由算法(总体式路由算法)

根据所经过的路由器多少和路径中各段链路的状态来计算最佳路由算法

3)分级路由算法(总体式路由算法)

路由器被分组,称为区域,每个路由器都只有自己所在区域路由器的信息,而没有其余区域路由器的信息。所以在其路由表中,路由器只需要存储其他每个区域的一条记录。

关于以上路由算法的具体介绍,参考有关资料,这里不深入分析了(仅供基础学习)。^_^

参考资料

《深入理解计算机网络》、《TCP/IP协议》

【TCP/IP】IP:网际协议(寻址和路由)相关推荐

  1. 《TCP/IP详解卷1:协议》第3章 IP:网际协议(2)-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  2. TCP/IP网络的一些问题(路由/协议/linux的实现)

    1.linux的虚拟网卡-tun linux的虚拟网卡驱动可以配置为两种模式,一种是点对点的tun模式,一种是以太网tap模式,实质上tun模式中从虚拟网卡出来的是ip数据报,也就是三层数据,而tap ...

  3. 网络:IP协议与寻址

    TCP/IP协议族中最核心的协议,提供不可靠.无连接的数据报传输服务. ·        不可靠:不能保证IP数据报能成功送达. ·        无连接:并不维护后续数据报的状态信息,每个数据报的处 ...

  4. HCIA------OSI、TCP和IP

    七层模型 物理层:光纤.双绞线.无线 数据链路层:MAC地址 网络层:路由.如何到达对方 传输层:TCP.UDP.安全否 会话层:迅雷下载.10m.限速5m 表示层:转码得过程.压缩 应用层:qq.搜 ...

  5. TCP 和IP的区别

    1. IP 网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议. IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层:相反,IP ...

  6. TCP/IP协议学习之TCP、IP篇

    TCP/IP是不同通信协议的大集合 协议族 TCP/IP是基于TCP和IP这两个最初的协议之上的不同的通信协议的大集合. 团结就是力量嘛,厉害的人总是倾向于聚集起来,厉害的协议同理,那么这些协议具体包 ...

  7. IP地址配置冲突导致路由振荡怎么办

    本期小编为大家带来的是:由于IP地址配置冲突导致路由振荡,使用户业务时断时通. 背景知识: IP地址在一个局域网内具有唯一性,也就是说局域网内,不能为不同的设备配置相同的IP地址. 组网情况: RTA ...

  8. IP地址,子网掩码,默认网关,路由,形象生动阐述

    自己的Linux虚拟机已经分配了固定的IP地址(使用无线路由,用的是192.168.1.XX网段),公司的无线网络分配的IP地址是(10.51.174.XX网段) 所以当自己的电脑拿到公司,还想使用桥 ...

  9. Tcp与Ip协议的客户端和服务器编程

    Tcp与Ip协议的客户端和服务器编程 本文就TCP和Ip协议的客户端和服务器分别进行编程,实现了客户端和服务端进行通信的功能,服务端对多个客户端进行监听,并能与多个客户端通信. 服务器端代码如下: u ...

最新文章

  1. dev里timeedit控件如何赋值_抽奖程序里的字节跳动模式和时长控制,让抽奖更有仪式感!...
  2. 矩阵正态分布基础1 外形式、外积与微分形式简介
  3. tasklist命令参数应用详细图解
  4. Lucene学习总结之七:Lucene搜索过程解析
  5. OpenGL:纹理映射bmp图像
  6. java obj1 = obj2_无障碍assertEquals(Object obj1,Object obj2),想怎么比较就怎么比较!! [ 光影人像 东海陈光剑 的博客 ]...
  7. spark RDD的理解
  8. 【Python】安装IPython和IPthon Notebook
  9. vector 内部方法大全 学习(初学者的参考资料)
  10. 性能测试--yslow
  11. 使用python玩转dicom文件——医学图像处理工具pydicom入门教程
  12. fftshift有什么用?MATLAB做FFT后为什么还要fftshift?
  13. 「解析」netron 模型可视化
  14. SE:14.Annotation
  15. 服务过载保护设计与实施
  16. 关于Diy51单片机的趣事
  17. 5.1.6 假脱机技术(输入井、输出井、输入输出缓冲区、共享打印机原理分析)
  18. ASP中Err.number返回的错误代码解释大全
  19. Fiddle 抓包小白一步带过超详细教程(含汉化)
  20. 计算机网络笔记17 分类的IP地址

热门文章

  1. 【杂谈】从零开始组建团队开发一款APP的人力成本以及时间成本解析
  2. 天翼杯大数据算法应用大赛
  3. 集成融云的视频通话功能
  4. VR全景图片浏览实现
  5. c语言的一些基本题型,编写fun函数实现基本功能
  6. Java SSM商城系统
  7. Java多用户商城源码/单商户商城系统源码
  8. Android动态获取权限(读写、获取手机状态、定位)
  9. django实现树形菜单
  10. MATLAB自带分类模型APP——classification learner的使用