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

IP协议详解

目录

一. IP协议概述

1. 概念

2. 特点

(1) 无连接性

(2) 不可靠传输

(3) 数据包分片和重组

二. IP协议报文格式

1. 版本 (4位)

2. 首部长度 (4位)

3. 服务类型 (8位)

4. 总长度 (16位)

 5. 标识, 标志位, 片偏移

6. 生存时间 (8位)

7. 协议 (8位)

8. 首部检验和 (16位)

9. 源IP地址和目的IP地址 (32位)

10. 选项

11. 数据(正文)

三. IP地址相关问题

1. IP地址的含义

2. 特殊的IP地址

(1) 网络地址

(2) 广播地址

(3) 环回IP地址

3. IP地址不够用

(1) 动态分配IP地址

(2) NAT 网络地址转换

(3) 使用IPv6协议


一. IP协议概述

1. 概念

IP (Internet Protocol) 翻译为"互联网协议". 是一种网络层协议. 它定义了数据包在网络中的传输方式, 确保数据能够从源主机传送到目的主机. 

IP协议是一种无连接的协议. 它不保证数据包的顺序, 可靠性和重复性 (这些任务通常由 传输层协议(如TCP) 来处理)

2. 特点

(1) 无连接性

IP协议是一种无连接的协议, 用IP协议传输数据不需要建立和维护连接状态.

(2) 不可靠传输

IP协议不保证数据包的可靠传输, 它不提供错误检测和恢复机制. 数据包可能会丢失, 重复或顺序错乱. 这些问题需要上层协议(如TCP)来处理.

(3) 数据包分片和重组

IP协议支持数据包的分片和重组. 如果一个数据包太大而无法通过某个网络传输, 它可以在源主机被分片, 然后在目的主机被重新组装. (重新组包的过程需要用到标识, 标志位和片偏移).

二. IP协议报文格式

1. 版本 (4位)

4位字段. 这个字段只有两个取值: 4和6, 分别代表 IPv4 和 IPv6.

2. 首部长度 (4位)

4位字段. 由于IP协议的报头是变长的, 所以也需要一个空间来存放IP协议报头的长度. 4位表示的范围是 0-15, 而这里长度的单位是4字节. 所以这个字段可以表示的长度范围是 0-60字节.

3. 服务类型 (8位)

8位字段. "Type Of Service", 用于指示数据包的处理优先级所需的服务.

一共8位: 3位优先权, 4位TOS字段, 1位保留字段(必须置为0, 以便未来使用).

4位TOS字段分别是: 延迟 (设置为1表示数据报需要低延迟), 吞吐量 (设置为1表示数据包需要高吞吐量), 可靠性 (设置为1表示数据包需要高可靠性), 成本 (设置为1表示数据包需要低成本).

4. 总长度 (16位)

16位字段. 表示整个IP数据包的长度, 包括头部和数据部分. 以字节为单位, 最大值为65535字节。

 5. 标识, 标志位, 片偏移

标识16位, 标志位3位, 片偏移13位.

IP协议在数据传输过程中, 会将同一个载荷中的拆成多个IP数据报进行传输. 标识就是用来标记他们是同一载荷上的数据 (同一载荷上的数据 标识相同).

片偏移决定组包时各个数据包的位置.

标志位, 3位, 其中一个是保留位; 另外两个 一个表示当前包是否需要组包(是否是拆包的一部分), 另一个表示当前包是否是组包中的最后一个单位.

6. 生存时间 (8位)

8位字段. "Time To Live" , 用于表示数据包在网络中的最大生存时间.

每发送一个IP数据报, 就会有一个TTL的初始值(32, 64, 128 ...), 每经过一个路由器, TTL的值就-1, 当TTL的值减为0时, 这个数据包就会被当前的路由器丢掉.

这个机制保证了错误的/没用的IP数据报不会一直存在, 消耗网络资源.

7. 协议 (8位)

8位字段. 通过存放不同的值来指示数据包携带的数据是使用哪种传输层协议 (例如TCP, UDP, ICMP等).

8. 首部检验和 (16位)

用于检验数据在传输过程中是否出错. (只检测IP报头).

9. 源IP地址和目的IP地址 (32位)

源IP地址32位, 目的IP地址32位. 用于指示发送数据包的源主机地址接收数据包的目的主机地址.

[注]: IP地址是一个32位整数, 如此长的一个数据不方便人们阅读. 于是我们为了方便阅读, 发明了"点分十进制": 把 32位(4字节) 分成4个部分, 每个部分1个字节. 而一个字节正好可以用0-255表示.

形如: "192.168.100.151" 这样的IP地址, 就是用点分十进制表示出来的.

10. 选项

可变长度字段. "Options". 用于提供额外的控制功能. 这个字段是可选的, 并不是所有的IP数据包都包含选项字段.

11. 数据(正文)

可变长度, 包含上层协议 (如TCP或UDP) 的数据.

三. IP地址相关问题

1. IP地址的含义

IP地址(32位整数), 4个字节. 如果用"点分十进制"方式表示, 有4个部分. 我们可以将其划分为左右两半边: 左半边是网络号, 右半边是主机号. 例如: 192.168.100.131 中, "192.168"就是网络号, "100.131"就是主机号.

