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

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

相关推荐
A小辣椒8 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒12 小时前
TShark:基础知识
linux
AlfredZhao14 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
网络研究院2 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展