首页 > 系统相关 >[Linux网络]网络层-IP协议与数据链路层

[Linux网络]网络层-IP协议与数据链路层

时间:2024-12-09 19:28:11浏览次数:5  
标签:ARP IP 报文 Linux 主机 IP地址 链路层 路由器

一、IP协议

1.IP协议的简单认识

        在TCP或UDP协议的传输层协议发送给对方的数据并不是直接给对方发了过去,而是需要经过网络层以及下面的数据链路层最后交到网卡才发送出去了。那么网络层协议做了什么呢?或者说IP协议做了什么呢?       

        TCP协议是有可靠传输的能力,他是有这个能力,但不等价于它能够将数据传输出去。在整个网络协议栈中,TCP协议做的是提供可靠传输的策略,而IP协议才是真正提供从主机A到主机B传输报文的能力。最重要的是封装了IP地址,可以在网络中找到唯一的一台主机,在通过TCP协议中的内容解析交到指定的主机应用进程中来。

        所以说IP协议提供了将数据跨网络传输的能力,和传输层的协议配合之后,满足用户提供想要的可靠方式进行传输数据。

2.IP的构成

        IP地址是由目标网络+目标主机构成的,也就是说先找到目标主机所在的网络,之后在该网络下寻找目标主机,这样做可以淘汰其他局域网,提供了数据传递的效率。

3.IP协议报文

报文与有效载荷的分离

        定长数据+自描述字段:通过定长数据,找到4位首部长度,也就是报头的长度,之后找到16位总长度,减去报头就是有效载荷的长度了。

报文的向上交付

        通过8位协议字段,该字段记录了传输层使用的协议,通过该字段就可以知道传输层用的什么协议了,之后就可以向上交付了。

8位生存时间(TTL)

        又称为数据报到达目的地址的最大跳数。当一个IP报文发出去了之后,这个报文就会在网络中不断的转发传递,假如说对方的主机已经离线了,或者报文的目的IP不对等等其他原因导致IP报文永远无法到达指定的对端主机,那么报文不能一直存在与网络中,这样一定会造成网路拥塞的,所以对于这些报文要进行销毁处理,但是什么时候销毁呢?是由8位生存时间决定的,报文每进行一次转发8位生成时间就减少一些,等到生成时间减为0后,路由器或者一些中转设备接收到生存时间为0的报文,不会继续转发了。也就将报文销毁了。

16位标识

        当一个IP数据包在被发送之前,可能会因为数据链路层无法一下发那么大的数据或者其他因素,把IP数据包分割成了多个较小的片段,也就是分片,那么这16位标识就是用来标志被分开的数据哪些是一起的,也方便到达目的主机后的数据重组。

3位标识与13位片偏移

        3位标识的第一位保留不用,第二位为1的话,则代表禁止对该IP数据包进行分片,第三位则表示更多分片的意思。对于第三位来说最后一个分片为0,其余的其他分片全为1,那个唯一的0也是表示该分片后的IP数据包结束的那个分片。

        13位片偏移则是代表着相对于原始的IP数据包的偏移,实际上是要*8的,所以除了最后一个之外,其余的都是报文长度8的整数倍

如何知道一个IP数据包被分片了呢?

        存在片偏移不为0的IP数据包或者第三位标志位为1。

如果有丢包的呢?

        也会知道,丢开头的,则没有片偏移为0的数据包,丢最后一个,则没有第三标志位为0的数据包,丢中间的话,片偏移不连续。但是最好还是不要让其做分片处理,因为如果一旦有一个分片丢包的话,整个IP数据包都需要重传

4.路由器

        当数据传输的过程中一定会经历路由器设备,帮助我们完成数据报的下一跳。路由器的本质其实也是一个特定的子网的主机,所以也要有自己对应的IP地址,用来标识自己,数据报也是通过IP地址找到的路由器。路由器也是不同子网进行通信的一个出入口,所以一般他会处于2个及以上的子网当中,所以他就会配备多个IP,有多个网卡。

        路由器是工作在网络层的,所以原则上他是没有传输层和应用层的,也解析不了传输层和应用层的报文,解析到网络层之后,查看这个报文的目的IP之后,继续封装发送到下一个路由器或者主机。

        路由器的工作不仅仅是IP的转发,还有一个功能就是构建局域网,在一个子网当中,路由器的网络IP号一般是xx.xx.xx.1号IP,当我们家里的路由器配置好了之后,手机等设备进行接入网络之前是没有IP地址的,接入了之后才会分配对应的IP地址,是由路由器随机分配的,而且每次没配的可能都不一样,所以也可以说是动态分配的IP地址。

