当前位置: 首页 > news >正文

【计算机网络】网络层——IP协议

 9efbcbc3d25747719da38c01b3fa9b4f.gif

                                                      作者主页:     作者主页

                                                      本篇博客专栏:Linux

                                                      创作时间 :2024年5月22日

9efbcbc3d25747719da38c01b3fa9b4f.gif

一. 基本概念

IP指网络互连协议,Internet Protocol 的缩写,是TCP/IP中的网络层协议,设计IP的目的是实现可扩展性,一是解决互联网问题,实现大规模,易构网络的互联互通,二是分割顶层网络应用和底层网络技术的耦合关系,以利于两者的独立发展。根据端到端的设计原则。IP只为主机提供一种无连接,不可靠,尽力而为的数据包传输服务

TCP提供数据控制,IP提供数据传输。TCP为传输层协议,其保证传输的可靠性和传输效率,下层的网络层和数据链路层负责数据在网络中的传输。

双方在进行网络通信时,数据并不是从一方的传输层直接发送到另一方的传输层的,而是需要依次向下交付给网络层和数据链路层,然后发送到网络中;对方主机拿到数据后,也需要依次向上交付解包。如下图

数据自顶向下交付,各协议层添加报头的过程叫做封装;报文自底向上,各协议层移除报头的过程叫做解包

网络层的作用就是将数据包从一台主机转发到另一台主机,也叫做路由


专有名词解释

  • 主机:配有ip地址,但不进行路由设备的控制
  • 路由器:既配有ip地址,也可以进行路由设备的控制
  • 节点:主机和路由器的统称

需要注意的是,现代操作系统的某些特定配置下,也可以使得主机具备一定程度的路由功能。比如支持NAT(网络地址转换),但这并不是主机的主要功能。路由器也可以被称为主机

