IP协议

网络层位于数据链路层和传输层之间。网络层中包含了很多协议,其中最重要的协议就是IP协议。网络层提供了IP路由功能,路由的依据就是收到的IP报头。在剥掉帧的头部和尾部之前,网络设备需要根据帧头中Type字段确定下 一步将帧发送到哪个上层协议进行处理。以太网帧头部Type字段值为0x0800 ,表示该帧的网络层协议为IP协议,该帧数据部分需要上送到IP协议进行处理。以下就是IP报文结构:
image.png

IP报文头部信息用于指导网络设备对报文进行路由和分片。同一个网段内的数据转发通过链路层即可实现,而跨网段的数据转发需要使用网络设备的路由功能。分片是指数据包超过一定长度时,需要被划分成不同的片段使其能够在网络中传输。

IP报文头部长度为20到60字节,报文头中的信息可以用来指导网络设备如何将报文从源设备发送到目的设备。其中,版本字段表示当前支持的IP协议版本,当前的版本号为4。 DS字段早期用来表示业务类型,现在用于支持QoS中的差分服务模型,实现网络流量优化。

源和目的IP地址是分配给主机的逻辑地址,用于在网络层标识报文的发送方和接收方。源主机必须要知道目的主机的IP地址后才能将数据发送到目的地。源主机向其他目的主机发送报文之前,需要检查目的IP地址和源IP地址是否属于同一个网段。如果是,则报文将被下发到底层协议进行以太网封装处理。如果目的地址和源地址属于不同网段,则主机需要获取下一跳路由器的IP地址,然后将报文下发到底层协议处理。这个下一跳路由器的IP地址就是主机的网关。
image.png

网关是指接收并处理本地网段主机发送的报文并转发到目的网段的设备。为实现此功能,网关必须知道目的网段的IP地址。网关设备上连接本地网段的接口地址即为该网段的网关地址。

网络中转发的IP报文的长度可以不同,但如果报文长度超过了数据链路所支持的最大长度,则报文就需要分割成若干个较小的片段才能够在链路上传输。将报文分割成多个片段的过程叫做分片。

接收端根据分片报文中的标识符(Identification),标志(Flags),及片 偏移

(Fragment Offset)字段对分片报文进行重组。标识符用于识别属 于同一个数据包的分片,以区别于同一主机或其他主机发送的其它数据 包分片,保证分片被正确的重新组合。标志字段用于判断是否已经收到 最后一个分片。最后一个分片的标志字段设置为0,其他分片的标志字 段设置为1,目的端在收到标志字段为0的分片后,开始重组报文。片偏 移字段表示每个分片在原始报文中的位置。第一个分片的片偏移为0, 第二个分片的片偏移表示紧跟第一个分片后的第一个比特的位置。比如, 如果首片报文包含1259比特,那么第二分片报文的片偏移字段值就应该 为1260。

报文在网段间转发时,如果网络设备上的路由规划不合理,就可能会出现环路,导致报文在网络中无限循环,无法到达目的端。环路发生后, 所有发往这个目的地的报文都会被循环转发,随着这种报文逐渐增多, 网络将会发生拥塞。为避免环路导致的网络拥塞,IP 报文头中包含一个生存时间TTL(Time To Live)字段。报文每经过一台三层设备,TTL值减1。初始TTL值由源端设备设置。当报文中的TTL降为0时,报文会被丢弃。同时,丢弃报文的设备会根据报文头中的源IP地址向源端发送ICMP错误消息。

目的端的网络层在接收并处理报文以后, 需要决定下一步对报文该做如何处理。 IP报文头中的协议字段标识了将会继续处理报文的协议。 与以太帧头中的Type字段类似, 协议字段也是一个十六进制数。 该字段可以标识网络层协议, 如ICMP(Internet Control

Message Protocol, 因特网控制报文协议), 也可以标识上层协议,如TCP(

Transmission Control Protocol ,传 输 控 制 协 议 ,对 应 值 0x06 ) 、UDP ( User

Datagram Protocol,用户数据包协议,对应值0x11)。

IP报头是最重要的报头之一,互联网上的路由器都是根据IP报头来进行数据的转发,应该熟悉理解里面的所有字段,为后续的路由原理打下坚实基础。