5.IP网络的划分

如何划分

        Ip地址是32位的,也就是说有大概42亿多个IP地址可以被使用,但是全球有70多亿人口,就算有10亿的网民,加上路由器,以及一个网民有多个设备的话,42亿也远远的不够用。网络兴起了之后,很多组织申请喜欢申请B类网络,导致B类网络很快就被分配完毕了,而且存在大量的地址浪费,以为申请到一个B类网络之后,可以接入2^16个设备,但是基本上都是用不完的,所以该方案存在很大的弊端。

CIDR方案

        所以为了解决IP地址不足以及大量浪费的问题,推出了CIDR方案,就是在原有的方案基础之上,添加了子网掩码,也是一个32位的整数,用于进行划分网络号和主机号,以1开头,以0结尾,大概就是这样的形式111111.....00000。将IP地址和子网掩码进行&的操作之后,得到的才是获取到的网络IP号的起始IP地址,网络掩码全取反之后代表的是申请到的IP地址个数。例如:140.252.20.68/24,就是代表前28位是网络号,&上子网掩码后得到140.252.20.64就是起始IP地址,子网掩码取反后是15,代表了申请了15个IP地址,所以本次申请到的IP地址范围是在140.252.20.64~140.252.20.78。

        CIDR方案,本质上是减少了IP地址的浪费问题,但是IP还是32位,那么也就还是42亿多个IP地址,没有解决IP地址数量的问题。

        为什么说CIDR解决了浪费的问题呢?例如,申请了一个B类网络,该网络只有10台主机,那么就留下4位给主机号,剩下的28位全部作为网络号,子网掩码设置为28,这样的话,正常申请的B类网络可以包含2^16个主机,那么现在才用了10个,剩下的通过子网掩码的方式,还可以分配2^12个有10个IP地址的局域网了。或者分配别的更多主机号的子网,都可以了。

一些特殊的IP地址

        将IP地址的主机号全部位置为0,则代表的是网络号,代表局域网号。
        将IP地址的主机号全部位置位1,则代表该局域网的广播地址,用于在一个链路中相互连接所有主机发送的数据报。
        以127.开头的所有IP地址都是用于本地换回测试的IP地址,通常是127.0.0.1

6.解决IP地址不足的问题

动态分配IP

        例如路由器的做法,只有设备链入网络之后,才会给你分配IP地址,采用动态分配的方式。

NAT技术

        文章后面详细讲解。

IPv6协议

        扩大分配个IP地址的字节数,改为16字节128表示一个IP地址,但是IPv4和IPv6协议互补支持,不互相兼容,如果想要适配IPv6协议的话,就需要让联网的所有设备的操作系统去升级才可以难度还是很大的,所以说为什么现在国家让一些大型互连网企业去必须支持IPv6协议的原因,先设配一部分,慢慢升级和变化。

私有IP和公有IP

        私有IP前缀通常是10.*、127.16.*~127.31.*、192.168.*,剩下的都是公网IP,我们在Linux下使用的ifconfig显示的就是私网IP。

        因为做到IP地址唯一是因为,在公网的时候,能通过IP地址找到唯一的一台主机设备,但是如果说不进行与互连网交互的时候,没必要分配给他一个唯一的IP了。这样做的话,可以让不同的局域网中出现相同的IP,当真正要访问互连网的时候,在通过局域网中的路由器转换位WAN口IP、公网IP。这种将私有IP不断的替换和转化为公有IP的技术也叫转NAT技术。 

二、网络技术

1.全球网络的构成

        IP地址是一份大的资源,是全世界一起来使用的。假设说全世界一共有256个国家,那么IP地址的前8位可以用来区分和表示不同的国家了。每一个国家都有自己的国际路由器,通过把各个国家的国际路由器连接起来,就可以实习国际通信了。

        之后每个国家在去细分自己掌握的IP资源,在我国来说,可以分为不同的省份,那么每个省份也可以进行划分,使用6个比特位,把不同的省进行编号区分开了。每一个省也都有自己的国内路由器,把这些国内路由器连接在一起,就可以实现国内跨省的通信了。

        按照上述的方式,在使用一些比特位去在省内区分各个地级市、县城、村庄。当划分到一定程度之后,剩下的位数不够了,则不会继续划分,而是采用私有IP的方式了,这样的话就完成了一个国家的IP地址划分。如今的互连网也是采用公网IP和私有IP结合的方式。

        如果说一个外国人想要和我们进行通信的话,他发送的内容会先到达他们国家的国际路由器,在国际路由器中进行识别,检测目的IP前八位是中国的编号之后,会发送给中国的国际路由器,中国的国际路由器再次识别向省、市等传递,每一级别的路由器都会对特定的IP地址的若干位进行鉴别,最终准确的将消息传递到我们手机里。跨省通信也是一样的,发送的数据要先到省级路由器,然后发送给对应的省级路由器,之后在向下传递到各级路由器,最后到对端主机上。

