网络基础 -- 网络层(IP协议)

目录

网络层

IP协议

 IP报文格式(IPv4)

网段划分(地址管理)

CIDR

特殊的IP地址

IP地址的数量限制

私有IP地址和公网IP地址

路由选择

ICMP协议


网络层

介于传输层和数据链路层之间, 它在数据链路层提供的两个相邻端点之间的数据帧的传送功能上, 进一步管理网络中的数据通信, 将数据设法从源端经过若干个中间节点传送到目的端, 从而向运输层提供最基本的端到端的数据传送服务.

网络基础 -- 网络层(IP协议)_第1张图片 图片来源于网络

 

  • 基本概念 : 
  • 主机 : 配有IP地址, 但不能进行路由控制的设备;
  • 路由器 : 既配有IP地址, 又能进行路由控制;
  • 节点 : 主机和路由器的统称

在网络层中, 最重要的协议就是IP协议, 我们来看看IP协议.

IP协议

IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议. 设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务.

IP是整个TCP/IP协议族的核心,也是构成互联网的基础。IP位于TCP/IP模型的网络层(相当于OSI模型的网络层),对上可载送传输层各种协议的信息,例如TCP、UDP等;对下可将IP信息包放到链路层,通过以太网、令牌环网络等各种技术来传送。

 IP报文格式(IPv4)

          网络基础 -- 网络层(IP协议)_第2张图片

4位版本协议(version) : 通信双方的IP协议必须要达到一致, IPv4的版本就是4

4位首部长度(header length) : 定义了IP协议首部(报头)的长度, 以4字节为单位, IP报头是不定长的, 首部长度范围 [5, 15] 即 [20字节,  60字节]

8位服务类型(Type Of Service, TOS) : 3 位优先权字段(已经弃用), 4位TOS字段, 和一位保留字段(此位必须置0), 思维TOS分别表示 : 最小延迟, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能有一个置1. 对于ssh/telnet这样的应用程序, 最小延时标胶重要, 对于ftp(文件传输协议)类型的程序, 最大吞吐量比较重要.

16位总长度 : IP数据报整体占多少个字节(单位是字节), 16位能表示的最大数是 65535, 即65535字节, 即64k, 那么TCP的数据肯定不能大于64k -20-20, 一个20是IP报头最次小长度, 一个20是TCP报头的最小长度;  UDP的数据肯定不能大于64K-20-8, 第一个20也是IP报头的最短长度, 8是UDP报头的长度. TCP会在传输层根据MSS(最大分段大小, Maxitum Segment Size)自动进行数据分段; UDP在传输层不会分段;  传输的IP报文还受到下层数据链路层的MTU(最大传输单元, Maximum Transfer Unit)的限制; 而TCP中的MSS就是根据数据链路层的MTU计算的. UDP在在传输层不会分段, 所以当UDP数据大小 大于 MTU 而小于64k 20-8 时, 数据就会在网络层进行分片

16位(分片)标识 : 在进行数据分片重组的时候表示数据分片属于那个完整的UDP报文, 具体来说,  IP在存储器中维持一个计数器, 每产生一个 数据报, 计数器就加1, 并将此值赋给标识字段. 但这个标识并不是平常的序号,因为IP是无连接, 不可靠服务, 数据报不存在按序接收的问题. 当数据报由于长度超过链路层的MTU而必须分片时, 这个标识字段的值就被复制到所有的数据报片的标识字段中, 等到对端重组的时候, 相同标识符的值的数据报就会被重新组装成一个数据报.

3位(分片)标志 : 高位未用,  中间位DF置1, 表示不能进行分片,置0才可以进行分片操作. 最低位MF, 置1表示后面还有数据分片,MF=0表示这已经是最后一个数据分片了.

13位片偏移 : 标识一个分片在原始UDP报文中的位置, 以8字节为单位, 例如将一个10001的UDP报文按256字节分片后, 第一片的数据报的片偏移就是0, 第二片数据报的片偏移就是256/8 = 32, 第三片就是512/8=64, 第四片就是768/8=96, 第四片并没有256个字节, 如果分片前的数据不能够被8整除, 那么分片后的最后一个数据大小就是分片前的数据报大小除以8的余数. 可以看到不管分片前的大小能不能被8整除, 片偏移永远是8的整数倍.

8位TTL : 报文在网络中的生存周期 -- 即跳数, 指的是能够经过多少路由器, 每经过一个路由器就称为一跳, 该值就减1, 为0时就被网络丢弃掉, 8位TTL, 最大值为2^8 - 1 = 255.

8位协议 : 标识传输层使用的是什么协议, 用于数据分用

16位校验和 : 二进制反码求和, 用于校验数据的一致性

32位源地址 / 32位目的地址 :用于标识源端/对端主机, 路由器就是根据对端主机IP地址进行路径选择的

选项字段(不定长, 最多40字节) : 基本很少用到


网络层功能的实现, 就是地址管理与路由选择, 

