1、计算机网络概述
当前的互联网是从美国国防部在70年代研制的ARPANET发展起来的。我国在1994年正式接入互联网,现在共有CMNET、CNCNET、UNINET等9个全国范围的计算机网络。然而早在1987年我国就向世界发送了第一封电子邮件, 这里有相关的介绍。在互联网发展的历史上,涌现了大量的技术和标准,有些早已废弃,有些沿用至今。现在的互联网使用分组交换传递信息,IP 为王(IP over everything, everything over IP)。
一般依据作用范围,将计算机网络分为广域网(WAN)、城域网(MAN)和局域网(LAN)。从网络编程的角度,这三种网络并无区别。简单理解,可以认为路由器等网络设备将一个城市的局域网连接成为一个城域网,进一步路由器等网络设备又将城域网连接成为一个广域网,最后所有的网络都接在了一起成为了互联网。
有若干指标,可以衡量计算机网络的性能。网络速率是最重要,也是普通人最关心的一个性能指标。网络速率表示主机在信道上传送数据的速率。运营商给小区住户安装宽带时所谓的一兆、十兆等带宽就是指的网络速率。在学术上,速率、带宽和吞吐量的含义并不相同,但普通人把他们看作一个东西并没有什么问题。时延是另一个很重要的网络性能指标,指数据从网络的一端发送到另一端需要花费的时间。某些场景,比如证券交易,低时延要比高速率重要的多。。这也是各个券商把机房选在交易所旁边,甚至自己架设专网的原因。另外,还有往返时间、利用率等指标衡量网络性能,但作为程序员并不需要特别关心。
计算机网络是一个非常复杂的系统,在实现上采用了分层的方法降低设计难度并提高了系统适应性。为了实现全球网络的互联互通,国际标准组织提出了OSI 参考模型,是法律上的互联网标准。但最终由于种种原因,OSI 标准并没有获得应用,反而TCP/IP 协议成为了事实上的国际标准。图1.1 给出了OSI 和TCP/IP体系结构,本文后面讲按照五层协议体系结构来记录相关网络知识。
物理层负责传输比特流,并向上层提供服务。
数据链路层以帧为单位在相邻的两个节点间传输数据。这里的帧包含数据和控制信息两部分,可以完成同步、寻址和检错等功能。
网络层以包(分组)为单位在网络间传输数据。网络层将运输层产生的数据封装成IP 数据包并选择合适的路由将分组送达目标主机。
运输层为主机中进程之间通信提供服务,负责可靠(TCP)或不可靠(UDP)的的传输数据。
应用层为用户程序提供服务,实现特定功能。常见的应用层协议有HTTP、FTP、SMTP等。
2、物理层
物理层在介质中传输数据的比特流, 实际上就是在收发信号。发送端把数据转换为某种信号,信号经过特定信道到达接收端,接收端再把信号恢复为数据,从而完成数据传输。物理层描述与传输信号的有关内容,包括机械特性、电气特性、功能特性和过程特性。网络编程不需要了解物理层相关技术。本节只介绍一些常识性的内容,没兴趣完全可以忽略。根据传输介质,可以将物理层分为有线传输和无线传输两大类。有线传输是基于电话网发展起来的。最初都是通过电话网接入互联网的,就是所谓的拨号上网;后来出现了xDSL技术,大大提高了电话网的接入速率。xDSL 有上下行对称和非对称两种技术,上行速度理论上最高可以到52Mbps,下行可以到1~2Mbps。现在许多小区都已经光纤到户, 实际网速已经是10Mbps起步。光纤到户只是FTTx技术的一种,可以更高的上网速率并且上下行速度对称。通过无线电视网,使用HFC技术也可以接入互联网,但在我国似乎没有得到广泛应用。无线传输发展速度日新月异,现在社会在巨大的技术进步促进下已经进入了移动互联网时代。移动通信经历了使用模拟信号到数字信号的过程,目前正向第5代技术演进。在2G 时代,终端可以通过基站接入互联网了,但限于几十Kbps速率很难有实际应用。在4G时代,终端能够以几十Mbps的速率接入互联网,开启了移动互联网的大幕。
三网融合是指电信网、广播电视网、互联网在向宽带通信网、数字电视网、下一代互联网演进过程中,三大网络通过技术改造,其技术功能趋于一致,业务范围趋于相同,网络互联互通、资源共享,能为用户提供语音、数据和广播电视等多种服务。技术上三网融合已经没有障碍,但是由于各方面利益纠葛,距离真正的融合还有很长的路要走。无论是否融合,从程序设计的角度看,物理层只是提供了一条通路实现了数据&信号传递,这一过程完全由硬件设备实现,在程序设计时不需要具备这方面的相关知识。
3、链路层
3.1 概述
数据链路层属于计算机网络的低层,使用的信道有两种类型,分别是点对点信道和广播信道。 链路指从一个节点到相邻节点的一段物理线路,这中间不存在任何交互节点。帧是链路层传输的协议数据单元。链路层将网络层交下的数据构成帧发送到链路上,同时把链路上接收到的帧中的数据上交网络层。链路层协议解决如何封装数据成帧,实现透明传输数据和检测传输差错。
3.2 点对点信道
点对点信道使用一对一的点到点的通信方式。点对点协议(Point to Point Protocol)是目前使用最广泛的数据链路层协议。PPP 使用的帧格式如下:
PPP 帧的第一个和最后一个字段都是标识字段,各占一个字节,规定为“0x7F”,用来表示帧的开始和结束。PPP 帧的第二个字段是地址字段,占一个字节规定为“0xFF”;第三个字段为控制字段,占一个字节规定为“0x03”。PPP 帧的第四个字段是协议字段,占两个字节。该字段为“0x0021”表示帧负载为IP 数据包,该字段为“0x8021”表示帧负载为网络层控制数据。PPP 帧的倒数第二个字段是检验序列,占两个字节。
PPP 协议采用填充技术来实现透明传输。当使用异步传输时,按照协议规定,发送数据时需要对信息字段进行字节填充,接收数据时再去掉信息字段的填充。当使用同步传输时,采用零比特填充方法,实现透明传输。上述过程通常由硬件实现,不需要在软件层面考虑。
PPP 协议帧检验序列使用CRC 技术保证无差错接收。数据在物理层传输时,最可能出现的是比特差错。链路层发送端计算PPP 帧的CRC 并作为FCS(Frame Check Sequence)放在校验序列部分,接收端技术收到的PPP帧的CRC 并于帧中的FCS 比较,若两者相同则认为正确的接收到了数据(理论上仍可能存在错误)。在链路层,对于出错的帧只是简单丢弃。显然,数据链路层无法保证可靠地传输数据。
3.3 广播信道
广播信道采用某种复用技术,使用一对多通信方式。局域网使用的就是广播信道。局域网共享信道的方法有静态划分和动态媒体接入两大类。静态划分信道可以使用时分复用、频分复用、码分复用等技术。用户使用划分给自己的信道通信不会和他人产生冲突,但划分信道的方案代价较高,不适合局域网。动态媒体接入技术可以分为两类,分别是受控接入和随机接入。受控接入方案要求用户必须服从某种控制,如令牌环网中通过令牌控制用户使用网络。随机接入是当前局域网主要的共享信道方案,下面将对此进行重点介绍。
3.4 局域网
当前的局域网,实际上就是以太网。以太网由美国施乐公司在1975年研制成功。在1980年,施乐、英特尔和DEC 公司联合提出了DIX 10Mbps 以太网规约,并最终成为了世界上第一个局域网标准。后来,IEEE 制定了一系列802.x 局域网标准。但是随着互联网的发展,TCP/IP 体系经常使用的局域网只剩下了DIX 的以太网。曾经IEEE 802 委员会将数据链路层分为LLC(Logical Link Control)和MAC(Medium Access Control)两个子层,现今LLC 的作用已经消失,并且很多网卡也仅装有MAC 协议。
当初以太网将所有计算机都链接到一根总线上,每台主机都能收到网络上其它主机发送的数据。为了实现一对一通信,每台主机的适配器(网卡)都有自己唯一的地址。发送端会把自己的适配器地址和目标适配器地址填到链路层的帧中,接收端监听线路上所有的数据,但仅接收与自己地址相同的帧。上述适配器地址就是MAC 层的硬件地址,又称为MAC 地址。MAC 地址共有48 位,其中前三字节由IEEE 分配,后三字节由网卡厂商分配。IEEE 规定MAC 地址第一字节的最低位为I/G(Individual/Group)位,其为0 表示地址为一个单个站地址,为1 表示地址为多播地址。IEEE 规定MAC 地址第一字节的次低位为G/L(Global/Local)位,其为0 表示地址为本地管理,为1 表示地址为全球管理。只有全球管理地址才需要向IEEE 购买。
前面说网卡只接收与自己地址相同的帧,其实这并不准确。实际上网卡监听网络上所有的帧,并接收发往本主机的帧。这里“发往本主机的帧”包括单播帧、多播帧和广播帧,只有单播帧的目标MAC地址与主机MAC 地址相同。网卡还有一种特殊的工种模式,叫做混杂模式。在混杂模式下,网卡会接收所有监听到的帧,不管这些帧发往哪里。当系统使用需要网桥时,网卡就必须配置为混杂工作模式。当主机运行多个虚拟系统时,往往使用网桥方式实现虚拟系统与外部网络的透明通信。
MAC 层的帧格式如下:
MAC 帧的第一个字段是目的地址段,占六个字节;第二个字段是源地址段,占六个字节。MAC 帧的第三个字段是类型字段,占两个字节。该字段为“0x0800”表示帧数据字段为IP 数据,该字段为“0x8137”表示帧数据字段为IPX 数据。MAC 帧最后一个字段为帧检验序列,占四个字节。MAC 帧同样使用CRC 作为FCS,以保证无差错接收。需要特别注意, MAC帧数据字段允许的最小长度是46字节。如果数据字段长度小于46字节,MAC层就会在数据字段后面加入整数字节填充字段。因为MAC 帧没有描述数据字段长度的字段,接收端MAC 层无法知道接收帧的数据字段是否有填充。MAC 层简单地把数据字段和填充字段(如果有)一起交给上层协议处理。另外,MAC 帧也没有表示帧结束的字段,而是采用了另外的方法判断MAC 帧结束位置。在发送MAC 帧前,通信线路上还要先传送额外8 字节内容用于实现收发端同步。但是,这8 个字节不属于MAC 帧。
以太网采用了共享信道随机接入的技术方案,发送数据时难免会出现冲突。为解决冲突问题,以太网使用了CSMA/CD(Carrier Sense Multiple Access with Collision Detection)协议。该协议简单说就是发送前先监听,边发送边监听,一旦发现冲突立刻停止发送。假设局域网两主机之间的最大时延为t。若某主机开始发送数据,则经过时间t 本网络所有的主机都可以监听到该数据,因此时间t 之后不会再有其它主机主动发送数据。经过时间2t 该主机可以知道在0~t 时间内是否有其它主机发送了数据导致冲突,因此如果在2t 时间内没有发生冲突,那么以后也不会再发生冲突。显然2t就是该网络的往返时间,学术上又称之为“争用期”。如果某次发送在争用期没有发生冲突,那么这次发送永远也不会遇到冲突了。以太网将争用期定为51.2μs,对于10Mbps的速率,刚好可以发送64 字节数据。因此以太网规定最短的有效帧长度为64 字节,凡是长度小于64 字节的帧都是由于冲突而异常中止的无效帧。MAC 帧的首部和尾部一共有18 字节,因此数据字段最短要有46 字节。
IEEE 802.3 标准规定的MAC 帧格式和前述DIX 的MAC 帧格式有两处不同。一是802.3 规定的MAC 帧的第三个字段是“长度/类型”,以0x0600 为界限,大于则表示“类型”,这是与与DIX MAC 帧完全相同;二是当802.3 MAC 帧的“长度/类型”字段小于0x0600 时,数据字段需要装入LLC 层的LLC 帧。前面已经说过,现在广泛使用的局域网都是以太网,所以实际链路层使用的都是DIX 格式的MAC 帧。
未完,待续。若需交流可以关注下面公众号,或者给我发邮件。