ARP协议

一个网络设备要发送数据给另一个网络设备时, 必须要知道对方的IP地址。 但是,仅有IP地址是不够的,因为IP数据报文必须封装成帧才能通过数据链路进行发送,而数据帧必须要包含目的MAC地址,因此发送端还必须获取到目的MAC地址。 每一个网络设备在数据封装前都需要获取下一跳的MAC地址。 IP地址由网络层来提供, MAC地址通过ARP协议来获取。 ARP协议是TCP/IP协议簇中的重要组成部分, 它能够通过目的IP地址获取目标设备的MAC地址, 从而实现数据链路层的可达性。

ARP(Address Resolution Protocol)协议,已知IP地址,来解析MAC地址,所以

ARP协议只存在于以太网中,是局域网中一个很重要的协议。
image.png

ARP报文结构如下:
image.png

网络设备通过ARP报文来发现目的MAC地址。 ARP报文中包含以下字段:

  1. Hardware Type表示硬件地址类型, 一般为以太网;

  2. Protocol Type表示三层协议地址类型, 一般为IP;

  3. Hardware Length和Protocol Length为MAC地址和IP地址的长度,单位是字节;

  4. Operation Code指定了ARP报文的类型, 包括ARP Request和ARP Reply;

  5. Source Hardware Address指的是发送ARP报文的设备MAC地址;

  6. Source Protocol Address指的是发送ARP报文的设备IP地址;

  7. Destination Hardware Address指的是接收者MAC地址, 在ARPRequest报文中, 该字段值为0;

  8. Destination Protocol Address指的是接收者的IP地址。

ARP通过一个广播请求(ARP Request)和一个单播回应(ARP Reply)来实现地址解析过程,因为ARP请求包是二层广播帧,所以ARP不能穿越路由器,不能被转发到其它的广播域。

ARP请求:如果和目的IP是同一网段,请求的就是目的IP所对应的MAC地址;如果和目的IP地址不在同一网段,请求的就是网关的IP所对应的MAC地址。

image.png

ARP响应:所有的主机接收到该ARP Request报文后, 都会检查它的目的协议地址字段与自身的IP地址是否匹配。 如果不匹配, 则该主机将不会响应该ARP Request报文。 如果匹配,则该主机会将ARP报文中的源MAC地址和源IP地址信息记录到自己的ARP缓存表中,然后通过

ARP Reply报文进行响应,响应报文是单播帧。

image.png

主机A收到ARP Reply以后,会检查ARP报文中目的MAC地址是否与自己的MAC匹配。 如果匹配, ARP报文中的源MAC地址和源IP地址会被记录到主机A的ARP缓存表中。

其实,主机在发送ARP请求之前,都是要查自己的ARP缓存表的,缓存表中没有记录才会发送ARP请求,缓存表中如果存在记录,就直接封装记录中的MAC地址成帧。缓存表是有刷新间隔的,一般是300秒。如果主机学习到错误的ARP条目,则主机就会被攻击或欺骗,因此,局域网中应该防范ARP攻击和欺骗。

免费ARP:用来探测IP地址是否冲突

image.png

主机被分配了IP地址或者IP地址发生变更后,必须立刻检测其所分配的IP地址在网络上是否是唯一的,以避免地址冲突。主机通过发送ARP Request报文来进行地址冲突检测。

主机A将ARP Request广播报文中的目的IP地址字段设置为自己的IP地址,且该网络中所有主机包括网关都会接收到此报文。当目的IP地址已经被某一个主机或网关使用时,该主机或网关就会回应ARP Reply报文。通过这种方式,主机A就能探测到IP地址冲突了。

ICMP协议

Internet控制消息协议ICMP(Internet Control Message Protocol)是网络层的一个重要协议。ICMP协议用来在网络设备间传递各种差错和控制消息,并对于收集各种网络信息、诊断和排除各种网络故障等方面起着至关重要的作用。ICMP是TCP/IP协议簇的核心协议之一。

ICMP数据包格式:

image.png

ICMP消息封装在IP报文中。 ICMP消息的格式取决于Type和Code字段,其中Type字段为消息类型, Code字段包含该消息类型的具体参数。 后面的校验和字段用于检查消息是否完整。 消息中包含32比特的可变参数,这个字段一般不使用, 通常设置为0。 在

