Java是第一个从一开始就为网络应用而设计的编程语言。随着Internet的不断发展,Java成为了唯一适合构建下一代网络应用程序的语言。Java简化了网络程序的编写,事实上,用Java编写网络程序几乎比任何其他语言都简单得多,在查看一些充分利用Internet且具有完备功能的应用程序的时,会注意到其中用于网络的代码非常之少。即使在大量涉及网络的程序中,如Web服务器和客户端,其中几乎所有代码都是在处理数据或用户界面。程序中涉及网络的部分几乎总是最短、最简单的。简单地讲,Java应用程序通过Internet发送和接收数据非常容易。
网络
网络(network)是几乎可以实时相互发送和接收数据的计算机和其他设备的集合。网络中的每台机器称为一个节点(node)。大多数节点是计算机,但是打印机、路由器、网桥、网关、哑终端和自动售卖饮料机也都是节点。具有完备功能的计算机节点也称为主机(host)。每个网络节点都有地址(address),这是用于唯一标识节点的一个字节序列。每个地址中的字节越多,可用的地址就越多,就可以有更多的设备同时连入网络。协议(protocol)是定义计算机如何通信的一组明确的规则:包括地址格式、数据如何分包等。针对网络通信的不同方面,定义有很多不同的协议。例如:超文本传输协议(Hypertext Transfer Protocol,HTTP)定义了Web浏览器如何与服务器通信;在另一方面,IEEE 802.3标准定义了另外一个协议,规定了数据位如何编码为某种特定类型线缆上的电信号。开放、公开的协议标准允许不同厂家的软件和设备相互通信:Web服务器不关心客户端UNIX工作站、Android手机还是一个iPad,因为所有客户端都使用相同的HTTP,与平台无关。
网络的分层
如图1-1所示,该分层模型实现了应用协议与网络硬件物理特性以及网络连接拓扑结构的解耦合。
图1-1:网络不同层的协议
如图1-2所示,在该模型中,应用程序如百度浏览器运行在应用层,只与传输层对话。传输层只与应用层和网际层对话。网际层则只与主机网络层和传输层对话,绝不直接与应用层对话。主机网络层通过线缆、光纤或其他介质将数据移动到远程系统的主机层网络,然后再通过上述各层将数据逐级上移传输到远程系统的应用层。
图1-2:网络分层
主机网络层:主机网络层层用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、双绞线提供的驱动。
网际层:网际层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
应用层:主要负责应用程序的协议,如HTTP协议和FTP协议等。
UDP和TCP
UDP协议是无连接通信协议,所谓的无连接就是指数据的发送端和接收端不建立逻辑连接。由于UDP协议消耗资源小,通信效率高,通常都会用于音频、视频和普通数据的传输。UDP协议在传输数据时不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。
TCP协议是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。
IP地址和域名
IPv4网络中的每台计算机都由一个4字节的数字标识。一般写为点分四段格式,如172.26.39.91,这4个数中,每个数都是一个无符号字节,范围从0到255。IPv4网络中的每台计算机都有唯一的4字节地址。当数据通过网络传输时,包的首部会包括要发往的机器地址(目的地址)和发送这个包的机器地址(源地址)。沿路的路由器通过检查目的地址来选择发送数据包的最佳路由。包括源地址是为了让接收方知道要向谁回复。
可能的IP地址有40亿多一点,无法做到地球上每人一个地址,更无法做到每台计算机一个地址,更糟的是,地址的分配并不是很高效。现在正在向IPv6缓慢地过渡,它将使用16字节地址。这样就能有足够的IP地址来标识每个人、每台计算机甚至地球上的每一台设备。IPv6地址通常写为冒号分隔的8个区块,每个区块是4个十六进制数字,如FEDC:BA98:7654:3210:FEDC:BA98:7654:3210。前导的0不需要写。两个冒号表示多个0区块,但每个地址中至少出现一次。例如,FEDC:0000:0000:0000:00DC:0000:7076:0010可以写为更紧凑的形式,如FEDC::DC:0:7076:10。
端口
每台有IP地址的计算机都有几千个逻辑端口,每个端口由1到65535之间的一个数字标识。每个端口可以分配给一个特定的服务。例如,Web的底层协议HTTP一般使用端口80。我们说Web服务器在端口80监听入站连接。当数据发送到特定IP地址的某个机器上的Web服务器时,它还会发送到该机器的特定端口(通常是端口80)。接收方检查接口收到的各个包,将数据发送给监听这个端口的程序。各种通信业务流就是这样区分的。1到1023的端口号保留给已知的服务,如finger、FTP、HTTP和IMAP。