IP报文结构

news/2024/10/31 1:13:46/

文章目录

    • IP报文结构
      • 分片

IP报文结构

在这里插入图片描述

  • 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4.

  • 4位头部长度(header length): 类似于TCP4位首部长度,通常填的是0101(十进制5)

  • 16位总长度(total length): IP数据报整体占多少个字节.这用于报文和有效载荷的分离,向上交付,解决粘包问题。

  • 8位协议: 表示上层协议的类型。这用于决定向上交付的时候自己的有效载荷应该交付给谁(TCP/UDP),这是由上层协议填的,自然也就传送给对等的协议。


分片

  • 以下部分有关IP报文分片

首先,IP分片不是大多数情况,只有在某些条件下会进行分片。

  • 那为什么会分片呢?

数据链路层一次可以往网络里发送的数据大小是有限制的:

MTU = 1500byte

如果报文太大的话,就要解决如何传输的问题。

这里就会用到IP分片,并且分片后的每个IP报文都需要带有相同的报头(相当于寄大件快递时,可能会拆分成几个快递,都需要添加相同的目的地址)

  • 分片成功了,还需要考虑组装的问题

对于传输层来说,它只需要做出决策就行了,不会管下层的网络层如何做到。

所以分片和组装都是在网络层IP解决的。每个层次有每个层次不同的任务,这个部分就是网络层负责。

而组装的过程,就是根据13位片偏移进行升序排序即可。

  • 分片的风险

由于分成了多个包,那么丢包的概率自然也会上升。如果丢了其中一个包,整个组装的包都会丢掉,由传输层进行重传。

所以并不建议分片,会增加丢包风险,这也是为什么前面说分片不是大部分情况。

  • 既然分片有风险,如果不想分片,是由谁决定?

很明显这是由传输层说了算,因为发多少、怎么发都是由传输层决定的,既然一次IP报文最大是一个MTU,那传输层一次不传超过MTU的数据,不就可以降低分片的概率了吗?

总的来说,传输层和网络层的分工就很明显了:决策VS执行。

介绍完分片,以下的字段就很好理解了:

  • 16位标识(id): 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的所以这个字段的功能是把标识相同的报文聚在一起。

  • 13位分片偏移(framegament offset): 标识本报文的有效载荷,在原始报文有效载荷中的偏移量。所以这个字段的功能是把所有标识一样的报文组合在一起
    这个字段还可以甄别是否丢包的情况,因为如果没有丢包,本报文的偏移量加上上一个报文偏移量肯定是下一个报文的偏移量,如果不符合肯定就是丢包了。但是也会怕最后一个报文丢包,因为无法得知偏移量是否匹配。但是不是有16位报文长度吗?按照这个长度不就可以得知总长度是否符合吗?这是错的,因为这个16位总长度代表的仅仅是本报文的长度,和整个组装后的报文长度是不一样的。但是,接下来的3位标志字段可以解决这个问题。

  • 3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文,十分强硬。 第三位表示"更多报文", 如果置1了,代表后面还有更多分片,反之则没有。所以可以用来解决上述的 “最后一个报文是否收到” 的问题。
    有了最后一个标志位,即可表示所有分片报文是否收全。

  • 接收数据的一方,如何得知收到的报文是分片的一方还是独立的一方?

可以根据13位片偏移得知:如果为0,就是未分片;如果不为0,就是分片。

那如果分片了,并且是第一个分片呢?偏移量不也为0?

可以根据3位标志:如果符合第一个分片,那后续必定会有其他分片,所以该字段的最后一位必定为1。


  • 32位源地址和32位目标地址: 表示发送端和接收端.
  • 8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
  • 16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏.

http://www.ppmy.cn/news/62968.html

相关文章

2分钟搞懂人工智能、机器学习和深度学习

不少高校的小伙伴找我聊入门人工智能该怎么起步,如何快速入门,多长时间能成长为中高级工程师(聊下来感觉大多数学生党就是焦虑,毕业即失业,尤其现在就业环境这么差),但聊到最后,很多…

NtfsStreamsEditor下载使用

NtfsStreamsEditor 是一款免费的 NTFS 流编辑器,它可以帮助用户查看和编辑 NTFS 文件系统中的备用数据流。备用数据流是一种特殊的 NTFS 文件数据结构,允许用户在单个文件中存储多个数据流。 使用 NtfsStreamsEditor,用户可以浏览、创建、编…

每天一道算法练习题--Day21 第一章 --算法专题 --- ----------位运算

我这里总结了几道位运算的题目分享给大家,分别是 136 和 137, 260 和 645, 总共加起来四道题。 四道题全部都是位运算的套路,如果你想练习位运算的话,不要错过哦~~ 前菜 开始之前我们先了解下…

【Nginx基础篇】Linux虚拟机安装nginx

目录 一、版本区别 二、编译安装 三、启动nginx 关于防火墙 四、安装成系统服务 一、版本区别 常用版本分为四大阵营 Nginx开源版 http://nginx.org/ Nginx plus 商业版 https://www.nginx.com openresty http://openresty.org/cn/ Tengine http://tengine.taobao.org/ …

ModelViewSet额外路由参数 与 ADMIN事件触发

ModelViewSet额外路由参数 用了DefaultRouter,那么在URL匹配时带路径参数,只有update、delete、retrieve能带,关键是匹配pk还是写死的,我们需要对任意参数,同时还能修改方法命名。 咋搞?很简单。比如我们…

音频焦点使用及原理

音频焦点使用及原理 本博客代码基于Android 10源码 为什么会有音频焦点这一概念? 在Android音频领域中,应用层所有的App播放音频,最终都是走到音频回播线程PlaybackThread中,如果多个App都走到同一个PlaybackThread中去&#xff0…

为文本检测和识别在OCR应用中的突破

OCR场景文本识别:文字检测文字识别 随着数字化时代的到来,文字识别技术得到了广泛的应用。OCR(Optical Character Recognition,光学字符识别)是一种技术,通过图像处理和计算机视觉来识别印刷或手写文字。在…

[JAVA EE ]创建Servlet——继承HttpServlet类笔记3

Response 一、响应行 组成:协议/版本 响应状态码 状态码描述响应状态码:服务器告诉客户端浏览器本次请求响应的一个状态,都是三位数 1xx:服务器接收客户端消息,但是没有接收完成,等待一段时间后&#xff…