UDP 用户数据报协议(User Datagram Protocol) 面向无连接
UDP 是面向无连接通信协议
速度快 有大小限制一次最多发送64K 数据不安全 易丢失数据
TCP协议(transmission Control Protocol)
TCP协议是面向连接的通信协议
速度慢 没有大小限制 数据安全
TCP
TCP 通信协议是一种可靠的网络协议 它在通信的两端各建立一个Socket对象
客户端 Socket 客户端 ServerSocket
通信之前要保证连接已经建立
TCP发送数据步骤
创建客户端的Socket对象(Socket)与指定服务端连接
Socket(String host , int port)
获取输出流 写数据
OutputStreamgetOutputStrem()
释放资源
void close()
TCP接收数据步骤
创建服务器端的Socket对象(ServerSocket)
ServerSocket(int port)
监听客户端连接 返回一个Socket对象
Socket accept() (阻塞)等客户端 连接
获取输入流 读数据 并把数据显示在控制台
InputStream getInputStream()
释放资源 void close()
TCP---客户端
创建一个socket
Socket socket = new Socket("127.0.0.1" , 10000);
获取一个IO流 开始写数据
OutputStream os = socket.getOutputStream();
os.write("hello".get,Butes*()); // 字符串 改写为 字节流
释放资源
os.close();
socket.close();
TCP--服务段
创建Socket对象
ServerSocket ss = new ServerSocket(10000) // 端口号
等待客户端连接
Sokcet accept = ss.accept();
获得输入流对象
InputStream is = accept.getInputStream();
int b;
while((b = is.read()) != -1){
System,out.println((char) b);
}
释放资源
os.close();
socket.close();
accept 方法是阻塞的 作用就是等待客户端连接
客户端创建对象并连接服务器 此时是通过三次握手协议保证跟服务器之间的连接
针对于客户端是输出流
针对服务器是输入流
read方法也是阻塞的 继续读取 或者 读到结束标记
在关流的时候 好多了一个往服务器写技术标记的动作
最后一步断开连接 通过四次挥手协议 保证连接终止
- 三次握手
1 客户端向服务起发送连接请求 等待服务器确认
2 服务器向客户端返回一个响应 收到客户端请求
3 客户端向服务器再次发出确认信息 建立连接
- 四次挥手
客户端向服务器发出请求取消连接请求
服务器向客户端返回一个响应 表示收到 客户端取消请求 (服务器将最后的数据处理完毕)
服务器向客户端 发出确认取消信息
客户端再次发送确认消息 连接取消
UDP
要先运行接收端 在运行发送端
如果接收端启动之后 没有接收到数据 那么会阻塞
-
UDP发送数据
创建发送端的 DatagramSocket对象
创建数据 并把数据打包(DatagramPacket)
调用DatagramSocket对象的方法发送数据
释放资源 -
UDP接收数据
创建接收端的 DatagramSocket对象
创建数据 并把数据打包(DatagramPacket)
解析数据包 并把数据在控制台显示
释放资源
UDP 的三种通信方式
- 单播 一对一
- 组播 ipv4 一对多
- 广播 一对所有
UDP通信程序练习
- UDP 发送数据 数据来自于键盘录入 直到输入的数据是886 发送数据结束
- UDP 接收数据 因为接收端不知道发送端什么时候停止发送 故采用死循环接收
发送端
Scanner sc = new Scanner(System.in);
DaragramSocket ds new DatagramSocket();
while(true){
String s = sc.nextLine();
if("886".equals(s)){
break;
}
byte[] bytes =s.getBytes();
InetAddress address = InetAddress.getByname("127.0.0.1");
int port = 10000;
Datagrampacket dp = new DatagramPacket(bytes, butes.length , address , port);
ds.send(dp);
}
ds.close();
接收端
DatagramSocket ds = new DatagramSocket(10000);
byte [] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
while(true){
byte bytes= new byte[1024];
DatagramSoack dp = new DatagramPacket(bytes , bytes,length); );
ds.receiver(dp);
byte[] data = dp.getData();
System.out.println(new String(data , 0 , length));
}
UDP和TCP的区别
TCP的优点:
可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。
TCP的缺点:
慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。
UDP的优点:
快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击……
UDP的缺点:
不可靠,不稳定 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。
有些应用场景对可靠性要求不高会用到UDP,比如长视频,要求速率
小结TCP与UDP的区别:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
字节流 就是散乱的数据结构 报文就是 带有标记的数据