计算机网络是如何工作的

前言

本文将我学习的计算机网络相关知识做个汇总,以求备忘,形成体系以及将来能融会贯通。

什么是计算机网络

简单地说就是由多台计算机(节点)相互连通(边)形成的通信系统。相对于其他的通信网络如无线电广播和电视信号而言,计算机网络传输的信息是二进制数字。

什么是网络协议

两个中国人之间交流需要双方都懂得汉语普通话,一个中国人和一个美国人交流则需要双方都懂英语。如果其中一人是聋哑人,双方则需要手语来交流。人与人之间的想要交流信息需要双方都接受的编码方式以及这种编码方式的格式和意义,我们把这种格式和意义叫做语言。计算机之间的交流也是一样的道理,编码方式为二进制数字,这些数字的格式和意义叫做协议。

OSI七层模型和TCP/IP五层模型

人类通过抽象来处理复杂的,无法一下子理解的事物。一个复杂的问题可以被分解成很多不同的抽象层次,每一个层次相对易于处理。计算机技术里也经常使用抽象的方法。比如在学习和理解计算机原理的时候,我们分别学习计算机体系结构,操作系统,编译原理,编程语言几个层次的知识,最后再从上到下或者从下到上的融会贯通起来。计算机网络也是一个复杂的系统, 需要处理很多如数据传输介质,信号格式,可靠性,性能和安全等问题,所以也被分为几个层次来设计和构建。

ISO提出了OSI七层模型并将其标准化,但由于其过于复杂不容易实现,实际的网络(如因特网)大多使用TCP/IP五层模型,即物理层,数据链路层,网络层,传输层,和应用层。本文将主要讨论五层模型。


计算机网络是如何工作的_第1张图片

