JavaSE——网络编程基础知识
计算机网络的分类:
局域网(LAN)
指在一个较小地理范围内的各种计算机网络设备互联在一起的通信网络,可以包括一个或多个子网,通常局限在几千米的范围之内。
城域网(MAN)
主要由城域范围内的各个局域网之间互连构成。
广域网(WAN)
由距离较远的局域网与城域网互联构成的通信网络,通常是除了计算机设备以外,还要涉及一些电信通信方式。
OSI分层模型:
应用层 |
表示层 |
会话层 |
传输层 |
网络层 |
数据链路层 |
物理层 |
TCP/IP分层模型:
应用层 [数据段] |
传输层 [数据包] |
网络互连层 [数据帧] |
物理层+数据链路层(主机到网络层) [比特] |
TCP/IP参考模型的层次结构:
TCP/IP的报文格式:
IP地址和端口号:
IP地址用来标志网络中的一个通信实体,这些通信实体可以是一台主机,一台打印机或者路由器的某一个端口。简单来说,IP 地址好比家的地址,家里的卧室餐厅等相当于不同的端口。
IP地址被分成A、B、C、D、E五类:
A类:10.0.0.0~10.255.255.255
B类:172.16.0.0~172.31.255.255
C类:192.168.0.0~192.168.255.255
在Internet上IP地址和主机名是一一对应的,通过域名解析可以由主机名得到机器的IP,由于机器名更接近自然语言,容易记忆,所以使用比IP地址广泛,但是对机器而言只有IP地址才是有效的标识符。
端口是一个16位的整数,用来表示数据交给那个通信实体处理。因此,端口是通信程序与外界交流的出入口,它是一综抽象的软件结构,包括一些数据结构和I/O缓冲区。端口号可以是0~65535,通常被分为三类:
公认端口:0~1023
注册端口:1024~49151
动态/私有端口:49152~65535
通常一台主机上总是有很多个进程需要网络资源进行网络通讯。网络通讯的对象准确的讲不是主机,而应该是主机中运行的进程。这时候光有主机名或IP地址来标识这么多个进程显然是不够的。端口号就是为了在一台主机上提供更多的网络资源而采取得一种手段,也是TCP层提供的一种机制。只有通过主机名或IP地址和端口号的组合才能唯一的确定网络通讯中的对象:进程。
TCP/IP协议:
Internet网络采用的是TCP/IP协议,在全球范围内实现不同硬件结构、不同操作系统、不同网络系统的互联。Internet网上存在的每台主机用为其分配的Internet地址代表自己,这个地址就是IP地址。到目前为止,IP地址用4字节也就是32位二进制表示,成为IPv4。为了便于使用,通常取每个字节的十进制数,并且每个字间用圆点隔开表示IP地址
传输控制协议/网间协议。
定义主机如何连入英特网及数据如何在他们之间传输的标准。
TCP握手协议:
服务端与客户端建立连接协议(三次握手)
客户端发送一个带SYN(synchronize 即握手信号)标志的TCP报文到服务器,这是三次握手中的报文一;
服务端回应客户端的,这是三次握手中的第二个报文,这个报文同时带ACK(Acknowledgement 中文译为”确认字符“。它的作用是确认发来的数据已经接受无误)标志,表示对刚才客户端SYN报文的回应;同时有标志SYN给客户端,询问客户端是否准备好进行数据通讯。
客户端此时会再次回应服务端一个ACK保温,这是报文段三。
完成三次握手,客户端与服务端开始传送数据。
连接终止协议(四次挥手)
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭,这原则是当一方完成他的数据发送任务后就能发送一个FIN来终止这个方向上的连接,收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据,首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
TCP客户端发送一个FIN,用来关掉客户端到服务器的数据传送(报文段4);
服务器收到这个FIN,它发挥一个ACK,确认序号为收到的序号加一(报文段5),和SYN一样,一个FIN将占用一个序号。
服务器关闭客户端的连接,发送一个FIN给客户端(报文6);
客户端发回ACK报文表示确认,并将确认序号设置为收到的序号加一(报文段7)。
连接终止过程中的四个状态:
FIN_WAIT_1:server 端主动要求关闭TCP连接,并且主动发送FIN后,等待cliect端回复ACK的状态,对于client来说,即等待接受FIN报文的状态。
FIN_WAIT_2:当client端回复 ACK报文后进入的状态。一般情况下,客户端一旦收到FIN报文就会立刻回复ACK,所以FIN_WAIT_1状态比较少见。
TIME_WAIT:主动关闭的一方在完成自身发起的关闭请求后(即断开连接),接收到被动一方的FIN后进入的状态。
CLOSE_WAIT:被动关闭方此时正等待上层应用发出关闭连接指令。
端口和套接字socket:
端口:一般而言,一台计算机只有单一的连到网络的物理连接,所有数据都通过此连接对内、外送达特定的计算机,这就是端口。网络程序设计中的端口(port)并非真实的物理存在,而是一个假想的连接装置。
端口被规定为0-65535之间的整数,HTTP服务一般使用80端口,FTP服务使用21端口。假如一台计算机提供了HTTP、FTP多种服务,那么客户机会通过不同点端口来确定连接到服务器的哪项服务上。
常见的一些协议和它们对应的服务端口号:
套接字:socket 通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。用于将应用程序和 端口连接起来。也是一个假想的连接装置,就像插插头的设备“插座”用于连接电器和电线一样。
在每个TCP、UDP数据段中都包含源端口和目标端口字段。有时,我们把一个IP地址和一个端口号合称为一个套接字(Socket),而一个套接字对(Socket pair)可以唯一地确定互连网络中每个TCP连接的双方(客户IP地址、客户端口号、服务器IP地址、服务器端口号)。
java将套接字抽象为类,只需创建 Socket类对象,即可使用套接字。
Socket 和 ServerSocket 类库位于java.net包中。ServerSocket用于服务器端,Socket建立网络连接时使用。在连接成功时,应用程序两端都会产生一个Socket 实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务端还是客户端而产生不同的级别,不管是Socket 还是 ServerSocket它们的工作都是通过SocketImp1 类及其子类完成的。
使用Socket进行Client/Server程序设计的一般连接过程是这样的:Server端Listen(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。 Server端和Client端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
(1) 创建Socket;
(2) 打开连接到Socket的输入/出流;
(3) 按照一定的协议对Socket进行读/写操作;
(4) 关闭Socket.
总结:
网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。
目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。