赞
踩
坚决抵制日本无视全球人民健康,文明长远发展,极其自私自利,向海洋倾倒核污水的行为
本专栏更新速度慢,简单讲讲那些特别散乱杂的知识,欢迎各位朋友订阅专栏
感谢一路相伴的朋友们
博主这段时间可能不会关注大家的留言和私信了,因为要备考力,希望大家理解
浅淡计算机系列第3篇
目录
DNS是什么?DNS的数据包是怎么发出怎么发回的?分片偏移是什么?递归查询是什么?如何避免DNS污染?那么强的DNSSEC是什么?HTTPDNS怎么回事,中间人攻击是怎么做到的?TCP/IP的层数?集线器是什么东西?我们熟悉的交换机?MAC地址和MAC地址表?IP地址?路由?怎么理解?子网是什么东西?路由表是啥?
在DNS数据包发出之前,会先使用UDP协议头,UDP协议头由以下部分组成:
总共8个字节
之后会加入IP协议头,由以下组成
P.S.:
IP协议头还有可选部分,包括选项字段和填充字段,用于提供可选项和填充
*:1998年IETF把这个字段改名为区分服务(Differentiated Services)
是不是有点不说人话,我们来举个例子:
假设你是一个快递员,你要把一份包裹送到收件人的地址
在送包裹之前,你需要填写一份快递单,上面包含了以下信息:
这个例子和IP协议头中的各个组成部分有类似之处。以下是对应的解释:
如何理解分片和偏移
分片和片偏移是IP协议中用于处理大数据包的机制
分片(Fragmentation)是指当数据报的大小超过了网络的最大传输单元MTU(Maximum Transfer Unit)时,将数据报分成多个片段进行传输的过程
在网络通信中,每个数据报都有一个头部,用于指示数据报的长度和目标地址等信息。但是,每个网络层的MTU大小是不同的,根据所使用的网络类型(如以太网、PPP等)而有所不同
当数据报的大小超过了目的网络的MTU时,就需要进行分片,分片时,先将数据报分成多个小片段,每个片段的长度都小于MTU,然后每个片段独立传输,到达目的地址后再重新组合成原始的数据报
片偏移(Fragment Offset)是指在分片后,每个片段在网络中的位置。每个片段都有一个片偏移值,用于指示该片段在原始数据报中的位置。片偏移值的范围是0到(总长度/MTU),其中总长度是指原始数据报的总长度。例如,如果原始数据报的长度为1200字节,MTU为1500字节,那么将进行两个片段的分片,第一个片段的片偏移值为0,第二个片段的片偏移值为800(1200/1500*1500)
通过分片和片偏移的机制,IP协议能够处理不同大小的数据报,确保数据的正确传输。但是需要注意的是,分片和片偏移会增加了数据传输的开销和复杂性,因此在网络配置中需要合理设置MTU大小,以减少不必要的分片和片偏移操作
来举个例子
假设你有一份很长的文件,比如一个电影,需要通过网络传输到另一个地方
但是网络传输中有一个限制,就是每个数据包的长度有限制,比如最大只能传输1500字节
如果你的文件超过了1500字节,就需要将文件分成多个数据包进行传输,这便是分片
当你将文件分成多个数据包进行传输时,每个数据包都有一个偏移值,偏移值可以理解为每个数据包在原始文件中从哪个位置开始传输
比如,如果你的文件有2000字节,那么偏移值为0的数据包表示从文件的第1字节开始传输,偏移值为1的数据包表示从文件的第1501字节开始传输,以此类推,在接收方,需要将这些数据包按照偏移值重新组合成原始的文件
通过偏移值,接收方可以确定每个数据包在原始文件中的位置,从而正确地重组文件
这个例子和IP协议中的偏移类似,都是将一个较大的数据分成多个较小的部分进行传输,并使用偏移值来确定每个部分在原始数据中的位置,从而正确地重组数据
添加IP头之后就可以发出去了
到DNS服务器查询到时候,加入DNS服务器并不知道这个域名的IP地址,那么它就会向根域名服务器,根服务器一定知道,但不见得会回传具体地址,而是传回顶级域名根服务器的地址,顶级域名根服务器,顶级域名根服务器可能还会回传一个域名服务器的地址
比如我们现在要请求http://www.example.com,DNS服务器不知道,就会向根服务器问,而通过域名我们知道,这个域名是归.com域名根服务器管的,根服务器就会回传.com顶级域名根服务器的IP地址,.com顶级域名根服务器会回传example.com的IP地址,而example.com会回传www.example.com的IP地址,至此DNS查询就完成了,但一般用不了这么远,大部分请求在第一步就被完成了
查询之后就会被发回,DNS响应包大概长这个样子
相应包头部
问题部分
资源记录部分
资源记录格式
因此,DNS响应包的结构包括了响应包头部、问题部分、资源记录部分和资源记录格式等几个部分,每个部分中包含了特定的字段信息
或者说,响应包跟像这样
假设你正在购物或者订餐,你可能会使用电话或者手机APP来联系商家
当你拨打商家电话或者打开APP时,你的设备会向电话簿或者应用数据库发送一个查询请求,询问商家的电话号码或者餐厅地址
电话簿或者应用数据库在收到请求后会返回一个响应包,这个响应包包含了所查询的电话号码或者餐厅地址
举个具体的例子,假设你打开了一个外卖APP,并搜索了一家附近的餐厅
APP会将搜索请求发送到应用数据库中,以查找该餐厅的电话号码
在返回的响应包中,问题部分会显示你所请求的餐厅名称或电话号码等信息,资源记录部分则会包含对应的电话号码等信息
因此,当你拨打商家电话或者打开应用来联系商家时,响应包中的问题部分会显示你所请求的商家信息,资源记录部分则会包含对应的电话号码或地址等信息
假设你是一个外地游客,来到了一个陌生的城市。为了找到一家好的餐馆,你打开地图应用,输入餐馆的名字,然后地图会告诉你餐馆的地址和电话
但是,如果有一些不良商家,他们可能会在地图上标注错误的信息,比如将他们的餐馆地址标注到其他餐馆的地址上,或者将其他餐馆的电话号码标注到他们的餐馆上
这样,当你打开地图搜索餐馆时,你可能会得到错误的信息,导致你无法找到正宗的餐馆或者被不良商家欺骗
这个例子就类似于DNS污染
DNS服务器就像是地图应用,它们帮助我们将域名(比如餐馆的名字)转换成对应的IP地址(比如餐馆的电话和地址)
但是,如果有一些恶意攻击者篡改了DNS服务器的信息,将错误的IP地址映射到被攻击的域名上,那么我们就会得到错误的信息,导致我们无法正常访问网站或者被引导到错误的网站
因此,DNS污染是一种非常危险的网络攻击方式,它可以让攻击者破坏我们的网络体验和安全
为了防止DNS污染,我们可以采取一些安全措施,比如使用DNSSEC技术来验证域名解析的完整性,或者使用防火墙等网络安全设备来保护域名服务器等
DNSSEC通过添加几个新的资源记录,如DNSKEY、DS、DNSMP等,来实现对DNS信息的认证。这些新的资源记录可以提供数字签名,以防止未经授权的第三方修改DNS条目。
DNSSEC的目的是防止DNS劫持和中间人攻击等网络威胁,确保域名解析的准确性,保护用户的网络交易和数据安全。
DNSSEC已于1997年由IETF(Internet Engineering Task Force)提出,并已在全球范围内得到广泛应用。它是维护互联网安全的重要工具之一
举个例子来解释:
假设,你正在研究一个地区的野生动物种群,为了更好地跟踪和监测野生动物的活动,你决定设置一些摄像头来拍摄野生动物的照片
但是,你担心有人会盗走摄像头或者篡改拍摄数据,从而破坏你的研究,于是,你决定采用DNSSEC技术来确保拍摄数据的完整性
具体来说,你将为每一个摄像头设置一个DNSSEC记录,这些记录可以验证摄像头的IP地址和域名的关系
这样,当其他人想要访问摄像头的IP地址并查看拍摄数据时,DNSSEC可以确保数据的完整性和真实性
如果有人试图篡改拍摄数据或者盗走摄像头,DNSSEC技术可以检测到这些非法行为,并发出警报或者通知你,从而保护你的研究数据和成果
DNSSEC可以确保域名和IP地址的映射关系的完整性和真实性,从而保护用户的网络体验和安全
用户输入网址回车,游览器解析网址,获取域名,解析域名。
先是向浏览器中找是否有此域名的缓存,如果有则解析结束,没有则继续查找操作系统缓存中是否有这个域名对应的dns结果
如果以上两则都未能找到,则游览器会向你部署HTTPDNS服务器发送HTTP请求(直接访问HTTPDNS的IP),HTTP服务器返回域名解析结果,然后浏览器缓存起来
这极大解决了DNS污染等问题
中间人攻击(Man-in-the-Middle Attack,MITM)是一种网络攻击方式,攻击者通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”
中间人攻击是一种间接的入侵攻击,攻击者不会直接攻击目标系统,而是通过拦截网络通信,假冒其中一个参与者,将通信内容重定向到自己的计算机上,从而窃取、篡改或者干扰通信内容
中间人攻击的技术手段包括:
中间人攻击是一种非常危险的攻击方式,它可以对各种网络通信进行窃取、篡改或干扰,包括敏感数据、账号密码、金融交易等
为了防止中间人攻击,可以采用各种安全措施,如加密通信、使用安全的证书和协议、定期更新和升级软件等
举个例子
假设你和你朋友在打电话聊天,你的电话号码是123-456-7890,你朋友的电话号码是987-654-3210。你们通过电话线进行通话
这时候,有一个坏人想要偷听你们的通话。他可以采取中间人攻击的方式来实现他的目的
具体来说,他可以这样做:
在了解TCP/IP之前,我们先来了解一下TCP/IP的分层:
应用层 | HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH…… |
---|---|
表示层 | XDR、ASN.1、SMB、AFP、NCP…… |
会话层 | ASAP、SSH、RPC、NetBIOS、ASP、Winsock…… |
传输层 | TCP、UDP、TLS、RTP、SCTP、SPX、ATP…… |
网络层 | IP、ICMP、IGMP、IPX、BGP、OSPF、RIP…… |
数据链路层 | 以太网、令牌环、HDLC、帧中继、ISDN、ATM…… |
物理层 | 铜缆、网线、光缆、无线电…… |
TCP/IP协议是Internet互联网最基本的协议,其在一定程度上参考了七层ISO模型
OSI模型共有七层,从下到上分别是物理层、数据链路层、网络层、运输层、会话层、表示层和应用层。但是这是有些复杂的,所以在TCP/IP协议中,七层被简化为了四个层次
TCP/IP模型中的各种协议,依其功能不同,被分别归属到这四层之中,常被视为是简化过后的七层OSI模型
链路层包含数据链路层与物理层
网络层传输层不变
会话层表示层引用层整合为应用层
三台电脑互相可以通过网线进行连接,互相发送的数据可以通过网线直接到达目标,而这种情况在越来越多的电脑加入的时候显得力不从心
于是发明了一个中间设备,把网线都插到这个设备上,由这个设备做转发,就可以彼此之间通信了,本质上和原来一样,只不过网口的数量和网线的数量减少了,不再那么混乱
它仅仅是无脑将电信号转发到所有出口,不做任何处理,因此被定性在了物理层
假设现在与ABCDEF,6个机器,
由于转发到了所有出口。A发的消息,BCDEF这5台机器怎么知道数据包是不是发给自己的呢
首先,你要给所有的连接到交换机的设备,都起个名字。原来你们叫 ABCD,但现在需要一个更专业的,全局唯一的名字作为标识,这个名字称为 MAC 地址
A的 MAC 地址是 aa-aa-aa-aa-aa-aa,B的 MAC 地址是 bb-bb-bb-bb-bb-bb,以此类推,不重复就好。
这样,A 在发送数据包给 B 时,只要在头部拼接上发件人:aa-aa-aa-aa-aa-aa,收件人:bb-bb-bb-bb-bb-bb就可以了
B 在收到数据包后,根据头部的目标 MAC 地址信息,判断这个数据包的确是发给自己的,于是便收下
其他的机器收到数据包后,根据头部的目标 MAC 地址信息,判断这个数据包并不是发给自己的,于是就可以丢弃了
虽然集线器使整个布局干净不少,但原来A只要发给 B 的消息,现在却要发给连接到集线器中的所有电脑,这样非常非常非常不安全
由于集线器过于不安全,所以交换机诞生了,它内部会有一张表,写着所有接到交换机上设备的MAC地址和端口,我们假设一下,接到交换机上有6台设备,它们对应如下
MAC地址 | 端口 |
---|---|
aa-aa-aa-aa-aa-aa | 1 |
bb-bb-bb-bb-bb-bb | 2 |
cc-cc-cc-cc-cc-cc | 3 |
dd-dd-dd-dd-dd-dd | 4 |
ee-ee-ee-ee-ee-ee | 5 |
ff-ff-ff-ff-ff-ff | 6 |
此时,仍然也可以拼接上发件人:aa-aa-aa-aa-aa-aa,收件人:bb-bb-bb-bb-bb-bb就可以了,但是第一次交换机内部什么都没有,怎么确定MAC地址归属呢,其实加入A发了第一次消息,交换机监测到信息从1端口来了后,就可以把A的MAC地址和1端口记录下了,而第一次发消息,交换机并不知道哪个是B,所以就全部发一遍,直到B响应了,就可以记录B和它对应的端口,而和上面集线器一样,发给B的数据包其他设备会丢弃,这里,我们就可以把它归类为数据链路层
这个网络结构被称为以太网
而假如设备足够多也没事,只需要多加一台交换机就可以了,在这种情况下,上百台设备在交换机性能足够多情况下同时在线也没问题,可是随着技术的发展,上百台设备同时在线也满足不了需求了,怎么办?
MAC地址也叫物理地址、硬件地址,长度为 48 位,一般这样来表示
00-16-EA-AE-3C-40
它是由网络设备制造商生产时烧录在网卡的EPROM
其中前 24 位(00-16-EA)代表网络硬件制造商的编号,后 24 位(AE-3C-40)是该厂家自己分配的,一般表示系列号。
只要不更改自己的 MAC 地址,MAC 地址在世界是唯一的。形象地说,MAC地址就如同身份证上的身份证号码,具有唯一性
那如果希望向上面那样表示将目标 MAC 地址为 FFFF-FFFF-?开头的,统一从路由器出去发给某一群设备(后面会提到这其实是子网的概念),那就需要要求某一子网下统统买一个厂商制造的设备,要么就需要要求厂商在生产网络设备烧录 MAC 地址时,提前按照你规划好的子网结构来定 MAC 地址,并且日后这个网络的结构都不能轻易改变
这显然是不现实的!
于是发明了一个新的地址,给每一台机器一个 32 位的编号,如:
11000000101010000000000000000001
有些不清晰,于是可以把它分成四个部分,中间用点相连
11000000.10101000.00000000.00000001
还是够不清晰,于是把它转换成 10 进制
192.168.0.1
最后给了这个地址一个响亮的名字,IP 地址。现在每一台电脑,同时有自己的 MAC 地址,又有自己的 IP 地址,只不过 IP 地址是软件层面上的,可以随时修改,MAC 地址一般是无法修改的
这样一个可以随时修改的 IP 地址,就可以根据我们规划的网络拓扑结构,来调整了
交换机已经无法记录如此庞大的映射关系了。
那我们可不可以让那根红色的网线,接入一个新的设备,这个设备就跟电脑一样有自己独立的 MAC 地址,而且同时还能帮我们把数据包做一次转发呢
这个设备就是路由器,它的功能就是,作为一台独立的拥有 MAC 地址的设备,并且可以帮我们把数据包做一次转发,它被定义在了网络层
现在两个设备之间传输,除了加上数据链路层的头部之外,还要再增加一个网络层的头部
假如 A 给 B 发送数据,由于它们直接连着交换机,所以 A 直接发出如下数据包即可,其实网络层没有体现出作用
数据链路层头部:
源MAC:AAA
目标MAC:BBB
网络层头部:
源IP:192.168.0.1
目标IP:192.168.0.2
然后就是数据包了
但假如 A 给 C 发送数据,A 就需要先转交给路由器,然后再由路由器转交给 C。由于最底层的传输仍然需要依赖以太网,所以数据包是分成两段的
A~路由器需要
数据链路层头部:
源MAC:AAA
目标MAC:ABAB
网络层头部:
源IP:192.168.0.1
目标IP:192.168.1.1
路由器到 C 这段的包如下
数据链路层头部:
源MAC:CDCD
目标MAC:CCCC
网络层头部:
源IP:192.168.0.1
目标IP:192.168.1.1
如果源 IP 与目的 IP 处于一个子网,直接将包通过交换机发出去
如果源 IP 与目的 IP 不处于一个子网,就交给路由器去处理
好,那现在只需要解决,什么叫处于一个子网就好了
192.168.0.1 和 192.168.0.2 处于同一个子网
192.168.0.1 和 192.168.1.1 处于不同子网
这两个是我们人为规定的,即我们想表示,对于 192.168.0.1 来说:
192.168.0.xxx 开头的,就算是在一个子网,否则就是在不同的子网。
那对于计算机来说,怎么表达这个意思呢?于是人们发明了子网掩码的概念
假如某台机器的子网掩码定为 255.255.255.0
这表示,将源 IP 与目的 IP 分别同这个子网掩码进行与运算,相等则是在一个子网,不相等就是在不同子网,就这么简单。
比如
A电脑:192.168.0.1 & 255.255.255.0 = 192.168.0.0
B电脑:192.168.0.2 & 255.255.255.0 = 192.168.0.0
C电脑:192.168.1.1 & 255.255.255.0 = 192.168.1.0
D电脑:192.168.1.2 & 255.255.255.0 = 192.168.1.0
那么 A 与 B 在同一个子网,C 与 D 在同一个子网,但是 A 与 C 就不在同一个子网,与 D 也不在同一个子网,以此类推
所以如果 A 给 C 发消息,A 和 C 的 IP 地址分别 & A 机器配置的子网掩码,发现不相等,则 A 认为 C 和自己不在同一个子网,于是把包发给路由器,就不管了,之后怎么转发,A 不关心
上一步 A 通过是否与 C 在同一个子网内,判断出自己应该把包发给路由器,那路由器的 IP 是多少呢?
其实说发给路由器不准确,应该说 A 会把包发给默认网关
对 A 来说,A 只能直接把包发给同处于一个子网下的某个 IP 上,所以发给路由器还是发给某个电脑,对 A 来说也不关心,只要这个设备有个 IP 地址就行
所以默认网关,就是 A 在自己电脑里配置的一个 IP 地址,以便在发给不同子网的机器时,发给这个 IP 地址
现在 A 要给 C 发数据包,已经可以成功发到路由器这里了,最后一个问题就是,路由器怎么知道,收到的这个数据包,该从自己的哪个端口出去,才能直接(或间接)地最终到达目的地 C 呢
路由器收到的数据包有目的 IP 也就是 C 的 IP 地址,需要转化成从自己的哪个端口出去,很容易想到,应该有个表,就像 MAC 地址表一样
这个表就叫路由表
至于这个路由表是怎么出来的,有很多路由算法,本文不展开
假如你(A)此时不知道你同伴 B 的 MAC 地址(现实中就是不知道的,刚刚我们只是假设已知),你只知道它的 IP 地址,你该怎么把数据包准确传给 B 呢?
答案很简单,在网络层,我需要把 IP 地址对应的 MAC 地址找到,也就是通过某种方式,找到 192.168.0.2 对应的 MAC 地址 BBBB
这种方式就是 arp 协议,同时电脑 A 和 B 里面也会有一张 arp 缓存表,表中记录着 IP 与 MAC 地址的对应关系
一开始的时候这个表是空的,电脑 A 为了知道电脑 B(192.168.0.2)的 MAC 地址,将会广播一条 arp 请求,B 收到请求后,带上自己的 MAC 地址给 A 一个响应。此时 A 便更新了自己的 arp 表
这样通过大家不断广播 arp 请求,最终所有电脑里面都将 arp 缓存表更新完整
作者会经常帮助有问题的小伙伴解决问题如果你有问题,可以直接到评论区指出,作者会在看到后到24小时内给予答复
如果本文有任何问题欢迎在评论去指出,如果喜欢这篇文章,希望能点赞评论关注
10246字,5个父项,13个子项,2个孙子项
参考文章
访问一个不存在的域名时,浏览器的工作流程是怎样的_不存在的分站域名_至学者的博客-CSDN博客
八个字节的 UDP 如何传输数据!细节,都是细节! - 知乎
太棒了!TCP/IP协议 (图解+秒懂+史上最全)_图解tcpip_退休的汤姆的博客-CSDN博客
参考书籍
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。