网络层:IP协议

news2024/11/26 18:18:23

目录

基本概念

IP报头

IP报文分片

为什么要分片?

如何分片?

分片的报文如何组装?

分片策略如何?

网段划分

IP地址被分成了五类IP:

CIDR

特殊的IP地址: 

私有IP和公网IP

路由

如何转发数据包?


基本概念

主机:配有IP,不进行路由控制的设备

路由器:配有IP并进行路由控制的设备

节点:主机和路由器统称节点

前面提到传输层主要解决的是数据可靠传输的问题,而网络层主要解决的是让数据能在主机之间传输的能力:

IP协议:网际互连协议(Internet Protocol),是网络层重要的协议。 

IP报头

字段含义:

4位版本:表示是IPv4还是IPv6协议。

4位首部长度(*4字节):表示报文首部长度,单位是4字节,因为IP报文的基本长度为20字节(不带选项时),所以至少是5。

8位服务类型:3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0),4位TOS分别表示:最小延时,最大吞吐量,最高可靠性, 最小成本。这四者相互冲突,只能选择一个,对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。

16位总长度:IP数据报整体字节数,包括报头和有效载荷

16位标识+3位标志+13位片偏移:用于IP报文分片的字段

8位生存时间(Time To Live, TTL):数据报到达目的地的最大报文跳数(hop),一般是64. 每次经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。

8位协议:表示数据包要交付上层协议的类型

6位头部校验和:使用CRC进行校验,来鉴别报文头部是否损坏

32位源地址和32位目标地址:表示发送端的IP地址和接收端的IP地址

IP报文分片

为什么要分片?

链路层有发送单个数据帧的最大值的约束,所以不能发太大IP报文,这个约束就是MTU(最大传输单元),MTU一般是1500字节,可以通过命令ifconfig查看:

如何分片?

发送方的网络层分片,接收方的网络层组装,倘若丢了一片分片就相当于传输层整体丢包,所以分片会导致丢包概率会增加,尽量不分片。

当报文分片时是如何识别报文分片了? 

三位标志中第一位保留,第二标记位表示禁止分片,如果标记为1,这时候如果报文长度超过MTU, IP模块就会丢弃报文,第三位标记位表示更多分片,如果分片了更多分片标记位就置1,最后一个分片更多分片标记位就置0,表示分片结束。

16位标识(id): 唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。

13位分片偏移(framegament offffset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置,实际偏移的字节数是这个值 * 8 得到的,所以在填入该值时就是报文实际相对报文起始的偏移/8,因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了),所以就算先收到最后一个分片,虽然更多分片标记位为0,但因为其片偏移不为0,所以可以识别是分了片的报文。

分片的报文如何组装?

1.将相同序号的报文收集(16位标识相同的)

2.正确组装:根据13位片偏移排序,第一个报文的片偏移为0

怎么保证收完和收全报文?第一个片偏移为0,后面的报文的片偏移按报文长度累加,最后一个报文的第三位更多分片标记位为0。

分片策略如何?

应该尽量减少分片:分片会导致报文丢失概率增加,因为任意一个分片丢失,对于上层而言就是整个报文的丢失。对于TCP,在三次握手的时候就会协商单次传输数据都报文大小MSS=MTU-IP报文头部-TCP报文头部,可以保证不发生分片,但对于不可靠的UDP而言,分片会直接影响UDP报文数据丢失。但是分片方案值得学习和借鉴,特别是分片和组装只用了三个字段就完成了。

网段划分

IP地址被分为两部分:
网络号:标识不同网段的主机

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

通过设置网络号和主机号就可以保证互相连接的网络中,每台网络的主机的IP地址都不相同,每个子网的网络号都相同,而主机之间的主机号不同,当子网中新增一台主机的时候就需要分配新的IP地址,这个分配任务是DHCP自动给主机分配IP,避免了手动分配IP地址的不方便,一般路由器带有DHCP功能,路由器可以看做一个DHCP服务器。

注:DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是基于UDP的应用层协议。

因为IP地址=目的网络+目的主机 ,所以数据在路由的时候可以根据不同的网络号先找到进行不同的网段然后在网段下在查找相应的主机,这样就可以提高效率。

IP地址被分成了五类IP:

 其中地址范围:

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

但是网络IP早已不足,而且存在问题,比如B类地址的主机号有16位,也即至多能运行6万多太主机在一个子网中,但是实际的网络架设中没有这么多主机,这样就会浪费IP地址,为了解决这个问题引入了CIDR(Classless Interdomain Routing),称为无类别域间路由:

CIDR

1.引入子网掩码来区分网络号和主机号

2.32位正整数,通常后面一串0来表示,子网掩码与IP地址按位与得到网络号

3.网络号和主机号的划分与这个IP地址是A类、B类还是C类无关

特殊的IP地址: 

子网划分:便于查找目标主机

主机地址全0:网络号,代表这个局域网

主机地址全1:广播地址,用于给同一个链路中相连的所有主机发送数据包

127.*的IP地址用于本地环回,如127.0.0.1,发给本地的报文不必传递到IP下层:

 

CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加),仍然不是很够用.,这时候有三种方式来解决:
1.动态分配IP地址:只给接入网络的设备分配IP地址。因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的
2.NAT技术:通过路由器在数据通信的时候将私网IP转化为公网IP,从而使不同私网能有相同的私网IP,从而解决IP地址不足的问题
3.IPv6: IPv6并不是IPv4的简单升级版。这是互不相干的两个协议,彼此并不兼容;IPv6用16字节128位来表示一个IP地址,理论上完全足够了,但是目前IPv6还没有普及

私有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都是相同的,这时用NAPT技术,使用IP+PORT来建立这个关联关系。
如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上。

路由

路由就是在复杂的网络结构中找出通往目的的线路。

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

 对于每个节点而言,每个节点内部维护一个路由表,在Linux中使用route命令查看路由表:

如何转发数据包?

如果目的IP命中了路由表,就直接转发即可。
路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目default规定的接口发送到下一跳地址。
Destination:目的网络地址
Genmask:子网掩码
Gateway:下一跳地址
Iface:发送接口
Flags:U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发
假设某主机上的网络接口配置和路由表如下:
这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到
192.168.56.0/24网络;

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

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

再跟第二行的子网掩码做与运算得到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去;由于192.168.56.0/24正是与eth1接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;

转发过程例2: 如果要发送的数据包的目的地址是202.10.1.2
依次和路由表前几项进行对比, 发现都不匹配;
按缺省路由条目, 从eth0接口发出去, 发往192.168.10.1路由器;
由192.168.10.1路由器根据它的路由表决定下一跳地址

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「ABAP」一文带你入门OPEN SQL中的SELECT查询(附超详细案例解析)

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…

阿里云服务器价格,阿里云轻量应用服务器最新价格表

阿里云服务器从地域上来区分可分为ECS云服务器和轻量应用服务器,从活动内容来区分又可分为秒杀云服务器和新用户特惠云服务器,下面是截止目前,阿里云服务器最新的秒杀及新用户特惠购买价格,以表格形式形式展示出来以供参考。 阿里…

​ICLR 2023 | 图数据分布外检测:从能量模型出发

©PaperWeekly 原创 作者 | 吴齐天单位 | 上海交通大学博士生研究方向 | 机器学习与图深度学习继续探索 Graph OOD 的相关问题,与以往工作不同的是,这篇工作避开了复杂的数学推导和琐碎的数据生成过程,直接从简单有效的判别模型入手研究…

【Spring】掌握 Spring Validation 数据校验

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Spring Validation 数据校验一、什么是 Spring…

RAN-in-the-Cloud:为 5G RAN 提供云经济性

RAN-in-the-Cloud:为 5G RAN 提供云经济性 5G 部署在全球范围内一直在加速。 许多电信运营商已经推出了5G服务并正在快速扩张。 除了电信运营商之外,企业也对使用 5G 建立私有网络产生了浓厚的兴趣,这些私有网络利用了更高的带宽、更低的延迟…

【编程基础之Python】8、Python复合数据类型

