1. 模式有client/server mode(客户端,服务器端模式) and the rendezvous mode(会合模式,可同时向对方发送请求)
2. client发送的握手信息,信息有:
1) UDT version: udt版本,主要用作兼容性处理
2) Socket Type: STREAM (0) or DGRAM (1).
3) Initial Sequence Number: 第一包的序号,是个随机值
4) Packet Size: the maximum size of a data packet (including all
headers). This is usually the value of MTU.
5) Maximum Flow Window Size
6) Connection Type. This information is used to differential the
connection setup modes and request/response.
7) Socket ID. The client UDT socket ID.
8) Cookie. This is a cookie value used to avoid SYN flooding attack
[RFC4987].
9) Peer IP address: B's IP address.
//initial handshake for connect protected void sendInitialHandShake()throws IOException{ ConnectionHandshake handshake = new ConnectionHandshake(); handshake.setConnectionType(ConnectionHandshake.CONNECTION_TYPE_REGULAR); handshake.setSocketType(ConnectionHandshake.SOCKET_TYPE_DGRAM); long initialSequenceNo=SequenceNumber.random(); setInitialSequenceNumber(initialSequenceNo); handshake.setInitialSeqNo(initialSequenceNo); handshake.setPacketSize(getDatagramSize()); handshake.setSocketID(mySocketID); handshake.setMaxFlowWndSize(flowWindowSize); handshake.setSession(this); handshake.setAddress(endPoint.getLocalAddress()); logger.info("Sending "+handshake); // 没有设置destinationID endPoint.doSend(handshake); }
client的状态之后设置位handshaking
3. server端对握手信息的处理
接收到握手信息后,产生cookie返回,client端需要返回相同的cookie到server
/* * response after the initial connection handshake received: * compute cookie */ protected void ackInitialHandshake(ConnectionHandshake handshake)throws IOException{ ConnectionHandshake responseHandshake = new ConnectionHandshake(); //compare the packet size and choose minimun long clientBufferSize=handshake.getPacketSize(); long myBufferSize=getDatagramSize(); long bufferSize=Math.min(clientBufferSize, myBufferSize); long initialSequenceNumber=handshake.getInitialSeqNo(); setInitialSequenceNumber(initialSequenceNumber); setDatagramSize((int)bufferSize); responseHandshake.setPacketSize(bufferSize); responseHandshake.setUdtVersion(4); responseHandshake.setInitialSeqNo(initialSequenceNumber); responseHandshake.setConnectionType(-1); responseHandshake.setMaxFlowWndSize(handshake.getMaxFlowWndSize()); //tell peer what the socket ID on this side is responseHandshake.setSocketID(mySocketID); responseHandshake.setDestinationID(this.getDestination().getSocketID()); responseHandshake.setSession(this); // 产生cookie sessionCookie=SequenceNumber.random(); responseHandshake.setCookie(sessionCookie); responseHandshake.setAddress(endPoint.getLocalAddress()); logger.info("Sending reply "+responseHandshake); endPoint.doSend(responseHandshake); }
server端的状态为n_handshake=1(第一次握手)
4. client端收到server端的返回
// 第一次握手的响应 if (getState()==handshaking) { logger.info("Received initial handshake response from "+peer+"\n"+hs); if(hs.getConnectionType()==ConnectionHandshake.CONNECTION_SERVER_ACK){ try{ //TODO validate parameters sent by peer long peerSocketID=hs.getSocketID(); sessionCookie=hs.getCookie(); destination.setSocketID(peerSocketID); setState(handshaking+1); }catch(Exception ex){ logger.log(Level.WARNING,"Error creating socket",ex); setState(invalid); } return; } else{ logger.info("Unexpected type of handshake packet received"); setState(invalid); } }
client的状态设置为handshaking+1
同时发送二次握手信息
//2nd handshake for connect protected void sendSecondHandshake()throws IOException{ ConnectionHandshake handshake = new ConnectionHandshake(); handshake.setConnectionType(ConnectionHandshake.CONNECTION_TYPE_REGULAR); handshake.setSocketType(ConnectionHandshake.SOCKET_TYPE_DGRAM); handshake.setInitialSeqNo(initialSequenceNo); handshake.setPacketSize(getDatagramSize()); handshake.setSocketID(mySocketID); handshake.setMaxFlowWndSize(flowWindowSize); handshake.setSession(this); handshake.setCookie(sessionCookie); handshake.setAddress(endPoint.getLocalAddress()); handshake.setDestinationID(getDestination().getSocketID()); logger.info("Sending confirmation "+handshake); endPoint.doSend(handshake); }
5. server端接收到client的二次握手
protected void sendFinalHandShake(ConnectionHandshake handshake)throws IOException{ if(finalConnectionHandshake==null){ finalConnectionHandshake= new ConnectionHandshake(); //compare the packet size and choose minimun long clientBufferSize=handshake.getPacketSize(); long myBufferSize=getDatagramSize(); long bufferSize=Math.min(clientBufferSize, myBufferSize); long initialSequenceNumber=handshake.getInitialSeqNo(); setInitialSequenceNumber(initialSequenceNumber); setDatagramSize((int)bufferSize); finalConnectionHandshake.setPacketSize(bufferSize); finalConnectionHandshake.setUdtVersion(4); finalConnectionHandshake.setInitialSeqNo(initialSequenceNumber); finalConnectionHandshake.setConnectionType(-1); finalConnectionHandshake.setMaxFlowWndSize(handshake.getMaxFlowWndSize()); //tell peer what the socket ID on this side is finalConnectionHandshake.setSocketID(mySocketID); finalConnectionHandshake.setDestinationID(this.getDestination().getSocketID()); finalConnectionHandshake.setSession(this); finalConnectionHandshake.setCookie(sessionCookie); finalConnectionHandshake.setAddress(endPoint.getLocalAddress()); } logger.info("Sending final handshake ack "+finalConnectionHandshake); endPoint.doSend(finalConnectionHandshake); }
server端的状态位ready,链接建立完毕
6. client端收到二次握手的确认
if(getState()==handshaking+1){ // 第二次握手的响应 try{ logger.info("Received confirmation handshake response from "+peer+"\n"+hs); //TODO validate parameters sent by peer setState(ready); socket=new UDTSocket(endPoint,this); }catch(Exception ex){ logger.log(Level.WARNING,"Error creating socket",ex); setState(invalid); }
client端状态为ready, 链接建立完毕
7. 关闭,接收到Shutdown包,直接设置状态为关闭
8. 一些类的梳理:
(1)一个链接,可以理解为一个session
client端对应一个ClientSession
server端对应一个ServerSession
(2) Server对应UDTServerSocket,Client对应UDTClient
(3) 底层的udp的传输和多个Session的维护使用UDPEndPoint
(4) 每个session的数据操作实际对应一个UDTSocket和CongestionControl
(5)每个UDTSocket对应一个UDTReceiver和UDTSender,对应一个UDTInputStream和UDTOutputStream
(6)CongestionControl用于拥塞控制
相关推荐
UDT(UDP-based Data Transfer Protocol)是一个用于高速数据传输的协议,它基于用户数据报协议(UDP)。UDT旨在提供类似TCP的可靠性和拥塞控制,但同时保持UDP的低延迟和高吞吐量特性,这使得UDT特别适合于大数据...
UDT(User Datagram Transport)是基于用户数据报协议(UDP)的一种传输层协议,它旨在提供比标准UDP更可靠的服务,同时保持其低延迟和无连接的特性。UDT for Delphi 是一个专为 Delphi 开发者设计的库,用于在 ...
UDT(UDP-based Data Transport)是一种高效、可靠的数据传输协议,尤其适用于实时音视频传输、大数据量的网络传输等场景。UDT SDK 4.1是针对Linux平台的一个开发工具包,它允许开发者在Linux系统上集成UDT功能,以...
它基于 UDP(用户数据报协议),但提供了类似 TCP 的可靠性和拥塞控制机制,适用于科学计算、视频流媒体、在线游戏等领域。 2. **服务端与客户端通讯**: 源码中包含了服务端和客户端的实现,这是任何网络应用程序的...
基于的手势识别系统可控制灯的亮_3
untitled2.zip
S7-1500和分布式外围系统ET200MP模块数据
anaconda配置pytorch环境
高校教室管理系统,主要的模块包括查看首页、个人中心、教师管理、学生管理、教室信息管理、教师申请管理、学生申请管理、课时表管理、教师取消预约管理、学生取消预约管理等功能。
半挂汽车列车横向稳定性控制研究:基于模糊PID与制动力矩分配的联合仿真分析在典型工况下的表现,半挂汽车列车在典型工况下的横向稳定性控制研究:基于模糊PID与制动力矩分配的联合仿真分析,半挂汽车列车4自由度6轴整车model,横向稳定性控制,在低附着系数路面,进行典型3个工况,角阶跃,双移线,方向盘转角。 采用算法:模糊PID,制动力矩分配,最优滑移率滑膜控制。 以上基于trucksim和simulink联合仿真,有对应 p-a-p-e-r参考 ,关键词: 1. 半挂汽车列车 2. 4自由度6轴整车model 3. 横向稳定性控制 4. 低附着系数路面 5. 典型工况(角阶跃、双移线、方向盘转角) 6. 模糊PID算法 7. 制动力矩分配 8. 最优滑移率滑膜控制 9. Trucksim和Simulink联合仿真 10. P-A-P-E-R参考; 用分号隔开上述关键词为:半挂汽车列车; 4自由度6轴整车model; 横向稳定性控制; 低附着系数路面; 典型工况; 模糊PID算法; 制动力矩分配; 最优滑移率滑膜控制; Trucksim和Simulink联合仿真; P-A-P-E-R参考
路径规划人工势场法及其改进算法Matlab代码实现,路径规划人工势场法及其改进算法Matlab代码实现,路径规划人工势场法以及改进人工势场法matlab代码,包含了 ,路径规划; 人工势场法; 改进人工势场法; MATLAB代码; 分隔词“;”。,基于Matlab的改进人工势场法路径规划算法研究
本文介绍了范德堡大学深脑刺激器(DBS)项目,该项目旨在开发和临床评估一个系统,以辅助从规划到编程的整个过程。DBS是一种高频刺激治疗,用于治疗运动障碍,如帕金森病。由于目标区域在现有成像技术中可见性差,因此DBS电极的植入和编程过程复杂且耗时。项目涉及使用计算机辅助手术技术,以及一个定制的微定位平台(StarFix),该平台允许在术前进行图像采集和目标规划,提高了手术的精确性和效率。此外,文章还讨论了系统架构和各个模块的功能,以及如何通过中央数据库和网络接口实现信息共享。
三菱FX3U步进电机FB块的应用:模块化程序实现电机换算,提高稳定性和移植性,三菱FX3U步进电机换算FB块:模块化编程实现电机控制的高效性与稳定性提升,三菱FX3U 步进电机算FB块 FB块的使用可以使程序模块化简单化,进而提高了程序的稳定性和可移植性。 此例中使用FB块,可以实现步进电机的算,已知距离求得脉冲数,已知速度可以求得频率。 程序中包含有FB和ST内容;移植方便,在其他程序中可以直接添加已写好的FB块。 ,三菱FX3U;步进电机换算;FB块;程序模块化;稳定性;可移植性;距离与脉冲数换算;速度与频率换算;FB和ST内容;移植方便。,三菱FX3U步进电机换算FB块:程序模块化与高稳定性实现
光伏逆变器TMS320F28335设计方案:Boost升压与单相全桥逆变,PWM与SPWM控制,MPPT恒压跟踪法实现,基于TMS320F28335DSP的光伏逆变器设计方案:Boost升压与单相全桥逆变电路实现及MPPT技术解析,光伏逆变器设计方案TMS320F28335-176资料 PCB 原理图 源代码 1. 本设计DC-DC采用Boost升压,DCAC采用单相全桥逆变电路结构。 2. 以TI公司的浮点数字信号控制器TMS320F28335DSP为控制电路核心,采用规则采样法和DSP片内ePWM模块功能实现PWM和SPWM波。 3. PV最大功率点跟踪(MPPT)采用了恒压跟踪法(CVT法)来实现,并用软件锁相环进行系统的同频、同相控制,控制灵活简单。 4.资料包含: 原理图,PCB(Protel或者AD打开),源程序代码(CCS打开),BOM清单,参考资料 ,核心关键词:TMS320F28335-176; 光伏逆变器; 升压; 逆变电路; 数字信号控制器; 规则采样法; ePWM模块; PWM; SPWM波; MPPT; 恒压跟踪法; 原理图; PCB; 源程序代码; BOM
centos9内核安装包
昆仑通态触摸屏与两台台达VFD-M变频器通讯实现:频率设定、启停控制与状态指示功能接线及设置说明,昆仑通态TPC7062KD触摸屏与两台台达VFD-M变频器通讯程序:实现频率设定、启停控制与状态指示,昆仑通态MCGS与2台台达VFD-M变频器通讯程序实现昆仑通态触摸屏与2台台达VFD-M变频器通讯,程序稳定可靠 器件:昆仑通态TPC7062KD触摸屏,2台台达VFD-M变频器,附送接线说明和设置说明 功能:实现频率设定,启停控制,实际频率读取等,状态指示 ,昆仑通态MCGS; 台达VFD-M变频器; 通讯程序; 稳定可靠; 频率设定; 启停控制; 实际频率读取; 状态指示; 接线说明; 设置说明,昆仑通态MCGS与台达VFD-M变频器通讯程序:稳定可靠,双机控制全实现
研控步进电机驱动器方案验证通过,核心技术成熟可生产,咨询优惠价格!硬件原理图与PCB源代码全包括。,研控步进电机驱动器方案验证通过,核心技术掌握,生产准备,咨询实际价格,包含硬件原理图及PCB源代码。,研控步进电机驱动器方案 验证可用,可以生产,欢迎咨询实际价格,快速掌握核心技术。 包括硬件原理图 PCB源代码 ,研控步进电机驱动器方案; 验证可用; 可生产; 核心技术; 硬件原理图; PCB源代码,研控步进电机驱动器方案验证通过,现可生产供应,快速掌握核心技术,附硬件原理图及PCB源代码。
高质量的OPCClient_UA源码分享:基于C#的OPC客户端开发源码集(测试稳定、多行业应用实例、VS编辑器支持),高质量OPC客户端源码解析:OPCClient_UA C#开发,适用于VS2019及多行业现场应用源码分享,OPCClient_UA源码OPC客户端源码(c#开发) 另外有opcserver,opcclient的da,ua版本的见其他链接。 本项目为VS2019开发,可用VS其他版本的编辑器打开项目。 已应用到多个行业的几百个应用现场,长时间运行稳定,可靠。 本项目中提供测试OPCClient的软件开发源码,有详细的注释,二次开发清晰明了。 ,OPCClient_UA; OPC客户端源码; C#开发; VS2019项目; 稳定可靠; 详细注释; 二次开发,OPC客户端源码:稳定可靠的C#开发实现,含详细注释支持二次开发
毕业设计