二. 协议报文格式

  • 4位版本号(version):对于IPV4来说就是4
  • 4位头部长度(header length):ip头部的长度,基本单位是4字节,也就是length*4的字节数。比如length = 4,那么报头长度(包括选项)就是4*4=16。4bit表示的最大数字是15,因此IP报头的最大长度是60字节。因为20字节是固定长度,所以选项部分最大为40字节
  • 8位服务类型(Type of service):3位优先权字段(已经弃用),4位TOS字段和1位保留字段(必须为0,后续发展补充)。4位TOS分别为最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个,对于ssh/telnet这样的应用程序,最小时延比较重要;对于ftp这样的程序,最大吞吐量比较重要
  • 16位总长度(total length):IP数据报整体占多少字节
  • 16位标识(id):唯一的标识主机发送的报文,如果IP报文在数据链路层被分片了,那么每一片里的标识都是相同的
  • 3位标志字段:第一位保留(现阶段不用,后续发展补充);第二位为0表示禁止分片,此时如果报文长度超过MTU长度,该报文就会被直接丢弃;第三位表示“更多分片”,如果分片,最后一个分片的“更多分片”标志位为0,其他都是1
  • 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移,其实就是在表示当前分片在原报文中处于哪个位置,分片偏移的单位是8字节,即如果分片偏移是100,那么实际偏移字节数就是100 * 8 = 800。因此,除了最后一个报文,其他报文的长度必须是8的整数倍(否则报文就不连续了

  • 8位生存时间(Time of live——TTL):数据报到达目的地的最大报文跳数,一般是64。每经过一个路由,TTL - = 1,一直减到0还没到达,那么就丢弃这个报文。该字段主要用来防止出现路由循环
  • 8位协议:表示上层传输层协议类型
  • 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏
  • 32位源地址:发送端,源主机IP地址
  • 32位目的地址:接收端,目的主机IP地址
  • 选项字段:不定长,最多40字节

分片与组装

传输层给IP层的数据如果较大,IP层还需要对此进行分片,然后依次交付给下层的数据链路层。这是因为在数据链路层有着MTU——最大传输单元的限制。

数据链路层规定,IP数据包最大的长度为1500字节,这也反向规定了TCP数据段的最大长度——MSS(最大段尺寸),MSS的值会设为MTU减去IP头部和TCP头部的长度,以保证TCP报文段在传输过程中不会被分片

分片:

  • 首先,同一个数据包的分片,标示id是相同的
  • 3位标志字段,第三位 “更多分片” 为0代表是分片的最后一个,为1则不是最后一片,可能是起始,也可能是中间
  • 13位偏移,指示了该数据包相对于起始数据包的偏移量

举例:将一个4500字节的TCP数据段分片封装,认为IP报文没有选项字段,即固定20字节长度

MTU的1500字节是包括IP报头的,所以有效载荷部分最大为1480字节

  • 因为属于同一数据段,所以16位标识相同
  • 3位标志字段,第二位为1表示允许分片;第三位为0表示分片的最后一个分片,为1则不是最后一个
  • 13位分片偏移是相对于起始分片的偏移量

组装

1. 不同客户端发送的数据包,16位标识可能重复,如何区分?

数据包中有ip地址,ip地址不会相同

2. 接收端怎么知道是否有分片

  • 如果3位标志位的第三位“更多分片”为1,代表是分片中的一片(不是最后一片)
  • 片偏移不为0(不是起始分片)
  • 片偏移为0,但“更多分片”为1(起始分片)

3. 如何保证分片收齐

  • 起始分片:更多分片为1,片偏移为0
  • 中间分片:更多分片为1,片偏移大于0
  • 结束分片:更多分片为0,片偏移大于0
  • 独立数据包(没有分片):更多分片为0,片偏移为0

首先可以保证,起始和结束分片是否收到一定知道;其次中间分片是否收全,IP层需要将所有分片进行排序,然后看每个分片的片偏移是否都等于前一个分片的片偏移+16位总长度

4. 如何组装和确保组装无误

按序排好后,只要分片没有丢失,就可以保证组装成功。如何组装?只要将报头和有效载荷分离,有效载荷依次向上层传输层交付即可

三. 网段划分

IP地址标识网络中唯一一台主机,端口号标识主机中唯一一个进程。所以IP地址+端口号可以表示网络中唯一一台主机的进程

网络通信的实质是,网络中,两个不同主机的进程的通信

端口号在传输层使用,而IP地址在网络层使用

IP地址分为两部分:网络号和主机号

  • 网络号:保证相互连接的两个网段(局域网)具有不同的标识
  • 主机号:同一网段(局域网),主机之间具有相同的网络号,但必须有不同的主机号

1. 第一次划分 

过去曾经提出一种划分网络号和主机号的方案,把所有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地址属于哪一类时,只需要遍历IP地址的前5个比特位,第几个比特位最先出现0,那么就对应属于哪一类IP地址

主机号越多,代表该网络可容纳的主机数越多

但随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快分配完了,而A类却浪费了大量的地址:

例如,申请一个B类地址,理论上该子网中允许容纳6万5千多台主机

但实际网络架构中,不存在一个子网有这么多主机的情况,因此大量的IP地址都别浪费掉

针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)

2. CIDR方案

在原有的五类网络的基础上继续进行子网划分,需要借用主机号当中的若干位充当网络号

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号
  • 子网掩码也是一个32位的正整数,通常用一串“0”来结尾
  • 每一个子网都有自己的子网掩码
  • 将IP地址和子网掩码进行“按位与”操作,得到的就是网络号
  • 网络号和主机号的划分与这个IP地址是A类,B类还是C类无关

可见,IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围

此时一个网络就被更细粒度的划分成一个个更小的子网,通过不断地子网划分,子网中IP地址对应的主机号就越来越短,因此子网中可用的IP地址的个数也越来越少,这就避免了IP地址被浪费的情况

需要注意的是,子网划分不是只能进行一次,我们可以在划分出来的子网的内部再继续进行子网划分

因此一个数据在路由器转发时——路由,随着数据不断路由进入更小的子网,其网络号的位数是不断变化的,准确来说其网络号的位数在不断增加,这就意味着IP地址中的主机号位数不断减少,子网规模不断变小。最终当数据路由到达目的主机所在网络时,就可以在该网络中找到对应的目的主机

四. IP地址不足

