互联网的实现,分为好几层,每一层都有自己特有的功能,而且每一层都靠下一层支持。用户接触到的,只是最上面的一层,我们称为应用层,要理解互联网,必须从最下层开始,自下而上的理解每一层的功能。
我们常见的网络模型,有以下三种:
它们之间的关系如下图所示
其中, 理论五层模型 是综合 OSI七层 和 TCP/IP四层 的优点,采用的一种原理体系结构。 我们接下来的探讨也是基于 理论五层模型 来展开的。
理论五层模型 的结构如下图
各层的作用如下:
简单说,越下面的层,越靠近硬件;越上面的层,越靠近用户。
每一层都是为了完成某一种功能。为了实现这些功能,需要遵守一些共同的规则,这些规则就是 协议(protocol) 。
互联网的每一层,都定义了很多协议。这些协议的总称,叫做 互联网协议(Internet Protocol Suite) ,它们是互联网的核心。
下面的内容中,我们通过每一层的功能的介绍,对每一层中的主要协议所起作用进行讲解。
电脑要进行联网,需要把电脑通过各种设备连接进网络,设备有光缆、电缆、双绞线、无限电波等方式。
物理层是用于传输信号的介质,它传输的是 0和1 的电信号。但是关于电信号如何分组,每个信号位有何意义并没有规定。
这就是 数据链路层 的功能,它在 物理层 的上方,确定了0和1的分组方式,用于两个设备(同一种数据链路结点)之间进行信息传递。
早期的时候,每家公司都有自己的电信号分组方式。逐渐地,一种叫做 以太网(Ethernet) 的协议,占据了主导地位。
以太网规定,一组电信号构成一个数据包,叫做 帧(frame) ,每一帧分为两个部分: 标头(Head) 和 数据(Data) 。
MTU是链路层对物理层的限制。
由于链路层存在MTU的限制,导致网络层的报文如果超过1500字节,就必要要对其进行分片发送。
上面我们提到,以太网数据包的 标头 ,包含了发送者和接受者的信息。那么,发送者和接受者是如何标识呢?
以太网规定,连入网络的所有设备,都必须具有 网卡 接口。数据包必须是从一块网卡,传送到另一块网卡。 网卡的地址,就是数据包的发送地址和接收地址,这叫做 MAC地址 。
每块网卡出厂的时候,都有一个全世界 独一无二的MAC地址 ,长度是 48个二进制位 ,通常用 12个十六进制数 表示。
前6个十六进制数是厂商编号,后6个十六进制数是该厂商的网卡流水号。有了MAC地址,就可以定位网卡和数据包的路径了。
定义地址只是第一步,后面还有更多的步骤:
上图中,5号计算机向3号计算机 发送一个数据包 ,同一个子网络的1号、2号、3号、4号、6号计算机 都会收到 这个包。它们读取这个包的 标头 ,找到 接收方的MAC地址 ,然后 与自身的 MAC地址相 比较 ,如果两者 相同 ,就 接收这个包 ,做进一步处理, 否则就丢弃 这个包。这种发送方式就叫做 广播 (broadcasting)。
有了数据包的定义、网卡的MAC地址、广播的发送方式,"链接层"就可以在多台计算机之间传送数据了。
以太网协议,依靠MAC地址发送数据。理论上,单单依靠MAC地址,成都的网卡就可以找到休斯顿的网卡了,技术上是可以实现的。
但是,这样做有一个重大的缺点。 以太网 采用 广播 方式 发送数据包 ,所有成员人手一包,不仅 效率低 ,而且 局限在发送者所在的子网络 。也就是说,如果两台计算机不在同一个子网络,广播是传不过去的。这种设计是合理的,否则互联网上每一台计算机都会收到所有包,那会引起灾难。
互联网是无数子网络共同组成的一个巨型网络,很像想象成都和休斯顿的电脑会在同一个子网络,这几乎是不可能的。
因此,必须找到一种方法,能够区分哪些MAC地址属于同一个子网络,哪些不是。如果是 同一个子网络 ,就采用 广播 方式发送, 否则 就采用 路由 方式发送。( 路由 的意思,就是指如何向不同的子网络分发数据包,这是一个很大的主题,本文不涉及。)遗憾的是,MAC地址本身无法做到这一点。它只与厂商有关,与所处网络无关。
这就导致了 网络层 的诞生。 它的作用是 引进一套新的地址 ,使得我们能够 区分 不同的计算机是否属于同一个 子网络 。这套地址就叫做 网络地址 ,简称 网址 。
于是, 网络层 出现以后,每台计算机有了 两种地址 ,一种是 MAC地址 ,另一种是 网络地址 。两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一起。
网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。因此,从逻辑上可以推断,必定是先处理网络地址,然后再处理MAC地址。
规定网络地址的协议,叫做 IP协议 。它所定义的地址,就被称为 IP地址 。目前,广泛采用的是IP协议的第四版和第六版,分别称为IPv4和IPv6。
互联网上的每一台计算机,都会分配到一个IP地址。这个地址分成 两个部分 , 前一部分代表网络,后一部分代表主机 。比如,IP地址14.215.177.39,这是一个32位的地址,假定它的网络部分是前24位(14.215.177),那么主机部分就是后8位(最后的那个1)。处于同一个子网络的电脑,它们IP地址的网络部分必定是相同的,也就是说14.215.177.2应该与14.215.177.1处在同一个子网络。
但是,问题在于单单从IP地址,我们无法判断网络部分。还是以14.215.177.39为例,它的网络部分,到底是前24位,还是前16位,甚至前28位,从IP地址上是看不出来的。
那么,怎样才能从IP地址, 判断两台计算机是否属于同一个子网络呢?这就要用到另一个参数 子网掩码 (subnet mask) 。
子网掩码 :
我们知道,IPv4的地址只有32位,地球上网民数量已经远远超出这个数字,那么,为啥至今还没出现地址枯竭呢?
因为我们还有一些技术,可以变相的缓解地址不足,比如NAT技术。
NAT(Network Address Translation,网络地址转换)
IPv6拥有128位巨大的地址空间,对于那么大的空间,也不是随意的划分,而是使用按照bit位进行号段划分。
IPv6地址结构如下图
例如 RFC4291 中定义了n=48, m=16,也就是子网和接口ID与各占64位。
IPv6没有子网掩码mask的概念,它支持的是 子网前缀标识方法 。
使用 IPv6地址/前缀长度 表示方法,例如:
可以看到,一个IPv6的地址有子网前缀+接口ID构成,子网前缀由地址分配和管理机构定义和分配,而接口ID可以由各操作系统实现生成。
IPv6是用来解决IPv4 地址枯竭 问题的,IPv4地址为32位,而IPv6地址为 128位
除了地址数量以外,IPv6还有很多 优点 ,例如:
如上所述,IP协议的作用主要有两个:
根据IP协议发送的数据,就叫做 IP数据包 。我们直接把IP数据包直接放进以太网数据包的"数据"部分,不用修改以太网的规格。这就是互联网分层结构的好处: 上层的变动完全不涉及下层的结构 。
具体来说,IP数据包也分为 标头 和 数据 两个部分:
其中, 标头 范围为 20-60字节 ( IPv6固定为40字节 ), 整个 数据包的总长度 最大为65535字节 。因此, 理论上 ,一个IP数据包的 数据部分 , 最长为65515字节 。
如图所示,标头中 20字节是固定不变的 ,它包含了版本、长度、IP地址等信息,另外还有可变部分的标头可选。而数据则是IP数据包的具体内容。
将它放入以太网数据包后,以太网数据包就变成了下面这样:
在以太网协议中,以太网数据包的数据部分,最长只有1500字节。因此, 如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了 。
关于网络层,还有最后一点需要说明。因为IP数据包是放在以太网数据包里发送的,所以我们必须同时知道 两个地址 ,一个是对方的 MAC地址 ,另一个是对方的 IP地址 。通常情况下,对方的IP地址是已知的,但是我们 不知道它的MAC地址 。
所以,我们需要一种机制,能够从IP地址得到MAC地址。
这里又可以分成两种情况:
总之,有了ARP协议之后,我们就可以得到同一个子网络内的主机MAC地址,可以把数据包发送到任意一台主机之上了。
ARP攻击是利用ARP协议设计时缺乏安全验证漏洞来实现的,通过伪造ARP数据包来窃取合法用户的通信数据,造成影响网络传输速率和盗取用户隐私信息等严重危害。
ARP攻击主要是存在于局域网网络中,局域网中若有一台计算机感染ARP木马,则感染该ARP木马的系统将会试图通过“ARP欺骗”手段截获所在网络内其它计算机的通信信息,并因此造成网内其它计算机的通信故障。
局域网中比较常见的ARP攻击包括:上网时断时续,拷贝文件无法完成,局域网内的ARP包激增。出现不正常的MAC地址,MAC地址对应多个IP地址,网络数据发不出去了,网上发送信息被窃取,个人PC中毒局域网内MAC地址泛洪使MAC地址缓存表溢出等问题。据包的协议地址不匹配,从而在网络中产生大量的ARP。
在局域网环境中,ARP攻击是主要的安全威胁,在传统网络中主要是通过静态绑定的方式来解决,但是这种方式限制了网络扩展的易用性。
有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。
接下来的问题是,同一台主机上有许多程序都需要用到网络,比如,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示网页的内容,还是表示在线聊天的内容?
也就是说,我们还需要一个参数,表示这个数据包到底供哪个 程序(进程) 使用。这个参数就叫做 端口 (port),它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。
端口是0到65535之间的一个整数,正好16个二进制位。0到1023的端口被系统占用,用户只能选用大于1023的端口。 不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。
传输层 的功能,就是建立 端口到端口 的通信 。相比之下, 网络层 的功能是建立 主机到主机 的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把 主机+端口,叫做 套接字 (socket)。有了它,就可以进行网络应用程序开发了。
现在,我们必须在数据包中加入端口信息,这就需要新的协议。最简单的实现叫做UDP协议,它的格式几乎就是在数据前面,加上端口号。
UDP数据包,也是由标头和数据两部分组成:
UDP数据包非常简单,标头部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。
UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。为了解决这个问题,提高网络可靠性,TCP协议就诞生了。这个协议非常复杂,但可以近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。
因此, TCP协议能够确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。
TCP数据包和UDP数据包一样,都是内嵌在IP数据包的数据部分。 TCP数据包没有长度限制,理论上可以无限长 ,但是为了保证网络的效率, 通常 TCP数据包的长度 不会超过IP数据包的长度 ,以确保单个TCP数据包不必再分割。
应用程序收到传输层的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。 应用层的作用,就是规定应用程序的数据格式。
举例来说,TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了应用层。这是最高的一层,直接面对用户。它的数据就放在TCP数据包的数据部分。
因此,现在的以太网的数据包就变成下面这样:
1. 以太网协议
以太网协议规定,一组电信号构成一个数据包,我们把这个数据包称之为帧。每一个桢由标头(Head)和数据(Data)两部分组成。
帧的大小一般为 64 – 1518 个字节。假如需要传送的数据很大的话,就分成多个桢来进行传送。
对于表头和数据这两个部分,他们存放的都是一些什么数据呢? 毫无疑问,我们至少得知道这个桢是谁发送,发送给谁的等这些信息吧?所以标头部分主要是一些说明数据,例如发送者,接收者等信息。而数据部分则是这个数据包具体的,想给接收者的内容。
一个桢的长度是 64~1518 个字节,也就是说桢的长度不是固定的,但是标头部分的字节长度是固定的,每个桢都是单独发的,并且固定为18个字节。
把一台计算的的数据通过 物理层 和 链路层 发送给另一台计算机,究竟是谁发给谁的,计算机与计算机之间如何区分,,你总得给他们一个唯一的标识吧?
于是,MAC 地址出现了。
2. MAC 地址
连入网络的每一个计算机都会有网卡接口,每一个网卡都会有一个唯一的地址,这个地址就叫做 MAC 地址。计算机之间的数据传送,就是通过 MAC 地址来唯一寻找、传送的。
MAC地址 由 48 位二进制数所构成,在网卡生产时就被唯一标识了。
3. 广播与ARP协议
(1). 广播
如图,假如计算机 A 知道了计算机 B 的 MAC 地址,然后计算机 A 想要给计算机 B 传送数据,虽然计算机 A 知道了计算机 B 的 MAC 地址,可是它要怎么给它传送数据呢?计算机 A 不仅连着计算机 B,而且计算机 A 也还连着其他的计算机。 虽然计算机 A 知道计算机 B 的 MAC 地址,可是计算机 A 却不知道计算机 B 是分布在哪边路线上,为了解决这个问题,于是,有了 广播 的出现。
在同一个 子网 中,计算机 A 要向计算机 B 发送一个 数据包 ,这个数据包会包含接收者的 MAC 地址。当发送时,计算机 A 是通过 广播 的方式发送的,这时同一个子网中的计算机 C, D 也会收到这个数据包的,然后收到这个数据包的计算机,会把数据包的 MAC 地址取出来,与自身的 MAC 地址对比,如果两者相同,则接受这个数据包,否则就丢弃这个数据包。
(2). ARP 协议 。
那么问题来了,计算机 A 是如何知道计算机 B 的 MAC 地址的呢?这个时候就得由 ARP 协议这个家伙来解决了,不过 ARP 协议会涉及到IP地址,我们下面才会扯到IP地址。因此我们先放着,就当作是有这么一个 ARP 协议,通过它我们可以知道子网中其他计算机的 MAC 地址。
上面我们有说到子网这个关键词,实际上我们所处的网络,是由无数个子网络构成的。广播的时候,也只有同一个子网里面的计算机能够收到。
假如没有子网这种划分的话,计算机 A 通过广播的方式发一个数据包给计算机 B , 其他所有计算机也都能收到这个数据包,然后进行对比再舍弃。世界上有那么多台计算机,每一台计算机都能收到其他所有计算机的数据包,那就不得了了。那还不得奔溃。 因此产生了 子网 这么一个东西。
那么问题来了,我们如何区分哪些 MAC 地址是属于同一个子网的呢?假如是同一个子网,那我们就用广播的形式把数据传送给对方,如果不是同一个子网的,我们就会把数据发给网关,让网关进行转发。
为了解决这个问题,于是,有了 IP 协议。
1. IP协议
IP协议,它所定义的地址,我们称之为 IP地址 。IP协议有两种版本,一种是 IPv4,另一种是 IPv6。不过我们目前大多数用的还是 IPv4,我们现在也只讨论 IPv4 这个版本的协议。
这个 IP 地址由 32 位的二进制数组成,我们一般把它分成4段的十进制表示,地址范围为0.0.0.0~255.255.255.255。
每一台想要联网的计算机都会有一个IP地址。这个IP地址被分为两部分,前面一部分代表 网络部分 ,后面一部分代表 主机部分 。并且网络部分和主机部分所占用的二进制位数是不固定的。
假如两台计算机的网络部分是一模一样的,我们就说这两台计算机是处于同一个子网中。例如 192.168.43.1 和 192.168.43.2, 假如这两个 IP 地址的网络部分为 24 位,主机部分为 8 位。那么他们的网络部分都为 192.168.43,所以他们处于同一个子网中。
可是问题来了,你怎么知道网络部分是占几位,主机部分又是占几位呢?也就是说,单单从两台计算机的IP地址,我们是无法判断他们的是否处于同一个子网中的。
这就引申出了另一个关键词———— 子网掩码 。子网掩码和IP地址一样也是 32 位二进制数,不过它的网络部分规定全部为 1,主机部分规定全部为 0.也就是说,假如上面那两个IP地址的网络部分为 24 位,主机部分为 8 位的话,那他们的子网掩码都为 11111111.11111111.11111111.00000000,即255.255.255.0。
那有了子网掩码,如何来判端IP地址是否处于同一个子网中呢。显然,知道了子网掩码,相当于我们知道了网络部分是几位,主机部分是几位。我们只需要把 IP 地址与它的子网掩码做与(and)运算,然后把各自的结果进行比较就行了,如果比较的结果相同,则代表是同一个子网,否则不是同一个子网。
例如,192.168.43.1和192.168.43.2的子码掩码都为255.255.255.0,把IP与子码掩码相与,可以得到他们都为192.168.43.0,进而他们处于同一个子网中。
2. ARP协议
有了上面IP协议的知识,我们回来讲一下ARP协议。
有了两台计算机的IP地址与子网掩码,我们就可以判断出它们是否处于同一个子网之中了。
假如他们处于同一个子网之中,计算机A要给计算机B发送数据时。我们可以通过ARP协议来得到计算机B的MAC地址。
ARP协议也是通过广播的形式给同一个子网中的每台电脑发送一个数据包(当然,这个数据包会包含接收方的IP地址, 这个 IP地址 怎么来的,往下看 )。对方收到这个数据包之后,会取出IP地址与自身的对比,如果相同,则把自己的MAC地址回复给对方,否则就丢弃这个数据包。这样,计算机A就能知道计算机B的MAC地址了。
可能有人会问,知道了MAC地址之后,发送数据是通过广播的形式发送,询问对方的MAC地址也是通过广播的形式来发送,那其他计算机怎么知道你是要传送数据还是要询问MAC地址呢?其实在询问MAC地址的数据包中,在对方的MAC地址这一栏中,填的是一个特殊的MAC地址,其他计算机看到这个特殊的MAC地址之后,就能知道广播想干嘛了。
假如两台计算机的IP不是处于同一个子网之中,这个时候,我们就会把数据包发送给网关,然后让网关让我们进行转发传送
3. DNS服务器
这里再说一个问题,我们是如何知道对方计算机的IP地址的呢?这个问题可能有人会觉得很白痴,心想,当然是计算机的操作者来进行输入了。这没错,当我们想要访问某个网站的时候,我们可以输入IP来进行访问,但是我相信绝大多数人是输入一个网址域名的,例如访问百度是输入 http://www.baidu.com 这个域名。其实当我们输入这个域名时,会有一个叫做DNS服务器的家伙来帮我们解析这个域名,然后返回这个域名对应的IP给我们的。
因此,网络层的功能就是让我们在茫茫人海中,能够找到另一台计算机在哪里,是否属于同一个子网等。
通过物理层、数据链路层以及网络层的互相帮助,我们已经把数据成功从计算机A传送到计算机B了,可是,计算机B里面有各种各样的应用程序,计算机该如何知道这些数据是给谁的呢?
这个时候, 端口(Port) 这个家伙就上场了,也就是说,我们在从计算机A传数据给计算表B的时候,还得指定一个端口,以供特定的应用程序来接受处理。
也就是说,传输层的功能就是建立端口到端口的通信。相比网络层的功能是建立主机到主机的通信。
也就是说,只有有了IP和端口,我们才能进行准确着通信。这个时候可能有人会说,我输入IP地址的时候并没有指定一个端口啊。其实呢,对于有些传输协议,已经有设定了一些默认端口了。例如http的传输默认端口是80,这些端口信息也会包含在数据包里的。
传输层最常见的两大协议是 TCP 协议和 UDP 协议,其中 TCP 协议与 UDP 最大的不同就是 TCP 提供可靠的传输,而 UDP 提供的是不可靠传输。
终于说到应用层了,应用层这一层最接近我们用户了。
虽然我们收到了传输层传来的数据,可是这些传过来的数据五花八门,有html格式的,有mp4格式的,各种各样。你确定你能看的懂?
因此我们需要指定这些数据的格式规则,收到后才好解读渲染。例如我们最常见的 Http 数据包中,就会指定该数据包是 什么格式的文件了。
喜欢点个赞
原文看这里
1 能够访问互联网的任意两台主机之间不一定能够直接通信的2 假如两台能够访问互联网的主机,在一个局域网下,也不一定能够直接通信,因为交换机端口之间可能有端口隔离,vlan,访问策略等屏蔽,因此这两个不一定能够直接通信
3 假如两台能够直接访问互联网的主机,在不同的局域网里,也不一定能够直接通信,因为两台主机之间可能有防火墙策略,防火墙策略决定了他们不一定能够直接通信
4 假如两台能够直接访问互联网的主机,在不同的局域网里,在防火墙策略允许他们通信,并且彼此之间有VPN,专用通信软件的等连接,这个是可以直接通信的
5 您学废了吗
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)