网络编程1:网络通讯原理简介
我们之前介绍的内容所涉及的Java程序可以理解为是单机版的,也就是说,仅可以在本机运行,那么网络编程的目的就是能够让我们所编写的程序在不同计算机之间通过网络进行通讯。实际上,所谓的通讯就是指的数据的传输过程,对于单机程序而言,数据传输就是从同一个硬盘的这个位置传递到另一个位置,而对于网络程序而言就是通过网络,将数据从这个计算机传递到另一个计算机。
那么在学习通过Java语言实现网络编程之前,我们首先要简单了解实现网络通讯的三大要素,以及两种常用网络模型。
1 网络通讯三大要素
(1) IP地址
比如,我们想要与朋友进行QQ聊天,那么首先要知道对方计算机的位置,这可以通过获取对方计算机的IP地址来实现,换句话说,IP地址相当于目标计算机的一个标识,获取了IP地址就相当于找到了对方计算机。现在最为常用的IP地址是由4个在0到255范围内的数字组成的数字序列作为计算机的网络标识,称为IPv4。这么定义的原因,目前大家可以简单理解为,4个数字的排列组合能够形成大量不重复的数字序列,尽可能保证每台计算机都能分配到不同的IP地址,以免出现冲突。
在众多IP地址中127.0.0.1是比较特殊的一个,称为本地回环地址,在本机没有分配任何IP地址时,127.0.0.1将会成为默认的IP地址。该IP地址可以用于测试网卡是否正常工作,在命令行中输入“ping 127.0.0.1”命令,若出现以下提示信息,
则说明网卡能够正常工作。
此外,还有一些IP地址专门用于局域网而被保留,不能被广域网所使用。最常见的就是“192.168.xxx.xxx”地址段。比如,在两个相邻机房中会出现IP地址均为“192.168.25.108”的两台电脑,这是因为两个机房所属两个独立的局域网,因此其中的计算机IP地址头两位均为“192.168”,而后两位按顺序依次分配。但两台计算机分配相同IP地址的情况在广域网中是不会出现的。再比如,“10.10.xxx.xxx”地址段也是用于局域网的保留地址段。其实,在一个局域网内,两台计算机之间的通讯对IP地址也是有要求的,那就是必须处于同一个IP地址段,比如同属于“192.168”地址的两台计算机能够实现通讯,而分别属于“10.10”地址段和“192.168”地址段的两台计算机则不能连接。
虽然4段IP地址有许多排列组合,但随着全球计算机数量的猛增,IP地址数量还是越来越难以满足每台计算分配一个独立IP地址的要求了。因此后期又出现了6段IP地址——IPv6。IPv6相比IPv4具有更多的排列组合可能,除了因为它包含6个地址段以外,还因为它是由数字和字母的组合排列构成。
以上简单介绍有关IP的一些小知识点,详细的原理说明可以参考专业书籍或者网络资源,这里不再展开。
(2) 端口
那么在网络中找到目标计算机以后,还是不能进行QQ聊天,因为有很多软件都可以实现网络聊天,除了QQ还有飞信、MSN,以及其他网络即时聊天工具。那么怎么才能保证通过QQ发送的信息就一定能让对方的QQ而不是飞信接受到呢?也就是说,不仅要找到目标计算机还要找到目标计算机上的目标软件,此时就需要通过分配给每个软件的数字标识——端口——进行区分。端口也称为逻辑端口,大家要与计算机上的物理端口加以区分。那么当我们指定了目标IP地址的某个端口以后,就确定了被连接的目标软件了。打个比方,假如要去拜访某个朋友,那么首先要知道对方所在地址,比如XXX市XX区XX街XX号XX楼相当于是IP地址,而门牌号码就是对方的端口,只有这两个要素都具备才能准确找到对方。
端口的数值也是有一个范围的,可以是0-65535中的任意数字。其中,0-1024是属于保留数值的,通常被系统应用程序所使用,因此尽量不要使用这个范围内的端口数值。列举几种常用应用的默认端口:Web应用常用80作为其端口,TomCat服务器的端口为8080,MySQL的端口为3306。
对于某个特点网络软件,它的端口数值并不是固定不变的,当它默认使用的端口被其他应用占用时,常见的方法时在默认值基础上向后顺延一位。
(3) 网络协议
根据指定的IP地址和端口,找到了目标计算机上的目标软件以后,最终还要确定通过什么样的方式进行通讯,这就好比两个人之间的交流要通过某种语言一样,而这种通讯方式称为网络协议。比如常见的网络协议有TCP/IP、UDP等等,只要两台计算机都安装了相同的网络协议,就能够进行正常的网络通讯了。除了前面说到的那两种网络协议以外,还有一些其他的协议,比如IPX协议,该协议仅支持局域网连接。但无论使用哪种协议,两台计算机之间能够进行正常通讯的前提是使用同一种网络协议。因此根据这一原理,一些需要高度机密或者需要特殊保护的机构内部的计算机之间的通讯都会使用一些非通用的自定义网络协议,这样能够保证外界计算机的非法访问。
那么最终总结起来,实现网络通讯的三大要素分别是:IP地址、端口以及网络协议。只有两个计算机互相确定对方法的IP地址和端口,并使用同一种网络协议的前提下,才能进行正常的网络通讯,我们通过下图来帮助大家理解这三个要素之间的关系。
2 网络模型
以上所说网络通讯三要素是实现网络通讯的最基本前提条件,只有具备了这三要素才有网络通讯的可能。那么除了需要具备基本条件以外,应该具体通过什么样的方式实现网络通讯呢?这就是这一部分将要介绍的内容——网络模型。
计算机网络是指由通信线路互相连接的许多自主工作的计算机构成的集合体,而数据的交换不仅发生在计算机之间,同样发生在同一个计算机的不同部件之间。那么网络模型所定义的就是计算机内部不同部件之间进行数据交换的具体规则。大家可以把这些不同的“部件”
理解为一个层次结构,不尽包括了物理层,还包括软件层,实际就是数据从数据源(对方计算机)发送直至呈现在用户屏幕整个过程之间所经历的所有网络结构层次,那么网络模型描述的就是这些层次各自的任务以及它们之间进行数据交换的具体方式。
目前常用的网络模型有OSI和TCP/IP两种参考模型,我们首先介绍OSI模型。
2.1 OSI参考模型
OSI是Open System Interconnection的缩写,意思是开放式系统互联,由国际标准化组织制定。该模型将网络通讯结构由上到下分为7个层次,分别为:应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层,如下图所示,
一般的网络应用用户所面对的是应用层,它表示网络服务与使用者应用程序间的一个接口,换句话说,应用层是面向用户的。假设用户A通过网络应用传输一批数据到用户B的同一个网络应用。那么首先,这些数据将在应用层按照应用层的封装规则被封装起来,大家可以理解为在原数据基础上添加了一些可被对方软件应用层识别的标识头,如图中所示数据被一层椭圆形所包裹,然后这些数据就被传递到了表示层。同样,包含了应用层标识头的数据,在表示层再次被封装起来,并继续被传递至会话层,以此类推,数据每传递到一层,就在原数据基础上添加能够被该层所识别的数字标识头,这一过程称为数据封包。其中在网络层给数据添加的内容包括了目标IP地址等信息。原数据经过层层“包裹”以后最终传输到了物理层。物理层就是看得见摸得着的传输介质了,比如网线、无线信号、蓝牙、红外等等,通过物理层就将数据从本机传输到了目标计算机中。
数据到达目标计算机后,还是通过OSI模型对其进行读取,只不过顺序与封包过程是相反的——从物理层开始逐层向上传递,每到达一层就将能够被该层识别的数字标识去掉,最终原始数据就被传递至应用层,呈现在用户面前,这一过程称为数据的拆包。那么原始数据在本机进行封包,经网络传输至目标计算机中再进行拆包,经过这一过程即可实现了网络通讯。
2.2 TCP/IP参考模型
TCP/IP参考模型与OSI参考模型同样都使用了层次结构的概念,并且原理是基本一致的,但是TCP/IP参考模型仅包含有4个层次,如下左图所示。
TCP/IP参考模型将OSI参考模型中的应用层、表示层、会话层合并为一个应用层,将数据链路层和物理层合并为一个主机至网络层,并单独保留了较为重要的传输层和网络层,因此这两种模型在传输数据方面有很多的相似性。
那么我们进行网络编程主要面对的是传输层和网际层,而常说的JavaWeb开发主要面对是应用层,因此传输层和网络层相对于应用层就是底层。
根据上述内容,数据在层与层之间传输时,都会按照每层的特点,在原数据中添加数字标识,而所谓的“特点”其实就是每层所遵循的传输协议,也就是网络通讯三要素之一。其中传输层常用的协议就是TCP/IP和UDP,网际层常用协议是IP,而应用层常用协议就是HTTP和FTP。
3 传输层传输协议——TCP/IP & UDP
我们在前面的内容中说道,进行网络编程主要面对的是网络参考模型中的传输层和网络层(或网际层),因此有必要对传输层所使用的传输协议——TCP/IP和UDP进行一个简要的介绍。
3.1 UDP
(1) UDP传输协议的特点
我们在前面的内容中提到,UDP是网络参考模型中,传输层使用的传输协议。它有以下几个特点:
(a) 面向无连接。所谓面向无连接的意思是,本机向对方发送数据时,并不需要对方一定在网络中。换句话说,无论数据接收方是否在网络中,发送方都能够进行数据的传输。那么接收方存在就接收数据,否则数据就会丢失;
(b) 封装成数据包。数据在被发送以前,都会被封装成数据包,每个数据包的大小为64k以内;
(c) 不可靠协议。因为面向无连接,无论对方是否在线都会发送数据,因此在数据传输过程中,如果接收方掉线,而发送方将不受影响地继续传输数据,那么这一部分就将丢失掉,不能保证数据的完整性。因此UDP传输协议是不可靠协议;
(d) 快速。由于不需要保证对方一定在线,省去了双方建立连接所需的时间,因此传输速度较快。
(2) UDP举例
为了帮助大家记忆UDP传输协议的特点,我们以邮局为例打一个比喻。假设小明给朋友寄一盒饼干,那么饼干就是需要被传输的数据,而小明是发送者,朋友就是接受者。
第一步,把饼干拿到邮局以后首先会将饼干放到一个盒子里面,打成一个包裹,这也就是数据的封装过程。然后,需要告诉邮局的工作人员包裹的寄送地址以及收件人,这就相当于在指定接收方的IP地址和端口号。
第二步,邮局的工作人员就会按照小明提供的地址将包裹发送出去。但是在发送以前,邮局工作人员不会去检查寄送地址的有效性,以及收件人是否一定存在于指定的寄送地址中。因此如果找不到指定地址,或者收件人一直不在的话,包裹就会被退回。对于网络数据传输来说,接收方如果不存在或者指定的IP地址和端口号错误,那么数据包将会丢失。
那么根据上述UDP传输协议特点可知,该协议的主要应用场景就是,能够进行数据的快速传输,并且不需要保证数据的完整性。比如,各种即时聊天软件,QQ、MSN、飞信等等。这一类软件的特点是,聊天的内容并不需要一定保证传输至接收方,但要尽可能快的发送信息。那么下载软件能否使用UDP协议呢?根据“下载文件”这类网络传输方式的特点,如果下载过程中丢失了一部分数据,那么极有可能下载下来的文件时不能被解读的而无法打开,因此下载软件不能使用UDP协议,因为必须保证数据的完整性。
3.2 TCP
(1) TCP传输协议的特点
与UDP传输协议相同,TCP协议同样应用于网络参考模型中的传输层,它的特点如下:
(a) 面向连接。这一点与UDP是完全相反的,也就是说,若想通过TCP协议进行网络通讯,必须确保接收方在线,否则无法实现网络通讯。
(b) 三次握手。由于TCP是面向连接的协议,因此在进行网络通讯以前必须确保对方在线,并在建立双方之间的网络连接以后,才能进行数据的传输。这里我们以客户端软件与服务端软件之间的通讯为例,来说明三次握手的过程。首先由客户端向服务端发送请求连接信息,服务端接收该信息以后,向客户端发送允许连接信息,客户端接收到该信息后,再次向服务端发送连接成功信息,最终建立双方之间的网络连接,这一过程称之为“三次握手”。通过三次握手建立了网络通路以后,双方就可以在这个网络通路中进行数据的传输。
(c) 可靠协议。由于只有在建立网络通路的情况才进行数据传输,因此当有一方断开连接时,就会停止数据的传输,以保证数据完整性。
(d) 较慢。由于需要通过“三次握手”进行网络通路的建立,较为消耗资源,相对UDP而言传输速度较慢。
(e) 大数据量传输。由于是在一个网络连接中进行数据传输,因此不必再将数据封装为一个一个数据包,直接进行传输即可。
(2) TCP举例
我们将UDP协议比喻为通过邮局寄送包裹,而通过TCP协议进行网络通讯就像是打电话。当我们拨打某个号码时,其实就是在向指定对象发出请求连接信息。如果对方在电话附近并接通电话,就是接收了对方的请求并建立了连接,此时双方之间就形成了一个电话通路,可以进行通过了,而通话的过程就数据的互相传输过程。
那么TCP传输协议常用语下载软件中,比如迅雷等。因为这些软件要求在进行网络传输过程必须保证数据的完整,因此必须建立可靠的网络通路,并且下载的数据量可能非常大,这都符合TCP传输协议的特点。当然,在下载过程中,用户端可能会掉线,此时用户端程序只需通过配置文件记录住文件传输的断点位置,即可实现断点续传。