计算机网络是一门基础课程,但是老师所讲的东西无非起到一个抛砖引玉的作用。然而对于需要自学的人来说,无疑是更难的。前路漫漫~~
谢希仁的那本《计算机网络》是很多大学选择的计网教材,在第一章是一个概论,大致讲了计算机网络的发展,也可以说是每个人都必须了解的小常识。在这里,我就做一个总结概括,把它作为学习计网预备知识。
「计算机网络的发展主要经历了下面的七个阶段。」
「批处理」:为了让更多的人使用计算机,出现了批处理系统。所谓的批处理,是指事先把用户数程序数据装入卡带或者磁带,并由计算机按照一定顺序读取。
「分时系统」:批处理系统之后,又出现分时系统。它是指多个终端同时与计算机连接,允许多个用户同时使用计算机。
「计算机通信技术」:在分时系统中,我们看到了终端和计算机的连接,但这并不意味着计算机与计算机之间也已互联连接。随着计算机的数量普及,计算机之间的数据交互的便捷性越来越受到重视,最开始两个主机之间交互数据过程相当繁琐,因此计算机通信技术(计算机与计算机之间由通信线路连接)应运而生。人们可以很轻松的即时读取另一台计算机中的数据,从而极大地缩短了传输数据的时间。
「计算机网络的产生」:20世纪70年代,人们开始实验基于分组交换技术的计算机网络,并着手研究不同厂商的计算机之间相互通信的技术。到了80年代,一种能够互联多种计算机的网络应运而生。网络通信技术进入了发展的高速公路。
「互联网的普及」:进入20世纪90年代,随着计算机的价格降低、性能增强、各类应用纷纷冒头,计算机普及程度越来越高。面对这一趋势,各家厂商不仅要保证生产产品的自身互联性,还着力于让自己的网络技术不断与互联网技术(TCP/IP)兼容。
「互联网时代」:随着互联网的普及,现在,人们越来越离不开互联网了。生活、学习工作也都得依靠网络信息,万物互联的时代早就已经到来了。
「网络安全时代」:互联网给世界带来了颠覆性的改变,给人们日常生活带来了极大的便利,互联网呈现给现代人一个高度便捷的信息网络环境,在国家面前,犹如水电煤气一样,成为了国家必不可少的重要资源,随着万物互联,网络安全必定是国家安全最重要的一环。在互联网普及的初期,人们更关注单纯的连接性,注重不受任何限制的建立连接。但现在,人们不再满足与“单纯的连接”而是更为追求“安全的连接”。
「比特」:比特(bit)是计算机中数据量的单位,也是信息论中使用的信息量的单位。英文单词bit来源于binary digit,意思是一个“二进制数字”。网络技术中的速率指的是连接在计算机网络上的主机在数字信道上传送数据的速率,它也称为数据率(data rate)或比特率(bit rate)。
「带宽」:在计算机网络中,带宽用来表示网络的通信线路传送数据的能力,因此网络带宽表示单位时间内从网络中的某一点到另一点所能通过的“最高数据率”。这种意义的带宽的单位是比特/秒。
「吞吐量」:吞吐量(throughput)表示在单位时间内通过某个网络(或信道、接口)的数据量,他表示当前网络传输数据的能力。
时延:
「时延带宽积」:时延带宽积表示链路可容纳的比特数,因此,链路的时延带宽积又称为以比特为单位的链路长度。
「往返时间RTT」:往返时间RTT,表示从发送方发送数据开始,到发送方收到来自接收方的确认(接收方收到数据后便立即发送确认),总共经历的时间。往返时间一般就会包括分组在网络中的各种时延。
「利用率」:利用率可以分为信道利用率和网络利用率两种。信道利用率指出某信道有百分之几的时间是被利用的(有数据通过)。完全空闲的信道的利用率是零。网络的利用率则是全网络的信道利用率的加权平均值。信道利用率并非越高越好,这是因为,根据排队论的理论,当某信道的利用率增大时,该信道引起的时延也会迅速增加。信道或网络的利用率过高会产生非常大的时延。
按照**「地理覆盖范围」**来分类的话,计算机网络可以被分为一下三个部分:
总线结构
:
优点:费用较低,易于扩展,线路的利用率高;
缺点:可靠性不高,维护困难,传输效率低。
环形结构
:
星型结构
有三种不同的计算机网络分层模型:
「OSI七层模型」
「五层结构模型」
TCP/IP协议是当前互联网所遵循的协议,它并不是单纯地由TCP或者IP组成,而是由各层的协议一起组成的,构成我们通常说说的TCP/IP协议栈。但是为了更好的理解,后面文章也是按照五层协议来写的。
这边先给一个建议,大家在学习计算机网络的时候不应该把每个网络协议单独拿出来学习,应该明白它的产生原因以及在整个计算机网络的作用。
它的作用是:屏蔽不同的传输媒体和通信手段的差异。我们都知道,自然界的信号无非就是两种,一种是数字信号,另一种就是模拟信号。那么是什么模拟信号?什么又是数字信号呢?
说白了,所谓的模拟信号就是连续变化的物理量,模拟信号其特点是幅度连续(连续的含义是在某一取值范围内可以取无限多个数值)。模拟信号,其信号波形在时间上也是连续的,因此它又是连续信号。我们对连续信号进行抽样,就会得到抽样信号,但抽象信号就是离散的(说着说着就说到了信号系统,看来补考对我的影响还是有的)。但数字信号是不同于模拟信号的,他在时间域上是离散的,它有两种不同状态的物理量,分别用“0”,“1”来表示。这就好像电灯开关一样,也有两种不同的状态。
当然,数字信号与模拟信号是可以相互转换的,模拟信号通常使用PCM(脉冲编码调制)方法量化并转换为数字信号,PCM方法是使不同范围的模拟信号对应不同的二进制值。通常,数字信号通过载波相移得到模拟信号。
我们大家都知道,数据在物理层传输的媒介是不一样的,工作在物理层的是**「集线器」**。不过,大致可以为一下两类:
说起信道,前面的基础篇提到过信道的利用率,但至于信道更详细的介绍,就没有提到,现在就来仔细看看。按照传输媒介可以分为三类:
信道是传输信息的信道,信道容量描述了信道无差错地传输信息的最大能力,可以用来衡量信道的好坏。
关于信道,还有一个重要的参数,那就是信噪比,信噪比越大,信道的容量也越大,这里的话给出著名的香农公式:
其中,C为信道容量,B为带宽,S/N为信噪比。
我们知道,当没有数据进行传输的时候,信道是十分空闲的。但是在网络数据请求量大的时候,比如说最近的618,信息的传播速度就会受阻。那什么是信道的复用,复用就是重复使用的意思。信道的复用可以分为以下几个方面:
数据链路层接收来自网络层的IP数据报,通过一定的封装,让IP数据报能在数据链路层上传输。像这样,装好了的IP数据报,我们称之为以太网帧,也叫MAC帧。MAC帧由以下几个重要的部分组成:
为什么要进行差错检测?
现实的通信链路都不会是理想的。这就是说,比特在传输的过程中可能会产生差错:1可能会变成0,0可能会变成1,这就叫做比特差错。在一段是时间内,传输错误的比特占所传输比特总数的比率成为误码率BER(Bit Error Rate)。误码率与信噪比有很大的关系,在实际通信中不可能使误码率下降到零。因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
MAC帧在传播的过程中会产生差错,差错的产生是不可避免的。前面在以太网帧部分我们提到过差错检测序列FCS,根据FCS我们就可以知道这个MAC帧在传输的过程中是否出现了错误或者丢失。
后面讲到传输层的时候我们也会提到差错检测,那么这两者到底有啥区别了?总结起来,可以用一句话概括:
差错检测的方法主要有两种:奇偶校验法(PCC)和循环冗余校验CRC,PCC非常简单,不是这篇文章的重点,下面主要讲一下CRC循环冗余校验。
循环冗余校验是一种根据传输或保存的数据而产生固定位数校验码的方法,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者储存之前计算出来并且附加到数据后面,然后接收端进行检验确定数据是否发生变化。
通过CRC,我们可以计算出FCS冗余校验码,FCS位于MAC帧的尾部。通过FCS,我们就可以知道这个MAC帧是否发送了错误。
说到适配器,其实完全可联想一下生活中的适配器。比如我们给手机充电的时候需要有电源适配器,电源适配器无非就是转换的作用,或者作为一个载体,实现能量的转移。实际上,电脑里的适配器也是一样。结合下面这张图来理解:
我们都知道,数据在外部媒介中的传输方式是串行传输,然而计算机处理内部指令的时候,用的是并行的方式。怎样把串行传输的数据转换成并行传输呢?这就需要适配器了。适配器就像是起到了桥梁的作用,通过它,就可以轻松实现数据传输方式的转换。
我们都知道交换机,交换机是一种多端口的网桥,在数据链路层使用MAC地址转发数据。在交换机类不实际存储以一张表,叫做CAM表。这张表记录了主机的MAC地址以及对应的接口,看看下面的这张图:
有三台主机A,B,C和交换机连接在一起,最开始,CAM里没有存储任何信息。
突然有一天,主机A(源MAC)想要给主机B(目的MAC)发送消息。这个时候,交换机就会检查自己的CAM表里是否存储了主机A的信息,交换机一看没有A的信息,就把A的信息写进自己的CAM表里。现在,交换机的CAM表变成了这样:
这个时候,交换机的CAM表里已经存储了主机A的信息,但是主机A却想要给主机B发送信息。这可怎么办呢?「首先」,交换机会检查自己的CAM表里是否存在B的信息,「如果存在」,就直接把信息转发给B。「如果不存在」,那又怎么办呢?犹豫了一下,交换机又有了一个想法,它把主机A发给主机B的消息以广播的形式发给了所有连在它身上的主机。主机C也收到了这条消息,但是主机C检查了一下目的地址,不是发给自己的,就果断丢弃了这条消息。主机B收到了这条消息后,同样也检查了收件人(目的地址),发现是给自己的消息,于是就收下了这条消息。之后,交换机就更新了自己的CAM表,上面增加了一条信息:
就这样,CAM表里存储了主机A,和主机B的信息。下一次,主机A想要给主机B发送信息的时候,交换机就不需要广播了。
到目前为止CSMA/CD的使用已经相当少了,它的使用在下面两个地方:
「使用CSMA/CD协议的的网络有以下三个特点:」
「补充一下退避算法的特点:」
IP协议对应的是IP地址,那么什么是IP地址呢?
维基百科上是这样解释的:
❝
IP地址(英语:IP Address, 全称:Internet Protocol Address),又译为网际协议地址、互联网协议地址。当设备连接网络,设备将被分配一个IP地址,用作标识。通过IP地址,设备间可以互相通讯,如果没有IP地址,我们将无法知道哪个设备是发送方,无法知道哪个是接收方。[2] IP地址有两个主要功能:标识设备或网络 和 寻址(英语:location addressing)。
❞
上面的一堆文字其实无非解释了两个点,总结如下:
现在想一下前面我们说到的MAC地址,MAC地址是一台主机的身份象征。一台主机从出厂以后,MAC地址就唯一确定了,无法更改(当然也可以通过软件修改,但是必须得确保同一局域网下不能有两台MAC地址相同的主机)。
「那么,为什么有了MAC地址,还需要IP地址?或者说是有了IP地址,还需要MAC地址?」
这其实也算是一个经典的问题了,网上也有不少答案,这里推荐两篇文章:
看完上面两篇文章,我总结如下:
IP数据的样子是这样的:
有几个重要的东西必须得进行说明一下:
关于IP数据报相对详细的文章可以看看这篇文章:IP数据报格式详解
前面说到IP地址的组成的时候,说到过网络号。常见的IP地址无非就是由网络地址和主机地址组成。那么什么是网络号?网络号就是计算机当前所在网络的名字,在这个网络下,又由许多的主机构成。那又该怎么计算网络号了?这时候,子网掩码派上了用场。
通常,计算机的IP地址和子网掩码是成对出现的,通过子网掩码和IP地址进行对照就可以知道主机号和网络号。为了方便表示,子网掩码前面通常是连续的1,后面部分是连续的0,不能出现0和1交替的情况。
请看下面的例子。
现在已经知道了主机A的IP地址和子网掩码,把它们转化成二进制的形式。通过二进制对应子网掩码的1的部分对应IP地址的网络号,子网掩码为0的部分对应主机号。下面的这张图画的很清楚:
我们知道,IP协议是不可靠的传输协议,网络中进行可靠传输的是TCP协议,这个后面在讲传输层的时候会说到。那么,如果在消息没有送达的情况下,网络层是怎么解决的了?这个时候,就需要用到ICMP协议。什么是ICMP协议了?ICMP是网络控制报文协议(Internet Control Message Protocol, ICMP)。
它的作用:更加有效地转发IP数据报作为IP数据报的数据部分,可以分为ICMP差错报文,和ICMP查询报文。差错报文是用来简单的报告错误的, 至于对于错误怎么处理是高层协议的职责。同时, 差错报文总是发送给最初的数据源(这是因为在ICMP数据报中唯一可以使用的就是源IP和目的IP),查询报文总是成对出现。
前面说到IP地址用来寻址,当目的地址和数据报处于同一网络时,MAC地址用来交付数据报。现在有一个问题,主机A要给主机B发送消息,消息经过一系列地转发,终于找到了主机B的IP地址。但是,我们都知道,数据在链路层的传输是需要MAC地址的,仅仅知道B的IP地址是无法进行通信的。请看下面这张图:
这个时候,ARP协议就派上用场了。ARP全称是地址解析协议(Address Resolution Protocol),其基本功能为透过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行,它是IPv4中网络层必不可少的协议。
「如同交换机工作在数据链路层一样,路由器是工作在网络层的。交换机有CAM表,路由器也有路由表。」
现在路由器要给主机B发送一条消息,必须得知道主机B的MAC地址才能进行通信。这个时候路由器会发送一个ARP请求,该请求是以广播的形式发送的,每一台连接到该路由器的主机都收到得到这条消息。但是只有主机B检查到自己的IP地址符合要求。于是主机B发送给路由器一条ARP响应,把自己的MAC的地址告诉了路由器。就像下面图示的那样:
每次路由器发送一个ARP请求的时候,就会增加一条数据,这一条数据记录了IP地址对应的MAC地址,这样路由器下次再给该主机发送消息的时候就不用广播了。当然如同交换机的CAM表中的数据有生存了时间一样,路由表中的数据也有生存时间。试想一下,如果数据一直存在,那么路由器岂不是需要花大量的存储空间来缓存已经失效的数据。
互联网的路由选择协议主要有两种,分别是RIP和OSPF。下面具体介绍这两种协议。
「先介绍RIP协议」:
「接下来说说什么是OSPF:」
参考文章:计算机网络原理之RIP以及OSPF对比
NAT技术其非常简单,那么NAT它的作用是什么呢?
NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。
这种方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做**「NAT路由器」,「它至少有一个有效的外部全球IP地址」。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。另外,这种通过使用少量的公有IP 地址代表较多的私有IP 地址的方式,「将有助于减缓可用的IP地址空间的枯竭」**。
「简单来说,NAT技术就是实现局域网与互联网通信的一项协议。」 NAT又可以分为三种不同的类型:
参考文章【计算机网络】NAT:网络地址转换
我们前面说的IP地址其实是IPV4,那么,为什么已经有IPIV4了,还要来一个IPV4呢?原来是这样的,早在上个世纪,人们就预料到IPV4地址枯竭的一天,为了解决这个问题,开始了IPV6的研发。
「IPv6 (IP version 6)是为了根本解决IPv4地址耗尽的问题而被标准化的网际协议。」 IPv4的地址长度为4个8位字节,即32比特。而IPv6的地址长度则是原来的4倍,即128比特,一般写成8个16位字节。可以看到,IPV6的地址是取之不尽,用之不竭的,那么现在为什么不把IPV4全部换成IPV6呢?
从IPV4切换到IPV6极其耗时,需要将网络中所有主机和路由器的IP地址进行重新设置。当互联网广泛普及后,替换所有IP地址会是更为艰巨的任务。
在现存的网络中,既有IPV4又有IPV6,那么它们之间是怎么通信的呢?有两种技术:「双协议栈」、「隧道技术」,下面分别进行介绍:
什么是停止等待协议了?看完下面一张图你可能就懂了
停止等待协议可以由以下三个部分组成:
数据在传输过程中可能会出现丢失和迟到的情况,对于丢失的数据进行重传,对于迟到的数据不做处理。既然说到了停止等待协议,那我就不得不补充一下ARQ协议。是什么ARQ协议了?
ARQ协议就是发送方不必收到对上一条消息的确认,一次可以发出多个分组,这样就提高了信道的利用,可以在某一时间内传送足够的数据量。
UDP协议相对与TCP协议来说是相当简单的,传输层的重点自然也是TCP协议。下面先简单解释一下UDP协议。
「UDP具有以下特点:」
「TCP是传输层的另一个协议,它具有以下特点:」
请看下面的这张图片(图片来源于网络)。
这里的话对数据报的某些字段作一下解释:
TCP进行数据发送,为了提高数据传输的效率,采用了一种叫做滑动窗口的机制来进行数据发送。
下面是发送端滑动窗口的示意图,滑动窗口的大小是绿色部分和红色部分的序列长度。它工作的机制是这样的,一旦发送端收到一个确认,滑动窗口就会向右移动。
关于流量控制,用一句简短的话就可以概括。
❝
接收端会给发送端一个负反馈,通过这个负反馈可以控制发送端的滑动窗口的大小。
❞
下面可以看一下知乎上是怎么说的,我找了一条讲的最形象,可以结合着理解一下。
知乎:TCP协议的滑动窗口具体是怎样控制流量的?
「慢启动:」 慢启动值得就是一条TCP链接刚建立时不要一下发送大量数据导致网络拥塞激增,而是由小到大根据反馈逐渐增大拥塞窗口。
「拥塞避免:」 拥塞避免就是让滑动窗口缓慢增大,而不是像慢开始那样成倍增长。
「快重传:」 发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器到期。
「快恢复:」 快恢复具有下面两个特点
三次握手与四次挥手可以说是面试常考的知识点了,不过在介绍三次握手之前,我觉得有必要了解一下**「理想传输条件的共性」**:
理想的情况终究是理想的,上述两种情况在实际环境是不可能发生的。那么,我们就来说说怎样使得我们的实际情况更加接近理想,这就是我们接下来要讲的三次握手。
首先,三次握手和后面要讲的四次挥手都是针对TCP来说的,UDP是面向无连接的协议,不可能存在的三次握手与四次挥手。三次握手与四次挥手是为了更好进行可靠的传输,下面先看下面三次握手的流程图。
既然是为了进行可靠的传输,无非是要保证客户端与服务器之间的数据发送和接收的正常进行。
为什么需要进行第三次握手了?一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。
通过上面的三个步骤,Client和Server能够进行可靠的传输,缺一不可。
既然理解了三次握手,想必四次挥手也没有啥难度,先把流程图附上。
如同三次挥手一样,四次挥手也是为了可靠的传输。四次挥手就是Client和Server断开连接的过程,那么你可能会觉得,建立连接的过程需要三次到还可以理解,为啥连断开连接都需要四次。难道一次或者两次就不可以了吗?
是这样的,既然三次握手的需要发送方和接收方确认,那么四次挥手也要得到发送方和接收方的确认。
也可以这样考虑,上面提到的问题。假如在第二次挥手的时候,Server在给Client发送ACK的同时,也发送了FIN的请求。那么如果,Server还在接收从Client传输过来的数据,则会因为Client的下一个ACK而关闭接收数据的通道,数据就会接收失败就像下面的这个图那样。
这里推荐一篇文章,帮助大家更好理解TCP连接地建立和断开的过程:两张动图-彻底明白TCP的三次握手与四次挥手
至于TCP与UDP的关系,看完下面的这张图你可能就懂了(图片来源于网络):
TCP是可靠的传输,UDP是不可靠的传输,那为什么我们还需要使用不可靠的UDP进行数据传输呢?
我们知道,UDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信),比如:QQ 语音、 QQ 视频 、直播等等。
TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的运输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源),这一难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。
关于HTTP的定义,可以看一下维基百科上是怎么说的:
❝
在网页浏览器的地址栏上显示HTTP网络协议的插图 HTTP是一个客户端(用户)和服务端(网站)之间请求和应答的标准,通常使用TCP协议。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。
❞
http协议现在已经广泛用于万维网,关于http,后面单独那个文章出来讲,不过现在得先说一下https。
其实http和https是一种协议,只不过https经过了SSL(Secure Socket Layer,安全套接字层)或TLS(Transport Layer Security,传输层安全)的封装。单从这两个协议就可以知道,https安全的,而http是不安全的。
FTP(File Transfer Protocol)文件传输协议,在TCP/IP协议族中属于应用层协议运行于TCP协议之上是一种可靠的传输协议,主要功能用于实现用户间文件分发共享,以及网络管理者在进行设备版本升级、日志下载和配置保存等业务操作时,均会使用到FTP功能。
前面说到IP地址是用来定位主机的,但是我们在生活中是很难记住这些没有规律的IP地址,我们只知道网站的域名。那现在要怎么办了?
于是DNS协议出现了。
DNS是域名解析协议,假如我们知道了域名,但是不知道服务器的IP地址,就需要用到DNS协议。
什么是DHCP协议了?还是看看维基上的定义
❝
动态主机设置协议(DHCP)是一种使网络管理员能够集中管理和自动分配IP网络地址的通信协议。在IP网络中,每个连接Internet的设备都需要分配唯一的IP地址。DHCP使网络管理员能从中心结点监控和分配IP地址。当某台计算机移到网络中的其它位置时,能自动收到新的IP地址。
❞
curity,传输层安全)的封装。单从这两个协议就可以知道,https安全的,而http是不安全的。
FTP(File Transfer Protocol)文件传输协议,在TCP/IP协议族中属于应用层协议运行于TCP协议之上是一种可靠的传输协议,主要功能用于实现用户间文件分发共享,以及网络管理者在进行设备版本升级、日志下载和配置保存等业务操作时,均会使用到FTP功能。
前面说到IP地址是用来定位主机的,但是我们在生活中是很难记住这些没有规律的IP地址,我们只知道网站的域名。那现在要怎么办了?
于是DNS协议出现了。
DNS是域名解析协议,假如我们知道了域名,但是不知道服务器的IP地址,就需要用到DNS协议。
什么是DHCP协议了?还是看看维基上的定义
❝
动态主机设置协议(DHCP)是一种使网络管理员能够集中管理和自动分配IP网络地址的通信协议。在IP网络中,每个连接Internet的设备都需要分配唯一的IP地址。DHCP使网络管理员能从中心结点监控和分配IP地址。当某台计算机移到网络中的其它位置时,能自动收到新的IP地址。
❞
维基上已经解释的非常清楚了,DHCP的作用就是动态地给主机分配IP地址,大大减少了网络管理员的工作负担。