网段划分(地址管理)

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

  • 网络号 : 保证相互连接的两个网段具有不同的标识, 简单来说就是标识网络 (网段:一段范围内的IP, 具体是网络号相同的所有IP)
  • 主机号 : 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号, 简单来说就是标识同一网段下的不同主机.
  • 子网 : IP地址是以网络号和主机号来表示网络上的主机的, 只有在一个网络号下的计算机之间才能“直接”互通, 不同网络号的计算机要通过网关(Gateway)才能互通. 但这样的划分在大多数情况下显得并不十分灵活. 为此IP网络还允许划分成更小的网络, 称为子网(Subnet).

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

那么问题来了, 手动管理子网内的IP, 是一件不现实的事情, 该如何解决?

DHCP动态主机配置协议 : 首先, 这是一个应用层协议, 可以自动给子网内新增的主机节点分配IP地址.  一般的路由器都带有DHCP功能, 因此路由器也可以看做是一个DHCP服务器.

在早期, 人们将所有的IP地址划分为5类, 要组建多大的局域网, 就选择相应的网段, 然后给局域网内的主机分配相应的主机号, IP地址分类如下:

  • A类 : 高1位固定 + 7位网络号 + 24位主机号. 范围 : 0.0.0.0 ~ 127.255.255.255, 网段的选择就是0 ~ 127, 最多容纳2^24-2台主机, 即16777214台主机, 用于组建超大型的网络
  • B类 : 高2位固定 + 14位网络号 + 16位主机号 -- 128.0.0.0 ~ 191.255.255.255  网段的选择就是128.0 ~ 191.255, 最多容纳2^16-2台主机, 即65534台主机, 用于组建中型网络
  • C类 : 高3位固定 + 21位网络号 + 8位主机号 -- 192.0.0.0 ~ 223.255.255.255  网段的选择就是192.0.0 ~ 223.255.255, 最多容纳2^8-2台主机, 即254台主机, 用于组建小型网络
  • D类 : 高4位固定 + 28位多播组号 -- 224.0.0.0 ~ 239.255.255.255
  • E类 : 高5位固定 + 27位留用 -- 240.0.0.0 ~ 247.255.255.255

随着互联网的飞速发展, 这种划分方案的局限性很快就显现出来, 大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址. 这是因为申请一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更是达到数千万之多, 然而实际网络架设中, 不会存在一个子网内有这么多主机的情况. 因此大量的A类IP地址都被浪费掉了.

CIDR

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

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号(和IP地址一样也用点分10进制来表示)
  • 子网掩码也是一个32位的无符号整数. 通常用一串 "0" 来结尾, (所以说子网掩码的二进制从高位到低位的1肯定是连续的)
  • 将IP地址和子网掩码进行 按位与 操作, 得到的结果就是网络号
  • 网络号和主机号的划分与这个IP地址是A类, B类还是C类无关

例子1 : IP : 140.252.20.68 子网掩码 : 255.255.255.0   ==> 网络号 : IP和子网掩码按位与 :140.252.20.0

            ==> 子网地址范围就是主机号的二进制从全0到全1, 140.252.20.0 ~ 140.252.20.255

例子2 : IP : 140.252.20.68 子网掩码 : 255.255.255.240   ==> 网络号 : IP和子网掩码按位与 :140.252.20.64

            ==> 子网地址范围就是主机号的二进制从全0到全1, 140.252.20.53 ~ 140.252.20.79

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

最大的主机号 + 1 就是局域网中主机的个数. 再看一个例子:

某公司网络的网段是192.168.2.0/24, 现在公司想从这个网段中划分出四个子网, 给公司的四个部门, 问, 每个子网的网络号以及子网掩码是多少, 以及每个子网中的IP地址范围是多少?

首先, 这是一个C类网络, 一个C类网络可以有256个主机号, 分为4个子网, 则每个子网的主机号个数就是64, 那每个子网中最大主机号就是64 - 1 = 63, 这个值就是子网掩码取反后的值, 那子网掩码就是63取反的值, 为255.255.255.192

四个子网的子网掩码是一样的, 因为其能分配的主机数都是一样的, 这道题中子网掩码为255.255.255.192

第一个子网IP范围 : 192.168.2.0 ~ 192.168.2.63  -- 网络号 : 192.168.2.0

第一个子网IP范围 : 192.168.2.64 ~ 192.168.2.127  -- 网络号 : 192.168.2.64

第一个子网IP范围 : 192.168.2.128 ~ 192.168.2.191  -- 网络号 : 192.168.2.128

第一个子网IP范围 : 192.168.2.192 ~ 192.168.2.255  -- 网络号 : 192.168.2.192

特殊的IP地址

  • IP地址中的主机号全为0, 就成了网络号, 代表这个局域网
  • 将IP地址中的主机号的二进制全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包(此时目的地址当然就被设为了广播地址)
  • 127.0.0.1. 它代表设备的本地虚拟接口, 所以默认被看作是永远不会宕掉的接口. 所以通常在安装物理网卡前就可以ping通这个本地回环地址. 一般都会用来检查本地网络协议、基本数据接口等是否正常的.
  • 0.0.0.0 标识本机上的所有网卡, 用与TCP服务端程序的绑定地址, 相当于监听本机的所有网卡.

