Java基于UDP实现 客户端/服务器
UDP协议
无连接
不可靠传输(传出去了不管有没有接受到,容易数据丢失)
面向数据报
全双工
UDP协议端格式
UDP协议报文结构,这个图在很多计算机网络教科书上都有,而且都是这么在花,但是实际这么画不够严谨
个人理解图应该如下:
源端口:源端口号。在需要对方回信时选用。不需要使用时可用 0 填充。
目的端口:目的端口号。这在终点交付报文时必须使用。
长度:UDP 用户数据报的长度,其最小值是 8(即仅有首部部分),单位:字节。
校验和:检测 UDP 用户数据报在传输过程中是否出错。有错就丢弃。
UDP报头里包含了一些特殊的属性,携带了一些重要的信息
不同的协议功能不同,报头中带有的属性信息就不同
对于UDP来说,报头一共就是八个字节,分成四个部分(每个部分都是均衡的两字节)
UDP 报头:8个字节,4个字段.
2字节 源 端口 + 发送方端口
2字节 目的端口 + 接受方端口
2字节 UDP报文长度 (范围:0 -> 65535) (一个UDP数据报,最长就是65535字节)
2字节 校验和 (发送方把要发送的数据计算出校验和(checksum1),接收方收到数据把数据按照同样的方式再计算一次校验和(checksum2),同时接受方也收到了checksum1,接受方比对checksum1和checksum2是否相同)
类比货拉拉搬家环节
买家叫车时,根据需要决定定什么样的车
车厢用来装货的部分就叫做 "载荷"
车头用来标识这辆车的身份,是大型车还是中型车,货车还是客车
UDP会把载荷数据通过UDP Socket,通过send方法拿来的数据的基础上在前面拼接几个字节的报头(相当于字符串拼接,此处是二进制的,不是文本的)
一次网络通信涉及到
五元组(源IP,源端口,目的IP,目的端口,协议类型)(两字节)
UDP报文长度(数据范围0->65535,64KB)(两字节)
Tips:
一个UDP数据报最大只能传输64KB的数据这是大呢还是小呢?如果应用层数据超过了64KB怎么办?
1. 就需要在应用层,通过代码的方式针对应用层数据报进行手动的分包, 拆成多个包,通过多个UDP数据报进行传输(本来send一次,现在send多次),就跟搬家的时候东西太多,一车装不下,就分多车装
2. 不用UDP,(因为使用如果使用上一条UDP传输拆分方案就得写很多代码很得进行多次测试处理bug,工作量大大增加,程序员的幸福感就降低了)直接换成TCP就没有这种限制.
校验和:验证传数的数据是否正确,网络传输的本质是光信号和电信号的转换,在这过程中,可能会受到一些物理环境干扰如电场,磁场,高能射线等,导致出现"比特翻转"(1->0,0->1)状况,数据一旦发生了改变,对数据的含义来说是致命的,例如在很多程序中经常使用1表示某功能的开启,0表示关闭.本来网络数据报是想开启这个功能,结果因为比特翻转导致变成了关闭...这后果可想而知是非常严重的!但这样的现象又是客观存在的,不可避免,程序员能做的就是能及时识别出错误信息!
因此就映入了校验和来进行鉴别
大致的鉴别方式如下:针对数据内容进行一系列数学运算,得到一个比较短的结果(比如两个字节的数据),如果数据内容一定,得到的校验和结果就一定,如果数据有变化,得到的校验和也就跟着与原来不同,所以只要前后内容是相同的,按照同样的算法得到的校验和也应该是相同的
但是实际的网路传输过程是把所有的字节都参与生成校验和运算,这样任何一个字节出了问题,都能及时的被发现!
Tips:
如果内容相同,得到的校验和一定相同(肯定的),但有时候不同内容按照相同的计算法则计算出的校验和可能相同(存在极小概率).但是在工程实践中,这种情况就忽略不计了,一般认为,校验和相同原始内容也相同
例子:就像我妈叫我去买"葱,姜,蒜",并最后嘱咐一共要三样!我由于没见过蒜长啥样,买回去了"葱,姜,辣椒"也是三样.这例子中的"三样"就相当于我与我妈之间数据传输的"校验和"但是在传输过程中出现了干扰使得我最终得到的信息内容不一样,就产生了错误!
针对网络传输的数据来说,生成校验和的算法有很多种,其中比较知名的有
CRC 循环冗余校验
简单粗暴,把数据的每个字节都循环的往上"累加",如果累加溢出了,截出高位不要.
此方法好计算,但是有相应的弊端,如果数据同时变动两个bit位(前一个字节少1,后一个字节多1)就会出现内容变了,但是CRC结果没有变这种情况
MD5
此方法不是简单的累加,有一系列公式来进行更复杂的数学运算(数学逻辑不过多介绍)
MD5算法的特点:
定长:无论原始数据多长,得到的MD5值都是固定的长度(4/8字节)
冲突概率很小:原始数据哪怕只变动一个地方,最后算出来的MD5的值也会差别很大,让结果更加分散
不可逆:通过原始数据计算MD5值很容易,但是通过MD5还原成原始数据(找到那个数据生成了次MD5值)就很难,理论上是不可实现的计算量极大,但也有很多解码网站他们的原理大多以"打表"的方式,把一些常用的数据计算出MD5值存储下来,用户输入MD5再在他的数据里面去一一核对(我们常见的WiFi万能
Java基于UDP实现 客户端/服务器相关推荐
- Java 基于 UDP 实现 Socket中的多客户端通信
这里原理同 TCP/IP 实现多客户端通信的原理是一样的,同样的 UDPClient.java 不变,与上一篇文章中描述的一致,无需修改 UDPServer.java package com.lear ...
- c udp文件发送到服务器端,基于UDP的客户端和服务器端的代码设计
实验平台 linux 实验内容 编写UDP服务器和客户端程序,客户端发送消息,服务器接收消息,并打印客户端的IP地址和端口号. 实验原理 UDP是无需连接的通信,其主要实现过程如下: 同样,我们可以按 ...
- C++socket编程(八):8.2简单的基于UDP的客户端和服务端
UDP中的服务器端和客户端没有连接 UDP 不像 TCP,无需在连接状态下交换数据,因此基于 UDP 的服务器端和客户端也无需经过连接过程.也就是说,不必调用 listen() 和 accept() ...
- linux下java基于UDP编程聊天_基于Linux下的UDP编程
一. Linux下UDP编程框架 使用UDP进行程序设计可以分为客户端和服务器端两部分. 1.服务器端程序包括: ? 建立套接字 ? 将套接字地址结构进行绑定 ? 读写数据 ? 关闭套接字 2.客户端 ...
- java基于http协议客户端与服务器端的交互,通俗易懂客户端与服务器端交互原理(HTTP数据请求与HTTP响应,包括Servlet部分...
经 常看到HTTP客户端与服务器端交互原理的各种版本的文章,但是专业术语太多,且流程过于复杂,不容易消化.于是就按照在 Servlet 里面的内容大致做了一些穿插.本来 连 Tomcat 容器 和 S ...
- java基于udp实现键盘录入聊天
发送端 package demo02;import java.io.IOException; import java.net.DatagramPacket; import java.net.Datag ...
- java在客户端生成文件_用Java编写创建一对客户端/服务器程序,利用数据报将一个文件从一台主机传送到另一...
展开全部 下面是e5a48de588b63231313335323631343130323136353331333337386564我自己写的一个读取并显示txt文件的demo,希望对您有帮助. pu ...
- udp实现客户端服务器
服务器端: #include<stdio.h> #include<assert.h> #include<unistd.h> #include<stdlib.h ...
- 认证服务器协议,基于口令的客户端/服务器认证协议
摘要: Identity authentication is the precondition for secure communication between the client and the ...
最新文章
- 2018 区块链技术及应用峰会(BTA)·中国全日程新鲜出炉,更多精彩议题看不停
- 关于主机的思维导图_几张思维导图,让你清楚的知道ip地址怎么回事?
- Dockerfile常见指令优化
- java expextion_Java(20~24)
- android 判断是否是标点符号_Java 中文字符判断 中文标点符号判断
- 查经 民数记3章 利未人
- 水冒泡了几度_冒泡和选择排序详解
- Vsftp在Ubuntu的安装与配置
- 银联支付h5返回商户的地址是post的吗?_php实现银联商务公众号+服务窗支付
- 工具分享:VISIO 2010版windows_64正版软件32位(附下载链接)
- Hbuilder:实现阴影透明背景特效
- Linux内核源代码阅读
- MATLAB-SIMULINK-二极管搭建整流电路(1)
- 反安装冰盾抗DDOS防火墙后出现启动报错的解决方法
- Java基础知识清单
- 【深度学习】保姆级教程:个人深度学习工作站配置指南
- unity helios_用于Eclipse Helios的JBoss工具!
- 录屏软件 ev录屏 安装与使用教程 教学演示视频提问必会的软件
- 关于电压跟随器的那些事
- xgboost中自定义损失函数的使用方法
热门文章
- Java 基于 UDP 实现 Socket中的多客户端通信