Java---网络编程

news/2024/9/18 20:24:32 标签: 网络

一.网络的基本概念

1.指令

二.网络模型

1.七层模型

七层模型,也称为OSI(Open System Interconnection)参考模型,是国际标准化组织(ISO)制

定 的一个用于计算机或通讯系统间互联的标准体系。它是一个七层的、抽象的模型体,不仅包括

一系列抽 象的术语或概念,也包括具体的协议。

1.1 物理层

定义设备标准,如*网线*的接口类型、*管线*的接口类型、*各种传输介质*的传输速率等。物

理层的作用是尽可能地屏蔽掉底层的差异,透明的传输bit(比特)。

这一层定义了物理特性,这是最底层的层次,它定义了网络节点之间如何物理连接,包括网络设备的物理连接和数据传输介质的选择。

1.2 链路层

定义了如何让格式化数据进行传输,以及如何控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。例如要发送的数据包的大小,要传送的每个数据包的寻址方式,使其到达预定的接收方,以及一种确保不超过一个节点尝试同时向接收方发送数据包的方法。

这一层负责在网络节点之间建立连接,以便进行数据传输,包括协商连接,以及如何表示、编码和识别数据帧。

链路层协议: SDLC、HDLC、PPP、STP、帧中继等。

1.3 网络

将数据传输到目标地址;目标地址可以使多个网络通过*路由器*连接而成的某一个地址,主要负责寻找地址和路由选择,网络层还可以实现拥塞控制、网际互连等功能在这一层,数据的单位称为数据包(packet)。

这一层负责将数据从一台计算机传输到另一台计算机,它定义了网络节点之间怎样交换数据,以及实现网络节点地址管理和路由管理。

网络层协议的代表包括:IP、IPX、RIP、OSPF等。

1.4 传输层

提供*端到端*的服务,可以实现流量控制、负载均衡。传输层信息包括端口、控制字和校验和。 传输层位于OSI的第四层,这层使用的设备时主机本身。数据包一旦离开网卡即进入网络传输层。

区块链,BT

这一层会对网络层提供的服务,以保证两个主机之间的数据传输的可靠性,同时确保可靠的数据传输以及可用的协议格式,如TCP,UDP和其他。

传输层协议: TCP和UDP。

1.5 会话层

负责在网络中的两点*建立**、****维持和终止****通信***,记忆数据的分隔等数据传输相关的管理。会话层的功能包括: 建立通信链路,保持会话过程通信链接的畅通,同步两个节点之间的对话,决定通信是否被中断以及通信中断时决定从何处重新发送。

这一层负责建立、管理和终止会话,它负责建立主机之间的数据传输,并保持会话,以便在主机之间实现请求/响应。

1.6 表示层

将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格 式;主要负责数据格式的转换,确保一个系统的应用层信息可被另一个系统应用层读取具体来 说,就是将设备固有的数据格式转换为网络标准传输格式,不同设备对同一比特流解释的结果可 能会不同;因此,主要负责使它们保持一致。

这一层负责处理数据的格式化,以及在通信过程中数据的编码转换,以便各台计算机之间可以正确传输数据。

表示层协议还对图片和文件格式信息进行解码和编码。

1.7 应用层

应用层是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。

这一层定义了用户和网络之间怎样进行数据传输,它是专门针对用户应用程序的网络控制,比如HTTP,SMTP,FTP等协议。

应用层协议:HTTP、FTP、SMTP、SNMP、 DNS、 HTTPS、 POP3等。

此外,还有一个叫作管理层的单独层,它负责集中管理以上7层的所有信息和服务,以便实现网络的完整性和高效性。

2.五层模型

三.TCP的三次握手&四次挥手

1.三次握手

1.1 概念

1.2 三次握手相关参数

序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号, 第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq 就是这个报文段中的第一个字节的数据编号。

确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带 数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字 节的编号+1即为确认号。

确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。

同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意 连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报 文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。

1.3 三次握手的目的

第一次握手请求连接的包才到会使服务器打开连接,占用资源而且容易被恶意攻击!防止攻击的 方法,缩短服务器等待时间。*两次握手容易死锁*。如果服务器的响应数据在传输中丢失,*客户 端*将不知道*服务器*建立什么样的序列号,客户端认为连接还未建立成功,将忽略服务端发来的 任何数据,只等待连接确认应答数据。而服务器在发出的响应超时后,重复发送同样的数据。这 样就形成了死锁。

2.四次挥手

终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放

运输连 接

3.为什么连接的时候是三次握手,关闭的时候却是四次挥手?

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。

但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。

只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

四.Socket编程

在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据

1.基于TCP的socket编程

1.1 开发流程

1.2 程序案例:

 服务端

final int PORT = 9999;
/*
 * 创建ServerSocket对象并绑定端口
*/
ServerSocket server = **new** ServerSocket(PORT);
System.out.println("服务端启动成功.....");
boolean f = true;
 