IP地址(IPv4)是一个4字节,32位的正整数,因此最多表示的主机数为,将近43亿个。又因为IP地址唯一标识网络中的一台主机,所以要想网络通信,就必须有IP地址。

但全球人口已经有超70亿,更何况不仅电脑,手机等设备,只要是需要上网的,都需要IP地址。由此可见,32位IP地址是远远不够的

因此才提出CIDR的方案,对已经划分好的五类网络继续进行子网划分,其目的就是为了减少IP地址的浪费。

CIDR虽然一定程度上缓解了IP地址不够用的问题,减少了IP地址的浪费,但IP地址的绝对上线并没有增加,即能表示的主机数没有增加。

为此,人们提出了以下几种方式:

  • DHCP协议:动态分配IP地址。只给介入网络的设备分配IP地址,因此同一个MAC地址(数据链路层)的设备,每次接入互联网中,得到的IP地址不一定相同,避免了IP地址强绑定与某一台设备。MAC地址是一个48位的地址,每一个网卡至少配备一个MAC地址。后续数据链路层再详细讲解
  • NAT技术:能够让不同局域网当中同时存在两个相同的IP地址,NAT技术不仅能解决IP地址不足的问题,而且还能够有效的避免来自网络外部的攻击,隐藏并保护网络内部的计算机
  • IPv6:IPv6用16字节,128bits来表示IP地址,从根本上缓解IP地址不足的问题。但IPv6并不是IPv4的简单升级,两者是互不相干的两个协议,彼此并不兼容。目前IPv6在公网还没有普及,但在我国的内网内,基本都已经支持IPv6

1. 私有IP和公网IP

如果一个组织内部组建局域网,IP只用于局域网内部的通信,而不直接连到Internet上,理论上,使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址。

  • 10.0.0.0 :前8位是网络号,共16,777,216个地址
  • 172.16.0.0  ~ 172.31.255.255 :前12位为网络号,共1,048,576个地址
  • 192.168.0.0 :前16位为网络号,共65,536个地址

包含在这个范围内的,都称为私有IP,只在子网(局域网)是使用,其余被称为公网IP(或全局IP)

2. DHCP协议

手动管理IP地址是非常麻烦的,当子网中新增主机时需要给其分配IP地址,当子网当中有主机断开网络时,又需要将其IP地址回收,便于后续给新增主机分配

  • 因此,对于IP地址的分配和回收一般不会手动进行,而是采用DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)协议
  • DHCP通常被应用在大型的局域网中,其主要作用就是集中管理地址,分配IP地址,使网络环境中的主机动态的获得IP地址,Gateway地址,DNS服务器地址等信息,并能够提高地址的使用率
  • DHCP是一个基于UDP的应用层协议,一般的路由器都带有DHCP功能,因此路由器也可以看作一个DHCP服务器

举例:

比如家里面的局域网的网络号为:192.168.2.

可用的IP地址就是192.168.2.0 ~ 192.168.2.255;一般规定.0和.255是不用的;路由器一般为局域网中的第一台主机,即192.168.2.1

DHCP的作用就是,当你的手机和你的电脑连网时,按顺序分配IP地址,如果早上你的手机先连,那么手机的IP地址为192.168.2.2,电脑为192.168.2.3;中午手机和电脑都断了网,下午电脑比手机先连,那么电脑的IP为192.168.2.2,手机为192.168.2.3。这就是动态地址分配——DHCP

3. 路由器

路由器是连接两个或多个网络的硬件设备,路由器上有两种网络接口,分别是LAN口和WAN口:

  •  LAN口(Local Area Network):表示连接本地网络的端口,主要用于家庭网络中的交换机,集线器或PC相连
  • WAN口(Wide Area Network):表示连接广域网的端口,一般指互联网

我们将LAN口的IP地址叫做LAN口IP,也叫子网IP;将WAN口的IP地址叫做WAN口IP,也叫做外网IP

4. NAT技术 

