计算机网络模型综述
计算机网络模型一般有两种划分,即OSI参考模型(7层)和TCP/IP模型(4层),如下图所示。它们本质上是一样的。
1. 物理层
电脑要组网,第一件事要干什么?当然是先把电脑连起来,可以用光缆、电缆、双绞线、无线电波等方式。
这就叫做物理层,它就是把电脑连接起来的物理手段。物理层的传输单位是比特,这一层主要关注以下内容:
- 通信链路与通信结点的连接需要一些电路接口,物理层规定了这些接口的一些参数。
- 规定了通信链路上传输的信号的意义和电气特征。
物理层的设备有中继器和集线器。中继器也称转发器,主要功能是将信号整形并放大再转发出去,以消除信号因噪声而造成的失真和衰减,使信号的波形和强度达到所需要的要求,来扩大网络传输的距离;集线器实质是多端口的中继器。
2. 数据链路层
总的来说,从上到下的角度来看,链路层提供的服务是将网络层的数据报通过通信链路从一个结点移动到另一个结点;从下至上的角度来看,链路层的功能是确定物理层中‘0’和‘1’的分组方式,单纯的0和1没有任何意义,必须规定解读方式:多少个电信号算一组?每个信号位有何意义?
2.1 以太网协议
早些时候,各个公司都有自己的电信号分组方式,后来出现了“以太网”这种协议,并逐渐占据了主导的地位。以太网规定,一组电信号构成一个数据包,叫做“帧(Frame)”,每一帧分成两个部分:头部(Head)和数据(Data),其中 Head 包含了一些说明信息,比如发送者、接收者以及数据类型等等,而 Data 指的则是传输的数据本身。
2.2 MAC地址
上面提到,以太网数据包的头部包含了发送者和接受者的信息,那么,发送者和接受者是如何标识的呢?
以太网规定,连入网络的所有设备,都必须具有“网卡”接口。数据包必须是从一块网卡,传送到另一块网卡,网卡的地址,就是数据包的发送地址和接受地址,也叫MAC地址。
每块网卡出厂的时候,都有全世界独一无二的MAC地址,长度是48位的二进制,通常用12个十六进制数表示。前6个十六进制是厂商编号,后6个是该厂商的网卡流水号,有了MAC地址,就可以定位网卡和数据包的路径了。
2.3 广播
定义地址只是第一步,后面还有更多的步骤。
- 首先,一块网卡怎么会知道另一块网卡的MAC地址?
回答是有一种「ARP协议」,可以解决这个问题。这个留到后面介绍,这里只需要知道,以太网数据包必须知道接收方的MAC地址,然后才能发送。
- 其次,就算有了MAC地址,系统怎样才能把数据包准确送到接收方?
回答是以太网采用了一种很"原始"的方式,它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。
上图中,1号计算机向2号计算机发送一个数据包,同一个子网络的3号、4号、5号计算机都会收到这个包。它们读取这个包的"标头",找到接收方的MAC地址,然后与自身的MAC地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。这种发送方式就叫做"广播"(broadcasting)。
有了数据包的定义、网卡的MAC地址、广播的发送方式,"链接层"就可以在多台计算机之间传送数据了。
当然,链路层提供服务的细节会随着链路层协议的不同而变化。可能的服务包括:
- 组帧(framing):在网络层数据报经过链路层传送之前,需要将其根据链路层协议封装起来。对于点对点通信,就是PPP帧或HDLC帧;对于广播链路,就是封装成以太网帧(以太网MAC帧)。以太网帧是绝对的重点。
- 链路接入:媒体访问控制协议(MAC)规定了帧在链路上传输的规则。对于点对点链路,MAC协议比较简单,甚至不存在(因此不是重点);MAC协议主要用于协调多个结点的帧传输,也就是多个结点共享单个广播链路的情况(这种情况是重点,结合以太网)
- 可靠交付:当链路层协议提供可靠交付服务时,保证无差错的经链路层移动每个网络层数据报。链路层的可靠交付常用于易产生高差错率的链路,如无线链路;而对于低比特差错的链路,包括光纤、同轴电缆和双绞线链路,则提供不可靠的服务。(如以太网提供的就是无连接不可靠的服务)
- 差错检测和纠正:在传输层和网络层中,也提供了差错检测(即校验和checksum),但是链路层的差错检测通常更为复杂,并且一般用硬件实现。而差错纠正不仅能够检测出帧是否出现比特差错,还能定位出现差错的位置,并纠正差错。
3. 网络层
在数据链路层的基础上,由于有了数据包的定义、网卡的MAC地址、广播的发送方式,已经可以在多台计算机之间传送数据了。但是需要注意,目前实现的是在同一个网络内的不同计算机之间的互访,假设现在位于上海的计算机A想要访问洛杉矶的计算机B,按照广播的方式,就必须要向全世界所有的计算机都发送数据包,换句话说,现在我们认为全世界均处于同一个网络下。However,可能吗?显然,这是行不通的。
于是,有了子网的概念,由一个个子网组成互联全球的互联网。在同一个子网内,通过广播的方式进行传播;而在不同的子网之间,则通过路由的方式发送。这就导致了“网络层”的诞生。
在网络层中,引入了一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址是“网络地址”,简称“网址”。于是,"网络层"出现以后,每台计算机有了两种地址,一种是MAC地址,另一种是网络地址。两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一起。网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。因此,从逻辑上可以推断,必定是先处理网络地址,然后再处理MAC地址。
3.1 IP协议
规定网络地址的协议,叫做IP协议。它所定义的地址,就被称为IP地址。目前,广泛采用的是IP协议第四版,简称IPv4。这个版本规定,网络地址由32个二进制位组成。习惯上,我们用分成四段的十进制数表示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地址,我们如何知道哪一部分代表网络呢?是前16位还是前24位呢?显然,仅从IP地址上是看不出来的,因此也就无法判断两个IP地址是否处于同一个网络内。于是,就需要用到另一个“子网掩码(subnet mask)”的概念了。
所谓"子网掩码",就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.254.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。知道"子网掩码",我们就能判断,任意两个IP地址是否处在同一个子网络。
比如,已知IP地址172.16.254.1和172.16.254.233的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算,结果都是172.16.254.0,因此它们在同一个子网络。
总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。
3.2 IP数据包
IP数据包就是把上层(即传输层)传下来的数据再封装成一个IP头部。如下所示:
各字段简要说明:
- 版本号(4位):表示是IPv4还是IPv6
- 首部长度(4位):因为一个IPv4数据报包含一个可变部分,因此需要“首部长度”字段来确定首部的长度,一般来说ip数据报不包含可变部分,即首部长度为20字节。单位是4字节。
- 区分服务:略
- 总长度(16位):指首部和数据域之和的长度,单位是字节。理论上一个数据报的最大长度可达2^16 - 1 = 65535字节,但是由于以太网帧的最大传输单元(MTU)为1500字节,因此,对于以太网来说,ip数据报的总长度若超过1500字节的,就需要分片。
- 标识、标志和片偏移:这3个字段主要与IP分片有关,下面单独讲。
- 生存时间(Time-To-Live,TTL)(8位):该字段用来标识数据报在网络中可通过的路由器数的最大值,以确保数据报不会永远在网络中循环。每当数据报经过一个路由器后,TTL减1,当TTL的值为0时,就丢弃该数据报。
- 协议(8位):标识IP数据报中的数据应该交给那个传输层协议(TCP/UDP),其中值为6表示TCP,值为17表示UDP。
- 首部校验和(16位):只校验分组的首部,不校验分组的数据部分。
- 源地址和目的地址(32位):发送方和接收方的ip地址
- 可选部分:略
- 数据域:即传输的真正有效载荷
从更宏观的角度来看,各层之间的数据封装如下,上层的变动完全不涉及下层的结构。这也体现了网络协议分层的好处。
3.3 ARP(Address Resolution Protocol)地址解析协议
关于"网络层",还有最后一点需要说明。
因为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地址,可以把数据包发送到任意一台主机之上了。
4. 传输层
有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。
接下来的问题是,同一台主机上有许多程序都需要用到网络,比如,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示网页的内容,还是表示在线聊天的内容?也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做"端口"(port)。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。
"端口"是0到65535之间的一个整数,正好16个二进制位。0到1023的端口被系统占用,用户只能选用大于1023的端口。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。
"传输层"的功能,就是建立"端口到端口"的通信。相比之下,"网络层"的功能是建立"主机到主机"的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做"套接字"(socket)。有了它,就可以进行网络应用程序开发了。
4.1 UDP协议
UDP协议提供的功能非常简单,它的格式几乎就是在数据前面加上端口号。另外,从功能上来说,UDP协议只在IP的数据报服务上增加了两个基本的服务:复用/分用和差错检测。如果应用程序开发者选择UDP而不是TCP,则应用程序几乎是直接和IP打交道。
UDP是提供无连接不可靠的服务,TCP提供有连接可靠的传输服务,那么为什么会选择UDP来开发应用程序呢?哪些场景适合采用UDP协议开发呢?
UDP有以下优点:
- 无需建立连接。相比于TCP,UDP不会因为建立连接而造成时延。因此响应速度会比较块。
- 无连接状态。TCP需要在端系统中维护连接状态(包括接收和发送缓存、拥塞控制参数、序号和确认号的参数等)。而UDP不维护连接状态,也不跟踪这些参数。对于某些专用服务器,在使用UDP时能支持更多活跃客户。
- 分组首部开销小。TCP首部有20字节(即为了维护状态信息),而UDP首部只有8字节。(这就是前面说的UDP的格式比较简单)
- 应用层能更好的控制要发送的数据和发送时间。因为UDP没有拥塞控制,所以网络中的拥塞状况不会影响主机的发送效率。怎么理解呢?采用UDP时,只要应用进程将数据传递给UDP,UDP就会将此数据打包进UDP报文段并立即将其传递给网络层;而对于TCP而言,就会考虑拥塞情况而不在乎可靠交付要多长时间。
4.2 TCP协议
UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。
为了解决这个问题,提高网络可靠性,TCP协议就诞生了。这个协议非常复杂,但可以近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。因此,TCP协议能够确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。关于TCP协议的传输原理是计算机网络的重点,这部分单独讲。
5. 应用层
应用程序收到"传输层"的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。
"应用层"的作用,就是规定应用程序的数据格式。
举例来说,TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了"应用层"。应用层的协议包括:
- 虚拟终端协议(TELNET,TELecommunications NETwork)
- 文件传输协议(FTP,File Transfer Protocol)
- 电子邮件传输协议(SMTP,Simple Mail Transfer Protocol)
- 域名服务(DNS,Domain Name Service)(
- 超文本传送协议(HTTP,HyperText Transfer Protocol)等。
- ...
6. 总结
层级 | 传输单位 | 物理设备 | 典型的协议 |
---|---|---|---|
应用层 | 报文(message) | FTP、SMTP、DNS、HTTP | |
传输层 | 报文段(segment) | TCP、UDP | |
网络层 | 数据报(datagram) | 路由器 | IP、ARP |
链路层 | 帧(frame) | 网桥和交换机 | 以太网协议、 |
物理层 | 比特(bit) | 中继器和集线器 |
参考:
- 本文主要整理自阮一峰老师的互联网协议入门(一)
- 《计算机网络·自顶向下方法》
- https://www.jianshu.com/p/c793a279f698