网络基础(三)——网络层

目录

IP协议

1、基本概念

2、协议头格式

2.1、报头和载荷如何有效分离

2.2、如果超过了MAC的规定,IP应该如何做呢?

2.3、分片会有什么影响

3、网段划分

4、特殊的ip地址

5、ip地址的数量限制

6、私有ip地址和公网ip地址

7、路由


IP协议

网络层解决的问题是将数据从一台主机送到到另一台主机,即在复杂的网络环境中确定一个合适的路径。

ip = 目标网络 + 目标主机(在构建网络的时候,为我们将来高速定位一台主机,提供了基础保障)


1、基本概念

· 主机:配有IP地址, 但是不进行路由控制的设备;

· 路由器:即配有IP地址, 又能进行路由控制;

· 节点:主机和路由器的统称;


2、协议头格式

4位版本号(version) :指定IP协议的版本,对于IPv4来说,就是4。
4位头部长度(header length) :IP头部的长度是多少个32bit,也就是 length * 4 的字节数。 4bit表示最大的数字是15,因此IP头部最大长度是60字节。
8位服务类型(Type Of Service) :3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位 TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于 ssh/telnet这样的应用程序,最小延时比较重要。对于ftp这样的程序,最大吞吐量比较重要。
16位总长度(total length) :IP数据报整体占多少个字节。
16位标识(id) :唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。
3位标志字段 :第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示"更多分片",如果分片了的话,最后一个分片置为1,其他是0。类似于一个结束标记。
13位分片偏移(framegament offset) :是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。
8位生存时间(Time To Live, TTL) :数据报到达目的地的最大报文跳数。一般是64。每次经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。
8位协议 :表示上层协议的类型。
16位头部校验和 :使用CRC进行校验, 来鉴别头部是否损坏。
32位源地址和32位目标地址 :表示发送端和接收端。
选项字段(不定长, 最多40字节):略

2.1、报头和载荷如何有效分离

这里和tcp一样,4为首部长度表示报头的大小,范围为20-60字节,那么我们先提取前20个字节,提取4位的首部长度,判断有没有选项,所以IP协议是通过定长和自描述字段可以将报头和有效载荷分离。

2.2、如果超过了MAC的规定,IP应该如何做呢?

前面说到了tcp要想做到100%可靠的传送给对面的前提是:你一定要有一个将数据传能发送到对方的能力。而IP要想跨网络传输也需要一个前提:把报文从一台主机送到和自己直接相连的下一台主机。这个能力是由mac帧,也就是数据链路层提供的。

所以对于上面的主机B来讲,和这个路由器F是直接相连的,而任意两个直接相连的主机一定是在同一个局域网中。所以其实数据链路层解决的其实是局域网通信的问题。

其中mac帧有一个规定:ip交下来的数据要受mac携带的有效载荷最大长度的影响,而且我们知道,有效载荷最大长度一定是ip交给mac的,既然是ip交给它的,那么其中就会涵盖ip报头+ip的有效载荷。而这个值就是mtu(max transfer unit最大传送单元),常规的就是1500字节。

所以ip在向下交付自己的报文,让mac帧去做下一个跳转的时候最大有效载荷长度不能超过1500字节,这就是规定。

如果超过了规定,要么IP就别发了,要么IP就要分片,而其中分片不算必须做的,因为你可以不传超过1500字节的数据。在网络通信的时候,不分片是常态,因为分片会引发很多潜在的问题。

首先我们要明确,既然分片了,那么到了对端就必须要组装。而且要组装正确,不能发过去一个数据,因为分片了,组装后又是另一种,所以从分片到组装当中传递时会携带相应的属性信息,换言之,属性信息在那个协议上,那么就由哪个协议完成分片和组装,所以刚刚说的都是由IP协议自己完成的。

2.3、分片会有什么影响

分片过多会导致丢包的概率增多,任何一个包丢了,都代表此处的传输有问题。

16位标识用来标识IP报文有没有进行分片。

13位分片偏移是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。

3位的标志第一位没用,第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示"更多分片",如果分片了的话,最后一个分片置为1,其他是0。类似于一个结束标记。

所以提取出分片的报文,根据16位标识,聚合"所有的"分片报文。

根据片偏移进行升排序来判断丢没丢包,如果第一个丢了,则用第一个片偏移是不是从0开始的。

根据更多分片最后是否为0,保证多个分片报文全部收到了。