IP地址的数量限制

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

实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡
都需要配置一个或多个IP地址.CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:

  • 动态分配IP地址 : 利用DHCP协议, 给接入网络的设备动态分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的
  • NAT技术(下面说)
  • IPv6: 在2019年11月26日15时35分, 位于荷兰阿姆斯特丹的IP地址管理机构正式宣布, 全球43亿(具体是2^32)个 IPV4地址已经全部分配完毕, 但我们还有IPv6协议可以用, IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 目前IPv6已经开始部署, 但还没有完全普及.

私有IP地址和公网IP地址

私有IP地址 : 在局域网中使用的IP

公网IP地址 : 在互联网中使用的地址

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

  • 10.* , 前8位是网络号,共16777216个地址, 用于组建大型局域网
  • 172.16.到172.31.前12位是网络号,共1048576个地址, 用于组建中型局域网
  • 192.168.*,前16位是网络号,共65536个地址, 用于组建小型局域网.
  • 包含以上范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP)
  • 一个路由器可以配置一个WAN口IP, 一个或多个LAN口IP(私有IP).
  • 路由器LAN口连接的主机, 都属于当前这个路由器的子网中.
  • 不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了.
  • 每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有多级,最外层的运营商路由器, WAN口IP就是一个公网IP了(如下图所示).
  • 子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).
  • 如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. 可以购买云服务器(比如阿里云, 腾讯云, 华为云等)


路由选择

                     网络基础 -- 网络层(IP协议)_第3张图片

路由选择过程如下 :

  • 当 IP数据包到达路由器, 路由器会先查看目的地址
  • 通过判断目的IP, 判定目的主机的所在网络是否与自己相连
  • 若相连, 则直接发送给目标主机
  • 若不相连, 则发送给下一个路由器(下一个路由器就如上面图中的上一级路由器)(这个过程中源IP地址会被替换为路由器的WAN口地址)
  • 重复这个过程, 一直到达目的IP(或者TTL为0时被丢弃)

具体如何判定当前这个数据报该发送到哪儿, 这就依靠每个节点(包括主机和路由器)内部都维护着一张路由表

  • 路由表可以使用route命令查看
  • 如果目的IP命中了路由表, 则直接转发即可
  • 逐行判断, 当判断到最后一行(之前所有行都不匹配), 就按缺省路由条目规定的接口(default getway, 默认网关)发送到下一跳地址.(最后一行主要由下一跳地址和发送接口两部分组成)

Linux中用route查看路由表 : 

网络基础 -- 网络层(IP协议)_第4张图片

  • Destination : 目的网段 (与我相连的网络的网络号)
  • Gatway : 网关(下一跳路由器入口的ip)
  • Getmask : 子网掩码
  • Metric : 跳数, 该条路由记录的质量, 一般情况下, 如果有多条到达相同目的地的路由记录, 路由器会采用metric值小的那条路由 
  • Use Iface : 与这个网络相连的网卡名称

路由选择具体过程 :

以上图路由表为例, 若有一个IP数据包到以上这个节点中(主机或路由器), 先将目的IP地址在路由表中逐行判断, 首先与第一行的子网掩码255.255.255.0相与, 只要目的地址与子网掩码相与的结果是网络号(网段)192.168.40.0, 就可以判断出, 这个IP数据包的目的主机就是在自己局域网内的主机, 直接转发就好.  如果相与后不是, 则再与第二行的子网掩码相与, 相与的结果与第二行的网段(网络号)比较看是否相等, 若相等, 这个IP数据包的目的主机是和这个节点相连网络中的主机, 则使用连接这个网络的网卡将其发送到这个网络中, 若相与结果与网段不相等, 则继续往下一行判断, 重复以上过程, 若所有行都判断完了, 还没有匹配的, 这时候这个节点就会通过连接自己网关的网卡, 将这个IP数据包发送给自己的上层网关, 让上层网关再去路由选择.


ICMP协议

一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输. 如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因.  所以我们就需要一种协议来完网络探测–ICMP协议。

ICMP协议的功能主要有:

  • 1. 确认IP包是否成功到达目标地址 
  • 2. 通知在发送过程中IP包被丢弃的原因 

简单来说, 就是在网络层向指定主机发送ICMP请求应答报文, 要求对方收到后进行回复, 通过这种方式实现网络探测(说白了就是针对IP地址的一种确认应答)

需要注意的是 : 

  • 1.ICMP是基于IP协议工作的,但是它并不是传输层的功能,因此仍然把它归结为网络层协议 
  • 2. ICMP只能搭配IPv4使用,如果是IPv6的情况下, 需要是用ICMPv6

ICMP报文包含在IP数据报中,IP报头在ICMP报文的最前面。一个ICMP报文包括IP报头(至少20字节)、ICMP报头(至少八字节)和ICMP报文(属于ICMP报文的数据部分)。当IP报头中的协议字段值为1时,就说明这是一个ICMP报文

ping命令(在Windows和Linux下都有) 就是使用ICMP协议实现的, 不涉及到端口.

你可能感兴趣的:(网络基础)