UDP协议
一、介绍
UDP(User Datagram Protocol)
,用户数据报协议 ;
是Internet互联网最基本的协议
其功能包括:
一、格式化信息流;
二、提供可靠传输。
1. OSI模型的七层框架
OSI模型定义了网络互连的七层框架,每一层实现各自的功能和协议,并完成与相邻层的接口通信。OSI模型各层的通信协议
应用层 | HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP、等等 |
---|---|
表示层 | XDR、ASN.1、SMB、AFP、NCP、等等 |
会话层 | ASAP、SSH、RPC、NetBIOS、ASP、Winsock、BSD Sockets、等等 |
传输层 | TCP 、UDP 、TLS、RTP、SCTP、SPX、ATP、IL、等等 |
网络层 | IP、ICMP、IGMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、X.25、等等 |
数据链路层 | 以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE 802.11、FDDI、PPP、等等 |
物理层 | 例如铜缆、网线、光缆、无线电等等 |
传输层是TCP/IP协议五层模型中的第四层。它提供了应用程序间的通信,它负责数据能够从发送端传输到接收端。
二、特点
1.UDP(UserDatagramProtocol)是一个简单的面向消息的传输层协议;
2.UDP协议 为应用程序提供了一种无需建立连接就可以发送封装的IP数据报的方法,俗称面向无连接
;
3.UDP 不可靠,没有任何可靠机制,即便发送失败也不会返回任何错误信息,也称不可靠协议
;
4.UDP 面向数据报,发多少就收多少,原样发送,交给UDP的报文,UDP不会拆分或合并;
5.UDP 没有拥塞控制,网络出现的拥塞不会使源主机的发送速率降低;
6.UDP 支持一对一
、一对多
、多对一
和多对多
的交互通信
7.缓冲区:只有接收缓冲区,没有发送缓冲区,接收缓冲区满了,多的直接丢弃
总结: UDP协议会把数据打包发送给目标地址,这个数据包能不能发送给目标地址就不管了,安全性低,容易丢包 但是速度快,开销小 无需类似于tcp协议三次握手。
代码案例
srever服务器端
1.创建接收端socket对象
2.接收数据 — —开始监听客户端发送给服务器端的数据,如果没有监听到数据则一直阻塞等待
3.解析数据
4.输出数据
5.释放资源
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) throws IOException {
/*
* @Date: 2023/04/07 图图15:24
* 1.创建接收端socket对象;
* 2.监听(阻塞 : 如果建立连接失败 程序会一直阻塞,不往下执行)
* 3.获得输入流对象
* 4.获取数据
* 5.输出数据
* 6.释放资源
*/
// 1
while (true) {
ServerSocket socket = new ServerSocket(8090);
// 2
Socket accept = socket.accept();
// 3
InputStream stream = accept.getInputStream();
// 4
byte[] bytes = new byte[1024];
int read = stream.read(bytes);
// 5
System.out.println(new String(bytes, 0, read));
// 6
stream.close();
}
}
}
client客户端
1.创建发送端socket对象
2.提供数据,并将数据封装到数据包中
3.通过socket服务器的发送功能,将数据包发出去
4.释放资源
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class TcpClient {
public static void main(String[] args) throws IOException {
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
int port = 8090;
Socket socket = new Socket(inetAddress, port);
OutputStream stream = socket.getOutputStream();
byte[] bytes = "aaaa".getBytes();
stream.write(bytes);
stream.close();
socket.close();
}
}