RFC 791 (2) - Overview

发布于:2024-05-09 ⋅ 阅读:(25) ⋅ 点赞:(0)

目录

总览

操作

Addressing 与 Fragmentation

Addressing

Fragmentation


总览

RFC791文档的第二部分就是对IP进行总浏览:可以看到,我们的五层划分是这样的:

                                    
                 +------+ +-----+ +-----+     +-----+  
                 |Telnet| | FTP | | TFTP| ... | ... |  
                 +------+ +-----+ +-----+     +-----+  
                       |   |         |           |     
                      +-----+     +-----+     +-----+  
                      | TCP |     | UDP | ... | ... |  
                      +-----+     +-----+     +-----+  
                         |           |           |     
                      +--------------------------+----+
                      |    Internet Protocol & ICMP   |
                      +--------------------------+----+
                                     |                 
                        +---------------------------+  
                        |   Local Network Protocol  |  
                        +---------------------------+  
​
                         Protocol Relationships

可以这样理解这些协议之间的关系:最上一层是应用层的协议,比如说telnet, FTP, TFTP等传统应用层协议!他们是使用了TCP或者udp这样一些传输协议的服务来完成自身的服务,而TCP UDP这些传输层的服务则是基于IP或者是ICMP的网络层服务完成自身的服务的,而IP和ICMP又是依靠或者说是依赖于本地网络的一些协议来完成他们的工作!可以看到层层的抽象共同完成了进程之间的报文传输!

由于RFC791着重描述与IP的工作原理,所以这里我们从IP的报文封装与拆包来进行分析!

操作

IP的封装与拆包实际上是按照这样的流程完成的。

为了严谨假设,我们假设两台主机之间需要通过一个网关跳转才能够完成传输!那么对于发送报文的应用进程,它需要准备好它的数据,然后调用本地的网络模型来发送数据。他把数据放到了一个上层应用已经结束封装的数据包,然后准备使用IP协议来构建IP报文,它向里面填充自身的源地址,目标地址,数据以及一些选项等。

在这里它需要向网关发送数据,那么这里的目标地址就需要填写网关的IP。然后他就会把这样的一个IP报文发送给网关,网关接收到了这样的IP报文之后它首先要剥离协议的头,从而把数据包从中裸露出来方便处理。他需要查看装在了数据段的目标地址,网关查看自己的转发表,这样他才能决定要转发到哪一个网关或者主机上!

由于在这个场景里面我们的表里面已经存储了目标主机的IP地址,所以在这里他直接往目标主机发送IP报文。于是他再一次封装IP报文,然后向目标主机投递这个IP报文,目标主机接收到了这个IP报文后向上传递,最终以一种系统调用的方式通知目标进程接收网报数据!所以整个流程就可以使用这样的图来简单的描述

   Application                                           Application
   Program                                                   Program
         \                                                   /      
       Internet Module      Internet Module      Internet Module    
             \                 /       \                /           
             LNI-1          LNI-1      LNI-2         LNI-2          
                \           /             \          /              
               Local Network 1           Local Network 2            
​
​
​
                            Transmission Path
​

AddressingFragmentation

我们知道IP报文是会在主机与主机之间进行传递!那么我们应该如何标识他们?

我们传递的报文可能会很大!在这种情况下一个报文可能并没有办法完全容纳我们的数据!这个时候它可能就需要分片!下面我们来讨论IP协议提要求提供的这两个基础功能是怎样的

Addressing

我们之前就说过,IP提供的最基础的两个服务,一个是Addressing(寻址),另一个就是Fragmentation(分片)。我们是怎么区分寻址的呢?答案是使用一些区分字段:

names:主机的名称,这个地方是不是想起来DNS了?是的!这里就是记载着names - Address映射对

addresses:主机的地址

route:记载着如何到达

当然,IP地址实际上也需要向下转化为本地的网络协议使用的地址(比如说MAC地址)

一般的,我们考虑IP地址,在1980年那个主机并不太多的时代,将IP地址分成ABC类。我们后面会进一步详细的讨论

Fragmentation

我们下面就讨论分片这个事情:分片,简而言之就是把一个巨大无比的数据报将它分解为小的一个分组就可以容纳的小碎片!当然一个数据报段文可以标记为不要分段!那么这个时候被标记了不要分段的数据包将会被解释为不是分段的,所以如果这个数据报它确实需要分段才能够发送,但是被标记为不分段时,它会被遗弃掉!

我们如何指示我们的数据报是分段的呢?答案很简单,在header里有所指示就行!我们的发送方将数据进行分段,然后传递出去!那么接收方就要依赖identification(身份)段中的标识来接受报文(这表明了这是这个分段组的!)

举个例子。假如说,我们要发送一个很大的报文时:这个巨大的数据包被拆分成一个一个数据段(注意第一个IP报文的数据段必须是64位大小的整数倍,后面的无所谓),每个数据包前面添加IP协议控制报文段,从而将这些将一个巨大的数据包转化为若干的IP分组报文!

第一个标识中写入自己的分组偏移量是零,之后的分组按照顺序依次递增,而同时在第一个报文中设置“是否有更多分组”的标志位中设置唯1,在最后一个分组中“是否有更多分组”的标志位中设置为0!这样我们的接收方它首先查看偏移量来表明这是第几个报文,同时查看是否有更多分组来决定还不还要继续接收这个报文流!直到接收到一个报文其分组标识为零的时候,它才会停止接收这个报文流!