上图链接自selfimpr1991的CSDN博客(http://blog.csdn.net/wenqian1991/article/details/42467643)。此图非常形象地表述了各层之间的关系。两个主机,其用户之间的通信是发送者主机从上至下,接收者主机从下往上。发送者用户(应用层)的数据经由传输层、网络层、链路层,然后通过物理层(媒介)连接到接收者的物理层,然后从下往上经链路层、网络层、传输层再到应用层的接收者用户。来回通信的话就是彼此交换发送者,接收者。需要注意的是,从上往下,数据报是越来越大,因为包含的地址信息越来越多,有效载荷(数据包)是不变的。传输层则添加了双方的端口号,网络层添加了双方的IP地址,链路层首部包含双方的MAC地址,层层添加,反过来,从下至上则是层层过滤。

接下来我们详细了解每一层。

物理层 (Physical Layer)

物理层是最底层也叫做第一层,主要包括实现网络系统的硬件。具体包括传输介质(如CAT5网线,电话线,无线电波等等),网络设备(如交换机,路由器,网卡,调制解调器等)以及操作这些设备的软件(如路由器软件,计算机操作系统等)。

二进制信息传输

计算机网络的信息传输在物理上是通过电流或电磁波实现的。当然机械波也可以传输信息只是比较低效,比如说话就是通过声波在空气中的传播实现的;声波也可以在固体传播,比如在铁皮管子上梆梆敲响也可以在紧急情况下传递信息,这些暂不讨论。电流在导体上传播, 或者电磁波在空气中传播时,根据其随时间而变化的性质可以画出波形图,如下图所示的典型正弦波:


计算机网络是如何工作的_第2张图片


X轴代表时间,Y轴代表信号强度。如果是电信号,Y轴为电压,如果是电磁波,Y轴则为电场强度。无论物理意义如何,Y轴代表的信号强度变化范围被称为“振幅”。信号成周期性变化,一秒钟内重复的周期个数称为“频率”。信号开始时可能处于一个周期内的任何位置,这个位置称为“相位”。

模拟信号(Analog Signal)是指波形为连续变化的信号。比如电模拟信号展现出连续变化的电压。上图所示的正弦波就是模拟信号。

数字信号(Digital Signal)是指波形不连续而是离散地变化的信号。比如电数字信号展现出不连续的,突然变化的电压,如下图所示的方形波:


计算机网络是如何工作的_第3张图片

将原始二进制数据转化为模拟/数字信号的设备就是调制解调器 (MODEM),戏称为‘’猫”。调制解调器包括两个主要组件,调制器(MOdulator)和解调器(DEModulator)。在计算机A发送信息给计算机B的过程中,A首先将二进制数字通过调制器转化为信号,然后信号(比如电流)在介质上传输(比如导体),到达B后通过解调器转换回二进制数字,完成传输过程。

模拟信号和数字信号都可以用来表示二进制数字(0和1)。只要对信号进行有规律的,事先规定好意义的变化就行了。比如上面的正弦波形图,可以规定信号强度到达顶峰时为1, 到达最低谷时为0;也可以规定强度在X轴以上时为1, 以下时为0。而在方波图里也可以做类似的规定。除了振幅,也可以变化频率和相位来表示信息。调制的过程就是通过改变(调制)信号的振幅,频率,相位或者任意的组合来使得波形发生有意义的变化,来表示信息。解调则是相反的过程。具体解释参见此文。

物理层以信号的形式传输二进制数字,每一个二进制数字(0或者1)叫做比特(bit),即Binary Digit的缩写。在物理层上传输的信息是像0101001110011......这样连续的比特流,并不能区分哪一段比特是代表具体什么意义,这是上一层(数据链路层)的工作。

传输介质和信道

传输介质是信号得以传输的媒介,广义上说可以是真空,空气,水,金属等等。信号发射端与接收端之间的介质形成的信号通道称为信道。

有线网络的典型介质以前是电话线,现在更多的是同轴电缆和光纤。无线网络则可以使用不同频率/波长的电磁波,如下图所示:


计算机网络是如何工作的_第4张图片


电磁波的频率与波长成反向变化的关系,频率 X 波长=光速。电磁波的能量决定了它能在介质中传输多远,在空气中传输的电磁波能量的衰减正比于传输距离的平方,是衰减很快的。频率越高的电磁波波长越短,更倾向于沿直线传播,更难进行衍射和反射,就像一头红了眼的公牛只知道朝着红布方向冲过去,不管中间有什么障碍物都直接撞。不同材料的障碍物会对电磁波造成不同程度的能量损耗,比如光能轻易地穿透玻璃而无法穿透墙壁。所以频率高的电磁波适合视距范围内点到点的直接传输,发射端与接收端之间不能有障碍物。由于地球曲率的原因,高频电磁波无法直接进行超视距传输,需要设置中继站。相反,频率低的电磁波很容易通过衍射或者反射绕过障碍物,更适合在复杂地形传播。

最常见的IEEE 802 (也就是WIFI)使用2.4GHz 和 5GHz两种频率。频谱上是在10的9次方,即广播电视频段和微波频段的交界处。很多偏僻的岛屿会使用微波与大陆通信。

网络工程师需要根据实际情况和需求,以及各种介质的性质来决定网络的物理传输介质。

带宽

单位时间内信道可以传输的信息量。数字信号的带宽单位一般用千/兆/吉比特每秒(Kbps/Mbps/Gbps)。频率越高的电磁波单位时间内波形变化越多,所以可以携带的信息越多,带宽也就越大。目前常见的以太网局域网(LAN)带宽是100Mbps。

单工,半双工(Half Duplex),与全双工(Full Duplex)通信

单工是指信号在介质上只能以一个方向流动,即A电脑只能发送信号给B电脑而无法收取信号。

半双工是指信号在介质上可以双向流动,但同一时刻只能单向流动。

全双工是指信号在同一时刻可以在介质上双向流动,介质利用率更高。

集线器(Hub)

最后来说一下(基本上)工作在物理层的设备,集线器。先上图


计算机网络是如何工作的_第5张图片

集线器是最简单,最底层的网络设备。它的基本功能是对信号的放大和转发,也就是相当于多口的中继器。电信号从任何端口流入,都会被放大并转发给其他所有端口,也就是数据广播。用集线器组成的网络成为共享式网络,因为网络中的所有电脑会收到所有的数据,并且共享带宽。共享式网络的优点是简单低成本,缺点是安全性差(一台电脑发送/接受的数据能被所有电脑收到,毫无隐私可言),性能差(很容易形成广播风暴导致带宽用尽)。另外集线器一般是半双工的工作方式所以通信效率较低。

安全

攻击集线器或者共享式网络十分简单,连接到网络中后即可以发送大量数据造成广播风暴,耗尽带宽。

数据链路层 (Data Link Layer)

也简称为链路层。这一层在物理层的基础上加入了逻辑控制的基本功能,来实现一小段数据(信息)从A到B的传输。

物理层以连续比特流的形式传输信息,此时我们还不能分辨那一段比特代表什么意义。链路层的最基本功能就是把连续的比特流切分为一段一段固定长度的0/1序列,叫做“帧”(Frame),并把每一个帧从发送者送达接收者。链路层关心的是每个帧的长度是多少,格式如何,包括什么内容,这些都是链路层协议要规定好的。它并不关心帧里面的数据是和含义。

在链路层中各个节点是以MAC地址为唯一标识的。MAC地址, 即Media Access Control Address, 共6个字节的二进制数,是所有网络设备出厂时设置的全球唯一的地址。其中前三个字节表示由IEEE分配给厂商的地址,将烧录在每一块网络接口卡的ROM中。而制造商通常为其每一网络接口卡分配后三个字节。所以得知一个MAC地址后,就可以在网上查找这块网卡的生产商了。如这个网站https://aruljohn.com/mac/68A3C4A2C1E7。黑客则可以进一步查询这家厂商生产网卡的已知BUG,然后利用BUG进行攻击。

借用邓义兵的博客上形象的比喻:帧就像信封,而链路层则像是社区里的邮差负责把信从A户送到B户。

常见的链路层协议包括IEEE802.3也就是俗称的以太网协议(Ethernet),以及IEEE 802.11也就是俗称的WIFI。以太网协议用于有线网络传输,WIFI用于无线。不太常见的协议则包括令牌环网和SNAP。

以太网协议的具体介绍见http://blog.51cto.com/lbzxy/125527,这里我转载并总结一下。

以太网

以太网这个术语通常是指由DEC,Intel和Xerox公司在1982年联合公布的一个标准,它是当今TCP/IP采用的主要的局域网技术,它采用一种称作CSMA/CD的媒体接入方法。几年后,IEEE802委员会公布了一个稍有不同的标准集,其中802.3针对整个CSMA/CD网络,802.4针对令牌总线网络,802.5针对令牌环网络;此三种帧的通用部分由802.2标准来定义。这里主要讨论802.3。

以太网V2和IEEE802.3两种以太网帧的格式如下图所示:


计算机网络是如何工作的_第6张图片


图片来自Wikipedia:https://en.wikipedia.org/wiki/Ethernet_frame

整个帧的大小根据其包含的数据大小而不定,主要分为以下部分:

前导信息(Premeable):在以太网V2中是8个字节,IEEE802.3中是7个字节。内容为交替出现的1和0,即10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101010 (注意我故意加入空格方便阅读,实际比特流不包含空格)

帧起始定界符(Start Frame Delimiter, SFD):仅在802.3中有效,1个字节,格式与前导信息基本相同,最后两位都是1,即10101011

目标地址(Destination MAC Address): 接收方MAC地址。以太网V2支持6个字节的MAC地址,802.3则支持6个字节与2个字节(主要用于早期局域网,现已少见)两种格式的MAC地址。

源地址(Source MAC Address): 发送方MAC地址。

类型字段(EtherType): 2个字节的类型字段仅用于Ethernet II帧。该字段用于标识数据字段中包含的高层协议,也就是说,该字段告诉接收设备如何解释数据字段。在以太网中,多种协议可以在局域网中同时共存,例如:类型字段取值为十六进制0800的帧将被识别为IP协议帧,而类型字段取值为十六进制8137的帧将被识别为IPX和SPX传输协议帧。因此,在 Ethernet II的类型字段中设置相应的十六进制值提供了在局域网中支持多协议传输的机制。在IEEE802.3标准中类型字段被替换为长度字段,因而Ethernet II帧和IEEE802.3帧之间不能兼容。

长度字段(Length): 用于IEEE802.3的两字节长度字段定义了数据字段包含的字节数。不论是在Ethernet II还是IEEE 802.3标准中,从前序到FCS字段的帧长度最小必须是64字节。最小帧长度保证有足够的传输时间用于以太网网络接口卡精确地检测冲突,这一最小时间是根据网络的最大电缆长度和帧沿电缆长度传播所要求的时间确定的。基于最小帧长为64字节和使用六字节地址字段的要求,意味着每个数据字段的最小长度为46字节。唯一的例外是吉比特以太网。在1000Mbit/s的工作速率下,原来的802.3标准不可能提供足够的帧持续时间使电缆长度达到100米。这是因为在1000Mbit/s的数据率下,一个工作站在发现网段另一端出现的任何冲突之前已经处在帧传输过程中的可能性很高。为解决这一问题,设计了将以太网最小帧长扩展为512字节的负载扩展方法。对除了吉比特以太网之外的所有以太网版本,如果传输数据少于46个字节,应将数据字段填充至46字节。不过,填充字符的个数不包括在长度字段值中。

同时支持以太网和IEEE802.3帧格式的网络接口卡通过这一字段的值区分这两种帧。也就是说,因为数据字段的最大长度为1500字节,所以超过十六进制数 05DC的值说明它不是长度字段(IEEE802.3).而是类型字段(Ethernet II)。

数据字段(Payload):46到1500字节不等。这是帧所包含的具体数据,一般是上一层(网络层)协议所封装的原始数据(比如IP数据包)。如前所述,数据字段的最小长度必须为46字节以保证帧长至少为64字节,这意味着传输一字节信息也必须使用46字节的数据字段:如果填入该该字段的信息少于46字节,该字段的其余部分也必须进行填充。数据字段的最大长度为1500字节。

校验序列字段(Frame Check Sequence, FCS): 既可用于Ethernet II又可用于IEE802.3标准的帧校验序列字段提供了一种错误检测机制,用于确保接收到的数据与发送时的数据一样。当源节点发送数据时,它执行一种称为循环冗余校验( C R C,Cyclical Redundancy Check)的算法。C R C利用帧中前面所有域的值生成一个惟一的4字节长的数,即F C S。当目标节点接收数据帧时,它使用约定好的算法重新计算CRC值并与发送的CRC值进行比较。如果这种比较失败,则接收节点认为帧已经在发送过程中被破坏并要求源节点重发该数据。CRC类似Hash算法但也有不同。相似之处在于二者都是用来检验数据在传输过程中是否被改变的。不同之处在于CRC虽然更快速但无法像Hash算法那样保证不同数据的CRC码一定不同,也就是唯一性。理论上数据可能被改变的同时CRC保持不变。这是因为CRC不像HASH一样用来防范人为的恶意修改,而主要是为了检测物理信号传送过程中因受到干扰而造成的数据扰动或者丢失。这种自然形成的扰动和丢失恰好满足CRC相等的概率微乎其微。但同时这种设计也为黑客在链路层进行攻击提供了可能。

以太网帧在物理层进行传输时称为以太包(packet),包中包含所有字段,各包之间间隔12字节。当目标设备接受到一个包之后,首先会去掉前导信息和帧起始定界符,然后对剩下的部分进行处理。

虽然IEEE802.3标准必然要取代Ethernet II,但由于二者的相似以及Ethernet II作为IEEE802.3的基础这一事实,我们将这两者均看作以太网。

工具

这里用最著名的网络工具之一的Wireshark来进行实验。

首先打开Wireshark, 选中一个正在工作的网卡开始抓包(Capture), 然后双击随便打开一个包,如下图所示


计算机网络是如何工作的_第7张图片

这是一个ARP协议的包。ARP协议是第三层网络层的协议,所以Wireshark显示了第三层以下所有层的协议包。

第一行说明了这是一个42字节的帧,在interface 0, 也就是刚刚选取的网卡上所捕获。

第二行说明这是一个以太网V2格式的帧,以及源地址和目的地址。这里是一个ARP广播,所以目的地址为ff:ff:ff:ff:ff:ff,意思是所有的MAC地址全部包括。

第三行说明这是一个ARP请求包。

下面的区域以16进制显示了这个包中所有的42个字节。这里没有显示前导信息,帧起始定界符和FCS (因为我用的Windows系统不支持,Mac和Linux应该都可以捕捉到),所以以6字节的目标地址开头,然后是6字节的源地址 68:a3:c4:a2:c1:e7, 接着是2字节的类型0x0806, 也就是ARP协议的类型值,最后是数据字段的28个字节。具体含义后面再讲。

物理寻址

那么两个网卡是如何通过MAC地址来找到对方的呢?毕竟电信号又没长眼睛。有线网里的电流只会随着导体往前流动不是吗?

首先看看极端情况,两个网卡(两台电脑)直接连接的情形。这需要一种特殊的网线叫做以太网交叉线(Ethernet crossover cable)来实现。插上两张网卡后,网卡中Auto MDI-X技术就会自动识别网线的类型,同时知道这是两张网卡直连的情形了。

更普遍的情形是3张及以上的网卡(电脑)连成网络,形成局域网(LAN)。这时就需要额外的网络设备了。工作在链路层的设备交换机(Switch)就出场了,来张特写:


计算机网络是如何工作的_第8张图片

交换机都有多个端口用以将多条网线连接起来。交换机内部的内存中有张MAC地址表,可以将多个MAC地址映射到其中一个端口上。所以交换机工作流程就是:

(1) 当交换机从某个端口收到一个数据包,它先读取包头中的源MAC地址,这样它就知道源MAC地址的机器是连在哪个端口上的; 如果这个MAC没有在表中,则它会更新表格;

(2) 再去读取包头中的目的MAC地址,并在地址表中查找相应的端口; 

(3) 如表中有与这目的MAC地址对应的端口,把数据包直接复制到这端口上; 

(4) 如表中找不到相应的端口则把数据包广播到所有端口上,当目的机器对源机器回应时,交换机又可以学习一目的MAC地址与哪个端口对应,在下次传送数据时就不再需要对所有端口进行广播了。

用交换机可以组成局域网并在链路层工作。这个网络没有也不需要IP地址,因为MAC地址可以用来定位。计算机A在连入这个网络后,并不知道网络中还有哪些其他计算机,也不知道她们的MAC地址。这些需要人(网管)为地在网络应用程序里面设置好。当A知道MAC 12:34:56:78:9A:bc 地址是隔壁美女的电脑后,就可以对其发送信息了。

多台交换机可以互相联通形成更大的网络,假设交换机A收到消息后查询MAC地址表得知12:34:56:78:9A:bc对应着5号端口,于是将帧转发给5号端口,5号的网线连到另一台交换机B,她再查询MAC地址表继续转发,直到帧送达美女的计算机。

交换机各个端口之间是独立的,不共享带宽也不共享数据。相较于集线器,交换机更加高效,安全。

由交换机组成的网络叫做交换式网络。

安全问题

地址泛洪,也叫做广播风暴,是针对交换机工作机制的一种拒绝服务攻击手段。具体方法就是构造大量的帧,其中的源地址和目标地址都设置为不存在的MAC地址。这样交换机每次都无法在地址表中查询到条目,则会

1. 向整个网络不停地广播帧。

2.不停更新地址表中的源地址和端口对应关系,最终造成地址表空间全部用完。


网络层 (Network Layer)

在组建局域网时要先选定物理介质和链路层协议。但世界上那么多局域网,肯定会使用不同的介质和协议,比如有的是WIFI无线网而有的是有线以太网,有的有线网使用Ethernet V2协议而有的使用IEEE802.3等等。这些不同的网络就像是说不同语言的人群,互相如何通信呢?首先大家需要邮局来转发信件,其次大家要使用同一种语言。这里的邮局就是工作在网络层的设备路由器,而这同一种语言就是网络层协议(IP协议)。

假设WIFI网络里的A电脑想给另一个以太网里的B电脑发送信息,那么A首先要把信息发送给能够理解接收WIFI信号并理解WIFI协议的无线路由器,无线路由器再把消息转发给另一台懂得以太网协议的有线路由器,最后有线路由器把消息转发给B电脑。这个过程中,A电脑,两台路由器和B电脑都要使用IP协议中规定的格式来处理数据。

Internet Protocol (IP) 协议

https://zhangbinalan.gitbooks.io/protocol/content/ipxie_yi_tou_bu.html

IP协议中的数据成为Datagram,中文译为数据报,真是个奇怪的名字。RFC791规定了IP协议的格式,如下图所示


计算机网络是如何工作的_第9张图片


版本号(Version):长度4个比特,标识此数据报遵循的IP协议版本号。一般为0100(IPv4)或0110 (IPv6)。

IP包头长度(Internet Header Length, IHL): 长度4个比特,描述IP包头长度,单位为4个字节,最大长度为1111=15,即15*4字节=60字节;最小长度为0101=5, 即5*4字节=20字节。因为IP包头中有长度可变部分,所以需要IHL。

未完待续

你可能感兴趣的:(计算机网络是如何工作的)