2.NAT技术与NAPT技术

        路由器是有构建子网的能力的,我们平时使用和看到的基本上都是私有的IP地址,是由路由器给我们随机生成的IP地址。当我们想访问一些当前子网之外的的IP地址,例如访问腾讯的服务器时,都是通过路由器转发的,路由器收到报文之后,查看IP地址不是当前子网的,就会向外转发,最终到达腾讯的服务器。那么问题来了,腾讯服务器想给我们应答一些内容的时候,怎么找到我们呢?我们用的是私有IP啊。

        其实路由器是可以配置两个IP地址的,一个是WAN口IP,另一个是LAN口IP(子网IP),路由器LAN口连接的主机,都是属于当前这个路由器网络的子网中的设备。当子网中的设备想要把保报文发送到公网或者子网之外的地方时,目的IP不会改变,但是源IP会被替换成WAN口IP,使用WAN口IP作为源IP,当腾讯服务器发送应答的时候,报文的目的IP就会是路由器WAN口IP,而不再是私有IP,腾讯服务器会认为是NAT路由器发送给我的报文,服务器的响应报文就会发给NAT路由器,之后在经过路由器的转化,就可以将应答报文发送到访问服务器的主机了。

        这种不断从内网转换为公网的技术,是网络地址转换技术,也就是NAT技术。该技术诞生的根本原因还是因为IP地址紧缺不够用,公网IP划分落实到省、市之后就没剩多少了,没法进行划分了,所以就把省内或者说市内的网络采用内网私有IP的方案进行处理了。

        NAPT技术,解决的是,响应报文从公网回来之后到达路由器,下一步该往哪个主机或者哪个子网中发送的问题。当有多台主机同时访问外部网络的服务器时,经过替换源IP地址,都会替换成一样的源IP地址,那么发回来的报文要想正确的回到对应的内网的各个机器中,就需要进行记录了。路由器会构建一个映射关系,也就是NAT转换表,当内部机器向外发送数据的时候,不但会替换源IP地址,而且会在NAT路由器上生成一个唯一的端口号,把私有IP:port和WANIP:唯一port之间建立映射关系,当服务器给NAT路由器发送了应答之后,通过解析端口号,通过映射表找到该发送到内网中的哪一台主机中。

        虽然说NAT技术可以有效的解决IP地址不足的问题,但是缺点也很明显,外部的服务是无法直接访问内部网络的主机的,也就是说必须内网的主机主动建立连接才能进行通信。再有就是NAT的转化表生成和销毁也是有性能开销的,当设备出现异常的时候,会影响整个内网的通信。

3.内网穿透

        可以解决两个不同内网主机的通信问题,最常见的就是QQ、微信。

        最简单的实现方式就是两个内网的主机先和一个公网的服务器建立连接,并将自己的内网地址和端口等信息告诉公网服务器,内网A主机想和内网B主机通信的话,内网A主机先把数据发送到公共服务器上,公共服务器在解析之后,将数据发送到内网B主机里面。

4.代理服务器

        最常见的代理服务器就是校园网系统,我们会发现,一般校园网都不需要密码就可以直接连接到网络,但是,当我们上网的时候,如果不认证信息的话,是无法进行获取网络信息的,这是为什么呢?在校园网的内网环境下,我们发送的所有内容,包括向qq服务器发送消息、向腾讯服务器发送请求等,都先到达了学校的代理服务器,代理服务器会进行判断,进行通信的设备是否进行验证,只有验证身份通过的才可以发送数据,也就是说只有验证通过之后,代理服务器才会把你想要发送的内容帮你发送出去。验证失败的话,就不会传递给路由器设备了。同时服务端返回的响应也是先到达代理服务器,服务器在发送给我们。

        这种校园网代理服务器可以有效的进行身份认证,只有该校的人员才能够认证成功使用网络。还可以对于一些经常访问的页面、文件等数据进行缓存,当用户再次请求该资源的时候,可以立刻返回不用再去向指定的服务器申请了,提高了网络的性能和效率。还有对于一些不良网站信息就行过滤等功能。这种代理客户端的属于正向代理,下面是反向代理的例子。

        一个公司有很多台服务器,同时把ip地址和端口号都暴露出来,供用户去访问获取资源,如果说绝大多数用户都访问其中一台服务器的话,其他服务器就会很闲,为了解决这种情况,我们可以使用代理服务器技术,只对外提供一个ip和端口号,对于大量用户的请求,通过代理服务器左分流处理,均衡的分给每一个服务器去处理请求。帮助服务端的是反向代理。

        反向代理最常用的场景就是帮助企业进行负载均衡。

