admin管理员组

文章数量:1638753

引言

就目前而言,多数网络编程的系列的文章都在围绕着计算机网络体系进行阐述,但其中太多理论概念,对于大部分开发者而言,用途甚微。因此,在本系列中则会以实际开发者的工作为核心,从Java程序员的角度出发,详细解读Java的网络编程核心内容。

一、计算机网络的“前世今生”与基础概念

先来看看维基百科对于 计算机网络 这个名词的解释:

计算机网络是指将位于不同地理位置,但具有独立功能的多台设备,通过通信设备和线路连接起来,在网络操作系统,网络管理软件、网络通信协议的协调管理下,实现资源共享和信息传递的计算机系统。

简单来说,计算机网络就是用于满足不同机器之间通信、共享的一种系统。

其实一开始计算机网络是用于军事化目的的,因美国军方需要一种多节点的通信技术,确保在其一部分节点被摧毁后,也能够确保通信依旧正常,因此组建了一个部门 ARPA 并在1966年完成了 ARPANET (阿帕网)项目,该项目也是最早的计算机网络之一。

当然,后续随着科技不断进步,各种网络相关的技术百家争鸣,出现了各式各样的网络技术,但同时也带来了很大的局限性,例如:不同的计算机网络之间并不能相互通信、不同操作系统之间无法通信、覆盖范围及其有限等。因此, ARPA 需要一种技术将不同的计算机局域网互联,最终 ARPA 组织创建了一个新的项目被称为 internetwork 因特网,也被称为“互联网”。

在 internetwork 项目的研发过程中,1974年, Robert E. Kahn 以及 Vinton G. Cerf 两位教授正式提出了新的传输协议: TCP/IP 协议,用于满足不同计算机网络之间的互联通信, ARPA 到 1982 年接受 TCP/IP 选定为 Internet 主要的计算机通信系统,作为因特网通信的“基石”。

1.1、计算机网络的组成

从组成上而言,计算机网络主要由主机、协议、传输介质以及软件四部分组成。

TCP/IP、IPX/SPX、AppleTalk

1.2、计算机网络的功能组成

计算机网络体系主要提供的两个核心功能就在于:

  • 资源共享:资源子网实现。
  • 数据通信:通信子网实现。

资源子网以及通信子网也对应着 OSI 中的上三层和下三层。

不过如果学习过计算机网络课程的小伙伴应该都知道,其实计算机网络是一个复杂而庞大的系统,由软件、驱动、硬件、线路等多部门共同组成,但对于这些理论性内容不再阐述,有兴趣的可以自行了解。

1.3、网络分层与OSI七层模型的由来

计算机网络是个非常复杂的系统,由于最初各个计算机网络体系结构不同,导致双方网络之间无法互通,因此,20世纪90年代, ISO 国际标准化推出了 OSI 模型打算制定计算机网络体系标准。

简单来说就类似于国内的普通话,因为不同省份的方言不同,导致不同地方的人交流起来并不方便,因此定义了“普通话”这一标准,所有人都遵循该标准进行交流沟通。

但由 ISO 组织制定的 OSI 网络七层模型结构并没有得到广泛应用,实际中应用最广泛的是 TCP/IP 体系结构。换句话说, OSI 七层模型只是理论上官方制定的国际标准,而 TCP/IP 体系结构才是事实上的国际标准。

PS:国际标准化组织提出的 OSI 模型未得到广泛应用的原因:

①制定时太过理想化,未考虑实际的应用场景。

②拆分过于精细化,实现起来过于复杂,运行效率并不高。

③ OSI 体系的制定周期过长,导致按其标准生产的设备无法及时投入市场抢占份额。

④ OSI 体系因为分层过多,设计也不合理,有些相同的功能在多个层次重复出现。

但因为 TCP/IP 体系中的最后一层没有制定规范的标准,所以对于学习计算机网络完善体系时会缺失一部分,所以又提出了一种折中方案,也就是综合 OSI 以及 TCP/IP 两个体系的优缺点,提出了一种五层结构的原理体系,因此在接触计算机网络体系时,通常都会存在三种分层结构:

OSI
TCP/IP

二、OSI七层网络模型与TCP/IP协议簇

计算机网络体系采用的是分层结构,每个层次之间互不干扰,上层不需要关心下层的具体实现,下层只需要为上层提供服务即可。

在 ISO 组织定义的国际标准 OSI 模型中,是七层网络模型。

在实际应用最广泛的 TCP/IP 模型中,是四层网络模型。

当然,在计算机网络教学中,也提出了五层网络模型。

但无论多少层网络模型,其实本质上都是在叙述相同的内容,只不过拆分的精细度不同而已,三种网络模型对应如下:

2.1、OSI七层网络模型

OSI七层网络模型中,每层的功能如下:

  • 应用层:人与计算机网络交互的窗口。
  • 表示层:负责数据格式的封装,如加密、压缩、编解码等。
  • 会话层:建立、终止、管理不同端间的会话连接。
  • 传输层:提供端到端(两台机器)之间的传输机制,以及提供流量控制、出错效验。
  • 网络层:逻辑寻址,IP地址,在下两层的基础上向资源子网提供服务。
  • 数据链路层:负责建立和管理节点间的链路,将数据封装成帧,进行可靠传输。
  • 物理层:在介质媒体上传输比特流。

