Linux(12)(上)

一.IP知识引入

引入:

  • IP协议的本质工作是:提供一种能力,将数据跨网络从主机A送到主机B
  • 但用户真正需要的是:提供一种能力,将数据可靠地跨网络从主机A送到主机B 。而IP协议只负责尽力而为地传输不保证可靠性、不保证顺序、也不保证不重复

而我们之前学习 TCP 时所说的"C → S"通信,其实是逻辑上的端到端视角而真实传送数据的时候是从上往下封装 ,然后发送给对方,然后对方再从下往上解包! 讲这个的主要原因就是说网络层它是封装应用层、传输层处理的内容因为有了传输层TCP的帮助才能实现将数据可靠地跨网络从主机A送到主机B

前置知识:

  • **IP种类:**私有IP,公网IP

  • IP组成:目标网络 + 目标主机(因此所有计算机就要有IP地址)

二.IP相关知识

2.1 IP格式

基础知识讲解:

  • 4位版本号(version): 指定IP协议的版本, 对于IPv4来说,,就是4。
  • **4位首部长度:**和TCP那个一样的概念
  • 8位服务类型: 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0)。4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本.。这四者相互冲突, 只能选择一个,如今多基于 DSCP 做 QoS 策略
  • 16位总长度: IP数据包整体占多少个字节(包括报头和数据)
  • 8位生存时间(TTL): 数据报到达目的地的最大报文跳数.。一般是64,每次经过一个路由, TTL -= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环。
  • 8位协议: 表示上层协议的类型
  • 16位头部校验和: 使用**Internet Checksum(网际校验和)**进行校验, 来鉴别头部是否损坏.
  • 32位源地址和32位目标地址: 表示发送端和接收端。

重要问题:

  1. **报头和有效载荷如何分离:**固定长度(20)+ 自描述字段(16位总长度)

  2. **如何将有效载荷交付给上层:**8位协议

编写socket需要IP+端口,其中端口是给传输层,而IP是给网络层

2.2 网络划分

1.引入:

IP地址分为两个部分, 网络号和主机号

  • 网络号: 保证相互连接的两个网段具有不同的标识

  • 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号

要点:

  1. 路由器本质也是一个子网的设备,所有需要网络通信的设备其实都要ip地址(路由器可以配置多个IP,且需要配置2个以上的ip地址)

  2. 路由器一定至少要连接2个子网,路由器也就相当于同时在两个子网。

  3. 路由器一般是子网中的第一台设备,一般他的IP地址都是:网络号.1

  4. **路由器功能:**ip报文的转发,连接存在的子网(局域网)

2.网络划分:

  • A类 0.0.0.0到127.255.255.255

  • B类 128.0.0.0到191.255.255.255

  • C类 192.0.0.0到223.255.255.255

  • D类 224.0.0.0到239.255.255.255

  • E类 240.0.0.0到247.255.255.255

随着Internet的飞速发展,这种划分方案的局限性很快显现出来

  • 例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多。

  • 然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了。

3.CIDR:

  • CIDR (无类别域间路由,Classless Inter-Domain Routing)
    采用 "IP地址/前缀长度" 的表示法(如 192.168.1.0/24),允许网络前缀长度任意指定 ,从而彻底摆脱了传统的 A/B/C 类地址的固定划分限制

  • 子网掩码也是一个32位的正整数

  • 将IP地址和子网掩码进行 "按位与" 操作,得到的结果就是网络号

  • 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关

4.特殊IP地址

  • 将 IP 地址中主机部分的所有位设为 0 ,得到的地址称为 网络地址 (或网络号),用于标识一个子网本身

  • 将 IP 地址中主机部分的所有位设为 1 ,得到的地址称为 受限广播地址 ,用于向该子网内的所有主机发送数据包。

  • 整个 127.0.0.0/8 地址块 (即 127.0.0.0127.255.255.255) 都保留用于本机环回测试

2.3 私有IP地址和公网IP地址

