计算机网络 - 计算机之间的网络互通

计算机网络

前言

大物理学家费曼提出一个高效的费曼学习法,即从问题入手,试着把问题都讲出来,以教代学,一旦你能把问题都讲清楚,便学会了。所以我想尝试一下把网络/通信/协议讲清楚,借此让自己学得明白,同时也锻炼自己得表达能力。

计算机网络 - 计算机之间的网络互通

在这一章我们着重介绍在生活中两台计算机的通信过程,在此过程中我们拨开迷雾一窥计算机网络通信的神秘面纱。在全世界成千上万的计算机中,无论地点新旧的计算机是如何准确的找到对方并进行通信的呢,并把数据按需发送给对方呢。
计算机网络 - 计算机之间的网络互通
分层:分层是计算机领域中常用的技巧 分层是为了隔离,通过分层划分职能,拆解问题,层与层之间约定接口,屏蔽实现细节,下层向上层提供能力,上层利用下层的能力提供更高的抽象。比如大家都非常熟悉的网络通信五层模型TCP/IP的四层模型,说实话分层模型的具体内容还是极其复杂的,所以很多人并不是很清楚为什么分五层,或者经常混淆分层模型负责的任务。

1. 物理层

这一层比较好理解,两台计算机之间要通信需要什么?当然是通信链路,这个通信链路在物理层表现得形式可能是光纤,铜缆,无线电,卫星,双绞线等介质把它们连接起来才能通信。
计算机网络 - 计算机之间的网络互通
也就是说,物理层负责把计算机连接起来,然后在计算机之间通过高低电频信号来传输电信号数据

2. 数据链路层

物理层是单纯的将计算机连接起来,并在之间传输高低电频信号,如果传输毫无规则我们是无法识别并处理这些信号。因此,我们需要制定一套规则或者说是协议来进行0,1的传送。例如多少个电信号为一组啊,每一组信号应该如何标识才能让计算机读懂啊等等。因为与硬件相关,所以需要借助系统的驱动程序,链路层协议就是定义这些细节的,比如怎么把数据从网卡发送到光纤,采用什么格式编码等,它解决的数据在媒介上表示、流动的问题。
于是,就有了网络协议
1.以太网协议
以太网协议规定,一组电信号构成一个数据包,我们把这个大小一般为 64 - 1518 个字节的数据包称之为。每一个桢由表头(Head)和数据(Data)两部分组成。
计算机网络 - 计算机之间的网络互通
如果需要传输的数据很大,则会分成多个帧传输,数据(Data)肯定是具体要传输给接收方的内容,那表头(Head)里面存放的是什么数据呢?我猜你闭着眼睛都能猜到,毫无疑问我们必须知道帧的发送和接收方,所以这里面存的是主要是说明数据,发送方和接收方的一些信息。
另外,一个因为帧的长度是不固定的,为了区分帧中表头和数据,帧的表头被固定18字节。

把一台计算机通过物理层和链路层发送出去的一帧数据如何区分,究竟是谁发给谁的,如何保证另一台计算机能准确接收呢,(一个计算机不可能只连接一个计算机),这个就需要对计算机进行区分,确定一个唯一标识。
于是,就有了MAC 地址
2. MAC 地址
接入网络的每台计算机都有网卡接口,每个网卡接口都会有一个唯一的地址,这个地址叫MAC地址,计算机之间的数据传输就是通过这个MAC地址来确定唯一的发送和接收。MAC地址是由48个字节组成,在网卡生产的时候就被唯一确定。
3. 广播与ARP协议
(1). 广播
计算机网络 - 计算机之间的网络互通
现在假如计算机A知道了计算机B的MAC地址(获取MAC地址还需要一个过程),计算机A要向计算机B传输数据,要怎么传输呢。这时候在交换网络中计算机A不仅连接着计算机B还连接着C、D…等,A却不知道B是分布在哪条线上。
于是,就有了广播

在同一个子网中,计算机A要向计算机B发送一个数据包,这个数据包中包含接收方的MAC地址。当发送时,A通过广播的方式向在同一个子网中的所有网络设备发送数据,这时在同一个子网中的C和D也会收到数据包。这时收到数据包的计算机会把数据包中接收方的MAC地址取出和自身MAC地址对比,如果两者相同则接收,反之则丢弃。这个过程我们称之为广播。好比校长通过学校广播呼叫操场上的某个同学一样,叫到自己的名字就去德育处喝茶,叫到别人的就吃瓜。

(2). ARP 协议
那么我们又是怎么知道计算机A的MAC地址呢?这时候 ARP 协议就闪亮登场了,不过 ARP 协议涉及到IP地址的相关内容。我们就当有这么个 ARP 协议的东西,它可以通过它获取到子网中其他计算机的MAC地址。

3. 网络层

上面我们有提到子网这么一个概念,实际上我们所处的网络是由无数个交换节点构成的交换网络,在这个网络中如果随意一台计算机发送数据所有计算机都能收到,那这个网络还不得崩溃吗?因此就需要子网这么个东西。

那么问题来了,我们如何区分哪些 MAC 地址是属于同一个子网的呢?假如是同一个子网,那我们就用广播的形式把数据传送给对方,如果不是同一个子网的,我们就会把数据发给网关,让网关进行转发,也就是发送给子网外的MAC地址。
于是,就有了IP协议