在 TCP/IP 体系中,将原本 OSI 体系中的应用层、表示层、会话层合并为了应用层,将数据链路层和物理层合并为了数据链路层,因此 TCP/IP 体系中只存在四层结构。

注意点:在最初因为技术问题,因此数据传输必须建立在物理实体介质的基础之上,但如今无线电的电磁波技术也可以做到利用空气作为介质,从而达到传输数据的目的。

在 OSI 分层体系中,上三层:应用层、表示层、会话层组成资源子网,下三层:网络层、数据链路层、物理层组成通信子网。

2.1.1、OSI模型的通信的封装与解析过程

在网络通信中,通信双方都必须是对等的,并且双方都遵守相同协议的,这样才可通信。好比举个例子:

竹子想发微信信息给熊猫,喊熊猫出来玩,但双方之间的通信基础必须对等,也就是说,熊猫的手机上也必须要安装了微信,否则竹子无法通过微信与熊猫出来玩。

但如果竹子说的是汉语,熊猫只能懂汉语,双方并未遵守相同的“协议”,那两者之间自然也无法进行通信。因此,通信的另一要素则是:通信双方都必须遵守相同的协议。

而在计算机网络中,当两台机器进行通信时,其过程主要包含数据的封装与解封:

如上图,左侧是发送端,右侧是接收端,当发送端的应用尝试传输一条数据时,数据会根据网络分层结构,从上至下依次封装,每层都对数据做一定的处理,最后在物理层转换为比特流(二进制数据),然后传输至接收端。

因为双方之间遵守的都是相同的协议体系(网络模型),因此接收端会首先接收到比特流数据,然后从下至上依次解封数据,最终在应用层还原数据,从而达到通信的目的。

2.2、TCP/IP协议簇

TCP/IP 应该是计算机网络中听的次数最多的词汇,但它并非单纯的指 TCP 和 IP 两个协议,而是一组协议的代名词,指由许许多多的网络协议一同组成的“协议簇”, TCP/IP 协议簇主要组成如下:

上面列出了一些 TCP/IP 协议簇中常用的一些协议,但整个协议簇是由大大小小上百个协议一同组成的(对于 TCP/IP 协议簇中的一些常用协议可参考:百度百科)。

在计算机网络体系中,每层都会存在多个协议,但一个协议只会隶属于一层。同时,协议也可以由软件、硬件两个维度来实现。

除开最常见的TCP/IP协议簇外,还有一些其他的协议组,如 IPX/SPX、NetBEUI、AppleTalk 等协议组。

2.2.1、通信协议的基本概念

前面的叙述中,更偏向于“空中楼阁”般的理论概念,比较生涩难懂,接下来我们以实际的 TCP/IP 协议出发,再对计算机网络更进一步阐述。

TCP/IP通信协议是最完整、使用最广泛的网络协议体系,它的魅力在于可使不同硬件结构,不同操作系统的计算机相互通信,通信协议中定义多方之间发送/接收的报文格式、顺序以及规则,其中语法定义了传输的报文格式,语义定义了报文传输规则,时序定义了报文传输顺序, 计算机通信的本质就在于信息报文的相互交换 。

2.2.2、协议数据单元(PDU)

计算机网络体系中,不同节点通信时交换的信息报文被称为 协议数据单元(PDU) , PDU 主要由协议头信息+数据( SDU )组成,数据是指发送端需要传输给接收端的信息,而协议头信息中,则包含了完成传输所需的控制信息,如地址、长度、序号、分段标识、差错控制信息等。

基于 TCP/IP 体系而言, PDU 在不同层存在不同的称呼,如下图:

2.3、计算机网络体系中各层综述

就目前而言,前面的阐述中已经将计算机网络中最常见的 OSI、TCP/IP 体系简单介绍明白了,但对于这些体系中,不同层的具体作用却并没有进行探讨。因此,接下来我们从自己设计一个计算机网络体系的角度出发,分别来探讨网络分层的必要性与每个分层的具体含义。

2.3.1、物理层

先来看最简单的通信模型:

如上图,两台电脑之间通物理媒体连接,互相传递信息,从而达到通信的目的。

在这种最简单的直连通信模型中,想要实现双方之间的通信,那应该考虑如下几个问题:

  • ①连接两台电脑之间的传输媒体可以采用哪些介质类型。
  • ②连接两台电脑时,两台电脑应该存在怎样的物理接口。
  • ③传输数据时,使用何种信号表达比特流中的 0 和 1 。
  • ④双方之间通信时,不同的传输介质,数据传输的速度标准又该是多少。

对于如上问题,我们可以将其全部归纳到“物理层”来解决,在该层中定义标准规范。

简单来说,物理层主要任务是 负责在介质上正确的传送比特流 ,并 规定物理接口的各种特性和物理设备的标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率 等。

2.3.2、数据链路层

但一般现在不会存在直连型网络,常用的计算机网络都是由多台机器共同组成的,如下:

在这种总线连接的通信模型中,当一台主机,比如 A 向 D 发送数据时,数据会通过总线传输至总线上的所有主机,此时 D 如何知道该条数据是发给自己的呢?其他主机又如何区分数据不是发给自己的呢?因此,对于这种多台机器组成的网络模型而言,我们也需要解决一系列问题,如:

MAC

对于上述中的这些问题,可以全部划归到链路层处理。

因此可以得出,数据链路层主要任务是 实现数据在不可靠的物理线路上的可靠传递<

本文标签: 协议腾讯之计网络编程原理