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

2024-08-23 06:20

本文主要是介绍【网络编程】第十章 网络层-IP(分片组装+网段+路由+NAT),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


文章目录

  • 重点
  • 概念
  • IP协议
    • 4位首部长度
    • 8位生存时间(TTL)
    • 分片
      • MTU-最大传输单元
      • 分片过程
    • 组装
  • 网段
    • 网段划分
      • 子网掩码
  • 特殊IP
    • loopback 环回
    • 解决IP地址不足问题
  • 私有 IP
    • 访问广域网和返回的步骤
    • NAT
      • NAPT-网络地址端口转换表
      • NAT技术的缺陷
      • NAT和代理服务器
        • 正向代理
        • 反向代理
      • 为什么私网IP不能出现在公网当中
  • 路由
    • 路由表查询的具体过程
    • route


重点

  • 网络层的作用:在复杂的网络环境中确定一个合适的路径.
  • 理解 IP 地址,理解 IP 地址和 MAC 地址的区别
  • 理解 IP 协议格式
  • 了解网段划分方法
  • 理解如何解决 IP 数目不足的问题,掌握网段划分的两种方案
  • 理解私有 IP 和公网 IP
  • 理解网络层的 IP 地址路由过程
  • 理解一个数据包如何跨越网段到达最终目的地
  • 理解 IP 数据包分包的原因
  • 了解 NAT 设备的工作原理

概念

  • 应用层:解决如何传输数据的问题
  • 传输层:解决可靠性问题
  • 网络层:数据往哪里传,怎么找到目标主机
  • 数据链路层(物理层):数据在物理硬件层面上传输

网络层的 IP 协议,拥有将数据从 A 主机发送到 B 主机的能力,并不代表每次都能成功送达,失败了就由传输层兜底重传

  • 主机:配有IP地址,但是不进行路由控制的设备。但实际现在几乎不存在不进行路由控制的设备了,就连你的笔记本也会进行路由控制。
  • 路由器:既配有IP地址,又能进行路由控制。
  • 节点:主机和路由器的统称。

IP协议

IPV4 中报文的格式

image-20240815110959878

  • 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位片偏移
1150020148012310
215002014801231185
315002014801231370
46020401230555

假设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
网段   主机号
  • 网络号:标识该地址所在的网络
  • 主机号:标识该地址所对应主机上的具体设备

网段划分

image-20240820140355583

  • 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 环回

image-20240820164126910

  • 如果是环回程序,会把报文发给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个地址。

访问广域网和返回的步骤

image-20240820181301378

  • 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之间的映射关系

image-20240821224744639

  • 当局域网中的主机向外网发送数据时,路由器会将源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不足的问题,而代理服务器则是更贴近具体应用,加速器
正向代理

一个位于客户端和目标服务器之间的服务器,客户端并不直接访问目标服务器,而是先访问代理服务器,由代理服务器代替客户端去访问对应的目标服务器,并将目标服务器的响应结果返回给客户端

image-20240821225940551
  • 缓存常用的内容,从而减少对目标服务器的请求,提高访问速度
  • 访问控制和过滤,限制用户访问特定网站或资源
反向代理

一个位于客户端和目标服务器之间的服务器,对于客户端而言,反向代理服务器就相当于目标服务器,用户不需要知道目标服务器的地址

image-20240821225956525
  • 百度内部实际并不是只有一台服务器,但不同地区的人们都可以通过访问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 默认路由发送出去。

这篇关于【网络编程】第十章 网络层-IP(分片组装+网段+路由+NAT)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1098599

相关文章

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

Nginx路由匹配规则及优先级详解

《Nginx路由匹配规则及优先级详解》Nginx作为一个高性能的Web服务器和反向代理服务器,广泛用于负载均衡、请求转发等场景,在配置Nginx时,路由匹配规则是非常重要的概念,本文将详细介绍Ngin... 目录引言一、 Nginx的路由匹配规则概述二、 Nginx的路由匹配规则类型2.1 精确匹配(=)2

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Java根据IP地址实现归属地获取

《Java根据IP地址实现归属地获取》Ip2region是一个离线IP地址定位库和IP定位数据管理框架,这篇文章主要为大家详细介绍了Java如何使用Ip2region实现根据IP地址获取归属地,感兴趣... 目录一、使用Ip2region离线获取1、Ip2region简介2、导包3、下编程载xdb文件4、J

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义