当然上面的保证都不是只单单通过一个对应一个的保证的,而且它们三个相互作用而保证的。

当然报文是有可能丢失的,而且我们可以根据这三个标志位来判断是哪几个丢失了。

我们在上面说的时候其实是有一个漏洞的,这就是如果一个报文分片后,只有最后一片丢了,也就是"更多分片"最后不是0,但是紧接着下一个就是没有分片的报文,此时它的"更多分片"是0,这又怎么区分报文丢没丢呢?其实很简单,因为如果没有丢,那么它的片偏移肯定不是0,如果是0那么这个肯定就是没有分片的报文。

总结:根据3位标志的更多分片来看是否被分片,根据16位标识将所有分片的报文聚合在一起,根据13位片偏移进行排序,然后再根据更多分片来决定我们是否收到的最后一个报文,再根据13位片偏移来决定中间是否丢包,如果上面的操作没有任何问题,那么将上面的报文合并成一个报文完成拼接的功能。


3、网段划分

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

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

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

子网其实就是把网络号相同的主机放在一起,如果在子网中新增一台主机,那么这台主机的网络号要和子网的网络号相同,但是主机号不能和同一子网内的主机重复,如图:

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

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

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

过去曾经提出一种划分网络号和主机号的方案, 把所有IP地址分为五类, 如下图所示(该图出自[TCPIP])。

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类网络地址, 导致B类地址很快就 分配完了, 而A类却浪费了大量地址;

针对这种情况提出了新的划分方案, 称为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。


4、特殊的ip地址

· 将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;

· 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;

**·**127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1


5、ip地址的数量限制

我们知道, IP地址(IPv4)是一个4字节32位的正整数。那么一共只有 2的32次方个IP地址, 大概是43亿左右。而TCP/IP 协议规定, 每个主机都需要有一个IP地址。这意味着, 一共只有43亿台主机能接入网络么? 实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个IP地址。 CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然 不是很够用。 这时候有三种方式来解决:

动态分配IP地址: 只给接入网络的设备分配IP地址。 因此同一个MAC地址的设备, 每次接入互联网中, 得到 的IP地址不一定是相同的;

NAT技术(后面会重点介绍);

**IPv6:**IPv6并不是IPv4的简单升级版。 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;


6、私有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地址, 一个是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的服 务器上。这样的服务器可以在阿里云/腾讯云上进行购买。


7、路由

路由其实就是在复杂的网络结构中, 找出一条通往终点的路线;

路由的过程, 就是一跳一跳(Hop by Hop) "问路" 的过程。所谓 "一跳" 就是数据链路层中的一个区间。具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。

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

1、当IP数据包, 到达路由器时, 路由器会先查看目的IP;

2、路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;

3、依次反复, 一直到达目标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

1、跟第一行的子网掩码做与运算得 到192.168.56.0,与第一行的目的网络地址不符

2、再跟第二行的子网掩码做与运算得 到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去;

3、由于192.168.56.0/24正是与eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转 发;

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

1、依次和路由表前几项进行对比, 发现都不匹配;

2、按缺省路由条目, 从eth0接口发出去, 发往192.168.10.1路由器;

3、由192.168.10.1路由器根据它的路由表决定下一跳地址;

相关推荐
今朝无言3 分钟前
Tri Mode Ethernet MAC IP核详解
网络·网络协议·tcp/ip·fpga开发
C++忠实粉丝29 分钟前
计算机网络socket编程(5)_TCP网络编程实现echo_server
网络·c++·网络协议·tcp/ip·计算机网络·算法
sun0077001 小时前
ubuntu增加swap交换空间
linux·运维·服务器
苹果醋32 小时前
前端面试之九阴真经
java·运维·spring boot·mysql·nginx
Diamond技术流2 小时前
从0开始学习Linux——环境变量详解
linux·服务器·学习·centos·软件安装·环境变量
疯狂吧小飞牛2 小时前
openssl颁发包含主题替代名的证书–SAN
运维·服务器·网络
疯狂吧小飞牛2 小时前
openssl创建自签名证书
linux·服务器·ssl
qhd吴飞3 小时前
在linux下用二进制方式安装mysql8
linux·运维·服务器
刘登辉3 小时前
雷电模拟器charles代理抓包
运维·服务器
股票GPT分析3 小时前
《Python 股票交易分析:开启智能投资新时代》(二)
大数据·服务器·python·c#·fastapi