草庐IT

边学习边记录IP协议

养不起心爱的猫该如何是好 2024-07-08 原文

IPv4数据报格式 :


IPv4数据报中的关键字段如下:

  • 版本: 这4比特规定了数据报的IP协议版本。不同的IP版本使用不同的数据报格式。IPv4的数据报格式如图所示。
  • 首部长度: 因为一个IPv4 数据报可包含一些可变数量的选项(这些选项包括在IPv4数据报首部中),故需要用这4比特来确定IP数据报中数据部分实际从哪里开始。大多数IP数据报不包含选项,所以一般的IP数据报具有20字节的首部。
  • 服务类型:服务类型(TOS)比特包含在IPv4首部中,以便使不同类型的IP数据报(例如,一些特别要求低时延、高吞吐量或可靠性的数据报)能相互区别开来。例如,将实时数据报(如用于IP电话应用)与非实时流量(如FTP)区分开也许是有用的。提供特定等级的服务是一个由路由器管理员决定的策略问题。
  • 数据报长度: 这是IP数据报的总长度(首部加上数据),以字节计。因为该字段长为16比特,所以IP数据报的理论最大长度为65535字节。然而,数据报很少有超过1500字节的。
  • 标识、标志、片偏移: 这三个字段与所谓IP分片有关,新版本的IP(即 IPv6)不允许在路由器上对分组分片。
  • 寿命: 寿命(Time-To-Live,TTL)字段用来确保数据报不会永远(如由于长时间的路由选择环路)在网络中循环。每当数据报由一台路由器处理时,该字段的值减1。若TTL字段减为0,则该数据报必须丢弃。
  • 协议: 该字段仅在一个P数据报到达其最终目的地才会有用。该字段值指示了IP数据报的数据部分应交给哪个特定的运输层协议。例如,值为6表明数据部分要交给TCP,而值为17表明数据要交给 UDP。注意在IP数据报中的协议号所起的作用,类似于运输层报文段中端口号字段所起的作用。协议号是将网络层与运输层绑定到一起的粘合剂,而端口号是将运输层和应用层绑定到一起的粘合剂。链路层帧也有一个特殊字段用于将链路层与网络层绑定到一起。
  • 首部检验和: 首部检验和用于帮助路由器检测收到的IP数据报中的比特错误。首部检验和是这样计算的:将首部中的每2个字节当作一个数,用反码运算对这些数求和。该和的反码(被称为因特网检验和)存放在检验和字段中。路由器要对每个收到的IP数据报计算其首部检验和,如果数据报首部中携带的检验和与计算得到的检验和不一致,则检测出是个差错。路由器一般会丢弃检测出错误的数据报。注意到在每台路由器上必须重新计算检验和并再次存放到原处,因为TTL字段以及可能的选项字段会改变。此时,一个经常问到的问题是:为什么TCP/IP在运输层与网络层都执行差错检测?这种重复检测有几种原因。首先,注意到在IP层只对IP首部计算了检验和,而TCP/UDP检验和是对整个TCP/UDP报文段进行的。其次,TCP/UDP与IP不一定都必须属于同一个协议栈。原则上TCP能运行在一个不同的协议(如ATM)上,而IP能够携带不一定要传递给TCP/UDP的数据。
  • 源和目的IP地址: 当某源生成一个数据报时,它在源IP字段中插入它的P地址,在目的IP地址字段中插入其最终目的地的地址。通常源主机通过DNS查找来决定目的地址,如在第2章中讨论的那样。我们将在4.4.2节中详细讨论了IP编址。
  • 选项: 选项字段允许IP首部被扩展。首部选项意味着很少使用,因此决定对每个数据报首部不包括选项字段中的信息,这样能够节约开销。然而,选项的可能存在的确是件复杂的事,因为数据报头长度可变,故不能预先确定数据字段从何处开始。而且还因为有些数据报要求处理选项,而有些数据报则不要求,故导致一台路由器处理一个IP数据报所需的时间变化很大。这些考虑对于高性能路由器和主机上的P处理来说特别重要。由于这样或那样的原因,在IPv6首部中已去掉了P选项。
  • 数据(有效载荷): 我们来看看最后的也是最重要的字段,这是数据报存在的首要理由!在大多数情况下,IP数据报中的数据字段包含要交付给目的地的运输层报文段(TCP或 UDP)。然而,该数据字段也可承载其他类型的数据,如 ICMP报文

IP数据报分片

想象你是一台互联几条链路的路由器,且每条链路运行具有不同MTU(最大传送单元)的链路层协议。假定你从某条链路收到一个IP数据报,通过检查转发表确定出链路,并且该出链路的MTU比该IP数据报的长度要小。此时你会感到慌乱,如何将这个过大的IP分组压缩进链路层帧的有效载荷字段呢?解决该问题的方法是将IP数据报中的数据分片成两个或更多个较小的IP数据报,用单独的链路层帧封装这些较小的IP数据报;然后向输出链路上发送这些帧。每个这些较小的数据报都称为片。

但是!!!

