计算机网络知识框架总结(复习)

前言

在大学学习了计算机网络,已经复习好几遍了,依然会忘记一些内容,虽然每次复习的时候都能重新认识到新的知识,但脑海中没有形成一个大致的框架,在复习的时候会没有查漏补缺的效果。

笔者打算写一篇学习笔记,初步总结计算机网络的知识框架,从总体把握,读者们大致能清楚计算机网络协议之间的关系。

主要参考了阮一峰老师的文章:互联网协议入门(一),写得很棒。本文在这基础上加入了笔者自己的理解,后续也会对文章中提到的协议进行适当补充。

概述

计算机网络是由好几层结构的组成,每一层相对独立又相互联系,像建筑物一样,每一层都为下一层提供了支持。每一层都是为了完成一种功能,为了能够让各层之间相互适配,需要各层都遵守共同的规则,这规则就叫做“协议”。

计算机网络的每一层都定义了很多协议,它们是计算机网络的核心。

对于计算机网络分层模型,许多书如《计算机网络:自顶向下方法(原书第6版)》是按照五层模型来解释,本文也是将计算机网络按五层来进行介绍。
在这里插入图片描述
用户接触到的只是最高层的应用层,对其下的层根本没有感觉。而且,越下面的层,越靠近硬件;越上面的层,越靠近用户

为什么要将计算机网络分层次呢?

封装对相邻层的变化。

开发的小伙伴们都知道:实现一个复杂、多功能的程序,为了便于维护和扩展,各模块功能之间应该是解耦的。分层次,不仅可以让各层专注于自己的“任务”,只需要正常提供服务即可;还可以实现技术的变化不会对其他层乃至整个系统的工作产生影响。

接下来介绍每一个层的功能及其主要的协议。

1、物理层

电脑之间能通信,首先得是先把电脑连接起来。可以通过使用光缆、电缆、双绞线、无线电波等方式将若干部电脑连接起来。
在这里插入图片描述
这就是“物理层”,是将电脑连接起来的物理手段,作用是负责传送0和1的电信号

物理层解决的是如何在连接好的各种计算机之间传输数据比特流,所以这一阶段的任务是确定传输媒体的接口的特性:机械特性(接口类型)、电气特性(电压范围)、功能特性(如-5V代表0,+5V代表1)、过程特性(各部件的工作步骤)。

2、数据链路层

然而,单纯的0和1是没有意义的,这串电信号需要有特定的解读方式:多少个电信号算一组?每个信号位有何意义?

数据链路层在物理层的上方,确定了0和1的分组方式。比特流在传输的过程中肯定会存在误差,数据链路层会采用差错检测、差错控制、流量控制等方法,向上一层提供高质的数据传输服务。

2.1. 以太网协议

早期每家公司都有自己的电信号分组方式,后来有一种叫做“以太网(Ethernet)”的协议占据了主导地位。以太网规定,一组电信号构成一个“(Frame)”,每一个帧分成两个部分:标头(Head)和数据(Data)
在这里插入图片描述
标头:包含数据包的一些说明项,比如发送者、接收者、数据类型等等;

数据:数据包中的具体内容。

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

2.2. MAC地址

按照以太网协议的帧发送数据,帧中的标头包含了发送者和接收者的信息,那么发送者和接收者的信息是如何标识的呢?

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

每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是48个二进制位,通常用12个六进制数表示。在Windows系统中可以通过命令来查看:

ipconfig/all

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

虽然说MAC地址是独一无二的,但是其实是可以修改本地的MAC地址的,有兴趣的朋友可以去试下。

2.3. 广播

上面我们介绍了,一块网卡有独一无二的MAC地址,而且以太网帧必须知道接收方的MAC,才能发送。

系统是怎么将帧准确送到接收方?

以太网采用一种“广播”的方式,它并不将数据包准确地送到接收方,而是向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。
在这里插入图片描述
如图,1号计算机向2号计算机发送一个数据包,在同一个网络端的3号、4号、5号计算机都会收到这个包。它们读取这个包的“标头”,找到接收方的MAC地址,然后与自身的MAC地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。这种发送方式就是"广播(Broadcasting)"。

3、网络层

