TCP 协议和 UDP 协议是 TCP / I P协议栈中的两个最主要的传输层协议. 其中 TCP 提供可靠的、 有序的、 端到端的数据传输服务, 而 UDP则提供的是不可靠的、 不保证有序到达的、 端到端的数据传输服务. TCP 协议一般应用在数据传输量大或可靠性要求高的场合 (例如: 文件传输 ); UDP协议则一般是应用在数据传输量不大且可靠性要求不高的场合.
然而, 在实践中却会经常碰到这样的情况, 需要传输的数据不连续或数据量不确定, 但可靠性却要求很高. 例如这个项目: 一银行终端管理软件, 网内终端数量最少时 2 台, 最多时可达 150 台, 传输的数据具
有实时性, 最少时只需传输几个字节 ( 例如: 远程关机、 重启等简单指令 ) , 最多可达几 KB ( 例如: 远程设置
终端属性 ), 要求数据在传输过程中安全可靠. 在该系统中到底该采用哪种协议作为传输层协议呢? 采用
TCP 协议则会因为开辟的侦听线程过多而直接导致服务器的效率下降, 特别是该系统中的终端机根本就
没有多余的资源可以浪费; 如果采用 UDP协议, 虽然可以解决资源浪费问题, 但该协议是一种不可靠的没有差错处理的协议, 而该系统必须保证数据传输过程中的安全可靠. 因此针对这种情况应该放弃采用 TCP协议作为传输层协议的方案, 而是采用 UDP协议作为传输协议通过增加差错处理、 拥塞控制等措施来提高数据传输的安全性与可靠性.
以上文字摘自--周锦才的可靠 UDP 协议的设计思路与实现方法论文。
对于UDP的可靠性传输已经研究了几天,今天实现了大文件的可靠性传输的初步,在接下来的几天里,会把它慢慢实现。
好的,下面入正题。
我们要先定义可靠性UDP的数据报,这相当于一种协议,只不过是由我们自己定义的。
先说说整体思路:
对于大文件的UDP传输,在发送端,首先要发送一个开始发送数据包,在接受端接受到这个开始发送数据包以后,要发送一个开始发送确认数据包,当发送端在一定时间内(这个时间根据网络情况自己调整)收到了确认数据包以后,开始将一个大文件分成若干个组,每个组包含n个数据包,每个数据包长m。然后根据上面发送开始发送数据包相似的原理,进行发送(这一部分很复杂,具体实现我也还在研究,在后文中会详细解析,敬请关注)。
当发送端发送完到最后一个数据包时,向接收端发送一个发送完成包,在收到接收端发来的反馈后,结束发送。
在以下代码中,实现了开始数据包的收发实现。
发送端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Random;
import javax.xml.crypto.Data;
public class UdpSend {
private int myPort;// 我方端口
private int otherPort;// 对方端口
private String otherIP;// 对方IP
private DatagramSocket dataSocket;
private final int GROUP_DATA = 256;// 一个组拥有的数据包个数
private final int DATA_LEN = 1024;