通俗易懂网络协议(IP)
IP层接收到一份要发送的数据报时,通过选路逻辑来决定向哪个接口(网卡)发送数据,发送数据之前,需要查询该接口获得其MTU,然后将数据报长度与MTU进行比较,如果需要,则进行分片,分片可以发生在原始发送端主机,也可以发生在中间路由器上。 IP数据报分片后,到达目的地后才进行重新组装,恢复分片前的IP数据报信息,重组由目的主机的IP层完成。因此,分片和重组对传输层(TCP、UDP)透明,IP首部中的标识、标志、分片偏移字段为分片和重组提供了足够的信息。 IP数据报首部中的标识(16bit)保存分片的唯一值,这意味着属于同一IP数据报的多个分片拥有相同的标识值。 标志(3bit)字段中的一位用来表示“是否有更多的片”,除最后一片外,其他组成数据报的分片该位设1,最后一片置0表示没有更多的片,也就是最后一片;片偏移字段用来标识该片在原始IP数据报中的位置。 当IP数据报切分为多个分片(IP数据报)后,每个分片的总长度字段(16bit)要更改为该片的长度值。 对链路层而言,不管是完整的IP数据报,还是IP数据报的一个分片,都以IP分组同等视之,分组是IP层把数据报传递给链路层的一个概念,既可能是一个独立IP数据报也可能是一个IP数据报的分片。每个分组(分片)都有自己的IP首部,并在选路时与其他分组(分片)独立路由,所以这些分片到达目的端可能失序,但IP首部有足够信息重新组装这些片。 任何一个分片的丢失,都要导致重传整个数据报,这是因为重传机制在传输层,而分片对传输层透明。 上图是UDP数据报在IP层的分片示例,可见UDP首部只存在第一个分组(分片)之中,这很容易理解,因为经传输层封装后的数据报对于IP层而言是透明的,IP不区分UDP首部和UDP数据,它们都是不透明的Payload。 接收端在收到IP分片后,相同标识值的分片属于同一个被切分的数据报,然后对分片偏移排序,更多片标志位为0的分组是最后一片,排序后的分组,如果分配偏移连续,且最后一个分组也到达,则表示整个数据报都到达了,则恢复数据报,否则继续等待。 IP转发 IP转发的概念很简单,就是路由器为IP数据报挑选一个接口发送出去。 从发送端到目的端,之间经历的所有路由器构成网络路由的完整路径,这跟从家到公司经过的所有路口构成的路径类似。 当网络接口(网卡)收到数据报时,IP模块检查数据报目的地址是否为自己的IP地址,如果是,数据报交付给由协议字段指定的协议模块(TCP、UDP等),如果不是,则判断IP层是否配置为路由器,如果是,则转发,如果不是,丢弃,因为主机不转发那些不是由它生成的数据报。 IP层包含一些位于内存中的信息,称为路由表,每次转发数据报时,都要查询路由表,执行最长前缀匹配法,决定挑选哪个路由表项做数据转发。IP转发逐跳进行,每次转发假设离目的地更近一步,路由器和主机不包含到目的地的完整路径信息。 路由表是路由条目的列表,每个路由条目包括以下几项关键信息。
选路过程:
通常路由表会有一个默认路由项目,用于默认路由,每经过一个路由器,IP首部中的TTL字段都要自减1。
(编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |