06 网络编程基础

devtools/2024/11/8 10:14:46/

目录

1.通信三要素

1. IP地址(Internet Protocol Address)

2. 端口号(Port Number)

3. 协议(Protocol)

2.TCP与UDP协议

三次握手(Three-Way Handshake)

四次挥手(Four-Way Waveoff)

TCP协议编程示例

UDP协议编程示例


1.通信三要素

网络编程中,通信的三个基本要素是:IP地址端口号协议。这三个要素共同确定了一个网络连接的唯一性。下面是对这三个要素的详细解释:

1. IP地址(Internet Protocol Address)

IP地址是互联网协议(Internet Protocol)地址,用于标识网络上的设备。IP地址分为两种主要类型:

  • IPv4:32位地址,通常表示为四个十进制数,每个数之间用点号分隔,例如 192.168.1.1

  • IPv6:128位地址,通常表示为八组十六进制数,每组之间用冒号分隔,例如 2001:0db8:85a3:0000:0000:8a2e:0370:7334

2. 端口号(Port Number)

端口号是一个16位的数字,用于标识特定的应用程序或服务。端口号范围从0到65535,其中:

  • 0-1023

    :熟知端口(Well-Known Ports),这些端口号由IANA(Internet Assigned Numbers Authority)分配给特定的服务,例如:

    • HTTP:80

    • HTTPS:443

    • FTP:21

    • SSH:22

  • 1024-49151:注册端口(Registered Ports),这些端口号可以由用户和应用程序注册使用。

  • 49152-65535:动态或私有端口(Dynamic or Private Ports),这些端口号通常由操作系统动态分配给客户端应用程序。

3. 协议(Protocol)

协议定义了数据在网络上传输的方式和格式。常见的网络协议包括:

  • TCP(Transmission Control Protocol):一种面向连接的、可靠的传输协议,用于保证数据的完整性和顺序。TCP通过三次握手建立连接,通过四次挥手断开连接。

  • UDP(User Datagram Protocol):一种无连接的、不可靠的传输协议,适用于实时应用,如视频流和在线游戏。

  • HTTP(Hypertext Transfer Protocol):用于传输超文本的协议,通常在浏览器和Web服务器之间使用。

  • HTTPS(Hypertext Transfer Protocol Secure):HTTP的加密版本,使用SSL/TLS协议进行数据加密。

2.TCP与UDP协议

网络通信中,TCP(传输控制协议)是一种面向连接的、可靠的传输协议。TCP连接的建立和断开分别通过三次握手和四次挥手来完成。

三次握手(Three-Way Handshake)

三次握手是TCP连接建立的过程,确保双方都准备好进行数据传输。以下是三次握手的步骤:

  1. 第一次握手

    • 客户端发送一个SYN(同步序列编号)包到服务器,并进入SYN_SEND状态,等待服务器确认。

    • SYN包中包含客户端的初始序列号(ISN),记为 Seq=A

  2. 第二次握手

    • 服务器收到客户端的SYN包后,回复一个SYN+ACK(同步确认)包,表示接受连接请求。

    • SYN+ACK包中包含服务器的初始序列号 Seq=B,以及对客户端SYN包的确认号 Ack=A+1

    • 服务器进入SYN_RECV状态。

  3. 第三次握手

    • 客户端收到服务器的SYN+ACK包后,发送一个ACK(确认)包,确认收到服务器的SYN+ACK包。

    • ACK包中包含对服务器SYN包的确认号 Ack=B+1,以及自己的序列号 Seq=A+1

    • 客户端进入ESTABLISHED状态。

    • 服务器收到客户端的ACK包后,也进入ESTABLISHED状态,连接建立完成。

四次挥手(Four-Way Waveoff)

四次挥手是TCP连接断开的过程,确保双方都正确地关闭连接。以下是四次挥手的步骤:

  1. 第一次挥手

    • 客户端发送一个FIN(结束)包到服务器,表示客户端已经没有数据要发送了。

    • 客户端进入FIN_WAIT_1状态。

  2. 第二次挥手

    • 服务器收到客户端的FIN包后,发送一个ACK(确认)包,确认收到客户端的FIN包。

    • ACK包中包含对客户端FIN包的确认号 Ack=A+1,以及自己的序列号 Seq=B

    • 服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。

  3. 第三次挥手

    • 服务器发送一个FIN包到客户端,表示服务器也没有数据要发送了。

    • 服务器进入LAST_ACK状态。

  4. 第四次挥手

    • 客户端收到服务器的FIN包后,发送一个ACK包,确认收到服务器的FIN包。

    • ACK包中包含对服务器FIN包的确认号 Ack=B+1,以及自己的序列号 Seq=A+1

    • 客户端进入TIME_WAIT状态,等待2MSL(最大段生命周期)后完全关闭连接。

    • 服务器收到客户端的ACK包后,进入CLOSED状态,连接完全关闭。

TCP协议编程示例

客户端

public class SocketClient {public static void main(String[] args) throws IOException {// 创建socketdu对象,指明服务器地址和端口Socket socket = new Socket("localhost", 9999);System.out.println("连接成功!");
​// 向服务器发送数据OutputStream outputStream = socket.getOutputStream();outputStream.write("Hello, 经验宝宝!".getBytes());System.out.println("数据发送成功!");
​//给服务端写一个结束标记socket.shutdownOutput();System.out.println("======以下代码是读取响应的结果======");
​// 接收服务器返回的数据InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[1024];int len;while ((len = inputStream.read(buffer))!= -1) {System.out.println(new String(buffer, 0, len));}System.out.println("数据接收成功!");
​// 关闭流inputStream.close();outputStream.close();
​// 关闭socket连接socket.close();
​}
}

