【网络编程】第十章 网络层-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 默认路由发送出去。

相关推荐
fantasy_arch4 分钟前
CPU性能优化-磁盘空间和解析时间
网络·性能优化
njnu@liyong1 小时前
图解HTTP-HTTP报文
网络协议·计算机网络·http
是Dream呀2 小时前
Python从0到100(七十八):神经网络--从0开始搭建全连接网络和CNN网络
网络·python·神经网络
kaixin_learn_qt_ing3 小时前
了解RPC
网络·网络协议·rpc
安全小王子3 小时前
Kali操作系统简单介绍
网络·web安全
Hacker_LaoYi5 小时前
【漏洞分析】DDOS攻防分析(四)——TCP篇
网络·tcp/ip·ddos
爱吃水果蝙蝠汤5 小时前
DATACOM-IP单播路由(BGP)-复习-实验
网络·网络协议·tcp/ip
Sun_12_25 小时前
SQL注入(SQL lnjection Base)21
网络·数据库
loong_XL6 小时前
服务器ip:port服务用nginx 域名代理
服务器·tcp/ip·nginx