ICMP Redirect消息中, 这个字段用来指定网关IP地址, 主机根据这个地址将报文重定向到指定网关。在Echo请求消息中, 这个字段包含标识符和序号, 源端根据这两个参数将收到的回复消息与本端发送的Echo请求消息进行关联。 尤其是当源端向目的端发送了多个

Echo请求消息时, 需要根据标识符和序号将Echo请求和回复消息进行一一对应。

常见的ICMP消息类型和编码类型:

image.png

一、ping程序:用来测试网络连通性工具

ICMP的一个典型应用是Ping。Ping是检测网络连通性的常用工具,同时也能够收集其他相关信息。用户可以在Ping命令中指定不同参数,如ICMP报文长度、发送的ICMP报文个数、等待回复响应的超时时间等,设备根据配置的参数来构造并发送ICMP报文,进行Ping 测试。

Ping常用的配置参数说明如下:

  1. -a source-ip-address指定发送ICMP ECHO-REQUEST报文的源IP地址。如果不指定源

IP地址,将采用出接口的IP地址作为ICMP ECHOREQUEST报文发送的源地址。

  1. -c count指定发送ICMP ECHO-REQUEST报文次数。 缺省情况下发送5个ICMP ECHO-

REQUEST报文。

  1. -h ttl-value指定TTL的值。 缺省值是255。

  2. -t timeout指定发送完ICMP ECHO-REQUEST后, 等待ICMP ECHOREPLY的超时时间。

Ping命令的输出信息中包括目的地址、ICMP报文长度、序号、TTL值以及往返时间。序号是包含在Echo回复消(Type=0) 中的可变参数字段,TTL和往返时间包含在消息的IP头中。

二、tracert程序(有个也叫traceroute)

ICMP的另一个典型应用是Tracert。Tracert基于报文头中的TTL值来逐跳跟踪报文的转发路径。 为了跟踪到达某特定目的地址的路径, 源端发送一个UDP报文,首先将报文的TTL值设置为1。该报文到达第一个节点后,TTL超时,于是该节点向源端发送TTL超时消息,消息中携带时间戳。然后源端将报文的TTL值设置为2, 报文到达第二个节点后超时, 该节点同样返回TTL超时消息,以此类推,直到报文到达目的地。目标主机会返回一个目标主机不可达的消息。这样,源端根据返回的报文中的信息可以跟踪到报文经过的每一个节点,并根据时间戳信息计算往返时间。Tracert是检测网络丢包及时延的有效手段,同时可以帮助管理员发现网络中的路由环路。

Tracert常用的配置参数说明如下:

  1. -a source-ip-address指定tracert报文的源地址。

  2. -f first-ttl指定初始TTL。 缺省值是1。

  3. -m max-ttl指定最大TTL。 缺省值是30。

  4. -name使能显示每一跳的主机名。

  5. -p port指定目的主机的UDP端口号。

路由基本原理

以太网交换机工作在数据链路层,用于在网络内进行数据转发。而企业网络的拓扑结构一般都会比较复杂,不同的部门,或者总部和分支可能处在不同的网络中,此时就需要使用路由器来连接不同的网络,实现网络之间的数据转发。

自治系统(AS):由同一个管理机构管理、使用统一路由策略的路由器的集合。一般地我们可以把一个企业网络认为是一个自治系统AS(Autonomous System)。根据

RFC1030的定义,自治系统是由一个单一实体管辖的网络,这个实体可以是一个互联网服务提供商,或一个大型组织机构。自治系统内部遵循一个单一且明确的路由策略。最初,自治系统内部只考虑运行单个路由协议;然而,随着网络的发展,一个自治系统内现在也可以支持同时运行多种路由协议。

一个AS通常由多个不同的局域网组成。以企业网络为例,各个部门可以属于不同的局域网,或者各个分支机构和总部也可以属于不同的局域网。局域网内的主机可以通过交换机来实现相互通信。不同局域网之间的主机要想相互通信,可以通过路由器来实现。路由器工作在网络层,隔离了广播域,并可以作为每个局域网的网关,发现到达目的网络的最优路径,最终实现报文在不同网络间的转发。

