互联网协议入门(一)

互联网协议解决的问题是:两台计算机是如何进行通讯的…

概述

互联网协议解决的问题是:两台计算机是如何进行通讯的。
互联网的核心是一系列协议。它们对电脑如何连接和组网,做出了详尽的规定。理解了这些协议,就理解了互联网的原理。

互联网的分层

互联网可以分为好几层。越往下,越是接近硬件;越往上,越贴近用户。
为方便理解,这里将互联网分成5层:
五层互联网模型
每一层都是为了完成特定的功能。而完成特定的功能,需要大家共同遵守一些普世的规则。这些规则就是互联网协议。

实体层

首先我们需要通过光缆、电缆、双绞线、无线电波等方式将单个电脑接入到整个互联网中。
实体层就是把电脑连接起来的物理手段。它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号。

链接层

实体层传送的只是一些0和1的电信号,而单纯的0和1是没有意义的,必须规定相应的解读方式:
多少个电信号算一组?每个信号位有何意义?

以太网协议

以太网规定:一组电信号为一帧,每一帧都包含一个标头(head)与数据实体(data)。
标头包含一些说明数据,如发送者、接受者、数据类型等等。
tips: 一帧可容纳的数据有限。所以数据量过大时,需要分成多个帧来传输。

mac地址

前面提到以太网的标头中包含发送者与接受者信息。那发送者与接受着到底是用什么来表示呢?
答案就是mac地址(全世界独一无二的网卡地址)

广播

定义地址只是第一步,发送者会将要发送的信息广播出去。接受者会解析以太网标头中的接受者的mac地址,并将之与自身网卡的mac地址进行比较来判断自己是不是要接收这条信息。
tip: 以太网的广播方式只能广播给同一个子网络中的计算机。
这里留下一个疑问,发送者如何知道对方的mac地址呢?

网络层

前面提到,广播的方式只能广播给同一子网络中的计算机。而完整的互联网是无数的子网络所组成的一个巨大的网格。
所以在真实的互联网的世界中,我们应当是先确定目标计算机所在的子网络,然后通过以太网协议标头中的mac地址信息来匹配子网络中具体的某一台目标计算机。
那么问题来了:如何确定目标计算机所在的子网络呢?
网络层便是用来确定目标计算机在哪个子网络的协议。它引进了一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做”网络地址”,简称”网址”。

IP协议

规定网络地址的协议,叫做IP协议。它所定义的地址,就被称为IP地址。
目前,广泛采用的是IP协议第四版,简称IPv4。这个版本规定,网络地址由32个二进制位组成。
习惯上,我们将网址分成4段。所以网址的范围为0.0.0.0255.255.255.255

如何根据IP地址判断两台计算机是否在同一子网络中呢?
我们并不知道一个IP地址的前面多少位是它的网络部分(网络部分相同即同一子网络),所以单纯通过IP地址是无法判断两个计算机是否在同一子网络的。

前面讲到单纯通过IP地址是无法判断两个计算机是否在同一子网络中的。此时需要配合另外一个网络参数子网掩码
总的来说,子网掩码就是告诉了我们哪几位是网络部分,哪几位是主机部分。

所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.254.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。

将IP地址与子网掩码进行AND运算,就能最终知道目标计算机在哪个子网络。

总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。

IP数据包

根据IP协议发送的数据,就叫做IP数据包。不难想象,其中标头部分必定包括IP地址信息。
“标头”部分主要包括版本、长度、IP地址等信息,”数据”部分则是IP数据包的具体内容。它放进以太网数据包后,以太网数据包就变成了下面这样(以太网数据包整体作为IP数据包的数据部分存在)。
数据包

ARP协议

要精准找到发送目标,我们需要两个信息:IP地址与mac地址。IP地址是已知的,mac地址却不得而知。
所以我们需要一种机制,能够由IP地址得到mac地址。
以下我们分成两种情况:① 发送者与接收者不在同一子网络(那么事实上没有办法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的”网关”(gateway),让网关去处理);② 发送者与接收者在同一子网络,此时可以通过ARP协议来获取对方的mac地址(具体如何实现,暂且不表)

传输层

有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。
但是每个主机都会有多个程序运行,如何建立两台主机中程序到程序的通信呢?
“传输层”的功能,就是建立”端口到端口”的通信。相比之下,”网络层”的功能是建立”主机到主机”的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做”套接字”(socket)。有了它,就可以进行网络应用程序开发了。

UDP协议

现在,我们必须在数据包中加入端口信息,这就需要新的协议。最简单的实现叫做UDP协议,它的格式几乎就是在数据前面,加上端口号。
UDP协议

TCP协议

UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。

为了解决这个问题,提高网络可靠性,TCP协议就诞生了。这个协议非常复杂,但可以近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。

因此,TCP协议能够确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。

应用层

应用程序收到”传输层”的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。(如http协议)
“应用层”的作用,就是规定应用程序的数据格式。
这是最高的一层,直接面对用户。它的数据就放在TCP数据包的”数据”部分。因此,现在的以太网的数据包就变成下面这样。
完整数据包

参考文章:
互联网协议入门(一)

叶思玄 wechat
如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!