NAT技术是当前解决IP地址不够用的主要手段,是路由器的一个主要功能

  • 一个路由器可以配置两类IP地址,一个是WAN口IP,一个是LAN口IP
  • 路由器LAN口连接的主机,都从属于当前这个路由器的子网中
  • 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),即子网的第一个IP。子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了,即两个子网允许出现相同的主机号
  • 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN口IP就是一个公网IP了
  • 子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成WAN口IP),这样逐级替换,最终数据包中的IP地址会成为一个公网IP,这种技术成为NAT(Network Address Translation,网络地址转换)
  • 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有公网IP的服务器上,这样的服务器可以在阿里云/腾讯云等等云服务平台购买

5. 代理服务器

代理服务器(Proxy Server)是一种网络服务器,他充当客户端与目标服务器之间的中间人,处理客户端对目标服务器的请求。客户端向代理服务器发送请求,代理服务器将请求转发给目标服务器,并将目标服务器的响应返回给客户端。通过使用代理服务器,客户端可以隐藏其真实IP地址,并且可以提高网络访问速度和安全性。代理服务器还可以使用过滤网络流量,防止恶意攻击和访问受限内容等

代理服务器有两种类型:正向代理和反向代理 

  • 正向代理(Forward Proxy):位于客户和目标服务器之间,代表客户端向目标服务器发送请求。当客户端想要访问互联网上的资源时,它会将请求发送给正向代理服务器,然后由代理服务器转发请求并将响应返回客户端。在这种情况下,目标服务器不知道请求的真实来源是客户端,只知道请求来源于代理服务器
  • 反向代理(Reverse Proxy):位于目标服务器和客户端之间,代表目标服务器向客户端提供服务。当客户端想要访问某个服务时,它发送请求到反向代理服务器,然后由代理服务器将请求转发给后端的目标服务器,并将响应返回给客户端。对于客户端来说,它只知道请求和响应来自于反向代理服务器,而不知道真正提供服务的是哪个目标服务器

最后:

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.一个冷知识:
屏蔽力是一个人最顶级的能力,任何消耗你的人和事,多看一眼都是你的不对。

2.你不用变得很外向,内向挺好的,但需要你发言的时候,一定要勇敢。
正所谓:君子可内敛不可懦弱,面不公可起而论之。

3.成年人的世界,只筛选,不教育。

4.自律不是6点起床,7点准时学习,而是不管别人怎么说怎么看,你也会坚持去做,绝不打乱自己的节奏,是一种自我的恒心。

5.你开始炫耀自己,往往都是灾难的开始,就像老子在《道德经》里写到:光而不耀,静水流深。

最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!

相关文章:

  • 生成树协议(STP)配置详解:避免网络环路的最佳实践
  • Ubuntu Desktop 24.04 常用软件安装步骤
  • 【C++20新特性】ranges::sort()使用方法,优势,注意点
  • Python与自动驾驶数据集处理:构建智能驾驶的基石
  • DRIVEVLM: 大视觉语言模型和自动驾驶的融合
  • java jdbc执行Oracle sql文件
  • Centos系统资源镜像配置
  • 批量处理合并拆分pdf功能 OCR 准确率高 免费开源
  • Intel oneMKL 入门
  • 手机打电话时由对方DTMF响应切换多级IVR语音菜单(完结)
  • 基于deepseek 以及豆包工具+nodejs 搭建A I自动化客服系统
  • 【brpc】安装与使用
  • MySQL初阶:JDBC
  • WPF读取json文件,用到combox控件
  • 03_基础篇-NumPy(下):深度学习中的常用操作
  • 计算机三级数据库免费题库
  • Docker 挂载策略:何时使用临时容器拷贝默认配置,何时直接挂载?
  • 用Python和Backtrader库实现均值回归策略解析
  • 密码学标准(Cryptography Standards)介绍
  • 动态规划(七)——子数组系列(求和问题)
  • 国际网站建设的目的/百度快照客服
  • 三亚推广公司/淘宝seo培训
  • wordpress 手机首页设置/做网站建设优化的公司排名
  • 土木毕业设计代做网站/sem竞价是什么
  • 郑州富士康招聘/seo的工具有哪些
  • 网站建设移动端官网/怎样联系百度客服