1.私有IP地址介绍

  • 10.0.0.010.255.255.255

  • 172.16.0.0 ~ 172.31.255.255

  • 192.168.0.0 ~ 192.168.255.255

  • 其余IP皆为公网IP

2.对运营商的了解

  • 用户通过互联网服务提供商 (ISP,即"运营商")接入 Internet。在光纤宽带等常见家庭接入场景中,光猫 (ONT,一种专用调制解调器)负责将光纤中的光信号转换为标准的以太网数字信号 ;随后,路由器接收该数字信号,完成内网 IP 分配、NAT 转换和路由转发,使多台设备共享上网。

3.路由器的两类账号密码

  • Wi-Fi 名称与 Wi-Fi密码

    用于家庭无线设备连接,与运营商无关,可自行设置。

  • 运营商认证凭证

    通常是 PPPoE 账号/密码(由运营商提供,印在工单或路由器背面);用于向 ISP 证明"你是合法用户",完成身份认证后才能获得公网 IP 并上网;是你办理宽带时分配的唯一账户。

4.访问数据的场景讲解

  • 一个路由器至少配置两个IP地址分别是: WAN口IP,LAN口IP(子网IP)。

  • 路由器LAN口连接的主机, 都属于当前这个路由器的子网。

  • 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1);子网内的IP地址不能重复。但是不同子网的IP地址可以重复了

  • 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点;这样运营商路由器可能会有很多级,最外层的运营商路由器,WAN口IP一定是一个公网IP了。

  • 子网主机访问外网时,家用路由器先做 NAT,将源 IP(如 192.168.1.100)替换为 WAN 口 IP。

若 WAN 口是公网 IP,则直接进入运营商网络;

若 WAN 口不是公网IP,运营商边缘设备会再次 NAT ,将其映射为公网 IP。 原始私有 IP(192.168.x.x)不会离开家庭网络。

  • 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上。

  • 我们上网时,报文通过运营商网络转发至目标服务器。如果访问外网被阻断,通常是因为运营商根据国家监管要求或自身策略,对特定流量实施了过滤或路由限制(这就是所谓的墙)

2.4 路由

路由引入:

  • 在复杂的网络结构中, 找出一条通往终点的路线!

  • 路由的过程,就是这样一跳一跳(Hop by Hop)"问路"的过程。所谓"一跳",指的是网络层中从一个路由器到下一个路由器(或最终主机)。

  • 在以太网中,每一跳的数据传输由数据链路层负责,通过源 MAC 地址与目的 MAC 地址完成帧的交付。

IP数据包的传输过程也和问路一样:

  1. 当IP数据包到达路由器时,路由器会先查看其目的IP地址

  2. 路由器根据自身的路由表 判断: 如果目的IP属于本地直连子网 ,则直接通过ARP获取目标主机的MAC地址,并将数据帧发给它;否则,将数据包转发给下一跳路由器(即路由表中指定的下一跳网关);

  3. 此过程在每一跳重复进行,直到数据包最终抵达目标主机所在的网络并被交付。

  4. 路由表中通常包含一条 缺省路由0.0.0.0/0),当目的地址与所有其他路由条目都不匹配时,就使用缺省路由将数据包发往默认网关 ------即与本机处于同一子网的三层设备(如家用路由器、三层交换机)。

要点:

  • 实际上,在一台主机中,IP 层并不会直接把报文"发出去",而是将 IP 数据包交给下一层------数据链路层。

  • 而数据链路层受限于物理介质和网卡硬件,无法传输任意大的帧 ,因此定义了最大传输单元(MTU,如以太网默认为 1500 字节)。

  • 这就要求上层(IP 层)不能交付超过 MTU 的数据包;若上层协议(如 TCP)试图发送过大的数据,IP 层会进行分片(或由 TCP 自行控制段大小,避免分片)。

  • 所以,TCP 滑动窗口虽然可以累积大量数据,但实际发送时仍需按 MSS (Maximum Segment Size),而 MSS 正是由 MTU 减去 IP 和 TCP 首部长度决定的------根源正是数据链路层的硬件限制 (如网卡和以太网标准)。