image.png

路由器最根本的作用是选择最优路径和路由IP数据包。

路由器收到数据包后,会根据数据包中的目的IP地址选择一条最优的路径,并将数据包转发到下一个路由器,路径上最后的路由器负责将数据包送交目的主机。数据包在网络上的传输就好像是体育运动中的接力赛一样,每一个路由器负责将数据包按照最优的路径向下一跳路由器进行转发,通过多个路由器一站一站的接力,最终将数据包通过最优路径转发到目的地。当然有时候由于实施了一些特别的路由策略,数据包通过的路径可能并不一定是最佳的。路由器能够决定数据报文的转发路径。如果有多条路径可以到达目的地,则路由器会通过进行计算来决定最佳下一跳。计算的原则会随实际使用的路由协议不同而不同。

image.png

路由器转发数据包的关键是路由表。每个路由器中都保存着一张路由表,表中每条路由表项都指明了数据包要到达某网络或某主机应通过路由器的哪个物理接口发送,以及可到达该路径的哪个下一跳路由器,或者不再经过别的路由器而直接可以到达目的地。

image.png

路由表中包含了下列关键项:

目的地址(Destination):用来标识IP数据包的目的地址或目的网络。

网络掩码(Mask):在IP编址课程中已经介绍了网络掩码的结构和作用。同样,在路由表

中网络掩码也具有重要的意义。IP地址和网络掩码进行“逻辑与”便可得到相应的网段信

息。如本例中:目的地址为8.0.0.0,掩码为255.0.0.0,相与后便可得到一个A类的网段信息

(8.0.0.0/8)。网络掩码的另一个作用还表现在当路由表中有多条目的地址相同的路由信息时,路由器将选择其掩码最长的一项作为匹配项。

输出接口(Interface):指明IP数据包将从该路由器的哪个接口转发出去。

下一跳IP地址(NextHop):指明IP数据包所经由的下一跳路由器的接口地址。

路由表中优先级、度量值等其他的几个字段我们将在以后进行介绍。

路由表如此重要,那路由表是如何产生的呢?

  1. 链路层协议发现的路由(也称为接口路由或直连路由)。只要给接口配置了IP地址和掩码,且接口是开启的,就可以产生;

  2. 由网络管理员手工配置的静态路由。

  3. 动态路由协议发现的路由。
    image.png

路由器在路由IP数据的时候有个封装解封装的过程:路由器在接收接口会解封装,然后在出接口会重新封装。即二层帧在经过路由器的时候是会被重新封装的。路由器在路由数据包的时候做了一个修改二层帧信息的动作,IP数据包经过IP路由网络,逐跳经过封装解封装,最后到达目的地。

路由器在做路由查询的时候,是一种尽力而为的传输方式,只要自己的路由表可达,就会路由数据,不需要去关心数据最终是否可达。

路由器优先级和度量值
1、 路由优先级(preference)
路由器会把它认为的最优秀的路由条目添加到路由表中,首先要看的就是路由来源,路由来源有直连路由、静态路由及各种动态路由,不同的厂商会对不同的路由条目来源定义不同的优先级标准,思科公司称这个为管理距离(distance),代表的是这个路由来源的可信程度,华为厂商称之为优先级(preference)
image.png
如图所示,路由器通过两种路由协议学习到了网段10.1.1.0的路由。虽然RIP协议提供了一条看起来更加近的路线,但是由于OSPF具有更高的优先级,因而成为优选路由,并被加入路由表中。
2、 度量值(metric)
如果路由器无法用优先级来判断最优路由,则使用度量值(metric)来决定需要加入路由表的路由。度量值是评定路由好坏的标准。一些常用的度量值有:跳数,带宽,时延,代价,负载,可靠性等。
跳数是指到达目的地所通过的路由器数目。
带宽是指链路的容量,高速链路开销(度量值)较小。
metric值越小,路由越优先;因此,图示中metric=1+1=2的路由是到达目的地的最优路由,其表项可以在路由表中找到。
image.png
3、 最长掩码匹配原则:
当路由表中有多条到达目的地路由条目时,路由器会选择掩码长度最长的条目来进行转发。

image.png