理论上,仅仅依靠MAC地址,两部电脑相互之间就可以发送数据了。但是这么做有一个重大缺陷。以太网采用广播方式发送数据包,所有成员人手一个数据包,不仅效率低下,而且仅局限于发送者所在的子网络。

也就是说,如果两台计算机不在同一个子网络,采用广播的方式是无法传输的。而这种设计是合理的,否则互联网上的所有计算机都会收到所有的包,不说信息安不安全,光是包数量都互联网来说就是灾难了。
在这里插入图片描述
计算机网络是无数个字网络共同组成的一个巨型网络,所以,需要区分哪些MAC地址属于同一个子网络,哪些不是。

如果是同一个子网络,就采用广播方式发送,否则就采用“路由”方式发送(路由,就是指如何向不同的字网络分成数据包,这个知识点比较庞大,留坑)。然而,MAC地址本身无法做到这点,因为MAC地址只跟厂商有关,与所处网络无关。

所以“网络层”就诞生了,它的作用是引进一套新的地址制度,使得我们能够区分不同的计算机是否属于同一个子网络,这套地址就叫做“网络地址”。

于是,每台计算机都有两种地址,一种是MAC地址,另一种是网络地址,二者之间没有任何联系,MAC地址是由厂商绑定在网卡上的,网络地址是由管理员分配的,它们只是随机组合在一起。

网络地址确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。从逻辑上推断,应该是先处理网络地址,再处理MAC地址

3.1. IP协议

规定网络地址的协议,叫做IP协议。它所定义的地址,就被称为IP地址。IP协议有两个版本,IPv4和IPv6,在IPv4中规定,网络地址由32个二进制位组成。但是,目前IPv4已经全部分配完毕,所以IPv6的时代即将来临了。

本文为了方便,还是使用了IPv4的版本来进行介绍。习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0~255.255.255。互联网上的每一台计算机,都会分配到一个IP地址。这个地址分为两部分,前部分是网络段,后部分代表主机。处在同一子网络的电脑,它们IP地址的网络部分必定是相同的。
在这里插入图片描述
请听题:请判断172.16.252.1和172.16.254.3这两个IP地址之间的关系。

答案是,无法判断。因为不知道网络部分是前24位,还是前16位,这从IP地址上是看不出来的。

这时候需要一个参数来表示子网络特征,这就是“子网掩码”。子网掩码的形式等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。知道了子网掩码,我们就能判断,任意两个IP地址是否处于同一个子网络。

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

请听题:假如172.16.252.1和172.16.254.3这两个IP地址的子网掩码都是255.255.255.0,那它们在同一个子网络吗?
在这里插入图片描述
如果子网掩码是255.255.240呢?
在这里插入图片描述
所以,IP协议的作用主要有两个,一个是为每台计算机分配IP地址,为数据包的传送提供地址,另一个作用是确定哪些地址在同一个子网络

3.2. IP数据包

根据IP协议发送的数据,就叫IP数据包,其中必定包括IP地址信息。而我们之前说过,以太网数据宝只包含MAC地址,并没有IP地址的栏位,那么IP数据包放在那里呢?

IP数据包可以直接放进以太网数据包的“数据”部分,这样就完全不用修改以太网的规格。这就是计算机网络分层的好处:上层的变动完全不涉及下层的结构
在这里插入图片描述
标头:包括版本、长度、IP地址等信息;

数据:IP数据包的具体内容。

将IP数据包放入以太网数据包后,以太网数据包就变成下面这样:
在这里插入图片描述
IP数据包的标头部分的长度为20到60字节,整个数据包的总长度最大为65535字节。因此,理论上,一个IP数据包的数据部分,最长为65515字节。在上文说过,以太网数据包的数据部分最长也就1500字节。因此,如果IP数据包超过了1500字节,那么就需要分割成几个以太网数据包,分开发送了。

3.3. ARP协议

上文提到了,IP数据包的传送中我们必须知道两种地址:IP地址和MAC地址。通常我们会知道对方的IP地址(后文会解释),但是我们并不知道它的MAC地址。

所以需要一种机制,可以从IP地址得到MAC地址。