三、数据链路层

1.跨网络传输的过程

        主机A和主机B在两个不同的局域网中,当主机A想给主机B发送信息的时候,会先查看路由表,发现主机B的网络号(IP地址)不属于A所在的网络区域,会将数据发送到路由器R,所以在数据链路层封装的时候,会将目的地址设置为R。到达R之后,会解包发现是给我的,会根据类型向上交付到路由器的网络层,R对比路由表之后发现也不是我所在网络的,之后会重复相同的操作进行封装发送到路由器S,路由器向上解包,在网络层对比路由表发现主机B是我局域网里面的,所以把报文发送到局域网内部,在内部只有主机B有机会向上交付,其他的主机都会丢弃报文。

2.MAC帧报头

如何解包:定长数据格式
如何向上交付:依靠类型字段
类型:0800:IP、0806:ARP、8035:RARP

3.MTU

        MTU表示在数据链路层发送报文中的数据长度最大是多少,因为由MTU的存在那么就倒逼着网络层的IP数据包小于MTU,如果网络层封装的来自传输层的报文过长的话,就需要进行分片处理,但是分片又不好,所以倒逼着传输层给网络层的报文长度为MTU - IP报头长度,那么传输层一次从自己的缓冲区中拿的数据长度就是MTU - IP报头长度 - TCP报头长度,该长度叫做MSS,也是在三次握手的时候协商的。

4.ARP协议

        由上述的第一点所说的,但是路由S怎么知道主机B的MAC地址呢?主机A又怎么知道路由R的MAC地址的呢?通过ARP的转换,ARP协议主要是用来在局域网中,将目标主机的IP地址转换为MAC地址。原理也很简单,就是会采用广播的方式,发送ARP请求,问该IP的主机是谁,对应IP主机收到后会将自己的MAC地址以ARP响应的方式返回,那么就知道了对应IP的MAC地址了。

ARP报文

硬件类型:ARP报文可以在哪种类型的网络上传输,值为1时表示为以太网地址。
协议类型:硬件地址要映射的协议地址类型,值为0x0800时,表示IP地址转化为MAC地址
MAC地址长度:标识MAC地址长度,以字节为单位,此处为6。
IP地址长度:标识IP得知长度,以字节为单位,此处为4。
操作类型:ARP报文类型。1为ARP请求报文,2为ARP应答报文

上述这几项通常都为固定写法。

ARP获取MAC地址的过程

        ARP报文发送的时候也需要添加MAC帧报头,形成MAC帧报文,但是我们发送ARP请求就是为了找MAC地址呢,所以目的地址怎么填写呢?目的地址写全F,表示的是该报文是广播报文,局域网内的主机都会收到,收到后解包,读取目的地址为全F,就知道是广播报文了,则会继续识别类型,读取到是0806就表示ARP报文了,会向上交付到ARP软件层处理,ARP层会先查看,如果操作类型是请求还是响应,如果是请求的话,那么在可靠目的IP地址是不是自己,如果不是则丢弃,是的话,则构建ARP响应报文,封装MAC帧报头,返回给发送请求的主机。

ARP的缓存机制

        ARP也会又自己的缓存,当获取到ip和mac对应的关系后,一段时间内会进行保存,只有在缓存中没有的时候,才会发送ARP请求报文进行获取。缓存机制也会提高效率。

基于ARP欺骗的中间人模式

        如果收到多次ARP应答的话,总会存放那个最新的映射关系版本。如果说又中间人经常给我们的主机发送ARP应答,把局域网的出口路由对应的MAC地址改为他自己的设备的话,我们发送的数据就会根据假的映射,到达他的主机当中,相当于给我们实现了断网操作,而且有数据泄露的风险。

四、其他协议

1.DNS域名解析服务

        互联网核心服务之一。它将域名与IP地址相互映射,方便用户记忆和访问网站。简单来讲就是把我们输入的字符串转换为ip地址和端口号

