文章目录
重点
- 网络层的作用:在复杂的网络环境中确定一个合适的路径.
- 理解 IP 地址,理解 IP 地址和 MAC 地址的区别
- 理解 IP 协议格式
- 了解网段划分方法
- 理解如何解决 IP 数目不足的问题,掌握网段划分的两种方案
- 理解私有 IP 和公网 IP
- 理解网络层的 IP 地址路由过程
- 理解一个数据包如何跨越网段到达最终目的地
- 理解 IP 数据包分包的原因
- 了解 NAT 设备的工作原理
概念
- 应用层:解决如何传输数据的问题
- 传输层:解决可靠性问题
- 网络层:数据往哪里传,怎么找到目标主机
- 数据链路层(物理层):数据在物理硬件层面上传输
网络层的 IP 协议,拥有将数据从 A 主机发送到 B 主机的能力,并不代表每次都能成功送达,失败了就由传输层兜底重传
- 主机:配有IP地址,但是不进行路由控制的设备。但实际现在几乎不存在不进行路由控制的设备了,就连你的笔记本也会进行路由控制。
- 路由器:既配有IP地址,又能进行路由控制。
- 节点:主机和路由器的统称。
IP协议
IPV4 中报文的格式
- 4位版本号:指定 IP 协议的版本,IPV4 来说就是 4,IPV6 来说就是 6
- 4位首部长度:IP 报头的长度,以4字节为单位,标准长度需要用四位首部长度 * 4字节
- 8位服务类型:3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本,只能四选一
- 16位总长度:IP报头+有效载荷的总长度
- 16位标识:唯一的标识主机发送的报文,如果数据在IP层进行了分片,那么每一个分片对应的id都是相同的
- 3位标志字段:
- 第一位保留,表示现在不用。
- 第二位表示禁止分片,表示如果报文长度超过MTU,IP模块就会丢弃该报文。
- 第三位表示"更多分片",如果报文没有进行分片,则该字段设置为0,如果报文进行了分片,最后一个分片置为 0, 其他分片报文都是 1,0 就类似于一个分片报文段的结束标记
更多分片为 0,且分片偏移为 0,代表当前报文没有进行分片;
更多分片为 1,且分片偏移为 0,代表当前是分片后报文中的第一个;
更多分片为 0,且分片偏移不为 0,代表当前是分片报文中的最后一个;
- 13位片偏移:分片相对于原始数据载荷开始处的偏移,表示当前分片在原数据载荷中的哪个位置,实际偏移的字节数是这个值 * 8 得到的。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了。如果数据载荷不足 8 的整数倍,需要进行向下取整!比如某个分片的数据载荷部分是 1476 字节,并非 8 的整数倍,那就应该选择1476/8=184.5 向下取整,即采用 8*184=1472 为该报文的数据载荷长度
- 8位生存时间(TTL):控制 IP 报文能在网络层传输的时间,每经过一个路由,TTL 减一,一直减到0还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环
- 8位协议:表示上层协议的类型,ICMP 1,IGMP 2,TCP 6,UDP 17,IPv6 41,OSPF 89
- 16位首部检验和:检测数据是否损坏,采用因特网检验和
- 32位源IP地址和32位目的IP地址:表示发送端和接收端所对应的IP地址
- 选项字段:不定长,最多15×4 = 40字 节,首部默认20字节
IP 协议的报文中没有端口号,因为端口号是传输层应该解决的事情
4位首部长度
IP从底层获取到一个报文后,首先读取报文的前20个字节,并从中提取出4位的首部长度,计算报头大小,报头大小 - 20字节得到选项,读完选项剩下都是有效载荷
8位生存时间(TTL)
8位生存时间代表的是报文到达目的地的最大报文跳数,每当报文经过一次路由,这里的生存时间就会减一,当生存时间减为0时该报文就会被自动丢弃
分片
传输层一次向下交付的数据太多了会导致分片,数据链路层不支持过大的数据,这就需要在发送方网络层对数据进行分片,分片后的每片都有独立ip,分片会提高丢包的概率,影响传输速率
MTU-最大传输单元
将IP传下来的数据封装成数据帧,然后发送到网络当中,数据帧不能超过MTU,数据帧一般为1500字节
分片过程
分片报文 | 总字节数 | IP报头字节数 | 数据字节数 | 16位标识 | "更多分片" | 13位片偏移 |
---|---|---|---|---|---|---|
1 | 1500 | 20 | 1480 | 123 | 1 | 0 |
2 | 1500 | 20 | 1480 | 123 | 1 | 185 |
3 | 1500 | 20 | 1480 | 123 | 1 | 370 |
4 | 60 | 20 | 40 | 123 | 0 | 555 |
假设IP层要发送4500字节的数据,由于该数据超过了MAC帧规定的MTU,因此IP需要先将该数据进行分片
IP报头如果不携带选项字段,那么其大小就是20字节,IP层添加的IP报头的长度就是20字节,并将数据分片四个分片报文
假设四个分片报文的16位标识都是123,则每片的id都是123
如果报文进行了分片,最后一个分片置为 0, 其他分片报文都是 1,0 就类似于一个分片报文段的结束标记
由于报文的长度必须是8的整数倍,如果数据载荷不足 8 的整数倍,需要进行向下取整,1480÷8 = 185
(1480+1480)÷8 = 370 (1480+1480+1480)÷8 = 555
总字节数相加为1480+1480+1480+40=4480,不是4500因为,加上 IP 报头 20 字节
组装
在接收方网络层对数据进行组装,根据16位标识来确定当前分片属于哪一个 "组",再将当前报文和后续收到同一组的报文集合在一起
-
先找到分片报文中13位片偏移为0的分片报文,然后提取出其IP报头当中的16位总长度字段,通过计算即可得出下一个分片报文所对应的13位片偏移,按照此方式依次将各个分片报文拼接起来。
-
直到拼接到一个"更多分片"标志位为0的分片报文,此时表明分片报文组装完毕。
网段
IP = 网络号 + 主机号,例如ip为1.1.1.1
1.1.1. 1
网段 主机号
- 网络号:标识该地址所在的网络
- 主机号:标识该地址所对应主机上的具体设备
网段划分
-
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。
子网掩码
- 引入子网掩码来区分网络号和主机号
- 子网掩码也是一个 32 位的正整数。通常用一串 0 来结尾,一串 1 开头,如255.255.255.0;
- 将 IP 地址和子网掩码进行 按位与 操作,得到的结果就是网络号;
- 假设IP地址是192.168.128.10,子网掩码进行"按位与"操作后得到的就是192.168.128.0,就是网络号
子网划分的目的:就是提高查找目标主机的效率
特殊IP
只能用于局域网
- 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网。
- 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。
- 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。
loopback 环回
-
如果是环回程序,会把报文发给IP输入函数读取上去,不将其插入到以太网中。
-
如果不是环回程序的话,插入到以太网中
解决IP地址不足问题
-
动态分配IP地址:只给接入网络的设备分配IP地址
-
NAT技术:能够让不同局域网当中同时存在两个相同的IP地址
-
IPv6:IPv6用16字节128位来表示一个IP地址
私有 IP
- 10.*,前8位是网络号,共16,777,216个地址。
- 172.16.* 到172.31. *,前12位是网络号,共1,048,576个地址。
- 192.168.*,前16位是网络号,共65,536个地址。
访问广域网和返回的步骤
- LAN:表示连接本地网络的端口,也是子网,基本都是192.168.1.1
- WAN:表示连接广域网的端口,一般指互联网
主机 A,访问目的IP122.77.241.10 的具体步骤,192.168.1.201 是本地私有ip,10.1.1.2是运营商私有ip,122.77.241.4是运营商公网ip
本地主机A发送IP家庭路由器B | 源IP:192.168.1.201 | 目的IP:122.77.241.10 |
---|---|---|
路由器B收到报文后,检测目的IP,发现并不是局域网的IP 于是交付给上层的运营商路由器C,报文的源IP被修改为家用路由器B的wan口IP | 源IP:10.1.1.2 | 目的IP:122.77.241.10 |
广域网IP寻址操作,找到目标公网IP的主机,再将报文发送给该主机 | 源IP:122.77.241.4 | 目的IP:122.77.241.10 |
目的ip122.77.241.4返回数据过程,本地ip192.168.1.201,10.1.1.1是运营商私有ip,122.77.241.3公网ip
目标主机返回报文,先到达运营商服务器 | 源IP:122.77.241.10 | 目的IP:122.77.241.4 |
---|---|---|
确定局域网 IP 后,就修改当前报文的目的 IP,继续往局域网转发 | 源IP:122.77.241.10 | 目的IP:10.1.1.2 |
家庭路由器B发送IP本地主机A | 源IP:122.77.241.10 | 目的IP:192.168.1.201 |
NAT
由于私网IP不能出现在公网当中,路由器会不断将数据包IP首部中的源IP地址替换成路由器的WAN口IP,NAT是一种将私有IP和全局IP相互转化的技术方法
NAPT-网络地址端口转换表
NAT路由器内部,用于地址转换的表。局域网中主机的私有IP 和 外网当中的某个公网IP之间的映射关系
- 当局域网中的主机向外网发送数据时,路由器会将源IP地址替换为自己的WAN口IP地址,并建立该主机私有IP与其对应访问的公网IP之间的映射关系,同时加上一个路由器选定的端口号。
- 当外网发来响应数据时,NAT路由器又会将目的IP地址替换成局域网中对应主机的LAN口IP地址,路由器就能通过IP+Port的方式来区分发给不同主机的数据包。
- 例如主机A和主机B用端口1010 访问同一个网站,此时路由器先接收一个主机请求,将源IP换成WAN口 ip端口号用1010,第二个接受的主机将源IP换成WAN口 ip端口号用1011
NAT技术的缺陷
- 无法从NAT外部向内部服务器建立连接,因为外部无法知道内部的私网IP,也就无法主动与内部服务器建立连接。
- 转换表的生成和销毁都需要额外开销。
- 通信过程中一旦NAT设备异常,即使存在热备,所有的TCP连接也都会断开。
NAT和代理服务器
代理网络用户去取得网络信息
- NAT 在网络层工作,对 IP 地址进行替换;代理服务器是在应用层工作
- NAT设备是网络基础设备之一,解决的是IP不足的问题,而代理服务器则是更贴近具体应用,加速器
正向代理
一个位于客户端和目标服务器之间的服务器,客户端并不直接访问目标服务器,而是先访问代理服务器,由代理服务器代替客户端去访问对应的目标服务器,并将目标服务器的响应结果返回给客户端
- 缓存常用的内容,从而减少对目标服务器的请求,提高访问速度
- 访问控制和过滤,限制用户访问特定网站或资源
反向代理
一个位于客户端和目标服务器之间的服务器,对于客户端而言,反向代理服务器就相当于目标服务器,用户不需要知道目标服务器的地址
- 百度内部实际并不是只有一台服务器,但不同地区的人们都可以通过访问
www.baidu.com
享受到百度提供的服务 - 反向代理可以起到负载均衡的作用。比如不设置反向代理服务器,那么用户在访问百度时,就会随机访问到百度内部的某台服务器,此时就可能导致某些服务器压力太大,而某些服务器却处于闲置状态。
- 便于统一管理服务器集群,提供统一入网服务器
- 提高了安全性,所有访问先查询是不是在黑名单或者是白名单
为什么私网IP不能出现在公网当中
- 不同的局域网中主机的IP地址可能是相同的,所以私网IP无法唯一标识一台主机
- 数据包必须要经过运营商的路由器
路由
实际就是一跳一跳"问路"的过程, "一跳" 就是数据链路层中的一个区间
路由表查询的具体过程
- 首先检测是或否是当前局域网中的 IP,是则可以直接转发到目标主机;
- 不是则查看自己的路由表,是否保存了这个 IP 应该往哪里走;
- 路由表没有保存,则和其他与自己相连的路由器通信(信息同步),问他们这个 IP 应该给谁
- 路由器经过路由表查询后,没有发现匹配的子网,此时路由器会将该数据转发给默认路由
route
route命令可以查看服务器上对应那些路由表
- Destination代表的是目的网络地址。
- Gateway代表的是下一跳地址,_gateway 以及 0.0.0.0 代表的都是默认网关
- Genmask代表的是子网掩码。
- Flags中,U标志表示此条目有效,G标志表示某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。
- Iface代表的是发送接口。
将目的ip和路由表中子网掩码"按位与"之后得到网络地址,再和Destination比较,两者相等代表当前ip就是需要通过该项路由,此时通过Iface接口发出去,如果和Destination不相等,则继续与下一个子网掩码比较,以此类推,最后由default 默认路由发送出去。