在这里需要分两种情况。第一种,如果两台主机不在同一个子网络,这就没有办法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的“网关(Gateway)”,让网关去处理。
在这里插入图片描述
如图,1号电脑向4号电脑发送一个数据包。它先判断4号电脑是否在同一个子网络,结果发现不是(后文会介绍),于是就把这个数据发送都网关A。网关A通过路由协议,发现4号电脑位于子网络B,又把数据包发给网关B,网关B再转发到4号电脑。

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

总结上述,可以得到下面这种表:

场景 数据报地址
同一个子网络 对方的MAC地址,对方的IP地址
非同一个字网络 网关的MAC地址,对方的IP地址

对于ARP的应用,有兴趣的朋友可以去了解一下:ARP欺骗,很有意思的。

4、传输层

有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。

但是,如果你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,怎么判断这数据包里是表示网页的内容,还是表示在线聊天的内容?

所以我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数叫做“端口(Port)”,它是每个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。

“端口”是0到65535之间的一个整数,正好16个二进制位。0到1023的端口被系统占用,用户只能选用大于1023的端口。所以应用程序会随机选用一个端口,然后与服务器的相应端口联系。可以在windows中的命令提示符来查看:

netstat -ano

在这里插入图片描述
可以看到,PID所代表的服务的端口是“本地地址”里:后的数字。

“传输层”的功能,就是建立“端口到端口”的通信。相比之下,“网络层”的功能是建立“主机到主机”的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做“套接字(socket)”。有了它,就可以进行网络应用程序开发了。

4.1. UDP协议

上文中我们提到了如果要识别数据包是发送给哪个程序,就需要加入端口信息,这就需要新的协议。最简单的实现是叫做UDP协议,它的格式几乎就是在数据前面,加个端口号。UDP数据包,也是由“标头”和“数据”两部分组成
在这里插入图片描述
标头:定义了发出端口和接收端口;

数据:具体的内容。

然后,将整个UPD数据包放入IP数据包的数据部分,而前文提到,IP数据包放在以太网数据包之中,所以整个以太网数据包现在变成了下面这样:
在这里插入图片描述
UDP数据包非常简单,标头部分只有8个字节,总长度不超过65535字节,正好放进一个IP数据包。

4.2. TCP协议

UDP协议的优点是结构简单,容易实现,但缺点是可靠性比较差,一旦数据包发出,无法知道对方是否收到。所以为了提高网络可靠性,TCP协议就诞生了。

这个协议很复杂,后续会专门写一篇关于TCP协议的文章。此处可以简单认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。

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

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

5、应用层

当应用程序收到“传输层”的数据之后,下一步是要对其中内容进行解读,但是传过来的数据五花八门,除非事先规定好格式,否则根本无法解读。而应用层的作用,就是规定应用程序的数据格式

举个栗子,TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了“应用层”。这是最高的一层,直接面对用户,所以它的数据就放在TCP数据包的数据部分,因此,现在的以太网的数据包就变成这样了:
在这里插入图片描述
接下来用打开Baidu主页作为栗子

我们知道,如果要上网,就得先设置好这几个参数:

  • 本机的IP地址
  • 子网掩码
  • 网关的IP地址
  • DNS的IP地址

这四个参数缺一不可,由于它们是给定的,每次计算机开机的时候,都会分到同样的IP地址,所以这种情况被称作“静态IP地址上网”
在这里插入图片描述
但是这种方式对于普通用户来说,有点“看起来好难的样子”,而且如果一台电脑的IP地址保持不变,其他电脑就不能使用这个地址。所以大多数用户使用“动态IP地址上网”。动态IP地址,是指计算机开机后,会自动分配到一个IP地址,不用人为设定。它使用的协议叫做DHCP协议

5.1. DHCP协议

DHCP协议规定,每一个子网络中,有一台计算机**“DHCP服务器”负责管理本网络的所有IP地址**。新的计算机加入网络,必须向DHCP服务器发送到一个“DHCP请求”数据包,申请IP地址和相关的网络参数。

前面说过,两台计算机在同一个子网络,必须要知道对方的MAC地址和IP地址,才能发送数据包。

但是,新加入的计算机不知道别的计算机的MAC地址和IP地址,怎么发送数据包?