2.ICMP协议

        是一个介于TCP协议之下,IP协议之上的协议。一个搭建好的网络平台,往往都需要进行测试连通性,但IP协议是不可靠传输,如果丢包了,IP协议也不会通知是否丢包以及丢包的原因。ICMP协议则提供了保证,如果不可到达目的地,会反向返回一个不可达的原因。ping的命令就是基于ICMP网络层协议。

标签:ARP,IP,报文,Linux,主机,IP地址,链路层,路由器
From: https://blog.csdn.net/m0_74207969/article/details/144310919

相关文章

  • linux-12 关于shell(十一)ls
       登录系统输入用户名和密码以后,会显示给我们一个命令提示符,就意味着我们在这里就可以输入命令了,给一个命令,这个命令必须要可执行,那问题是我的命令怎么去使用,命令格式有印象吗?在命令提示符下,我们首先是命令吧?command,后面可以带什么?参数对吗?options,再后面是arguments,我们......
  • Linux常用命令之top命令详解
    top命令是Linux系统中用于实时监控系统性能的一个非常强大的工具。它提供了一个动态的、实时的视图,展示了系统的整体状态,包括CPU使用情况、内存使用情况、交换空间使用情况以及正在运行的进程的详细信息。top命令的主要功能实时更新:与静态命令如ps不同,top会每隔......
  • JS-4 JavaScript 引入到文件
    JavaScript常用引入方式:嵌入到HTML文件中、引入本地独立JS文件、引入网络来源文件1、嵌入到HTML文件中<body>  <script>    varage=20;    console.log(age);  </script></body> 2、引入本地独立JS文件<body>  <scriptsrc=".......
  • JavaScript 基础语法入门
    JavaScript是一种运行在浏览器中的编程语言,适合初学者快速上手。以下内容是JavaScript的基础语法介绍。1.JavaScript的引入方式内嵌式在HTML文件中,通过<script>console.log("Hello,JavaScript!");</script>外部文件引入将JavaScript写入独立的文......
  • JS-2 JavaScript语句、标识符
    1、语句JavaScript程序的单位是行(line),也就是一行一行地执行。一般情况下,每一行就是一个语句varnum=10;语句以分号结尾,一个分号就表示一个语句结束。 在html中用script写css 2、标识符标识符(identifier)指的是用来识别各种值的合法名称。最常见的标识符......
  • Netty 源码分析之 二 贯穿Netty 的大动脉 ── ChannelPipeline (一)
    目录源码之下无秘密──做最好的Netty源码分析教程Netty源码分析之番外篇JavaNIO的前生今世JavaNIO的前生今世之一简介JavaNIO的前生今世之二NIOChannel小结JavaNIO的前生今世之三NIOBuffer详解JavaNIO的前生今世之四NIOSelector......
  • 腾讯通RTX停更后升级指南,兼容移动端及Linux系统
    一、腾讯通RTX继续使用的难题自腾讯通RTX停止更新并下架官网后,其用户面临着一系列无法克服的问题。这不仅包括失去技术支持、版本更新和资源下载的渠道,还涉及以下使用问题:●不兼容国产系统与移动端:腾讯通RTX仅适配Windows和Mac系统,无法支持统信UOS、银河麒麟等国产操作系统以及......
  • (2)JS-Clipper2之Clipper
    1.类描述            Clipper类封装了多边形上的布尔运算(交集、并并、差和异或),也称为多边形裁剪。输入多边形(主题subject 和剪辑集 clipsets)通过Clipper对象的AddPath和AddPaths方法传递给它,剪辑操作通过调用它的Execute方法执行。通过重复调用Execute,可以......
  • (6)JS-Clipper2之ClipperOffset
    1.描述ClipperOffset类封装了对打开路径和关闭路径进行偏移(膨胀/收缩)的过程。这个类取代了现在已弃用的OffsetPaths函数,该函数不太灵活。可以使用不同的偏移量(增量)多次调用Execute方法,而不必重新分配路径。现在可以在一次操作中对开放和封闭路径的混合进行偏移。此外,Off......
  • Linux中安装配置MongoDB
    最近在整理自己私人服务器上的各种阿猫阿狗,正好就顺手详细记录一下清理之后重装的步骤,今天先写点数据库的内容,关于在Linux中安装配置MongoDB说实话为什么会装MongoDB呢,因为之前因为公司需要做点Nodejs的中间件,我顺手玩了一下MongoDB的CRUD,文档型数据库还是挺有意思的安装环境Ce......