Many attempts at VoIP were tried – stream initiation, TINS, etc. None of them worked very well.
Google launched their XMPP network with voice support, then joined the standards effort to define Jingle.
Covered by several XMPP extensions: XEP-166: Jingle XEP-167: Jingle Audio via RTP XEP-176: Jingle ICE Transport XEP-177: Jingle Raw UDP Transport XEP-180: Jingle Video via RTP XEP-181: Jingle DTMF XEP-183: Jingle Telepathy Transport Method XEP-208: Bootstrapping Implementation of Jingle XEP-215: STUN Server Discovery for Jingle
Acronym soup: ICE, STUN, TURN
Jingle in three easy steps
Do you want a session? Session Negotiation
What kind of session do you want to negotiate? (voice, video, file transfer?) Content Negotiation
How are we going to make this session work? (direct connect, ICE, media proxy?) Transport Negotiation
Pro: always works (we’re using the server to send XMPP packets already)
Con: overloads the server, may be too slow for real-time protocols like voice/video. (~2000 concurrent users max)
Try to go peer to peer
Pro: scales forever. Best way to build a worldwide network.
Con: gets really complicated with firewalls and NATs.
Making peer to peer work
Step 1: try direct connect between IP addresses. (typically only works inside a local network)
Step 2: if #1 fails, the parties are probably behind a firewall or NAT. Do some “crazy stuff” to punch through. (can work up to 90% of the time)
Step 3: if #2 fails, there’s a pretty strict firewall in place so failover to using the server (media relay) (catch the other 10% or so)
The sum of these techniques is ICE, at the cutting edge of VoIP connectivity
Jingle connection architecture
What is NAT?
Problem: the internet was running out of IPv4 addresses Whoops. In the same category as the fake Bill Gates quote: ”640K ought to be enough for anybody”
Solution: group a bunch of computers behind a single IP address using Network Address Translation You don’t know your public IP when behind a NAT. The NAT device dynamically assigns ports to internal hosts to keep all the network traffic going to the right places
Better Solution: IPv6 – bigger addresses (not being adopted worldwide anytime soon) 340,282,366,920,938,463,463,374,607,431,768,211,456 addresses, or enough to give multiple IP addresses to every grain of sand on the planet. Could run into problems when humans conquer multiple galaxies?
“ Crazy stuff”: punching through NATs
Step 1: use a STUN server to find your public IP address
Me: Hey STUN server, I don’t know my IP Address. Can you help? NUTS (the STUN server): Looking at the packet you sent me, I see that the IP address of your NAT device is AAA.BBB.CCC.DDD Me: Sweet!
Step 2: figure out more stuff using the STUN server
Me: Ok, now I want to check to see what my NAT device does with ports. Does the public port change when I connect to different IP addresses? NUTS: Well, good question. I have another IP address you can connect to in order to try that. Me: Awesome, I tried that out and now I know more about my NAT device. Based on my local addresses, what you told me, plus what the other guy told me, I now have have a bunch of address/port options I can try with the other party. NUTS: No problem, glad to help! Buh-bye.
Step 3: connectivity checking to try to create a hole
Me: Can you hear me on this IP/port? You: … [Silence] Me: Hmm, the last one didn’t work. How about this one? You: … [Silence] Me: This is taking awhile… arg! How about this one? You: I hear you, I hear you! Yay, we found a hole.
(Punching holes works better with UDP vs. TCP)
Jingle Client Libraries
libjingle from Google -- http://code.google.com/apis/talk/libjingle/index.html
Telepathy -- http://telepathy.freedesktop.org
Smack – http://www.igniterealtime.org
Jingle server support
Openfire: an Open Source XMPP server with enhancements for Jingle.
Built-in media relay
Without it, P2P calls won’t always complete
Built-in STUN server
Without it, you’ll have to use public STUN servers
Jingle: not just for voice
Anything else that uses a lot of bandwidth or that does streaming
Jingle: what’s missing
Haven’t defined a way to do VoIP conferencing
Advanced call controls are missing (hold, transfer, etc). There’s a general consensus that this stuff shouldn’t be added to Jingle. Leave it to SIP.
Other Jingle content types (besides audio) are either not defined or immature
Current Jingle status
Standards work on the fundamentals and audio content profile is wrapping up.
Waiting for Google to switch to official Jingle protocol.
Need interop work between different implementations.
Jingle is poised to fulfill its promise as an open standard for a federated, world-wide VoIP network.
Contact me via IM or email:
Secure Communications with Jabber Peter Saint-Andre Time: 11:35AM - 12:20PM Location: D137-138