DHCP协议是建立在UDP协议上的应用层协议,其数据包如下:
在这里插入图片描述

  1. 以太网标头,设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者就是本机网卡的MAC地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。
  2. IP标头,设置发出方的IP地址和接收方的IP地址。这时对于两者,都是一个位置信息。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255。
  3. UDP标头,设置发出方的端口和接收方的端口。这部分是DHCP协议规定好的,发出方是68端口,接收方是67端口。

这个数据包构造完成后,就可以发出了。

以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的MAC地址是FF-FF-FF-FF-FF-FF,所以也看不出是发给谁的。每台收到这个包的计算机,还必须分析这个包的IP地址,才能确定是不是发给自己的。当看到发出方IP地址是0.0.0.0,接受方是255.255.255.255,于是DHCP服务器才知道“这个包是发给我的”,而其他计算机就可以丢弃这个包。

接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个“DHCP响应”数据包。这个响应包的结构,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是67(发出方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。

所以,新加入的计算机收到这个响应包,于是就可以知道自己的IP地址、子网掩码、网关地址、DNS服务器等参数

5.2. DNS协议

一般我们打开浏览器,输入网址打开网页。从上文我们可以知道,如果我们想发送数据包请求资源,必须要先知道对方的IP地址。但是我们只知道网址如www.baidu.com,不知道它的IP地址。

DNS协议可以帮助我们,将这个网址转为IP地址。已知DNS服务器为8.8.8.8,于是我们想这个地址发送一个DNS数据包(53端口)。
在这里插入图片描述
然后,DNS服务器做出响应,告诉我们Baidu的IP地址是14.215.177.39。于是,我们知道了对方的IP地址。

接下来,我们要判断这个IP地址是不是与本机在不在同一个子网络,这就需要用到子网掩码。用子网掩码分别与Baidu的IP地址和本机的IP地址进行AND运算。如果这两个结果相等,说明在同一个子网络;如果结果不相同,则Baidu与本机不在同一个子网络,需要由网关来处理。

因此,我们如果要向Baidu发送数据包,必须通过网关转发,也就是说,以太网标头的接收方MAC地址将是网关的MAC地址。

5.3. HTTP协议

我们要浏览网页,使用的协议是HTTP协议,其数据包结构如下:
在这里插入图片描述
HTTP部分的内容,类似于:

GET … HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Accept: application/json, text/javascript, /; q=0.01
Sec-Fetch-Dest: empty
User-Agent: Mozilla/5.0 …
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Referer: https://www.baidu.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: …

我们假定这部分的长度为4960字节,他会被嵌入TCP数据包中。

  • TCP协议

TCP数据包需要设置端口,接收方(Baidu)的HTTP端口假设为80,发送方(本机)的端口是一个随机生成的1024~65535之间的整数,假定为42341。

TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度为4980字节

  • IP协议

然后,TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是本机IP地址,接收方是Baidu的IP地址。

IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度为5000字节

  • 以太网协议

最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方位本机的网卡MAC地址,通过ARP协议+网关的IP地址,可以得到网关的MAC地址,所以接收方为网关的MAC地址。

因为,以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分成4个包。且每个包都有自己的IP标头(20字节),所以4个包的IP数据包的长度分别为1500、1500、1500、560
在这里插入图片描述

  • 服务器端响应

经过多个网关的转发,Baidu的服务器14.215.177.39,收到了这四个以太网数据包。

根据IP标头的序号,Baidu将四个包拼接起来,取出完整的TCP数据包,然后读出里面的“HTTP请求”,接着做出“HTTP响应”,再用TCP协议发回来。

本机收到HTTP响应后,就可以将网页显示出来,完成一次网络通信。
在这里插入图片描述
到这里,计算机网络的五层模块就介绍完啦~

结语

阮一峰老师这篇文章互联网协议入门(一)写的真的很棒,博主小菜鸡一只,只能借这篇文章复习下框架,后续会根据复习的内容,将文章里的内容慢慢充实起来。

如果本文对你的学习有帮助,请给一个赞吧,这会是我最大的动力~

参考资料:

互联网协议入门(一)
互联网协议入门(二)
计算机网络——物理层
【计算机网络】你真的理解数据链路层吗?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章