一、网络通信协议
1、概述
计算机之间想要互通信息就必须使用网络,网络连接的规则就被成为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,不同的计算机之间需要共同遵守才能进行通信。
七层模型,也称为 OSI(Open System Interconnection)参考模型,是国际标准化组织(ISO)制定的一个用于计算机或通讯系统间互联的标准体系。它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。TCP/IP 则借鉴了 OSI 的这些概念建立 TCP/IP 模型,在网络通讯协议中使用最为广泛的也是 TCP/IP 协议(包括 TCP 协议和 IP 协议),UDP 协议和其他一些协议的协议组。如图:
TCP/IP四层模型的每层分别负责不同的通讯功能:
-
应用层:主要负责应用程序的协议,如 HTTP 协议、FTP 协议
-
传输层:要使用网络程序进行端到端的通讯,主要使用 TCP 和 UDP
-
网络层:是整个 TCP/IP 协议的核心,主要用于将传输的数据进行分组并发到目标计算机
-
网络接口层:物理传输通道,主要是一些网络连接设备的驱动协议
2、IP地址和端口号
IP地址:网络中每台计算机的一个标识号
本机IP地址:127.0.0.1 或 localhost 目前,IP地址普遍都是IPv4版本的,它是由32位二进制数来表示的,但在实际中都是以十进制数来表示的。如:127.0.0.1 但由于计算机网络规模的不断扩大,对IP地址的需求也不断增加,IPv4的IP地址已经不够用了,因此,IPv6就诞生了。IPv4用4个字节表示IP地址,而IPv6用16个字节表示IP地址,它的容量为2的128次幂-1个。
端口号:计算机中应用程序的标识号
一台服务器有256*256个端口号 0-1023是公认端口号,即已经公认定义或为将要公认定义的软件保留的 1024-65535是并没有公共定义的端口号,用户可以自己定义这些端口的作用
二、网络通信的实现
1、TCP协议
TCP是一个面向连接的,可靠的,基于字节流的传输层协议,主要通过 ServerSocket 类和 Socket 类
三次握手
-
第一次握手:客户端向服务器发出连接请求,等待服务器确认
-
第二次握手:服务器向客户端发送一个相应,通知客户端收到了请求连接
-
第三次握手:客户端再次向服务器发送确认信息,确认连接
四次挥手
-
第一次挥手:服务端确认客户端需要断开连接
-
第二次挥手:客户端确认服务端接收断开请求
-
第三次挥手:客户端确认服务端数据发完
-
第四次挥手:服务端确认客户端断开连接
ServerSocket 类
ServerSocket(int port):构造方法,创建 ServerSocket 对象,将其绑定到一个指定的端口号上
Socket accept():侦听并接受到此套接字的连接
Socket 类
Socket(String host,int port):构造方法,创建 Socket 对象,会根据参数去连接在指定地址和端口上运行的服务器程序
int getPort():返回一个 int 类型对象,该对象是 Socket 对象与服务器连接的端口号
InetAddress getLoclAddress():获取 Socket 对象绑定的本地 IP 地址,并将 IP 地址封装成 InetAddress 类型的对象返回
void close():关闭 Socket 连接,结束本次通信。在关闭 Socket 之前,应将与socket相关的所有输入/输出流全部关闭
InputStream getInputStream():返回一个 InputStream 类型的输入流对象,如果该对象是由服务器的 Socket 返回,就用于读取客户端发送的数据,反之,用于读取服务器端的数据
OutputStream getOutputStream():返回一个 OutputStream 类型的输出流对象,如果该对象是由服务器的 Socket 返回,就用于向客户端发送数据,反之,用于向服务器端发送数据
服务端实现:
-
创建 ServerSocket 对象
-
等待客户端连接,当客户端连接后,获取客户端Socket对象
-
给客户端反馈信息
-
与客户端收发数据......
-
关闭资源
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(6666);
Socket client = serverSocket.accept();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
bw.write("你已经连接上服务器了");
bw.newLine();
bw.flush();
bw.close();
client.close();
}
客户端实现:
-
创建 Socket 对象
-
获取服务端的反馈信息
-
与服务端收发数据......
-
关闭资源
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost",6666);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(br.readLine());
br.close();
socket.close();
}
2、UDP协议
UDP是一个面向无连接,不可靠的传输层协议,主要通过DatagramPacket 类和 DatagramSocket 类来实现。
DatagramPacket 类
DatagramPacket (byte[] buf,int length):接收端构造方法,接收一个字节数组来存放接收到的数据
DatagramPacket (byte[] buf,int length,InetAddress address,int port):发送端构造方法,接收存放发送数据的字节数组和指定发送端 IP 地址和端口号
InetAddress getAddress():返回某台计算机的 IP 地址
int getPort():返回某台远程主机的端口号
byte[] getData():返回数据缓冲区
int getLength():返回将要发送或接收到的数据长度
DatagramSocket 类
DatagramSocket():没有指定端口号,系统会分配一个没有被其它网络程序所使用的端口号
DatagramSocket(int port):指定一个端口号创建对象,可以监听指定的端口
void receive(DatagramSocket p):从此套接字接收数据包
void send(DatagramSocket p):从此套接字发送数据包
发送端实现:
-
创建 DatagramPacket 对象,并封装数据
-
创建 DatagramSocket 对象
-
调用 DatagramSocket 对象方法 send() 发送数据
-
释放资源
public static void main(String[] args) throws IOException {
byte[] data = "我是发送端".getBytes();
DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getByName("127.0.0.1"),6666);
DatagramSocket ds = new DatagramSocket();
ds.send(dp);
ds.close();
}
接收端实现:
-
创建 DatagramSocket 对象,绑定端口号(要和发送端一致)
-
创建字节数组,接收发来的数据
-
创建数据包 DatagramPacket 对象
-
调用 DatagramSocket 对象方法 receive(DatagramPacket DP) 接收数据
-
对接收到的数据 DP 进行拆包
-
释放资源
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(6666);
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes,1024);
ds.receive(dp);
Inet4Address ipAddress = (Inet4Address) dp.getAddress();
byte[] data = dp.getData();
int length = dp.getLength();
String str = new String(data,0,length);
System.out.println(ipAddress + ":" + str);
ds.close();
}
三、TCP 和 UDP 的区别
-
TCP面向连接,UDP面向无连接
-
TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。UDP是不可靠服务,只保证数据有交付
-
TCP只能点对点,UDP支持一对一,一对多,多对一和多对多的交互通信
-
TCP面向字节流,传输速率容易受影响;UDP面向报文,网络出现拥塞不会使源主机的发送速率降低(如实时对战游戏基本采用UDP协议)