当前位置: 首页 > java >正文

【C++/Linux】TinyWebServer前置知识之IP协议详解

目录

IPv4地址

分类

IP数据报分片

IP 协议在传输数据报时,将数据报分为若干分片(小数据报)后进行传输,并在目的系统中进行重组,这一过程称为分片(Fragmentation)。

IP模块工作流程​编辑


IP(网际互连协议,Internet Protocol)是TCP/IP协议族中最为核心的协议。所有的 TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。

报文格式

版本:占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4),以后要使用IPv6(即版本6的IP协议)。

首部长度:占4位,可表示的0~15,单位是4B。因为IP首部的固定长度是20字节,因此首部长度字段的最小值是5(即二进制表示的首部长度是0101)。而当首部长度为最大值1111时(即十进制数的15),就表明首部长度达到最大值15个32位字长,即60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此IP数据报的数据部分永远在4字节的整数倍时开始。首部长度限制为60字节的缺点是有时可能不够用,但这样做是希望用户尽量减少开销。最常用的首部长度是20字节(即首部长度为0101),这时不使用任何选项。

区分服务:占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务DS(DifferentiatedServices)。只有在使用区分服务时,这个字段才起作用,在一般的情况下都不使用这个字段。

总长度:占16位,指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节。

标识(identification)占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。

标志(flag)占3位,但目前只有低两位有意义。标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。标志字段中间的一位记为DF(Don't Fragment),意思是“不能分片”。只有当DF=0时才允许分片。

片偏移占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,除了最后一个分片,长度一定是8字节(64位)的整数倍,最后一个分片可能是8字节(64位)的整数倍。

生存时间占8位,生存时间字段常用的英文缩写是TTL(Time To Live),表明这是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在互联网中兜圈子(例如从路由器R1转发到R2,再转发到R3,然后又转发到R1),因而白白消耗网络资源。最初的设计是以秒作为TTL值的单位。每经过一个路由器时,就把TTL减去数据报在路由器所消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把TTL值减1。当TTL值减为零时,就丢弃这个数据报。

协议占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个协议进行处理。至少记住TCP和UDP(腾讯安全工程师笔试题)。

IPv4地址

分类

IP地址表示如下:

IP地址::={<网络号>,<主机号>}

二进制对于人类来说很难记忆,所以我们将IP地址分为上面的4个部分,每个部分8位(0-255),使用.分隔,就是点分十进制。

A类IP地址 地址范围1.0.0.1-126.255.255.254(二进制表示为:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110)

B类IP地址地址范围128.1.0.1-191.254.255.254(二进制表示为:10000000 00000001 00000000 00000001 - 10111111 11111110 11111111 11111110)

C类IP地址范围192.0.1.1-223.255.254.254(二进制表示为: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111110 11111110)

D类IP地址范围224.0.0.1-239.255.255.254(二进制表示为:11100000 00000001 00000001 00000001 - 11101111 11111111 11111111 11111110)

A类是7位,应该是0-127呀,为什么是1-126呢?因为一些规定,有些ip作为了特殊ip,不能作为A类地址的网络。

除去特殊ip后

IP数据报分片

IP 协议在传输数据报时,将数据报分为若干分片(小数据报)后进行传输,并在目的系统中进行重组,这一过程称为分片(Fragmentation)。

MTU,物理网络一次传送的数据是有最大长度的,因此网络层的下层(数据链路层)的传输单元(数据帧)也有一个最大长度,这个最大长度值就是 MTU,每一种物理网络都会规定链路层数据帧的最大长度,比如以太网的 MTU 为 1500 字节。

IP 协议在传输数据报时,若IP数据报加上数据帧头部后长度大于 MTU,则将数据报切分成若干分片后再进行传输,并在目标系统中进行重组。IP 分片既可能在源端主机进行,也可能发生在中间的路由器处,因为不同网络的 MTU 是不一样的,而传输的整个过程可能会经过不同的物理网络。如果传输路径上的某个网络的 MTU 比源端网络的 MTU 要小,路由器就可能对 IP 数据报再次进行分片。分片数据的重组只会发生在目的端的 IP 层。

IP模块工作流程

从右往左分析:

先从网络驱动程序(网卡)中获取IP地址信息,将其放入到IP输入队列中。

对数据报的头部做CRC校验,判断数据报是否发生错误,确认无误,进行下一步操作。

检验是否接收端是本主机,如果目标IP地址是本网段中的某个IP地址,则将数据发送给具体主机,主机通过端口号确保发送给哪一个应用。如果不是则将该网段中的地址,进行数据报转发。

判断数据报是否允许转发,允许转发则转发,不允许则丢弃。

IP输出队列存放的是等待发送的IP数据报,除过要发送的IP地址外,还包括ICMP报文、TCP报文、UDP报文。

http://www.xdnf.cn/news/10509.html

相关文章:

  • 【iOS】YYModel源码解析
  • 告别printf!嵌入式系统高效日志记录方案
  • 如何评估 RAG 的分块Chunking策略
  • 【沉浸式求职学习day52】【初识Mybaits】
  • 风控研发大数据学习路线
  • Java生态中的NLP框架
  • 【C语言】C语言经典小游戏:贪吃蛇(上)
  • Vortex GPGPU的github流程跑通与功能模块波形探索(四)
  • 解决:install via Git URL失败的问题
  • 【LLM vs Agent】从语言模型到智能体,人工智能迈出的关键一步
  • Java中对象哈希值的解析
  • 力扣HOT100之多维动态规划:64. 最小路径和
  • Langchian - 自定义提示词模板 提取结构化的数据
  • bismark OT CTOT OB CTOB 以及mapping后的bam文件中的XG,XR列的含义
  • 用go从零构建写一个RPC(4)--gonet网络框架重构+聚集发包
  • 【知识点】第3章:基本数据类型
  • Linux之进程间通信
  • 600+纯CSS加载动画一键获取指南
  • NLP学习路线图(十九):GloVe
  • Windows不关防火墙,安全开放端口方法
  • 【图论 拓扑排序 贪心 临项交换】P5603 小 C 与桌游 题解|普及+
  • ubuntu 添加应用到启动菜单
  • Unity中应对高速运动的物体,碰撞组件失效的问题?
  • Android高级开发第四篇 - JNI性能优化技巧和高级调试方法
  • 小团队如何落地 Scrum 模型:从 0 到 1 的实战指南
  • Mysql水平分表(基于Mycat)及常用分片规则
  • 【黑马程序员uniapp】项目配置、请求函数封装
  • win32相关(虚拟内存和物理内存)
  • 模块二:C++核心能力进阶(5篇)篇二:《多线程编程:C++线程池与原子操作实战》(14万字深度指南)
  • PolyGen:一个用于 3D 网格的自回归生成模型 论文阅读