RTP Real Time Protocol LTN ZOELLER Cédric MAJ CONSTANTIN Jean-Yves Centre de Recherche Opérationnelle et de Simulation de l’Armée de Terre
PLAN Présentation générale de RTP Présentation générale du projet Présentation détaillé de RTP Implémentation Ressources
Présentation générale de RTP
Présentation générale de RTP Real Time Transport Protocol Objectif: fourniture de bout en bout de services pour des données ayant des contraintes de temps réel Composition: Transport des données: RTP Contrôle de la session: RTCP
Place de RTP Application SAP/SDP RTP/RTCP TCP / UDP IP Niveau 2
Présentation générale du projet
Présentation générale du projet Acquisition RTP Multicast Stockage RTP Multicast Affichage RTP Multicast Affichage RTP Multicast
Présentation détaillé de RTP
Présentation détaillé de RTP RFC 1889 RTP Diffusion synchrone de flux temps réels Pas de contrôle de qualité de la communication RTCP Contrôle de qualité de la communication Partage bande passante
Présentation détaillé de RTP En-tête Fixe 12 Octets En-tête optionnelle Données
Présentation détaillée de RTP V: Version P: Padding X: Extension CC: Nombre de CSRC M: Marker PT: Payload type Sequence Number Timestamp SSRC: Identifiant source synchronisation CSRC: Identifiants des sources
Entête RTP 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P|X| CC |M| PT | sequence number | | timestamp | | synchronization source (SSRC) identifier | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ | contributing source (CSRC) identifiers | | .... | + extensions + + +
RTCP Feedback qualité distribution Identification Nombre de participant Autres informations
Présentation détaillée de RTCP Rapport d’émission Rapport de réception SDES Bye Application
Présentation détaillée de RTCP V: Version P: Padding RC: Report Count PT: Packet type Length NTP Timestamp RTP Timestamp Sender Packet Count Sender Octet Count SSRC Fraction lost Cumulative number packets lost
RTCP / Sender Report . 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P| RC | PT=SR=200 | length | header | SSRC of sender | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ | NTP timestamp, most significant word | sender +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ info | NTP timestamp, least significant word | | RTP timestamp | | sender's packet count | | sender's octet count | | | report |...............................................................|
RTCP / Sender Report .. |...............................................................| | | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ | SSRC_1 (SSRC of first source) | report +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ block | fraction lost | cumulative number of packets lost | 1 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | extended highest sequence number received | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | interarrival jitter | | last SR (LSR) | | delay since last SR (DLSR) | | SSRC_2 (SSRC of second source) | report : ... : 2 | profile-specific extensions |
RTCP / Receiver Report 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P| RC | PT=RR=201 | length | header | SSRC of packet sender | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ | SSRC_1 (SSRC of first source) | report +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ block | fraction lost | cumulative number of packets lost | 1 | extended highest sequence number received | | interarrival jitter | | last SR (LSR) | | delay since last SR (DLSR) | | SSRC_2 (SSRC of second source) | report : ... : 2 | profile-specific extensions |
RTCP / SDES 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P| SC | PT=SDES=202 | length | header +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ | SSRC/CSRC_1 | chunk +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1 | SDES items | | ... | | SSRC/CSRC_2 | chunk +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 2
RTCP / Bye 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P| SC | PT=BYE=203 | length | | SSRC/CSRC | : ... : +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ | length | reason for leaving ... (opt)
DEMO Capture Ethereal depuis JMF
Translators Envoie les flux de différentes sources séparément Transmet les paquets avec leurs identifiant SSRC intact. Peut changer le codage des données. Il assigne alors de nouveaux numéros de séquences aux paquets Un destinataire ne peut détecter la présence d’un Translator à moins de se procurer les caractéristiques de la source
Mixers Combine les flux de différentes sources pour former un nouveau flux Il devient source de synchronisation: Tous les paquets RTP émis sont marqués avec l’identificateur SSRC du mixer. Pour préserver l’identité des sources principales il inclut la liste des différents identificateur SSRC derrière le header RTP (liste CSRC). CSRC : Contributing source Identifiers
Exemple Réseau RTP M1:48(1,17) E4:47 M1:48(1,17) M3:89(64,45)
Implémentation
Implémentations Classe RTP de bas niveau RTP selon SUN: API JMF
RTP bas niveau
RTP bas niveau public class MulticastSocketRTP_RTCP extends MulticastSocket { private byte buf[]; private DatagramPacket packet; private RTPPacket2 rtp_packet; private RTCPPacket2 rtcp_packet; private int type; public MulticastSocketRTP_RTCP(String adresse,int port,int t) throws IOException { super(port); type = t; buf = new byte[1500]; InetAddress multicastadresse = InetAddress.getByName(adresse); packet = new DatagramPacket(buf,buf.length); joinGroup(multicastadresse); }
RTP bas niveau public void printOutHeader() { try{ receive(packet); System.out.println("Header "+getType()); switch (type) case 0: rtp_packet = new RTPPacket2(packet.getData(),packet.getLength() ); System.out.print("|V :"+rtp_packet.getVersion() ); System.out.print("|P :"+rtp_packet.getPadding() ); System.out.print("|X :"+rtp_packet.getExtension() ); System.out.print("|CC :"+rtp_packet.getCC() ); System.out.print("|M :"+rtp_packet.getMarker() ); System.out.println("|PT :"+rtp_packet.getPayloadType() ); System.out.print("|Sequence Number :"+rtp_packet.getSequenceNumber() ); System.out.print("|TimeStamp :"+rtp_packet.getTimeStamp() ); System.out.print("|SSRC :"+rtp_packet.getSsrc() ); System.out.println(""); break;
RTP bas niveau public class RTPPacket2{ //Taille de l'en-tête RTP: static int HEADER_SIZE = 12; //Champ de l'en-tête private int Version; private int Padding; private int Extension; private int CC; private int Marker; private int PayloadType; private int SequenceNumber; private int TimeStamp; private int Ssrc; public byte[] header; //Taille de la charge utile (payload) public int payload_size; //Data de la charge utile public byte[] payload;
RTP bas niveau if (packet_size >= HEADER_SIZE) { //Récupération de l'en-tête header = new byte[HEADER_SIZE]; for (int i=0; i < HEADER_SIZE; i++) header[i] = packet[i]; //Récupération des data de la charge utils payload_size = packet_size - HEADER_SIZE; payload = new byte[payload_size]; for (int i=HEADER_SIZE; i < packet_size; i++) payload[i-HEADER_SIZE] = packet[i]; //Récupération des valeurs des champs de l'en-tête Marker = header[1] & 128; if (Marker != 0) Marker=1; CC = header[0] & 64; Extension = header[0] & 16; if (Extension !=0) Extension = 1; Padding = header[0] & 32; if (Padding !=0) Padding = 1;
RTP bas niveau DEMO
RTP selon SUN RTPManager Manager de connections RTP RTPControl Player Classe contenant le type de flux RTP (JPEG/MPEG…) Player Classe où l’on joue les flux RTP RTPConnector Classe permettant de s’adapter à différentes couches (réseau/transport différents TCP/UDP//IP) + de détails sur le site sun
RTP selon SUN
RTP selon SUN public class reception_rtp implements ReceiveStreamListener, SessionListener, ControllerListener { String sessions[] = null; RTPManager mgrs[] = null; Vector playerWindows = null; boolean dataReceived = false; Object dataSync = new Object(); public reception_rtp(String sessions[]) { //CONSTRUCTEUR this.sessions = sessions; //224.123.111.101/22222 224.123.111.102/22224 } protected boolean initialize() { try { InetAddress ipAddr; SessionAddress localAddr = new SessionAddress(); SessionAddress destAddr; mgrs = new RTPManager[sessions.length]; //un MANAGER RTP par session playerWindows = new Vector();
RTP selon SUN mgrs[i] = (RTPManager) RTPManager.newInstance(); mgrs[i].addSessionListener(this); mgrs[i].addReceiveStreamListener(this); ipAddr = InetAddress.getByName(session.addr); if( ipAddr.isMulticastAddress()) { // adresse locale et distante identique localAddr= new SessionAddress( ipAddr, session.port, session.ttl); destAddr = new SessionAddress( ipAddr, } else { localAddr= new SessionAddress( InetAddress.getLocalHost(), session.port); destAddr = new SessionAddress( ipAddr, session.port); } mgrs[i].initialize( localAddr); mgrs[i].addTarget(destAddr);
RTP selon SUN if (evt instanceof NewReceiveStreamEvent) { try { stream = ((NewReceiveStreamEvent)evt).getReceiveStream(); DataSource ds = stream.getDataSource(); // Trouve le format reçu RTPControl ctl = (RTPControl)ds.getControl("javax.media.rtp.RTPControl"); if (participant == null) System.err.println(" L'emmetteur du stream est déjà identifié."); else { System.err.println(" Le stream vient de: " + participant.getCNAME()); } // creation d'un player en passant DataSource (ds) au constructeur Player p = javax.media.Manager.createPlayer(ds); if (p == null) return; p.addControllerListener(this); p.realize(); PlayerWindow pw = new PlayerWindow(p, stream); playerWindows.addElement(pw);
Ressources
Ressources RFC http://rfc.net/rfc1889.html RFC en « français » JAVA http://java.sun.com/products/java-media/jmf/ C Exemples de code dans la RFC