TCP/IP协议栈--IP首部选项字段的分析

时间:2023-02-27 07:36:56

IP输入函数(ipintr)将在验证分组格式(检验和,长度等)之后。确定分组是否到达目的地之前,对选项进行处理。

这表明分组所

遇到的每一个路由器以及终于的目的主机都对要分组的选项进行处理。

IP分组内能够包括某些在分组被转发或被接收之前处理的可选字段。IP实现能够用随意顺序处理选项。标准IP首部之后最多可跟

40字节的选项。

TCP/IP协议栈--IP首部选项字段的分析

1.选项格式

IP选项字段可能包括0个或多个单独选项。选项有两种类型,单字节和多字节。如图所看到的:
TCP/IP协议栈--IP首部选项字段的分析

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVE9ERDkxMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

全部选项都以1字节类型type字段開始。

在多字节选项中,类型字段后面紧接着一个长度len字段,其它字段时数据data。很多选项

数据字段的第一个字节时1字节的位域offset字段,指向数据字段内的某个字节。长度字节的计算覆盖了类型、长度和数据字段。

类型

被继续分成三个子字段:1bit备份copied标志,2bit类class字段和5bit数字number字段。

下图列出了眼下定义的IP选项。

前两个选项

时单字节选项;其它的是多字节选项。
TCP/IP协议栈--IP首部选项字段的分析
第1列显示了Net/3的选项常量,第2列和第3列是该类型的十进制和二进制值。第4列是选项的长度。

Net/3列显示的是在Net3中

由ip_dooptions实现的选项。IP必须自己主动忽略全部它不识别的选项。当中安全和流ID没有在Net/3中实现,流ID选项时过时的。
安全选项主要时美国军方使用。
当Net/3对一个有选项的分组进行分片时。它将检查copied标志位。该标志位之处是否把全部选项都备份到每一个分片的IP首部。
class字段把相关的选项按下图进行分组,除时戳选项具有class为2外,全部选项都是class为0.

2.ip_dooptions函数

ipintr在检測分组的目的地址之前调用ip_dooptions.该函数处理分组中它所直到的全部选项。
ip_dooptions顺序读取每一个选项并进行处理:假设遇到EOL选项则终止该循环,假设遇到NOP选项。则忽略它,假设须要未知
选项则忽略。
分组选项被处理后,假设分组须要被转发。分组被传给ip_forward。
假设处理选项时出现了错误,函数就会进入错误处理。发出适当的ICMP错误报文。
以下几节会详细说明选项的处理。

3.记录路由选项

记录路由选项使得分组在穿过互联网时所经过的路由被记录在分组内部,项的大小是源主机在构造时确定的,必须足够保存
全部预期的地址。我们记得在IP分组的首部,选项最多仅仅能有40个字节。

记录路由选项能够有3个字节的开销。

后面紧跟地址的

列表(每一个地址4个字节)。假设该选项是唯一选项,则最多能够有9个(3+4*9=39)地址出现。一旦分配给该选项的空间被填满,
就按通常的情况对分组进行转发,中间的系统就不再记录地址。
下图说明了一个记录路由选项的格式。
TCP/IP协议栈--IP首部选项字段的分析
假设IP目的地址时某个系统地址(分组已到达目的地),则把接收接口的地址记录在选项中。否则把ip_rtaddr函数提供的外出
接口的地址记录下来。假设ip_rtaddr无法找到目的地路由,则发送一个ICMP主机不可达差错报文。

ip_rtaddr函数
该函数查询路由缓存,必要时查询完整的路由表,来找到到给定IP地址的路由。

函数返回一个指向in_ifaddr结构的指针。该指针

与该路由的外出接口有关。该函数中。rtalloc函数搜索路由表。寻找到目的地的路由。

4.源站和记录路由选项

通常在中间路由器所选择的路径上转发分组。源站和记录路由选项同意源站明白制定一条到目的地的路由,覆盖掉中间路由器
的路由选择决定。并且在分组到达目的地的过程中,把该路由记录下来。
严格路由包括了源站和目的站之间的每一个中间路由器的地址。

宽松路由仅仅指定某些中间路由器地址,在宽松路由中。路由器能够

*选择两个系统之间的不论什么路径;而在严格路由中,则不同意路由器这么做。
例如以下图,A,B和C是路由器。而HS和HD是源和目的主机。由于每一个接口都有自己的IP地址,所以我们看到路由器A有三个地址:
A1。A2。A3。

