【网络】网络层IP协议

文章目录

  • [1. IP协议](#1. IP协议)
  • [2. 网段划分(重点)](#2. 网段划分(重点))
    • [2.1 基本共识](#2.1 基本共识)
    • [2.2 子网掩码](#2.2 子网掩码)
    • [2.3 私有 IP 和公网 IP](#2.3 私有 IP 和公网 IP)
    • [2.4 路由器](#2.4 路由器)
  • [3. 路由](#3. 路由)
  • [4. IP报文分片问题](#4. IP报文分片问题)


在应用层和传输层,我们已经解决了应用程序之间的通信问题,以及端到端的可靠通信问题。
("端"可以是应用程序的实例、进程,或者是用户设备中的某个服务,端到端的通信依赖于主机到主机的传输能力)

那在广阔的网络环境中,主机与主机又是怎么通信的呢?

网络层就是来解决该问题的

通信双方的主机并没有直连,它们是先交给路由器,由路由器再做"局域网"的通信问题。

重谈TCP/IP

  • IP协议的核心作用:把数据包从一主机,跨网络转发到目标主机(不关心丢包,它也不知道是否丢了)
  • TCP + IP两协议的核心作用:将数据可靠的从A主机发送到B主机。 此时就解决了两通信主机距离变长的核心问题了,

1. IP协议

  • 主机:配有 IP 地址,但是不进行路由控制的设备;
  • 路由器:既配有 IP 地址,又能进行路由控制;
  • 节点:主机和路由器的统称
  • 4位版本:IPV4/IPV6
  • 4位首部长度,4位范围是[0,15],基本单位是4字节,那也就是[0,60],由于报头占20字节,所以也就是[20,60],支持40个字节的选项。(如果没有选项,4位首部长度默认为5)
  • 8位服务类型 :即数据报转发的策略。
    • 3 位优先权字段(已经弃用),4 位 TOS 字段,和1 位保留字段(必须置为 0)。
    • 4 位 TOS 分别表示:最小延时、最大吞吐量、最高可靠性、最小成本。这四者相互冲突,只能选择一个。对于 ssh/telnet 这样的应用程序,最小延时比较重要;对于 ftp 这样的程序,最大吞吐量比较重要
  • 16位总长度:即该数据报的总长度,最小值为20字节(仅包含最小的20字节IP报头)
  • 32位源IP/32位目的IP:表示发送端和接收端
  • 8 位生存时间 (Time To Live,TTL): 数据报到达目的地的最大报文跳数; 一般是64. 每次经过一个路由, TTL -= 1,一直减到 0 还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
  • 8 位协议:表示上层协议的类型(TCP/UDP)
  • 16 位头部校验和:使用 CRC 进行校验, 来鉴别头部是否损坏

后面介绍

  • 16 位标识
  • 3 位标志字段
  • 13 位分片偏移

2. 网段划分(重点)

2.1 基本共识

为什么要进行网段划分呢?

因为只有源IP地址、目的IP地址是不够的。网络通信的路线应该被设计!(被运营商设计)

IP地址 = 网络号 + 主机号

  • 网络号: 保证相互连接的两个网段具有不同的标识;
  • 主机号: 同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号

网络划分的意义在于:先根据目标网络号淘汰非目标网络,到达目标网络后,再根据目标主机号进行内网转发,提高整体的查找转发效率了

  • 不同的子网其实就是把网络号相同的主机放到一起.
  • 如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复
  • 由于路由器属于两个子网,所以它一定要有两个IP地址。

通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的 IP 地址都不相同.

那么问题来了,手动管理子网内的 IP,是一个相当麻烦的事情

  • 有一种技术叫做 DHCP,能够自动的给子网内新增主机节点分配 IP 地址,避免了手动管理 IP 的不便
  • 一般的路由器都带有 DHCP 功能,因此路由器也可以看做一个 DHCP 服务器。子网中主机的IP地址,都是路由器给的,它具有构建子网的能力。

那网络具体是怎么划分的呢?

过去曾经提出一种划分网络号和主机号的方案,把所有 IP 地址分为五类,如下图所示:

  • 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

2.2 子网掩码

随着 Internet 的飞速发展,上方划分方案的局限性很快显现出来,大多数组织都申请 B 类网络地址,导致 B 类地址很快就分配完了,而 A 类却浪费了大量地址;

  • 例如, 申请了一个 B 类地址,理论上一个子网内能允许 65535 千多个主机,A 类地址的子网内的主机数更多。然而实际网络架设中,不会存在一个子网内有这么多的情况,因此大量的 IP 地址都被浪费掉了

针对这种情况提出了新的划分方案, 称为 CIDR(Classless Interdomain Routing):

引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;

  • 子网掩码也是一个 32 位的正整数,通常用一串 "0" 来结尾;
  • 将 IP 地址和子网掩码进行 "按位与" 操作,得到的结果就是网络号;
  • 网络号和主机号的划分与这个 IP 地址是 A 类、 B 类还是 C 类无关;

可见,IP 地址与子网掩码做与运算可以得到网络号,主机号从全 0 到全 1 就是子网的地址范围;

IP 地址和子网掩码还有一种更简洁的表示方法,例如 140.252.20.68/24,表示 IP 地址为140.252.20.68,子网掩码的高 24 位是 1,也就是 255.255.255.0

特殊的 IP 地址

  • 将 IP 地址中的主机地址全部设为 0, 就成为了网络号, 代表这个局域网;
  • 将 IP 地址中的主机地址全部设为 1 , 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
  • 127.*的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1

我们知道,IP 地址(IPv4)是一个 4 字节 32 位的正整数,那么一共只有 2 ^32^ 个 IP地址,大概是 43 亿左右。而 TCP/IP 协议规定,每个主机都需要有一个 IP 地址,这意味着, 一共只有 43 亿台主机能接入网络么?

实际上,由于一些特殊的 IP 地址的存在,数量远不足43 亿;另外 IP 地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个 IP 地址。

CIDR 在一定程度上缓解了 IP 地址不够用的问题(提高了利用率,减少了浪费,但是 IP地址的绝对上限并没有增加),仍然不是很够用. 这时候有三种方式来解决:

  • 动态分配 IP 地址: 只给接入网络的设备分配 IP 地址. 因此同一个 MAC 地址的设备, 每次接入互联网中, 得到的 IP地址不一定是相同的;
  • NAT 技术(重点):通过地址转换机制,使得使用私有IP地址的内部网络能够安全地访问外部网络,并解决IP地址不足的问题(即允许不同的子网中有相同的私有IP地址)
  • IPv6: IPv6 并不是 IPv4 的简单升级版.这是互不相干的两个协议, 彼此并不兼容; IPv6 用 16 字节 128 位来表示一个 IP 地址; 但是目前 IPv6 还没有普及;

2.3 私有 IP 和公网 IP

如果一个组织内部组建局域网,IP 地址只用于局域网内的通信,而不直接连到 Internet 上,理论上使用任意的 IP 地址都可以,但是 RFC 1918规定了用于组建局域网的私有 IP 地址

  • 10.*,前 8 位是网络号,共 16,777,216 个地址
  • 172.16.*172.31. *,前 12 位是网络号,共 1,048,576 个地址
  • 192.168.*,前 16 位是网络号,共 65,536 个地址

包含在这个范围中的,都成为私有 IP,其余的则称为全局 IP(或公网 IP); 私有IP不能出现在公网上,公网IP不能重复!

2.4 路由器

一个路由器可以配置两个 IP 地址, 一个是 WAN口 IP, 一个是 LAN口 IP(子网IP).

  • 路由器LAN 口连接的主机,都从属于当前这个路由器的子网中.
  • 不同的路由器,子网 IP 其实都是一样的(通常都是 192.168.1.1)。子网内的主机IP 地址不能重复,但是子网之间的 IP 地址就可以重复了.
  • 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点。这样的运营商路由器可能会有很多级,最外层的运营商路由器, WAN 口 IP 就是一个公网 IP 了

那IP数据包具体是怎么转发的呢?

子网内的主机需要和外网进行通信时,路由器将 IP 首部中的 IP 地址进行替换(替换成 WAN 口 IP),这样逐级替换,最终数据包中的 IP 地址成为一个公网 IP,这种技术称为 NAT(Network Address Translation)网络地址转换)。

从公网又是怎么转发到内网上的呢? - - 后面介绍

3. 路由

路由的本质:就是在复杂的网络结构中,找出一条通往终点的路线

由于目标IP = 目标网络 + 目标主机,那路由的时候,就只关心目标网络(即路由的基本单位是目标网络)

路由的过程,就是这样一跳一跳 "问路" 的过程,所谓的一跳就是从一个子网跳转到另一个子网。

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

  • 当 IP 数据包,到达路由器时,路由器会先查看目的 IP;
  • 路由器决定这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器
    (路由器一定会尽可能的帮我进行路由,因为报文千里迢迢到这里不容易,所以一般会配置默认路由,谁有外部网络的通信能力,一般会被配置为缺省路由);
  • 依次反复,一直到达目标 IP 地址;

那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表;

路由表可以使用 route 命令查看

  • 如果目的 IP 命中了路由表,就直接转发即可;
  • 当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。

假设某主机上的网络接口配置和路由表如下:

这台主机有两个网络接口,一个网络接口连到 192.168.10.0/24 网络,另一个网络接口连到 192.168.56.0/24 网络;

在路由表中,各项的含义如下:

  • Destination:表示数据包需要到达的目标网络的地址
  • Genmask:子网掩码
  • Gateway:是下一跳地址
  • Iface:发送接口,表示数据包从哪个接口发出
  • Flags 中的 U 标志表示此条目有效 (可以禁用某些 条目),G 标志表示此条目的下一跳地址是某个路由器的地址没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;

转发过程例 1: 如果要发送的数据包的目的地址是 192.168.56.3

  • 跟第一行的子网掩码做与运算得 到 192.168.56.0,与第一行的目的网络地址不符
  • 再跟第二行的子网掩码做与运算得 到 192.168.56.0,正是第二行的目的网络地址,因此从 eth1 接口发送出去;
  • 由于 192.168.56.0/24 正 是与 eth1 接口直接相连的网络(Flags不带G),因此可以直接发到目的主机,不需要经路由器转发;

转发过程例 2: 如果要发送的数据包的目的地址是 202.10.1.2

  • 依次和路由表前几项进行对比,发现都不匹配;
  • 按缺省路由条目,从 eth0 接口发出去,发往 192.168.10.1 路由器;
  • 由 192.168.10.1 路由器根据它的路由表决定下一跳地址;

4. IP报文分片问题

为了讨论IP报文的分片问题,我们先思考一下为什么TCP协议中滑动窗口中的数据,不打包成一个报文发送呢?为什么要一段一段的发?

首先,传输层要依次将报文向下层发送(数据段-->数据报-->数据帧),由于数据链路层规定,单次发送数据帧的有效载荷不能超过MTU(最大传输单元),当一个 IP 数据报的大小超过了网络的 MTU 限制时,就需要进行分片!

所以,当IP报文太长时,要进行分片;但是谁来分片呢?网络层自己分,因此网络层报头中多了3个字段

首次我们要明确一下,分片是好还是不好呢?

不好,丢包概率增加了。

  • 传输层向下发送一个X大小的报文段,对端传输层就只关心收到的报文段大小是不是X,它不关心是否分片了
  • 分片以后,发送的包更多了,丢包的概率增加了;对端网络层无法对包进行组装,因此就会被传输层判定为丢包。
  • 所以,丢包不仅仅是在"路上"丢,也有可能是分片后导致拼不起来了,造成丢包

所以,分片不能作为网络发送的主流,那如何不分片呢?- - 网络层不要发太长的报文,但是网络层决定不了,真正决定发多少的是传输层,所以问题的根源就是传输层不要发太长的报文段,所以滑动窗口才会一段一段的发(它考虑了分片的问题)


那如果要进行分片,如何分呢?

要讨论如何分,我们要先分析它怎么能将分片完整的组装

  • 接收方如何知道自己收到的报文分片了?
  • 接收方如何知道自己收到的报文收全了?
  • 如何拼成完整的报文?

这些问题,由IP报头中的3个字段解决

  • 16位标识:每一个报文,都有一个ID;如果报文分片了,分片后的报文ID相同
  • 3位标志:
    • 第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)
    • 第二位为 1 表示禁止分片,这时候如果报文长度超过 MTU,IP 模块就会丢弃报文
    • 第三位表示"更多分片",如果分片了的话,最后一个分片置为 0,其他是 1
  • 3 位分片偏移:是分片相对于原始 IP 报文中有效载荷开始处的偏移,其实就是在表示当前分片在原报文中处在哪个位置。(片偏移必须是8的整数倍

收到分片后如何组装呢?

  1. 当目的主机的 IP 层接收到这些分片后, 会根据标识字段将属于同一个数据报的所有分片挑选出来。
  2. 排序与组装:
    • 利用片偏移字段, IP 层会对属于同一个数据报的分片进行排序
    • 对排序后的结果分析,根据片偏移,以及前一片的大小决定是否连续
    • 当所有的分片都到达并正确排序后, IP 层会将这些分片重新组装成一个完整的 IP 数据报。

具体如何分呢?

  1. 分的是IP报文的有效载荷
  2. 片偏移,是指在原始报文中有效载荷的偏移量
  3. 片偏移的具体数字,必须是8的整数倍 。除了最后一个报文之外,其他报文的长度必须是 8 的整数倍,否则报文就不连续了
    • IP报文的总长度是16位,但是片偏移只有13位,无法全部表示;8 = 2 ^3^,对一个报文分片和组装时,都对报文除以8,就可以解决。

分片后,每一片都是一个IP报文!


相关推荐
Lxyand11 小时前
网络准入控制
服务器·网络·tcp/ip
丁总学Java2 小时前
SSL/TLS 协议、SSL证书 和 SSH协议 的区别和联系
网络协议·ssh·ssl
有趣的我3 小时前
PCEP使用
网络·智能路由器
suzhou_speeder3 小时前
了解 PoE 扩展模式(Extend Mode)及其对数据速率的影响
运维·网络·交换机·poe·poe交换机
萤火夜3 小时前
网络应用层之HTTPS
网络协议·http·https
DataDynamos数动实验室6 小时前
BGP状态和机制
运维·网络·计算机网络·智能路由器
神一样的老师6 小时前
通过恒定带宽服务器调度改进时间敏感网络(TSN)流量整形
网络
weixin_419658317 小时前
HTTPS的加密流程
网络协议·http·https
m0_748255027 小时前
linux 网卡配置
linux·网络·php