【编程基础之Python】8、Python复合数据类型Python复合数据类型列表(List)创建列表访问元素内置方法列表操作元组(Tuple)创建元组访问元素集合(Set)创建集合基本操作其他操作字典(Dictionary&am…

4.ffmpeg命令转码规则、过滤器介绍、手动流map选项

在上章我们学习了ffmpeg命令行帮助以及选项查找 本章我们来深入学习ffmpeg命令转码规则、过滤器介绍、手动流map选项 参考链接: 1.ffmpeg命令行转码流程 ffmpeg命令行转码流程如下图所示: 对应中文则是: 步骤如下所示: ffmpeg调用libavformat库(包含解复用器)来读取输入文件…

Linux -- 查看进程 PS 命令 详解

我们上篇介绍了, Linux 中的进程等概念,那么,在Linux 中如何查看进程呢 ??我们常用到的有两个命令, PS 和 top 两个命令,今天先来介绍下 PS 命令~!PS 命令 :作用 &#x…

C语言拔高知识——指针的进阶(万字大文超详细)

在之前的文章中,我已经讲解过了初阶指针的内容,今天就来讲一讲指针的进阶! 上篇指针地址:保姆式指针讲解,超详细,适合初学者_指针详解_陈大大陈的博客-CSDN博客 目录 1. 字符指针 2. 指针数组 3. 数组指…

3年测试经验的人来面试,简历都没写明白,一开口就要给20K的offer?

​我最近阅读了大约15份简历,他们都在申请我的团队的测试工程师职位。但是没有一份表达清楚了他是如何进行测试的。 下面我摘录了一些 信息: 几乎所有的应聘者都罗列了成串儿的他们熟悉的“技术”(包括但不限于….Net, Unix&#…

c++基础/类和对象

c基础 2.1名字空间 namespace 防止命名冲突 说明&#xff1a;名字空间可以在全局作用域或其他作用域&#xff08;另一个名字空间&#xff09;内部定义&#xff0c;但不能在函数或类的内部定义。 使用&#xff1a; #include<iostream> using namespace std; //std中包…

【C/C++ 数据结构】-八大排序之 冒泡排序快速排序

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【C/C数据结构与算法】 分享&#xff1a;那我便像你一样&#xff0c;永远躲在水面之下&#xff0c;面具之后&#xff01; ——《画江湖之不良人》 主要内容&#xff1a;八大排序选…

前端构建工具大盘点:gulp、webpack、vite、rollup、esbuild、snowpack、babel、parcel、swc、tsc

文章目录背景分类转译器打包器对比gulp VS webpackBundle vs Bundleless&#xff08;代表就是webpack VS vite&#xff09;其他比较个人理解总结官网背景 做前端也有好多年了&#xff0c;从最早的 jQuery 时代到现在的三大框架&#xff0c;这过程中用到了很多构建工具&#xf…

婴幼儿常见八大疾病及护理方法

在1岁之前&#xff0c;婴儿的体质还没有完全发育&#xff0c;很容易生病&#xff0c;大多数婴儿在1岁之后都会更好。今天&#xff0c;新的稀有婴儿育儿专家组织了一些婴儿最容易患的疾病和护理方法。1、新生儿黄疸宝宝出生后&#xff0c;你可能会注意到他的皮肤发黄。别担心&am…

Netty学习(三):Netty线程模型和代码示例

〇、前言网络编程的基本线程模型&#xff0c;详见&#xff1a;Netty学习&#xff08;二&#xff09;&#xff1a;线程模型一、工作原理简图Netty主要基于主从 Reactors 多线程模型&#xff08;如下图&#xff09; 做了一定的改进&#xff0c;其中主从Reactor 多线程模型有多个R…

11_MySQL数据处理(增删改)

1. 插入数据1.1 实际问题解决方式&#xff1a;使用 INSERT 语句向表中插入数据。1.2 方式1&#xff1a;使用VALUES使用这种语法一次只能向表中插入一条数据。情况1&#xff1a;为表的所有字段按默认顺序插入数据INSERT INTO 表名 VALUES (value1,value2,....);值列表中需要为表…

Windows安装Liberica JAVA8

在浏览器打开下载&#xff1a;Liberica JAVA。 点击链接"下载MSI"相对应的Microsoft Windows版本。 下载后完成后&#xff0c;验证的文件&#xff0c;通过比较其大小对你的驱动器和下载的页。 一个更加先进的方法来验证检验和在PowerShell&#xff1a; (Get-FileHas…

软件测试之测试环境--XAMPP

1. 测试环境 Linux下的环境搭建 LNMP: LinuxNginxMysqlphp项目 Windows下的环境搭建 WAMP: WindowsapacheMysqlphp项目 2. Xampp安装及使用 XAMPP包括Apache、MySQL、PHP、PERL&#xff0c;直接解压缩&#xff0c;没有复杂的安装过程&#xff0c;强烈推荐初学者使用。 到目前…

【C/C++基础知识点】输出n位斐波那契数列

目录 前言什么是斐波那契数列兔子的故事小知识点收尾前言 在软件行业已经有快十年,技术虽然一般般,但是足够应付额解决编程入门的相关问题! 都说十年磨一剑,积累到一定经验,是时候发挥自己的价值,给予入门的同行些许的帮助! 为什么要写收费专栏,其实原因很简单,时间就…

使用VNC远程连接Ubuntu - 内网穿透实现公网远程办公

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…