相同。B和C也有多个地址。

TCP/IP协议栈--IP首部选项字段的分析

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVE9ERDkxMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

IP首部的源和目的地址以及在选项中列出的位移和地址表。指定了路由以及分组眼下在该路由中所处的位置。

下图显示了当

分组依照这个宽松路由从HS经过A,B,C到HD,信息时怎样改变的。每行代表当分组被第1列显示的系统发送时的状态,最后
一行显示分组被HD接收。
每一个系统都把接口的地址放到选项去。

通过这样的方法, 分组所採用的路由都被记录在选项中。被记录的路由将被目的系统倒

转过来放到应答分组上,让他们沿着原始的路由的逆方向发送。
除了UDP,Net/3在应答时总是把收到的源路由逆转过来。
TCP/IP协议栈--IP首部选项字段的分析

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVE9ERDkxMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

选项处理主要包括下面几个部分:
1.源路由的结束
假设IP首部的目的地址是某个本地地址。而且offset所指向的超过了源路由的末尾。源路由中没有地址了,则分组已经到达
了目的地。调用save_rte将源路由保存在例如以下图所看到的的ip_srcrt结构中,由于在终于目的地。运输协议必须可以使用分组中
被记录下来的路由,运输协议必须把该路由倒过来并附在全部应答的分组上。
TCP/IP协议栈--IP首部选项字段的分析

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVE9ERDkxMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

2.为下一跳更新分组
假设IP首部目的地址是一个本地地址,而且offset指向选项内的一个地址,则该系统是源路由中指定的一个中间系统,分组
还没有到达目的地。在严格路由中,下一个系统必须位于某个直接相连的网络上。而在宽松路由中。假设没有找到下一个系统
的接口或路由。则发送一个ICMP源路由失败差错报文。
假设找到一个接口或一条路由,则更新IP目的地址设置为offset指向的IP地址。

在源路由选项内。用外出接口的地址取代中间

系统的地址,把offset添加。指向路由的下一个地址。
3.多播目的地
假设新的目的地址不是多播地址,在处理全然部选项后,应该把分组转发不是返回给ipintr。
源路由中的多播地址同意两个多播路由器通过不支持多播的中间路由器进行通信。

5.时间戳选项

当分组穿过一个互联网时,时间戳选项使各个系统把它当前的时间表示记录在分组的选项内。时间是以从UTC的午夜開始计算
的毫秒计,被记录在一个32bit的字段里。
假设系统没有准确的UTC或没有每秒更新至少15次,就不把它作为标准时间,非标准时间必须把时间戳字段的高位置位。
有三种时间戳选项,Net/3通过下图所看到的的ip_timestamp结构訪问。
TCP/IP协议栈--IP首部选项字段的分析
ip_flg指定的三种时间戳选项例如以下:
TCP/IP协议栈--IP首部选项字段的分析
初始主机必须构造一个具有足够大的数据区存放可能的时间戳和地址的地址的时间戳选项,对于ipt_flg为3的时间戳选项,
初始主机在构造该选项时,填写要记录时间戳的系统的地址。

下图显示了三种时间戳选项的结构。

TCP/IP协议栈--IP首部选项字段的分析
由于IP选项仅仅有40个字节。所以时间戳选项限制仅仅能有9个时戳,或4个地址和时间时戳对。

