`
jimmee
  • 浏览: 539942 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

UDT协议-基于UDP的可靠数据传输协议的实现分析(6)-链接的建立和关闭

阅读更多

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的可靠数据传输协议---UDT实现源码

    UDT(Ultra Data Transfer)协议是一种专为大数据传输设计的高效、可靠的传输协议,它基于用户数据报协议(UDP)构建。在TCP/IP协议栈中,TCP提供了可靠的数据传输服务,但其高开销和低效率限制了在大规模数据传输...

    UDT协议-基于UDP的可靠数据传输协议.docx

    UDT(User Datagram Transport)协议是一种基于UDP(User Datagram Protocol)的可靠数据传输协议,设计目的是为了解决在高带宽延迟乘积(Bandwidth-Delay Product, BDP)环境中,传统的TCP协议效率低下的问题。...

    UDT协议-基于UDP的可靠数据传输协议.pdf

    UDT(User Datagram Transport)协议是一种基于用户数据报协议(UDP)的可靠数据传输协议,设计用于解决在高带宽时延乘积(BDP)网络环境下的传输效率和公平性问题。传统的TCP协议在BDP较大时表现不佳,因为其拥塞...

    UDT协议-基于UDP的可靠数据传输协议 (2).pdf

    UDT(User Datagram Transport)协议是一种基于UDP(User Datagram Protocol)的可靠数据传输协议,主要设计用于处理高带宽时延乘积(BDP)环境下的高效数据传输。在传统的TCP协议中,由于Additive Increase ...

    UDT协议-基于UDP的可靠数据传输协议 (2).docx

    UDT(User Datagram Transport)协议是一种基于用户数据报协议(UDP)的可靠数据传输协议,设计初衷是为了在高带宽时延乘积(BDP)的网络环境中提供高效、公平和稳定的传输服务,尤其适用于大数据量传输场景,如网格...

    UDT-基于UDP的可靠数据传输协议【中文版】

    另一个重要的应用场景是,允许网络研究人员、学生和应用程序开发人员在UDT框架下轻松地实现和部署新的数据传输算法和协议。此外,UDT也可用于更好地支持防火墙穿透。 UDT完全构建在UDP之上。但是,UDT是有连接的,...

    UDT --- 基于UDP的高速传输协议

    基于UDP的高速传输协议UDT,介绍UDT的来历,拥塞控制算法,开发使用方法等。

    udt UDT网络传输协议开源包,是基于UDP的可靠传输协议

    UDT(User Datagram Transport)是一种高性能的、基于UDP(User Datagram Protocol)的可靠传输协议,专为大数据量的网络传输而设计。它弥补了UDP在数据可靠性方面的不足,同时尽可能保持了UDP的低延迟和高吞吐量...

    udt-java 可靠UDP传输 源码

    UDT(UDP-based Data Transfer Protocol)是为了解决TCP在大数据传输时的效率问题而设计的一种用户数据报协议(UDP)上...同时,这个项目也是研究可靠UDP传输的一个很好的实例,有助于提升对网络协议和系统设计的理解。

    UDT协议基于UDP的可靠数据传输协议.pdf

    UDT(User Datagram Transport)协议是一种基于用户数据报协议(UDP)的可靠数据传输协议,设计目的是为了在高带宽时延乘积(BDP)的网络环境中提供高效、公平和稳定的传输服务。传统的TCP协议在面对高BDP时表现不佳...

    基于UDP的可靠传输(停等协议)

    通过这种方式,虽然基础是不可靠的UDP协议,但通过应用层的停等协议,我们可以实现可靠的数据传输,保证了数据的正确性和完整性,适用于对实时性要求较高但又需要基本可靠性的场景。在实际应用中,还可以考虑优化,...

    UDT协议UDP可靠数据传输协议.pdf

    UDT,全称为User Datagram Transport,是一种基于UDP(用户数据报协议)的可靠数据传输协议。UDP本身是一种无连接的、不可靠的传输协议,它不保证数据的顺序和完整性,也不进行拥塞控制。然而,UDT针对UDP的这些不足...

    UDT协议UDP可靠数据传输协议.docx

    UDT,全称为User Datagram Transport,是一种基于UDP(用户数据报协议)的可靠数据传输协议,设计用于在高带宽时延乘积(Bandwidth-Delay Product, BDP)环境中提供高效、公平和稳定的传输服务。传统的TCP协议在面对...

    udt 基于udp的可靠连接

    UDT(UDP-based Data Transfer Protocol)是一种用于高速数据传输的协议,它建立在用户数据报协议(UDP)之上,但提供了TCP(传输控制协议)类似的可靠性。UDT的设计目标是解决在大规模网络环境下,尤其是互联网上的...

    基于UDP的高速传输协议--UDT.zip

    UDT结合了UDP的低延迟和TCP的可靠性,通过引入一系列优化技术,实现了在不可靠的UDP基础上实现可靠的数据传输。 1. **UDT的可靠性机制** UDT采用了类似TCP的序列号和确认机制,确保数据包按序到达且无丢失。同时,...

    udt源码 udp可靠性传输

    UDT(UDP-based Data Transport)是一种专为大数据传输设计的开源传输协议,它构建于用户数据报协议(UDP)之上,旨在提供比TCP更高效、更可靠的传输服务。UDT结合了UDP的低延迟和高带宽利用率特性,并通过自定义的...

    基于UDP的高速传输协议UDT4 详解

    1. **基于UDP的基础**:UDT4利用了用户数据报协议(UDP)的无连接特性,避免了TCP的三次握手和四次挥手过程,从而减少了建立和关闭连接的时间,提高了数据传输的即时性。 2. **拥塞控制**:尽管UDP没有内置的拥塞...

    UDT-C,UDT库C语言版本

    UDT(UDP-based Data Transfer Protocol)是一个用于高速数据传输的协议,它基于用户数据报协议(UDP)。UDT旨在提供类似TCP的可靠性和拥塞控制,但同时保持UDP的低延迟和高吞吐量特性,这使得UDT特别适合于大数据...

    论文研究-基于UDP的高速网络传输协议研究.pdf

    分析了基于UDP的改进高速网络传输协议的基本原理, 详细阐述了近年来提出的一些典型的基于UDP改进传输协议的主要设计思想。通过建立端到端的高速网络试验床, 评价了RTT及丢包率对RUBDP、Tsunami、 UDT、PA-UDP四种...

Global site tag (gtag.js) - Google Analytics