1. IP协议

IP协议:它所定义的地址,就是我们通常说的IP地址。IP协议有两种版本,一种是 IPv4,另一种是 IPv6。现在大部分用的是IPv4。这里我们只讨论IPv4。这个IPV4通常由32位构成,通常我们以4段十进制表示,地址范围为0.0.0.0~255.255.255.255

每一台想要联网的计算机都有一个IP地址,这个地址分为两部分,前面一部分是网络部分后面一部分是主机部分,并且网络部分和主机部分所占用的二进制位数是不固定的

假如有两台计算机的网络部分是一模一样的,我们就说这两台计算机所处同一子网中,例如有这两个IP地址:192.168.52.1和192.168.52.2。假如这两个IP的网络部分为24位主机部分为8位,那么他们网络部分为:192.168.52。所以他们所处同一子网中。

那么问题又来了。我们怎么知道网络和主机部分各占多少位呢,也就是说单从两台计算机的IP地址,我们是无法得知它们是否同处一个子网中
于是,就有了子网掩码

子网掩码和IP地址一样由32位二进制数组成,不过规定它们的网络部分位1,主机部分位0来区分。也就是假如192.168.52.1的网络部分是24位,主机部分为8位。则子网掩码为:11111111.11111111.11111111.00000000,十进制表示为:255.255.255.0
计算机网络 - 计算机之间的网络互通
有了子网掩码我们就知道了当前IP的网络和主机部分。这时只需要把自己的IP地址和子网掩码作(and)比较,然后把各自的结果对比,相同则处于同一子网中。,否则不是同一个子网。

2. ARP协议
这下我们了解了IP协议,我们再来理解ARP协议。其实ARP协议和IP协议工作原理相似。现在我们有了两台计算机IP地址和子网掩码就能判断出这两台电脑是否处于同一子网中。

假如他们呢处于同一子网中,我们就可以通过ARP协议来获取对方的MAC地址。获取过程依然通过广播形式向同一子网中的每台电脑广播一个数据包,这个数据包中有目标计算机的IP地址,对方收到这个数据包后会取出数据包中的IP地址和自己的地址比较,如果相同则把自己的MAC地址回复给对方,否则则丢弃。这样计算机A就获得了计算机B的MAC地址了。
计算机网络 - 计算机之间的网络互通
另外:传送数据也是通过广播,获取MAC地址也是通过广播。那接收方怎么区别发送方是要发送数据还是询问MAC地址呢?其实在询问MAC地址的数据包中,在对方的MAC地址中一栏中填的是一个特殊的MAC地址,用以区分。

假如两台主机的IP不在同一子网中呢?这个时候我们就会把数据包发送给网关,让网关为我们转发。

3. DNS服务器
我们如何知道一台主机的IP地址呢?我们在上网的时候,一般会在浏览器输入网址而不是IP地址,例如:www.baidu.com 这个域名。其实当我们输入这个域名时,会有一个叫做DNS服务器域名系统(DNS)来帮我们解析这个域名,然后返回这个域名对应的IP。域名系统(DNS)提供主机名字和IP地址之间的转换,比如www.baidu.com是一个域名,应用程序可以通过一个标准库函数(gethostbyname)来获得给定名字主机的IP地址,标准库函数(gethostbyaddr)实现逆操作。

IP地址是一串数字,含义不清、也不便于记忆,主机名含义更清晰,www.baidu.com你就很容易记住,这也是为什么存在IP地址还需要主机名的原因。

因此,网络层的功能就是让我们能够找到另一台计算机在哪里,是否属于同一个子网等。

4. 传输层

在这里我们的数据跋山涉水已经经过物理层、数据链路层、网络层成功的从计算机A到计算机B了。数据就在眼前。可是计算机里有各种各样的程序运行着,计算机该如何知道这些数据是给谁的呢。
于是,就有了端口(Port)

也就是说我们在发送数据的时候还要指定一个端口号,让指定的应用来接收和处理数据。

也就是说IP所在的网络层是提供 端到端主机之间的通信,而传输层则是提供 端口到端口的应用间的通信

有人会说,我们输入网址和大多数时候我们也没有指定端口啊,其实呢,对于有些传输协议,已经有设定了一些默认端口了。例如http的传输默认端口是80,这些端口信息也会包含在数据包里的。

传输层最常见的两大协议是TCP 协议UDP 协议,其中 TCP 协议UDP协议最大的不同就是 TCP 提供可靠的连接传输,而 UDP 提供的是不可靠无连接传输。
计算机网络 - 计算机之间的网络互通

5. 应用层

这一层是离我们最近的,用户最直接的操作。纷繁负责的数据和数据格式经过应用内部各司其职。我们能把数据按照各个规则进行处理才是得到有用的效果

总结

本次属于公司内训方式讲解了地址、域名、端口、TCP/IP分层模型、封装、分用等概念。五层模型的介绍大概这么多,按照数据如何从A到B的主线以最通俗易懂的方式讲解。确实需要记住的东西不少,当然计算机网络是一门高深的学问,本文讲解中可能存在错误。本人也想用以教代学的方式检验和让自己学得更明白。