while(f) {
/*
 * 监听客户端请求
 */
 Socket socket = server.accept(); 
/*
 * 获取输入流字节并将其转换为字符流
 */
  InputStream stream = socket.getInputStream();
  InputStreamReader in = new InputStreamReader(stream, "utf-8");
/*
 * 创建缓存区
 */
  char[] buffer = new char[48];
/*
 * 读取流中数据将其放入缓存(buffer)中
 */
    Socket socket = server.accept();//监听到客户端的socket
    // 接收客户端请求
    InputStream stream = socket.getInputStream();
    InputStreamReader in = new InputStreamReader(stream, StandardCharsets.UTF_8);
    char[] buffer = new char[64];
    in.read(buffer);
    String str = new String(buffer);
    str = str.trim();
    System.out.println("[来自客户端:] " + str);
server.close();

 客户端

final   int  PORT = 10010;
final  String HOST = "127.0.0.1";

Socket socket =  new  Socket(HOST, PORT);
OutputStream stream = socket.getOutputStream();
OutputStreamWriter out = new OutputStreamWriter(stream);
out.write("测试一下客户端数据");
out.flush();
socket.close();

2.基于UDP的socket编程

UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整 到达的。

2.1 程序案例:

 UDP 接收端

final in  PORT = 9900;
DatagramSocket socket = **new** DatagramSocket(PORT);
System.out.println("UDP Receive启动....");
byte [] buffer =  new byte[1024];
DatagramPacket packet = new  DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String msg =  new  String(packet.getData());
System. out .println("使用UDP接收到的数据: " + msg); 
socket.close();

 UDP 发送端

final int  PORT = 9900;
 final  String HOST = "127.0.0.1";
DatagramSocket socket = new  DatagramSocket();
String msg="使用UDP发送一条数据";
 byte [] buffer = msg.getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, 
InetAddress.getByName(HOST),PORT); 
System. out .println("UDPSend发送信息: ");
socket.send(packet);
socket.close();

程序运行结果:

UDP Receive启动....

使用UDP接收到的数据: 使用UDP发送一条数据


http://www.niftyadmin.cn/n/5664469.html

相关文章

哪些人群适合做旅游卡项目?首选这5类人群!

在旅游市场蓬勃发展的今天,旅游卡项目成为了一个充满潜力的创业选择。那么,哪些人群适合涉足这个领域呢?重点首选这5类人群: 一、自由职业者 自由职业者拥有灵活的工作时间安排,这是他们从事旅游卡项目的一大优势。他…

2024年适合培训服务企业的7款CRM盘点

培训服务行业在线索管理、客户管理、数据分析、项目管理、师资管理和课程管理等方面,使用CRM可以事半功倍,最重要的是,可以用数据说话,找到降本增效的方向。 下面对培训服务行业常用测CRM做个盘点,包括国内比较头部的…

配置环境-keil

配置keil -- 先将keil安装配置好,包括库 一、STM32 -- STM32是意法半导体(意大利)采用ARM公司设计的内核,设计一系列32位单片机芯片。 1、STM32开发的几种方式 2、STM32寄存器和库函数版本的工程创建 新建文件夹 复制相关文件…

C#使用Access数据库使用总结

话说这Access数据库确实是有点年代了,前面在深圳的一家放射医疗公司,数据库用的Access,后面在我的建议下,换成了SQLite。用SQLite多舒服,不用装Runtime,还可以用EF。Access得装Runtime,也用不了…

Linux网络——HTTP协议详解(1)

文章目录 HTTP协议URLHTTP报文请求报文响应报文 HTTP协议 HTTP可以说是当今应用最广泛的应用层协议之一,主要面向的是浏览器(客户端)和服务器之间通信的规定 HTTP协议的底层是TCP协议,我们先大概认识一下这个协议是如何使用的 …

重学SpringBoot3-集成RocketMQ(二)

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成RocketMQ(二) 1. 基础概念2. 准备工作3. 实现事务消息的生产者4. 事务监听器实现5. 消费者示例6. 发送事务消息7. 测试7.1 模…

《仙境传说RO:新启航》游戏攻略,VMOS云手机辅助高效挂机助攻!

在《仙境传说RO:新启航》中,游戏的玩法非常丰富,但对很多玩家而言,想要全方位提升游戏体验并不容易。借助VMOS云手机,可以为玩家提供更为便捷和高效的辅助工具。VMOS云手机特别定制了适用于《仙境传说RO:新…

漏洞挖掘 | 记录第一个src厂商的支付漏洞

前言 最近去搜了一些厂商SRC试一下,没想到已学的知识也能挖掘到逻辑漏洞,下面给大家说一下这个逻辑漏洞的思路,没想到居然存在的,也算是运气好吧,希望对大家有所帮助。纯实战文章,一点都不水,且…