在路由器中重新组装数据报会给协议带来相当大的复杂性并且影响路由器性能。(TCP等协议需要重新组装数据报)为坚持网络内核保持简单的原则,IPv4的设计者决定将数据报的重新组装工作放到端系统中,而不是放到网络路由器中。
IPv4 的设计者将标识、标志和片偏移字段放在P数据报首部中。当生成一个数据报时,发送主机在为该数据报设置源和目的地址的同时再贴上标识号。发送主机通常将为它发送的每个数据报的标识号加1。当某路由器需要对一个数据报分片时,形成的每个数据报(即片)具有初始数据报的源地址、目的地址与标识号。当目的地从同一发送主机收到一系列数据报时,它能够检查数据报的标识号以确定哪些数据报实际上是同一较大数据报的片。由于IP是一种不可靠的服务,一个或多个片可能永远到达不了目的地。因为这种原因,为了让目的主机绝对地相信它已收到了初始数据报的最后一个片,最后一个片的标志比特被设为0,而所有其他片的标志比特被设为1。另外,为了让目的主机确定是否丢失了一个片(且能按正确的顺序重新组装片),使用偏移字段指定该片应放在初始IP数据报的哪个位置。

IPv6废止分片原因

  1. 分片也是有开销的;
  2. 首先,它使路由器和端系统更为复杂;
  3. 其次,分片能够被用于生成致命的DoS攻击,攻击者向目标主机发送了小片的流,这些片中没有一个片的偏移量是0。当目标试图从这些不良分组中重建数据报时,可能会崩溃。

IPv6

由于新的子网和IP结点以惊人的增长率连到因特网上(并被分配唯一的P地址),32比特的IP地址空间即将用尽。为了应对这种对IP地址空间的需求,开发了一种新的IP协议,即 IPv6。IPv6的设计者们还利用这次机会,在IPv4积累的运行经验基础上加进和强化了IPv4的其他方面。
IPv6数据报格式 :

IPv6中引入的最重要的变化显示在其数据报格式中:

  • 扩大的地址容量。IPv6将IP地址长度从32比特增加到128比特。这就确保全世界将不会用尽IP地址。现在,地球上的每个沙砾都可以用IP地址寻址了。除了单播与多播地址以外,IPv6还引入了一种称为任播地址(anycast address)的新型地址,这种地址可以使数据报交付给一组主机中的任意一个。
  • 简化高效的40字节首部。许多IPv4字段已被舍弃或作为选项。因而所形成的40字节定长首部允许更快地处理IP数据报。
  • 流标签与优先级。IPv6有一个难以捉摸的流(flow)定义。该字段可用于“给属于特殊流的分组加上标签,这些特殊流是发送方要求进行特殊处理的流,如一种非默认服务质量或需要实时服务的流”。例如,音频与视频传输就可能被当作一个流。在另一方面,更为传统的应用(如文件传输和电子邮件,就不可能被当作流。由高优先级用户(如某些为使其流量得到更好服务而付费的用户)承载的流量也有可能被当作一个流。然而,IPv6的设计者们显然已预见到最终需要能够区分这些流。IPv6首部中还有一个8比特的流量类型字段,该字段就像IPv4中的TOS字段,可用于给出一个流中某些数据报的优先级,以便指明某些应用的数据报比其他应用的数据报有更高的优先权。

以下是在IPv6中定义的字段。

  • 版本。该4比特字段用于标识IP版本号。IPv6将该字段值设为6。
  • 流量类型。该8比特字段与我们在IPv4中看到的 TOS字段的含义相似。
  • 流标签。该20比特的字段用于标识一条数据报的流。
  • 有效载荷长度。该16比特值作为一个无符号整数,给出了IPv6数据报中跟在定长的40字节数据报首部后面的字节数量。
  • 下一个首部。该字段标识数据报中的内容需要交付给哪个协议(如TCP或UDP)。该字段使用与IPv4首部中协议字段相同的值。
  • 跳限制。转发数据报的每台路由器将对该字段的内容减1。如果跳限制计数到达0时,则该数据报将被丢弃。
  • 源地址和目的地址。
  • 数据。这是IPv6数据报的有效载荷部分。当数据报到达目的地时,该有效载荷就从IP数据报中移出,并交给在下一个首部字段中指定的协议处理。

在IPv4数据报中出现的几个字段在IPv6数据报中已不复存在:

  • 分片/重新组装。IPv6不允许在中间路由器上进行分片与重新组装。这种操作只能在源与目的地上执行。如果路由器收到的IPv6数据报因太大而不能转发到出链路上的话,则路由器只需丢掉该数据报,并向发送方发回一个“分组太大”的ICMP差错报文即可。于是发送方能够使用较小长度的IP数据报重发数据。分片与重新组装是一个耗时的操作,将该功能从路由器中删除并放到端系统中,大大加快了网络中的IP转发速度。
  • 首部检验和。因为因特网层中的运输层(如TCP与 UDP)和数据链路层协议执行了检验操作,IP设计者大概觉得在网络层中具有该项功能实属多余,可以将其去除。快速处理IP分组是重点。IPv4时,由于IPv4首部中包含有一个TTL字段,所以在每台路由器上都需要重新计算IPv4首部检验和。就像分片与重新组装一样,在IPv4中这也是一项耗时的操作。
  • 选项。选项字段不再是标准IP首部的一部分了。但它并没有消失,而是可能出现在IPv6首部中由“下一个首部”指出的位置上。这就是说,就像TCP或UDP协议首部能够是IP分组中的“下一个首部”,选项字段也能是“下一个首部”。删除选项字段使得IP首部成为定长的40字节。

有关边学习边记录IP协议的更多相关文章

  1. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  2. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  3. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  4. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  5. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  6. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  7. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  8. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

  9. ruby-on-rails - 在 Rails 中更高效地查找或创建多条记录 - 2

    我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr

  10. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

随机推荐