规定: 同一局域网中的设备, 网络号必须相同, 主机号必须不同. 相邻局域网中的设备, 网络号必须不同.

2. 特殊的IP地址

(1) 网络地址

主机号全为0时, IP地址表示"网络地址".

当IP地址的主机号部分全为0时, 这个地址通常表示当前网络的网络地址. 网络地址用于标识整个子网, 不能分配给任何主机作为其IP地址.

[注]: 我们在给任何设备分配IP地址时, 主机号都不能设为全0.

(2) 广播地址

主机号全为1时, IP地址表示"广播地址".

广播地址用于向子网内的所有主机发送广播消息. 往广播地址发送一个数据包, 就相当于给整个局域网中的所有设备都发了一个数据包.

(3) 环回IP地址

主机号为 "127.* " 时, IP地址表示"环回IP"(loopback).

给这个IP发送一个数据, 设备就会从这个IP上再收到同一个数据. (相当于自己发给自己).

环回IP一般用来测试~

3. IP地址不够用

我们知道, IP地址是一个32位整数. 32位能够表示的最大整数是42亿9千万, 也就是说, 如果一台主机有一个IP地址的话, 32位的IP地址, 最多能够表示42亿9千万个设备.那这样的数字放到互联网极其发达的今天显然是不够用的. 于是我们就要想办法去解决这个问题:

(1) 动态分配IP地址

一台主机有一个静态的IP地址不可行. 那么我们就动态分配IP地址, 只在某设备上网时才给它分配IP地址, 不上网则不分配. 这种分配方式通常用于大型网络或公共网络.

(2) NAT 网络地址转换

该机制将IP地址分为两大类: 内网IP和外网IP (或者叫 私网IP和公网IP). 要求公网IP必须是唯一的, 而私网IP在不同局域网中是可以重复的. 下面我们就来介绍一下NAT机制的具体内容:
[1] 在同一局域网内, 设备A访问设备B, 这种情况不会涉及到NAT.

[2] 公网上的设备A访问公网上的设备B, 这种情况也不会涉及到NAT.

[3] 一个局域网中的设备A访问另一个局域网中的设备B, 这种情况在NAT中是不允许的.

[4] 一个局域网内部的设备A, 访问公网上的设备B, NAT主要就是针对这种情况发挥作用.

例如:

我的设备A(私网IP地址: 192.168.131) 要访问公网设备B(公网IP地址: 5.6.7.8). 那么此时我的设备A是不能直接访问设备B的, 而是需要先进行一次IP地址转换. 设备A的IP地址先通过运营商路由器A1(公网IP地址: 1.2.3.4) 进行一次IP地址转换, 把设备A的私网IP换成A1的公网IP1.2.3.4 之后再进行通信.

如果某局域网内的两个设备同时要访问一个公网设备, 那么这两个设备经过NAT网络地址转换之后的公网IP是一样的, 那怎么区分这两个设备呢? --> 通过端口号. 经过NAT之后, 两个设备的公网IP确实是一样的, 但是请求访问公网设备B的应用程序的端口号一般是不同的. 所以这时候就可通过端口号来区分不同的设备.

NAT网络地址转换是当前我们解决IP地址不够用问题的主要方法.

(3) 使用IPv6协议

IPv6协议 使用128位(16字节)表示IP地址, 16字节能表示的范围非常非常大(我们可以近似看做无穷大).

   好了, 本篇文章就介绍到这里啦, 大家如果有疑问欢迎评论, 如果喜欢小编的文章, 记得点赞收藏~~


http://www.kler.cn/a/443580.html

相关文章:

  • 怎么把多个PDF合并到一起-免费实用PDF编辑处理工具分享
  • Substrate Saturday 回顾:如何利用 Polkadot Cloud 扩展 Solana 网络服务?
  • Vscode + gdbserver远程调试开发板指南:
  • 商品线上个性定制,并实时预览3D定制效果,是如何实现的?
  • 开发微信小程序的过程与心得
  • c/c++ 无法跳转定义
  • 八大网络安全策略:如何防范物联网(IoT)设备带来的安全风险
  • 开发功能需求文档: Django 管理后台图片字段管理
  • 统一身份安全管理体系的业务协同能力
  • Jackson 的@JsonAnyGetter注解
  • Shell自定义(二)
  • 基于单片机的智能电子秤(论文+源码)
  • 芯片级IO (Pad) Ring IP Checklist
  • C语言中的内存管理:理解指针、动态内存分配与内存泄漏
  • QT/C++与LUA交互过程中,利用ZeroBraneStudio对LUA脚本进行仿真调试
  • GUI07-学工具栏,懂MVC
  • Fgui世界坐标转ui坐标的问题
  • 大模型与呼叫中心结合的呼出机器人系统
  • c#委托delegate学习
  • CSS padding(填充)
  • 【双指针】算法题(一)
  • JavaSE(基础篇-进阶篇day03)
  • docker 使用 xz save 镜像
  • 如何构建一个可信的联邦RAG系统。
  • 如何在centos系统上挂载U盘
  • 回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测