Java网络编程之网络基础知识

230 阅读5分钟

本文是Java网络编程的第一篇,介绍网络的基础知识。

1. 网络

网络是几乎可以实时相互发送和接收数据的计算机和其他设备的集合。

  • 节点(node):网络中的每台机器称为一个节点
  • 主机(host):具有完备空能的计算机节点
  • 地址(address):用于唯一标识节点的一个字节序列
  • 协议(protocol):定义计算机如何通信的一组明确的规则,包括地址格式、数据如何分包等。

2. 网络的分层

为了对应用程序开发人员和最终用户隐藏复杂性,网络通信的不同方面被分解为多个层。每一层表示为物理硬件与所传输信息之间的不同抽象层次。

传统的OSI模型将网络传输分为了7个独立的层次,如下表所示

层级说明
应用层应用程序提供的服务
表示层格式化数据,以便为应用程序提供通用接口
会话层在两个节点之间建立端连接
传输层面向面向连接或无连接的常规数据递送,TCP和UDP协议属于传输层协议
网络层通过寻址来建立两个节点之间的连接,IP协议属于网络层协议
链路层将数据分帧,添加校验机制,并处理流控制
物理层原始比特流的传输

其中应用层、表示层和会话层统称为应用层,一般由程序开发者实现。传输层、网络层、数据链路层和物理层为底层,由操作系统提供。

下面以客户端向服务端发送"hello"为例,来说明网络传输的过程。

2.1 应用层

应用层的功能是应用程序提供的功能。在发送"hello"的例子中,用户把字符串"hello"转化成二级制流传递给传输层。

2.2 传输层

这里以TCP协议为例来说明传输层。TCP提供了IP环境下的数据可靠传输,它实现了数据流传送、可靠性校验、流量控制等功能。

这里就是在数据中添加一个标记,"TCP首部"。

2.3 网络层

这里以IP协议为例进行说明。IP协议用于将多个包的交换网络连接起来,它在源地址和目的地地址之间传送数据包,它还提供对数据进行重新组装的功能,以适应不同网络对包大小的不同要求。

同理,IP协议会给数据加上目的地地址(IP地址和端口)等信息,必要时还会拆分数据。

2.4 数据链路层

传输中若发生差错,为了达成只将有错的有限数据进行重发,数据链路层将比特流组合成帧,然后以帧为单位进行传送。

2.5 物理层

物理层传输就是数据通过物理介质进行传输的过程,物理介质包括电缆、光纤等 物质。这些数据通过物理介质传输到目的地,目的地再依照与上述相反的过程进行解 析,最后得到字符串"hello"。

3. 协议

3.1 IP协议

3.1.1 IP地址

网络上的计算机都是通过IP地址进行识别的,应用程序通过通信端口彼此通信。

3.1.2 端口

端口是英文port的意译,是设备与外界通信交流的出口,每台计算机可以分配0到65535共65536个端口。其中0到1023号端口称为众所周知的端口号,它们分配给一些固定的服务,比如80端口分配个WWW服务,21端口分配给FTP服务。

3.1.3 域名

又称网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置)。

3.2 TCP协议

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,而与TCP相对应的UDP协议则是无连接的、不可靠的协议。

3.2.1 TCP连接的建立

三次握手建立连接,具体过程如下:

  • 客户端向服务端发送SYN seq=x
  • 服务端接到数据,并向服务端发送SYN seq=y,ACK=x+1
  • 客户端回给服务端ACK=y+1

3.2.2 TCP的数据传输

发送一个数据后,发送方并不能确保数据一定会被接收方接收。于是发送方会等待接收方的回应,如果太长时间没有收到回应,发送方会重新发送数据。

3.2.3 TCP连接的终止

TCP通过四次挥手来确保双端都断开了连接。

第一次挥手∶主机1(可以是客户端也可以是服务器)向主机2发送一个终止信号(FIN),此时,主机1进入FIN_WAIT_1状态,它没有需要发送的数据,只需要等待主机2的回应。

第二次挥手∶主机2收到了主机1发送的终止信号(FIN),向主机1回应一个 ACK。收到ACK的主机1进入FIN_WAIT_2状态。

第三次挥手∶在主机2把所有数据发送完毕后,主机2向主机1发送终止信号(FIN),请求关闭连接。

第四次挥手:主机1收到主机2发送的终止信号(FIN)向主机2回应ACK。然后主机1进入 TIME_WAIT状态(等待一段时间,以便处理主机2的重发数据)。主机 2收到主机1的回应后,关闭连接。至此,TCP的四次挥手便完成了,主机1和主机2都关闭了连接。

参考资料

  1. 《Java网络编程》
  2. 《Unity 3D网络游戏实战》