FaceTime会话建立过程的技术猜测

Jobs在WWDC10上提到,FaceTime将会是一个开放标准,也就是说,不仅iPhone4-iPhone4可以通话,任何支持这一标准的应用都加与之通话。因此,值得我们观注一下。 FaceTime最吸引人的地方在于,居然不用预先维护联系人,而各种即时通信工具都需要你这样做,也不需要你登录某个服务器,直接拨电话号码就可以,真正是零配置,这对于普通用户来说,体验真是好极了。 那么FaceTime是怎么做到这一点的呢?由于手头并没有iPhone4,连能跑iOS4的机器都没有,只能根据Jobs在发布会上提到一堆术语来猜测了,有条件的朋友不妨抓个包,看看是不是这么回事。 已知会话使用SIP协议完成,这就好办了。想来应该是这样一个过程: app启动或检测到wifi网络连接变化 app从SIM卡里取得必要信息,用本机手机号@facetime.apple.com之类的URI注册到Apple家的SIP服务器上。 用户拨一个电话号码 app按照SIP规范拼装100 invite包,发给apple的服务器,from为本机手机号,to为被叫手机号 SIP服务器响应trying,并在内部查找 SIP服务器根据URI找到对应用户的当前记录 SIP服务器根据被叫方登记的地址和端口,将invite转给被叫手机 被叫手机上的app收到invite,开始振铃,并发180 ringing包给SIP服务器 SIP服务器将ringing包转给主叫方 主叫方手机开始显示对方正在振铃 被叫用户接受通话 被叫方app发200 OK包 SIP服务器将200 OK包转给主叫手机 现在双方都知道对方的地址和端口了,200 OK包的内容是一个SDP描述,用于协商如何建立数据流 主叫方发ACK包给被叫方,这个包就不再需要服务器中转了 双方app开始用RTP建立视音频流 双方app通过RTP接叫对方的h.264视频流,同时将本机摄像头的h.264码流封装成RTP包发出 如果成为开放标准,参与这会话过程的SIP服务器可以有多个,它们会接力转发invite/ringing/ok包,除了SIP协议包里会记录所有的中转步骤,对于主叫和被叫双方是透明的。 点对点直接通信都绕不开一个麻烦,就是NAT。通过NAT,多个内网ip可以用同一个公网ip向外发数据,如果要接收的数据使用同一个tcp链接,那么NAT网关都有办法处理,这就是为什么我们通过NAT上网并不会有什么不同。但是,如果外网用户要主动建立一个到内网用户的链接,麻烦就来了。由于WiFi用户一般都要经过NAT,这就更要妥善处理了。 为此,Apple引用了三个标准: STUN (Session Traversal Utilities for NAT) IETF标准,定义会话如何跨越多个不同类型的NAT TURN (Traversal Using Relay NAT) IETF标准,让NAT后面的客户端可以向公网服务器一样接收外部请求 ICE (Interactive Connectivity Establishment) IETF标准,简化穿透NAT防火墙建立连接