推荐书籍:计算机网络.一种开源的设计方法,从设计层面,面向实际问题来讲解计算机网络的来龙去脉,将计算机网络的知识系统化了,首先从计算机网络的需求出发,再到现有提供的解决方案,最后到解决方案的开源实现,整个文章脉络清晰,是计算机网络进阶的好书。 通读完这本书后,结合自己的见解,做了一些读书笔记,记录一下。
计算机网络的核心需求:“通过各种共享媒体和设备连接越来越多的用户和应用程序,以便它们可以相互通信”,需要解决三个关键性问题,分别是,
1. 连通性,谁以及如何连接。
2. 可扩展性,有多少连接。
3. 资源共享,如何利用连接。
连接性,可视为“从一组节点和链路钩子的连通图,任一节点可以通过一系列联系起来的节点和链路组成的路径到达彼此”。这里节点指的是主机或中间设备;链路指的是两个及以上的节点连接,两个为点对点,两个以上为广播(广播链路上的节点通过竞争获得发送权),链路的连接方式可以是有线的或无线的,节点的通信方式可以使全双工或半双工;两个节点之间的路径指的是,一系列联系起来的中间链路和节点,它可分为交换式和路由式,前者需要中间节点建立路径连接并在发送消息之前交换表中记录路径的状态信息,而后者可通过非预设的,能独立选择的路径进行转发,也许经过的路径不一定相同。
可扩展性,“一种可扩展到大量节点的平台,以便能够使每个节点知道如何到达任何其他节点”。将节点组织成很多组,少量节点可以组成一个组,多个组也可以聚合成一个超组,可创建一种可管理的树状层次结构,把每个组都分层并连接起来。分组的方式可按地理区域划分,如局域网、域域网和广域网。
资源共享,“一种共享平台,使用节点和链路的容量在节点之间传送通信信息”。这是正是数据通信和传统语言通信之间最大的不同(分组交换和电路交换的区别),传统语音通信在开始通话之前,首先需要找到主叫和被叫之间的电路并进行交换,之后会维持着这样一条64kbps的电路,这种专用资源分配的好处是可提供稳定的资源,从而在连续的数据流中保持高质量,不好的地方是,对于闲置时间长会效率低。而数据通信是一种更加宽松和高效的资源共享实践,不会建立专用线路,数据分组成包(消息前附加头信息),让所有数据流量包竞争通行权并随时发送,从而解决随时需要输入数据但大部分长时间会闲置的场景,但不好的地方是会有突发数据流量,从而造成网络拥塞,我们通过设置缓冲区空间用于数据排队来解决。
计算机网络或数据通信是有关计算机系统或设备之间通信的一组规则,自从1969年Aparnet建立第一个节点后,存储转发分组交换技术成为了因特网体系结构,这是一个满足上述三个需求的解决方案,这个方案后来于1983年于TCP/IP协议套件融合,后面在众多解决方案中脱颖而出占据了统治地位。其他的解决方案如,X.25和开放系统互连(OSI),最终被TCP/IP替代;异步传输模式(ATM),但难以兼容TCP/IP最终消失匿迹;多协议标签交换(MPLS)得以幸存下来,因为它一开始就是作为TCP/IP协议的补充而设计。因特网是通过产业、教育、政府和科研部门中的自治网络将用户连接起来的世界性范围的网络,网络采用TCP/IP协议套件;而互联网是两个或多个子网络构成的一种网络,强调的是互联。
对于连通性,需做出三个决策“路由式或交换式连接”,“端到端或逐跳机制,以保证分组可靠和有序分发”,“在建立和维护这种连通性该如何组织任务”。因特网连通性解决方案是采用路由式路径,端到端保持它的正确性,并将任务组织成四个协议层。路由是无状态无连接的,所有分组独立发送没有预设一条路径,不保存任何跟踪分组流的状态信息;流量控制和差错检测建立在终端主机上,而不是在所有的链路上;四层协议分别为应用层、传输层、网络层和物理+数据链路层,应用层属于数据平面协议,其他三层是控制平面协议(分组的操作有两种,控制和数据,前者是用来指导节点如何转发数据称为控制平面,而后者包括了用户或应用要转发的消息称为数据平面),后面专门会对四层协议展开说明。
对于可扩展性,需要回答三个问题“层次结构有多少层”,“每个层有多少实体”,“如何管理这个层次结构”。因特网可扩展性解决方案是采用三层结构,子网作为最底层,自治系统AS作为中间层,而将许多AS留在顶层。利用子网表示物理网络中具有连续地址块的节点;一个AS(自治系统或域)由组织管理的子网和将它们连接起来的路由器所组成,AS内的一台路由器知道所有内部AS路由器和AS内的子网,以及负责AS之间路由的多台外部AS路由器。
对于资源共享,需要解决三个问题“是否应该区分不同应用的流量处理”,“资源共享策略是什么”,“流量控制机制放在那里来执行策略”。因特网资源共享解决方案是在网络内部提供普通的尽最大努力服务,同时使用端到端的拥塞和流量控制在带宽共享中实现公平的策略。不管对于哪类应用,因特网仅提供单一类型的连接服务,即IP尽最大努力服务,所有IP分组都一样处理,它是原始的,除了转发和差错检测的简单校验和之外,它不具有任何增值服务,校验和无效(仅校验分组IP头部,避免协议处理中的错误,数据分组留给端到端协议校验),它就会丢弃分组,是不可靠的,分组的错误恢复和流量控制都交给端到端协议完成。端到端协议TCP,具有差错恢复和流量控制,用来调整从源流出的分组中的带宽时延乘积(链路带宽与RTT的乘积,结果为比特数据量),以便使得所有流量可以公平地共享资源。另一种端到端协议UDP则仅有一个简单校验和用于差错检测。
补充:应用可分为三类,交互式、文件传输和实时的,交互式应用产生少量流量,但需要及时做出响应,文件传输应用会产生大量流量,可以容忍较高的延迟,而实时应用则既有连续的流量也有低延迟的要求。
因特网特点,为了解决连通性和资源共享问题,因特网将端到端观点运用到极致,在将复杂性推到边缘设备,保持了核心设备的简洁性,核心设备运行不可靠的无状态路由,而边缘通过差错控制和拥塞控制分别保证正确性和健壮性,一个带有子网和域的简单三层结构就足以将因特网扩展到高达数十亿个节点。
因特网体系结构为满足数据通信的要求和原则,提供了一套综合集成解决方案,这套解决方案是一个开放标准,Linux操作系统遵循并实现该标准。
不管是在主机还是路由器,系统都要由软件、硬件和集成电路(IC)元件组成。在一台主机上,网络体系结构大多数以软件和少部分的IC实现,协议栈中的TCP、UDP和IP是在操作系统中实现,应用协议在应用程序实现,链路协议在接口卡的IC上实现,路由器上类似。
Linux系统具有用户空间和内核空间程序,内核空间为用户空间程序提供服务。进程是一个可以在CPU上调度运行的用户空间或内核空间的化身,内核空间进程驻留在内核内存空间以管理系统操作,为用户空间进程提供服务。当用户空间进程需要来自内核空间程序的某个特定服务时,它可以发出一个系统调用(API),以便在内核空间中生产一个软件中断,进程然后切换到内核空间执行内核空间程序完成所要求的服务,一旦完成,进程便返回到用户空间运行他的用户空间程序,这种是阻塞性调用,如socket调用,它是专用于网络互联目的系统调用的一个子集。
对于一个软件功能而言,所有独立于应用程序的功能,或是每个应用共同需要的功能,应该作为内核空间程序来执行,即把功能实现放到操作系统里,提供统一的API给应用调用。显而易见,所有应用协议在用户空间的应用程序中实现;而TCP、UDP和IP则在Linux的内核中实现;各种依赖于硬件的链路层协议则在内核驱动程序和硬件中实现;对于一些控制平面协议如OSPF、RIP、BGP,由于数量太多及运行复杂的路由算法,因此将它们放在用户空间,作为守护进程持续地在后台运行,当然路由表在内核空间里,内核要为该守护进程提供修改路由表的API。
物理层
物理层通过传输介质发送和传输信号,传输介质是一种可以将成为信号的能量波从发送端向接收端传输的物质实体,如,自由空间是电磁波信号的传输介质。传输介质只能传输信号,而不是数据,因此物理层需要将数字数据转换成适当的信号波形。因此它要解决的问题,首先,将从链路层来的数据转换成数字信号或模拟信号,其次是编码和调制,最后是提高信道利用率,需要多路复用和多路访问等技术。
链路层
通过物理链路从一个节点到另一个节点有效成功地传输数据,除了物理层的信号操作外,还需要链路层解决如下问题,如链路之间串扰噪声损坏信号导致错误,链路层需要错误控制机制;如发射器以超过接收器能接收的速度发送,链路层需要流量控制;如多个节点通过共享介质传输数据,链路层需要有一个仲裁机制决定谁先发送。主要的链路层协议包括,以太网、802.11、PPP、蓝牙、3G、LTE以及过时的ATM和X.25。
链路层提供对物理通信的控制并对上面网络层提供服务。主要有以下功能:成帧寻址,将传输的数据打包以帧为单位,为数据打上源地址和目标地址;差错控制和可靠性,检测到传输的帧出错,接收器可直接丢弃,或者会被要求重传,在以太网协议里,重传由TCP保证,在802.11无线协议里,发射器接收不到接收器的确认,会有超时重传;流量控制,以太网协议里,在半双工模式下,采用CDMA/CD机制,而在全双工模式下,接收器显式发送一个PAUSE帧,发送器收到便会停止发送;介质访问控制,以太网协议里,用载波监听和冲突检测,即CDMA/CD机制,在全双工链路中不存在介质访问控制。
网络层
IP层(网络层)的目的是从发送主机向接收主机发送分组,不同于链路层是两台相邻主机之间通信,网络层提供服务时允许网络上任意两台主机之间的通信,屏蔽了各种异构的链路层网络。它需要解决三个问题,“如何通过链路层技术将网络连接起来”,通过网际互联设备,将分散在世界各地的网络连接起来,这个网络成为互联网,目前广泛使用的全球互联网是因特网;“如何在全球范围内确定一台主机”,寻址问题,一个主机地址要能把主机所属网络和主机自身标识出来,是在互联网里的全球标识符;“如何在两台主机之间找到一条路径转发分组”,路径由相邻路由表串联而成,查找路径并沿路径传输分组分别称为路由和转发,路由是由路由协议来实现,它需要交换路由消息并计算最短路径,而转发是通过主机或中间路由器查找计算出来的路由表,确认最合适下一跳地址进行转发。
传输层
传输层是端到端协议层,为应用程序提供端到端的服务。在链路层提供的是相邻节点之间的单跳通信,在网络层提供的是互联网上主机之间的多跳通信,而传输层提供的是互联网不同主机的应用进程之间的进程通信。因此传输层需提供如下服务:寻址,端口号确认数据包属于哪个应用进程;差错控制,确认接收数据的有效性;可靠性,重传机制保证传输的数据能到达目的地;速率控制,流量控制和网络拥塞控制,调节发送方应以多块速率发送数据给接收方,前者是源进程和目的进程之间,而后者是源进程和目的网络之间;
广泛的应用程序有不同需求,因此衍生了复杂的传输控制协议TCP和原始的用户数据报协议UDP。TCP实现了上述所有服务,而UDP则忽略了可靠性和速率控制服务。TCP是有礼貌的,而UDP是莽撞的,然而链路的承受能力是有限的,如果网络充斥着大量UDP数据,即使tcp再怎么礼让,也不能避免网络拥塞。