服务端

public class SocketServer {public static void main(String[] args) throws Exception {// 创建服务器socket对象ServerSocket sockServer = new ServerSocket(9999);System.out.println("服务器启动成功!");
​// 等待客户端连接Socket socket = sockServer.accept();System.out.println("客户端连接成功!");
​// 使用socket中的输入输出流进行通信,处理客户端请求InputStream inputStream = socket.getInputStream();
​byte[] buffer = new byte[1024];int len = 0;while ((len = inputStream.read(buffer))!= -1) {System.out.println(new String(buffer, 0, len));}
​// 发送响应数据OutputStream outputStream = socket.getOutputStream();String response = "Hello, 铁头娃!";outputStream.write(response.getBytes());
​// 关闭输入输出流outputStream.close();inputStream.close();// 关闭服务器socket对象socket.close();sockServer.close();}
}

网络编程中,客户端和服务器之间的通信需要明确的数据边界。如果客户端发送的数据没有明确的结束标记,服务器可能会一直等待更多的数据,而客户端则可能因为没有收到响应而卡住。解决这个问题的方法有几种:

  1. 固定长度的消息:客户端和服务器之间约定每条消息的固定长度。

  2. 特殊字符作为结束标记:客户端在消息末尾添加一个特殊的结束标记,服务器在读取到这个标记后停止读取。

  3. 数据包大小作为前缀:客户端在发送消息之前先发送消息的长度,服务器根据这个长度读取完整的消息。

通过这些方法,你可以确保客户端和服务器之间的通信具有明确的数据边界,避免因缺少结束标记而导致的问题。

UDP协议编程示例

发送端

public class DataGramSend {public static void main(String[] args) throws Exception {// 创建一个DatagramSocket,用于发送数据报// 无参:默认创建的DatagramSocket的端口号是0,表示系统自动分配一个可用端口号// 有参:创建的DatagramSocket的端口号是指定的端口号DatagramSocket socket = new DatagramSocket();System.out.println("DatagramSocket创建成功!");
​// 创建DatagramPacket,用于封装要发送的数据// 第一个参数:发送的数据// 第二个参数:发送数据的长度// 第三个参数:接收方的IP地址// 第四个参数:接收方的端口号byte[] data = "Hello, 菊花侠!".getBytes();DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("127.0.0.1"), 8888);System.out.println("DatagramPacket创建成功!");
​// 发送数据报socket.send(packet);System.out.println("数据报发送成功!");
​// 关闭DatagramSocketsocket.close();System.out.println("DatagramSocket关闭成功!");}
}

注意:UDP是不可靠的、无连接的通信,即使在没有接收端的情况下发送端也可以发送数据。

接收端

public class DataGramReceive {public static void main(String[] args) throws Exception {// 创建 DatagramSocket,用于接收数据报DatagramSocket socket = new DatagramSocket(8888);// 创建 byte 数组,用于接收数据byte[] buffer = new byte[1024];// 接收数据报,并将数据写入 bufferDatagramPacket packet = new DatagramPacket(buffer, buffer.length);socket.receive(packet);
​// 打印接收到的内容String message = new String(packet.getData(), 0, packet.getLength());System.out.println("接收到的数据报:" + message);
​// 关闭 DatagramSocketsocket.close();}
}

http://www.ppmy.cn/devtools/132279.html

相关文章

Linux学习笔记之时间日期和查找和解压缩指令

时间日期类 date指令-显示当前日期 date (显示当前时间) date %Y (显示当前年份) date %m (显示当前月份) date %d (显示当前那一天) date “%Y-%m-%d %H:%M:%S” (显示…

植物神经功能紊乱?这些维生素或许能帮到你!

植物神经功能紊乱,这个听起来有些陌生的名词,实际上却是一种常见的内脏功能失调综合征。它可能与心理、遗传、疾病等多种因素有关,表现为多个系统的症状,如睡眠障碍、心悸、头痛、胸闷、多汗等,严重影响了患者的生活质…

集合进阶------泛型(JAVA笔记第三十期)

p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解 目录 泛型概念泛型类泛型接口泛型接口的实现类泛型方法可变参数的泛型方法 泛型的通配符 泛型概念 泛型,顾名思义,广泛的类型,使用泛型可以帮助我们…

Docker配置宿主机目录和网络映射

容器挂载宿主机目录 在Docker中,你可以通过-v或--volume选项将宿主机的目录挂载到容器中。这可以让你在容器和宿主机之间共享文件。 例如,如果你想将宿主机的/home/user/data目录挂载到容器的/data目录,你可以使用以下命令: do…

mysql 源码安装以及多实例

一、源码安装mysql-5.5.32 1、编译安装CMAKE [rootOldboy tools]# tar zxvf cmake-3.5.2.tar.gz [rootOldboy tools]# cd cmake-3.5.2 [rootOldboy cmake-3.5.2]# ./configure && make && make install2、编译安装mysql-5.5.32 [rootOldboy tools]# mkdir …

信息安全工程师(81)网络安全测评质量管理与标准

一、网络安全测评质量管理 遵循标准和流程 网络安全测评应严格遵循国家相关标准和流程,确保测评工作的规范性和一致性。这些标准和流程通常包括测评方法、测评步骤、测评指标等,为测评工作提供明确的指导和依据。 选择合格的测评团队 测评团队应具备相关…

canfestival主站多电机对象字典配置

不要使用数组进行命名:无法运行PDO 使用各自命名的方式:

二分查找习题篇(上)

二分查找习题篇(上) 1.二分查找 题目描述: 给定⼀个 n 个元素有序的(升序整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: ​输入: nums [-1,0…