Difference between revisions of "Private:psim"

From NMSL
Line 97: Line 97:
 
   1. At the beginning, we should have a peer publish a video (or a trace file).
 
   1. At the beginning, we should have a peer publish a video (or a trace file).
 
   2. The join() and leave() methods in the Group class may be moved to the Peer class and each peer
 
   2. The join() and leave() methods in the Group class may be moved to the Peer class and each peer
     should has a IP address, bitmap field and a listen() method.
+
     should has a bitmap field.
 
   3. We may add a Tracker class:
 
   3. We may add a Tracker class:
 
     Class Tracker
 
     Class Tracker
 
     {  
 
     {  
 
       URL url; //peers use this url to find the tracker
 
       URL url; //peers use this url to find the tracker
       Vector<Peer> peers; //maintain a peer list to be quired by peers
+
       Vector<Peer> peers;         //maintain a peer list to be quired by peers
 
       Vector<InetAddress> SelectPeers();  //when a peer joins a group at the first time, it quires other peers from the
 
       Vector<InetAddress> SelectPeers();  //when a peer joins a group at the first time, it quires other peers from the
                                          //tracker,  then the tracker invokes SelectPeers() and returns
+
                                                                  //tracker,  then the tracker invokes SelectPeers() and returns
                                          //a list of neighbors to that peer
+
                                                                //a list of neighbors to that peer
 
       void recordPeer(); //record information of a peer when it first connects the tracker or update it when some old
 
       void recordPeer(); //record information of a peer when it first connects the tracker or update it when some old
                          //information is already stored
+
                                    //information is already stored
      //the information exchanged between a tracker and a peer may be <peerID, videoName, ipAddress, port>
+
                                  //the information exchanged between a tracker and a peer may be <peerID, videoName>
 +
                                  // or <peerID, videoName, ip_Address, port> if we want to do simulation on different machines
 
     }  
 
     }  
 
   4. If we really want to send video files between peers, we may need a Storage class to operate with files
 
   4. If we really want to send video files between peers, we may need a Storage class to operate with files

Revision as of 15:22, 5 March 2009

This page documents the development of a discrete event simulator for P2P video streaming applications. This simulator captures important features of data-driven video streaming systems. In particular, it is designed to evaluate: (i) the performance of various segment scheduling algorithms; (ii) the potential of network coding in multi-layer P2P video streaming systems.

Class Diagrams

  • use long for time/offset in msec, which has a rollover time 24.85 days

class Frame { // video frame, a layer of it, read from trace file
    int no; // serial number
    int layer; // layer number it belongs to, set to zero for nonscalable frame
    long deadlineOffset; // deadline offset compared to the start of the video, in msec
    int size; // frame size in bytes
}

class Segment { // packetized frames
    int no; // serial number
    Vector<Frame> frames; // reference to included frame
    int totalSize; // aggregate size in bytes
}

class Video { // a media file, shared by a group of peers
    String filename; // video trace file path and name
    Hashtable<int, Frame> frameTrace; // frames read from the trace file
    Hashtable<int, Segment> segmentTrace; // segments generated by the prepareSegments(...)
    void prepareSegments(int noFrame); // packetize frames into segment, 
        // noFrame indicates how many frames should we put in one segment; 
        // we might implement other packtization schemes later.
}

class Neighbor { // keep track of what my neighbor has done
    Peer peer; // peer instance, for accessing availability info
    int estimateRate; // estimated rate (maybe historical)
}

class Peer { // represent a running peer
    int ingressBW; // incoming bandwidth in bps
    int egressBW; // outgoing bandwidth in bps
    BitSet avail; // availability bufmap
    Vector<Neighbor> neighbors; // peers that we may send requests to 
}

class Group { // peers that have downloaded or want to download a Video
    Video video; // media shared among peers
    Vector<Peer> peers; // peers in this group
    void join(Peer peer); // adding a new peer into this group
    void leave(Peer peer); // removing a peer from this group
}

class Connection { // end to end network link between two peers
    Peer peer1; // one end
    Peer peer2; // the other
    long delay; // transmission delay in msec
    int e2eBW; // end-to-end bandwidth in bps
}

// XXX TODO XXX

class SimException {

}

Interface EventHandler {
    void handle() throws SimException; // callback function
}

class Event {
    long time; // when this event happens
    Peer src; // which peer generates this event
    Peer dst; // whom is destinate of this event 
    Vector<EventHandler> handlers; //process an event and update states accordingly
    int type; // enum, see below
    // 1. connect: peer 1 makes a connection to peer 2, and add each other into neighbors
    // 2. requestSent: a receiver sends a high-priority request message to a sender
    // 3. requestArrived: a request message gets to a sender
    // 4. dataSent: a sender sends a data segment
    // 5. dataArrived: a data segment arrives to a receiver

    void addHandler(Interface EventHandler); // add an additional event handler
    void rmvHandler(Interface EventHandler); // remove an additional event handler
}

class EventQueue {
    SortedMap<Long, Event> queue; // events sorted on its time
    void dispatch(Event event); // sequentially invoke even handlers 
}

class Simulator {
    long simTime; // elapsed simulation time in msec
    EventQueue events; // pending events that will be processed
    void dispatchEvent(); // forever loop to process the next event
}



Some comments:
  1. At the beginning, we should have a peer publish a video (or a trace file).
  2. The join() and leave() methods in the Group class may be moved to the Peer class and each peer
    should has a bitmap field.
  3. We may add a Tracker class:
    Class Tracker
    { 
      URL url; //peers use this url to find the tracker
      Vector<Peer> peers;         //maintain a peer list to be quired by peers
      Vector<InetAddress> SelectPeers();  //when a peer joins a group at the first time, it quires other peers from the
                                                                  //tracker,  then the tracker invokes SelectPeers() and returns
                                                                 //a list of neighbors to that peer
      void recordPeer(); //record information of a peer when it first connects the tracker or update it when some old
                                    //information is already stored
                                   //the information exchanged between a tracker and a peer may be <peerID, videoName>
                                   // or <peerID, videoName, ip_Address, port> if we want to do simulation on different machines
    } 
  4. If we really want to send video files between peers, we may need a Storage class to operate with files
  5. We may design a superclass of all peers, trackers, and neighbors, as a typical networking server to deal with
      network connections.