2.5 IP报头剩余介绍

  • **16位标识(id):**唯一的标识主机发送的报文. 如果IP报文在网络层层被分片了, 那么每一个片里面的这个id都是相同的

  • 3位标志字段: 保留处理中间(DF)为1表示禁止分片(0是允许分片) ,这时候如果报文长度超过MTU,IP模块就会丢弃报文。后(MF)表示"更多分片", 如果分片了的话,最后一个分片置为0, 其他是1。类似于一个结束标记

  • **13位分片偏移:**是相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的,因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)

原始 IP 报文:20B 首部 + 3000B 数据

→ 分片1:20B 首部 + 1480B 数据(偏移=0,MF=1)

→ 分片2:20B 首部 + 1480B 数据(偏移=185 → 1480/8=185,MF=1)

→ 分片3:20B 首部 + 40B 数据(偏移=370 → 2960/8=370,MF=0)

分片的相关知识:

  1. 如何组装: 接收端根据 源IP、目的IP、协议号、ID 四元组识别属于同一原始报文的所有分片,按 分片偏移 从依次拼接数据部分,直到收到 MF = 0 的最后一个分片,完成重组。
  2. 为什么分片: 因为数据链路层有 MTU 限制(如以太网默认 MTU = 1500 字节),因此如果超过该1500字节,那么就需要分片。
  3. **怎么知道一个IP是否分片:**存在分片的偏移量!= 0 || 存在分片的标志字段的MF == 1
  4. 丢失分片会怎么样已经我怎么知道是否丢失分片:

**丢开头:**那么你组装的时候就会发现没有偏移量为0的

**丢中间:**那么你会发现组装的时候会发现空一块(185 直接到 555 少了一个370)

**丢尾巴:**那么你会发现MF都为1,可是最后一个MF要是0

用图片来理解分片

重点:

  1. **分片后,只有第一个分片才会携带传输层及以上的报头,**而其他的只会携带网络层报头
  2. **分片的坏处:**当IP中有任何一个分片丢失,就要全部丢弃,因此不建议分片;因此是建议让TCP自己处理大小问题,这才有了我们之前在分析TCP滑动窗口的时候看到里面是有分段的,其中段是怎么分出来的就是根据MSS

今天的知识就到这里了,下一期将带来数据链路层的相关知识,本章知识都是理论部分,需要大家多多理解,最后是看完这篇继续看下篇,谢谢大家了!

相关推荐
步步为营DotNet3 小时前
深度剖析.NET中IHostedService:后台服务管理的关键组件
服务器·网络·.net
LUCIFER4 小时前
[驱动进阶——MIPI摄像头驱动(五)]rk3588+OV13855摄像头驱动加载过程详细解析第四部分——ISP驱动
linux·驱动开发
Ares-Wang4 小时前
网络》》路由引入 、路由控制 》》路由策略 route-policy 、Filter-Policy(过滤策略)
网络·智能路由器
暮云星影4 小时前
四、linux系统 应用开发:UI开发环境配置概述 (一)
linux·ui·arm
Jia ming5 小时前
虚拟地址与物理地址:64位VS48位
网络
a程序小傲5 小时前
得物Java面试被问:RocketMQ的消息轨迹追踪实现
java·linux·spring·面试·职场和发展·rocketmq·java-rocketmq
Ghost Face...5 小时前
i386 CPU页式存储管理深度解析
java·linux·服务器
LEEE@FPGA5 小时前
zynq 是不是有了设备树,再linux中不需要编写驱动也能控制
linux·运维·单片机
RisunJan5 小时前
Linux命令-less(分页查看器)
linux·运维
梁正雄5 小时前
linux服务-MariaDB 10.6 Galera Cluster+garbd
linux·运维·mariadb