网络协议栈:
数据从一台计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈发到网络上 时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation)
IP数据包格式
IPv4报文的首部包含14个字段,其中13个是必须的,第14个是可选的(在表中用红色标出)。首部中的字段均以大端序包装。
-
版本
- IP报文首部的第一个字段是4位版本字段。对IPv4来说,这个字段的值是4。
-
首部长度(IHL)
- 第二个字段是4位首部长度,说明首部有多少32位 字长。由于IPv4首部可能包含数目不定的选项,这个字段也用来确定数据的偏移量。这个字段的最小值是5,最大值是15。
-
显式拥塞通告(ECN)
- 在RFC 3168中定义,允许在不丢弃报文的同时通知对方 网络拥塞的发生。ECN是一种可选的功能,仅当两端都支持并希望使用,且底层网络支持时才被使用。
-
全长
- 这个16位字段定义了报文总长,包含首部和数据,单位为字节。这个字段的最小值是20(20字节首部+0字节数据),最大值是65,535。所有主机都必须支持最小576字节的报文,但大多数现代主机支持更大的报文。有时候子网会限制报文的大小,这时报文就必须被分片。
-
标识符
- 这个字段主要被用来唯一地标识一个报文的所有分片。一些实验性的工作建议将此字段用于其它目的,例如增加报文跟踪信息以协助探测伪造的源地址。
-
标志
-
这个3位字段用于控制和识别分片,它们是:
- 位0:保留,必须为0;
- 位1:禁止分片(DF);
- 位2:更多分片(MF)。
- 如果DF标志被设置但路由要求必须分片报文,此报文会被丢弃。这个标志可被用于发往没有能力组装分片的主机。
- 当一个报文被分片,除了最后一片外的所有分片都设置MF标志。不被分片的报文不设置MF标志:它是它自己的最后一片。
-
分片偏移
- 这个13位字段指明了每个分片相对于原始报文开头的偏移量,以8字节作单位。
-
存活时间(TTL)
- 这个8位字段避免报文在互联网中永远存在(例如陷入路由环路)。存活时间以秒为单位,但小于一秒的时间均向上取整到一秒。在现实中,这实际上成了一个跳数计数器:报文经过的每个路由器都将此字段减一,当此字段等于0时,报文不再向下一跳传送并被丢弃。常规地,一份 ICMP报文被发回报文发送端说明其发送的报文已被丢弃。
-
协议
- 这个字段定义了该报文数据区使用的协议。
-
首部检验和
- 这个16位 检验和字段用于对首部查错。在每一跳,计算出的首部检验和必须与此字段进行比对,如果不一致,此报文被丢弃。值得注意的是,数据区的错误留待上层协议处理—— 用户数据报协议和 传输控制协议都有检验和字段。
- 因为生存时间字段在每一跳都会发生变化,意味着检验和必须被重新计算。
-
源地址
- 一个IPv4地址由四个字节共32位构成,此字段的值是将每个字节转为二进制并拼在一起所得到的32位值。
- 例如,10.9.8.7是00001010000010010000100000000111。
- 这个地址是报文的发送端。但请注意,因为NAT的存在,这个地址并不总是报文的 真实发送端,因此发往此地址的报文会被送往NAT设备,并由它被翻译为真实的地址。
-
目的地址
- 与源地址格式相同,但指出报文的接收端。
-
选项
附加的首部字段可能跟在目的地址之后,但这并不被经常使用。请注意首部长度字段必须包括足够的32位字来放下所有的选项(包括任何必须的填充以使首部长度能够被32位整除)。当选项列表的结尾不是首部的结尾时,EOL(选项列表结束,0x00)选项被插入列表末尾。下表列出了可能的选项:
数据
数据字段不是首部的一部分,因此并不被包含在检验和中。数据的格式在协议首部字段中被指明,并可以是任意的传输层协议。
一些常见协议的协议字段值被列在下面:
分片
当一个设备收到一个IP报文时,它阅读其目的地址并决定要在哪个设备上发送它。设备有与其关联的MTU来决定其载荷的最大长度,如报文长度比MTU大,那么设备必须进行分片。
设备将整个报文数据分成数片,每一片的长度都小于等于MTU减去IP首部长度。接下来每一片均被放到独立的IP报文中,并进行如下修改:
- 总长字段被修改为此分片的长度;
- 更多分片(MF)标志被设置,除了最后一片;
- 分片偏移量字段被调整为合适的值;
- 首部检验和被重新计算。
例如,对于一个长20字节的首部和一个MTU为1,500的以太网,分片偏移量将会是:0、(1480/8)=185、(2960/8)=370、(4440/8)=555、(5920/8)=740、等等。
如果报文经过路径的MTU减小了,那么分片可能会被再次分片。
比如,一个4,500字节的数据载荷被封装进了一个没有选项的IP报文(即总长为4,520字节),并在MTU为2,500字节的链路上传输,那么它会被破成如下两个分片:
现在,假设下一跳的MTU掉到1,500字节,那么每一个分片都会被再次分成两片:
事实上,数据的长度被保留了下来——1480+1000+1480+540=4500,最后一片的偏移量(495)*8(字节)加上数据——3960+540=4500也正好是数据长度。
值得注意的是,第3和4片是从原始第2片再次分片而来的。当一个设备必须分片最后一片时,它必须在除分出的最后一片外的其它片上设置更多分片标志。
组装
当一个接收者发现IP报文的下列项目之一为真时:
- 更多分片标志被设置;
- 分片偏移量字段不为0。
它便知道这个报文已被分片,并随即将数据、标识符字段、分片偏移量和更多分片标志一起储存起来。
当接受者收到了更多分片标志未被设置的分片时,它便知道原始数据载荷的总长。一旦它收齐了所有的分片,它便可以将所有片按照正确的顺序(通过分片偏移量)组装起来,并交给上层协议栈。
在路径选择的过程中,主机和路由器的决策是由一个叫路由表的路径数据库辅助决定的。路由表在路由器内部。根据路由协议,主机也可以拥有用于选择最佳路径的路由表。主机路由表是互联网协议中可选的。各种路由表:
- 网络路由:一个在网络中有特定网络ID的路由(路径)
- 主机路由:一个有特定网络地址(网络ID和主机ID)的路由。主机路由允许智能化的路由选择。主机路由通常用于创建用于控制和优化特定网络通信的定制路由。
- 默认路由:一个当别的路由在路由表中未被找到的时候使用的路由。如果一个路由器或终端系统(如装有Microsoft Windows和Linux的个人电脑),找不到到达目的地的路由时就会使用默认路由。
距离向量算法使用Bellman-Ford算法。对于每一条网络上节点间的路径,算法指定一个“成本”给它们。节点会选择一条总成本(经过路径的所有成本总和)最低的路径,用来把资料从节点甲送到节点乙。
此算法非常的简单。当某节点初次启动时,将只知道它的邻居节点(直接连接到该节点的节点)与到该节点的成本。(这些资讯、目的地列表、每个目的地的总成本,以及到某个目的地所必须经过的“下一个节点”,构成路由表,或称距离表。)每个节点定时地将目前所知,到各个目的地的成本的资讯,送给每个邻居节点。邻居节点则检查这些资讯,并跟目前所知的资讯做比较;如果到某个目的地的成本比目前所知的低,则将收到的资讯加入自己的路由表。经过一段时间后,网络上得所有节点将会了解到所有目的地的最佳“下一个节点”与最低的总成本。
当某个节点断线时,每个将它当作某条路径的“下一个节点”的节点会将该路由资讯舍弃,再建立新的路由表资讯。接着,他们将这些资讯告诉所有相邻的节点,再找出到所有可抵达的目的地之新路径。
连线状态算法中,每个节点拥有网络的图谱(一个图)。每个节点将自己可以连接到的其他节点资讯传送到网络上所有的节点,而其他节点接着各自将这个资讯加入到图谱中。每个路由器即可根据这个图谱来决定从自己到其它节点的最佳路径。
完成这个动作的算法——Dijkstra算法——建立另一种数据结构——树。节点产生的树将自己视为根节点,且最后这棵树将会包含了网络中所有其他的节点。一开始,此树只有根节点(节点自己)。接着在树中已有的节点的邻居节点且不存在树中的节点集合中,选取一个成本最低的节点加入此树,直到所有节点都存入树中为止。
这棵树即用来建立路由表、提供最佳的“下一个节点”等,让节点能跟网络中其它节点通讯。
路由算法的比较
在小型网络中,距离向量路由协定十分简单且有效率,且只需要些微的管理。然而,它们的规模性不好,且 收敛性质也十分差,因此促进了较复杂但规模性较好的连线状态路由协定的开发,以使用在较大型的网络。
连线状态路由协定的主要优点是在限制的时间内,对于连线改变(例如断线)的反应较快。而且连线状态路由协定在网络上所传送的封包也比距离向量路由协定的封包小。距离向量路由协定必须传送一个节点的整个路由表,但连线状态路由协定的封包只需要传输该节点的邻居节点资讯即可。因此,这些封包小到不会占用可观的网络资源。连线状态路由协定的主要缺点则是比距离向量路由协定需要较多的储存空间与较强的计算能力。