Android 网络基础之网络协议篇

1,792 阅读9分钟

读前思考

学习一门技术或者看一篇文章最好的方式就是带着问题去学习,这样才能在过程中有茅塞顿开、灯火阑珊的感觉,记忆也会更深刻。

  1. 五层网络协议的体系结构分别是什么?每一层都有哪些协议?
  2. 为何有MAC地址还要IP地址?

网络协议五层模型

对于网络的分层,有的分为七层,有的分为四层,而我认为五层模型是最容易理解的网络模型。

image

如上图所示,从上往下依次为应用层、传输层、网络层、链接层、实体层。
越往上,就越靠近用户;越往下,则越靠近硬件。

协议

大家都遵守的规则,就叫做"协议"(protocol)。

互联网的每一层,都定义了很多协议。这些协议的总称,就叫做"互联网协议"(Internet Protocol Suite),它们是互联网的核心。

实体层(Physical Layer)

我们从最下面一层开始分析,电脑要联网,第一件事要做什么?就是用电缆、光缆、双绞线等方式将电脑连接起来,这就是实体层。

实体层就是就是把电脑连接起来的物理手段。它主要规定了网络的一些电气特性,作用是负责传送 0 和 1 的电信号。

链接层(Link Layer)

"链接层"在"实体层"的上方,确定了 0 和 1 的分组方式。(多少个电信号算一组?每个信号位有何意义?)

以太网协议

以太网规定,一组电信号构成一个数据包,叫做"帧"(Frame)。每一帧分成两个部分:标头(Head)和数据(Data)。

"标头"包含数据包的一些说明项,比如发送者、接受者、数据类型等等;"数据"则是数据包的具体内容。

"标头"的长度,固定为 18 字节。"数据"的长度,最短为 46 字节,最长为 1500 字节。因此,整个"帧"最短为 64 字节,最长为 1518 字节。如果数据很长,就必须分割成多个帧进行发送。

MAC 地址

以太网规定,连入网络的所有设备,都必须具有"网卡"接口。数据包必须是从一块网卡,传送到另一块网卡。网卡的地址,就是数据包的发送地址和接收地址,这叫做 MAC 地址。

每块网卡出厂的时候,都有一个全世界独一无二的 MAC 地址,长度是 48 个二进制位,通常用 12 个十六进制数表示。

前 6 个十六进制数是厂商编号,后 6 个是该厂商的网卡流水号。有了 MAC 地址,就可以定位网卡和数据包的路径了。

广播

以太网采用了一种很"原始"的方式,它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。

同一个子网络的计算机都会收到这个包。它们读取这个包的"标头",找到接收方的 MAC 地址,然后与自身的 MAC 地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。这种发送方式就叫做"广播"(broadcasting)。

有了数据包的定义、网卡的 MAC 地址、广播的发送方式,"链接层"就可以在多台计算机之间传送数据了。

网络层(Network Layer)

以太网协议,依靠 MAC 地址发送数据。这样做有一个重大的缺点。以太网采用广播方式发送数据包,如果两台计算机不在同一个子网络,广播是传不过去的。这种设计是合理的,否则互联网上每一台计算机都会收到所有包,那会引起灾难。

因此,必须找到一种方法,能够区分哪些 MAC 地址属于同一个子网络,哪些不是。如果是同一个子网络,就采用广播方式发送,否则就采用"路由"方式发送。("路由"的意思,就是指如何向不同的子网络分发数据包)

作用

“网络层”的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做"网络地址",简称"网址"。

"网络层"出现以后,每台计算机有了两种地址,一种是 MAC 地址,另一种是网络地址。网络地址帮助我们确定计算机所在的子网络,MAC 地址则将数据包送到该子网络中的目标网卡。因此,从逻辑上可以推断,必定是先处理网络地址,然后再处理 MAC 地址。

IP协议

规定网络地址的协议,叫做 IP 协议。它所定义的地址,就被称为 IP 地址。习惯上,我们用分成四段的十进制数表示IP地址,从 0.0.0.0 一直到 255.255.255.255。

IP 地址的前一部分代表网络,后一部分代表主机。比如,IP 地址 172.16.254.1,这是一个 32 位的地址,假定它的网络部分是前 24 位(172.16.254),那么主机部分就是后 8 位(最后的那个1)。处于同一个子网络的电脑,它们 IP 地址的网络部分必定是相同的,也就是说 172.16.254.2 应该与 172.16.254.1 处在同一个子网络。

但是,问题在于单单从 IP 地址,我们无法判断网络部分。还是以 172.16.254.1 为例,它的网络部分,到底是前 24 位,还是前 16 位,甚至前 28 位,从 IP 地址上是看不出来的。

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

知道**"子网掩码"**,我们就能判断,任意两个 IP 地址是否处在同一个子网络。方法是将两个 IP 地址与子网掩码分别进 行 AND 运算(两个数位都为 1,运算结果为 1,否则为 0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。

ARP协议

因为 IP 数据包是放在以太网数据包里发送的,所以我们必须同时知道两个地址,一个是对方的 MAC 地址,另一个是对方的 IP 地址。通常情况下,对方的IP地址是已知的(后文会解释),但是我们不知道它的 MAC 地址。

所以,我们需要一种机制,能够从 IP 地址得到 MAC 地址。

这里又可以分成两种情况。第一种情况,如果两台主机不在同一个子网络,那么事实上没有办法得到对方的 MAC 地址,只能把数据包传送到两个子网络连接处的"网关"(gateway),让网关去处理。

第二种情况,如果两台主机在同一个子网络,那么我们可以用 ARP 协议,得到对方的 MAC 地址。ARP 协议也是发出一个数据包(包含在以太网数据包中),其中包含它所要查询主机的IP地址,在对方的 MAC 地址这一栏,填的是 FF:FF:FF:FF:FF:FF,表示这是一个"广播"地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出 IP 地址,与自身的 IP 地址进行比较。如果两者相同,都做出回复,向对方报告自己的 MAC 地址,否则就丢弃这个包。

有了 ARP 协议之后,我们就可以得到同一个子网络内的主机 MAC 地址,可以把数据包发送到任意一台主机之上了。

传输层(Transport Layer)

**"端口"(port)**表示这个数据包到底供哪个程序(进程)使用。
"传输层"的功能,就是建立"端口到端口"的通信。相比之下,"网络层"的功能是建立"主机到主机"的通信。只要确定主机和端口,我们就能实现程序之间的交流。

UDP协议

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

UDP 数据包,也是由"标头"和"数据"两部分组成。

"标头"部分主要定义了发出端口和接收端口,"数据"部分就是具体的内容。

UDP 数据包非常简单,"标头"部分一共只有8个字节,总长度不超过 65,535 字节,正好放进一个 IP 数据包。

TCP协议

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

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

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

TCP 数据包和 UDP 数据包一样,都是内嵌在 IP 数据包的"数据"部分。TCP 数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常 TCP 数据包的长度不会超过IP数据包的长度,以确保单个 TCP 数据包不必再分割。

应用层(Application Layer)

"应用层"的作用,就是规定应用程序的数据格式。

举例来说,TCP 协议可以为各种各样的程序传递数据,比如 Email、WWW、FTP 等等。那么,必须有不同协议规定电子邮件、网页、FTP 数据的格式,这些应用程序协议就构成了"应用层"。

image

至此,整个互联网的五层结构,自下而上全部讲完了。

文章已经读到末尾了,不知道最初的几个问题你都会了吗?如果不会的话?可以再针对不会的问题进行精读哦!答案都在文中,相信你肯定可以解决的!