【网络编程】第十章 网络层-IP(分片组装+网段+路由+NAT)


文章目录


重点

  • 网络层的作用:在复杂的网络环境中确定一个合适的路径.
  • 理解 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位标志字段:
  1. 第一位保留,表示现在不用。
  2. 第二位表示禁止分片,表示如果报文长度超过MTU,IP模块就会丢弃该报文。
  3. 第三位表示"更多分片",如果报文没有进行分片,则该字段设置为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 默认路由发送出去。

相关推荐
ytdbc35 分钟前
OSPF综合实验
网络
kaisun641 小时前
Docker 构建网络问题排查
网络·docker·eureka
雪度娃娃2 小时前
存储器层次结构——磁盘硬盘存储
服务器·网络·数据库·计算机组成原理
YUANQIANG20242 小时前
通信领域进行蒙特卡洛仿真的思路和步骤
网络
eam0511232 小时前
OSPF综合实验
网络
QQ15401828563 小时前
USB转千兆以太网芯片方案
网络·pt153s·千兆以太网芯片·usb转以太网·千兆网口芯片
曦夜日长3 小时前
Linux系统篇,进程概念(一):计算机体系、操作系统的认识、程序的加载过程
linux·运维·网络
似水এ᭄往昔3 小时前
【Linux网络编程】--Socket编程预备
linux·服务器·网络
笨蛋不要掉眼泪3 小时前
Java并发编程 :深入剖析LinkedBlockingQueue
java·开发语言·网络·并发
杨浦老苏3 小时前
网络连接实时可视化利器TapMap
网络·docker·可视化·监控·群晖