TCP/IP协议栈--IP首部选项字段的分析的更多相关文章

  1. TCP/IP协议栈概述及各层包头分析

    TCP/IP协议栈中各层包头的分析 Protocol列表示的是该数据包最高层对应的协议,Length列表示该包的长度(包括从底层的协议到最高层的协议,其中包头一般是,链路层14字节,IP20字节,TC ...

  2. TCP/IP协议栈 --- IP路由

    IP路由:当一个IP包在主机发送出去或者在网络当中时,是怎么选择路径到达目的主机的呢? 一般情况下, 如果说源主机和目的主机在同一个网络中的话,那个数据报可以直接到达目的主机而不经过路由器,下面可以试 ...

  3. TCP/IP协议---IP协议

    IP协议层 在传输层的下边,链路层的上边. IP层封装后称为数据报(传输层叫数据段,链路层叫数据帧.值得注意的是,不是所有的以太网数据帧都是IP数据报,至少以太网还要使用ARP协议.不是所有的IP数据 ...

  4. TCP/IP协议栈 --- 网络层(IP 首部 和分片)

    IP 是TCP/IP协议栈中重要的层次, TCP UDP ICMP IGMP都是依赖IP层进行传输的.首先它是一种不可靠,无连接的协议.不可靠:它不保证IP包能正确到达目的地,无连接:表示IP并不会维 ...

  5. TCP/IP UDP 协议首部及数据进入协议栈封装的过程

    数据的封装 UDP 封装 TCP 封装 IP 封装 检验和算法 当应用程序用TCP传送数据时,数据被传送入协议栈中,然后逐一通过每一层直到被当作一串比特流送入网络 注: UDP数据TCP数据基本一致. ...

  6. tcp/ip详解-ip头部选项字段

    IP头部的选项字段 作用:用于网络调试和测试 IP首部的可变部分就是一个可选字段.选项字段用来支持排错.测量以及安全等措施,内容很丰富.此字段的长度可变,从1个字节到40个字节不等,取决于所选择的项目 ...

  7. TCP/IP协议栈中的TimeStamp选项

    原文转自:http://www.cnblogs.com/lovemyspring/articles/4271716.html TCP应该是以太网协议族中被应用最为广泛的协议之一,这里就聊一聊TCP协议 ...

  8. 【转】TCP/IP协议栈及OSI参考模型详解

    OSI参考模型 OSI RM:开放系统互连参考模型(open systeminterconnection reference model) OSI参考模型具有以下优点: 简化了相关的网络操作: 提供设 ...

  9. TCP/IP协议栈与数据包封装+TCP与UDP区别

    ISO制定的OSI参考模型的过于庞大.复杂招致了许多批评.与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用.如图2-1所示,是TCP/IP参考模型和OSI参考模型的对比示意图. T ...

随机推荐

  1. mysql5.7安装配置

    sonar要求mysql5.6版本,所以安装一下最新的mysql5.7 相对路径配置一直存在问题,所以采用绝对路径配置,本次配置的基础路径是: D:\sonar\mysql-5.7.17-winx64 ...

  2. iOS 十六进制的颜色值转换为UIColor

    UIColor+Hex.h里面中 #import <UIKit/UIKit.h> @interface UIColor (Hex) + (UIColor *) colorWithHexSt ...

  3. MySql类似Oracle的dual虚拟表

    在mysql里也存在和oracle里类似的dual虚拟表:官方声明纯粹是为了满足select ... from...这一习惯问题,mysql会忽略对该表的引用. 你可千万注意了: select * f ...

  4. 报错&quot&semi;the geometry has no Z values&quot&semi;处理

    );  //将Z值设置为0 //IPoint point = (IPoint)pGeo; //point.Z = 0; } else            {                IZAwa ...

  5. 通过HTML条件注释判断IE版本的HTML语句详解&lt&semi;&excl;--&lbrack;if IE&rsqb;&gt&semi; &lt&semi;&excl;&lbrack;endif&rsqb;--&gt&semi;

    我们常常会在网页的HTML里面看到形如[if lte IE 9]……[endif]的代码,表示的是限定某些浏览器版本才能执行的语句,那么这些判断语句的规则是什么呢?请看下文: <!--[if ! ...

  6. JavaScript基础&lpar;一&rpar;

    我是一个初学者,但求能学到些许知识!以下是根据韩顺平老师的<轻松搞定网页设计html+css+javascript—javascrip部分>整理而成. 为什么要学习javascript? ...

  7. &lbrack;xPlugins&rsqb; 开发中常用富文本编辑器介绍

    富文本编辑器学习,常见富文本编辑器有: CKeditor(FCkeditor).UEditor(百度推出的).NicEdit.KindEditor CKEditor 即 FCKEditor FCKed ...

  8. 去除右键的opendgl

    Windows Registry Editor Version 5.00[-HKEY_CLASSES_ROOT\Unknown\shell\opendlg][-HKEY_CLASSES_ROOT\Un ...

  9. python反转列表的三种方式

    1.内建函数reversed() li =[1, 2, 3, 4, 5, 6] a = list(reversed(li)) print (a) 注意:reversed()函数返回的是一个迭代器,而不 ...

  10. 【App】不通过App Store实现ios应用分发下载安装(转)

    转自:https://www.cnblogs.com/star91/p/5018995.html   最近公司的项目准备着手宣传工作了,宣传手册上要印制App的下载地址二维码,但是客户端应用还未上线, ...