« October 2004 | Main | February 2005 »
January 30, 2005
Skype的主要功能-Skype通讯协议分析(3)
Skype的功能主要可以分为:初始化,登录,用户搜索,呼叫建立与终止,媒体传输和状态消息。
1、初始化
第一次安装后,Skype会发送一段HTTP 1.1的请求给中央服务器,包括关键字"installed"以及所装Skype的版本号。以后的每次登录Skype都会向中央服务器发送一小段包含关键字"getlatestversion"的HTTP 1.1请求,检查是否有新版本的Skype。
2、登录
登录可能是Skype最重要的功能。在这个过程中,Skype终端到登录服务器上验证用户名密码,广播他在上线给好友及其它的点,检查NAT和防火墙的类型,发现拥有公网IP地址的在线Skype节点,这些新发现的节被用于在所在Super Node无法使用后继续保持本机与Skype网络的连接。
登录的过程我们前面已经讲过,先用UDP连,然后是TCP,然后TCP到80,然后TCP到443,行的话就连上了,不行的话就显示无法登录。连接的对象是保存在本机中Host Cache中的。
登录服务器的IP是80.160.91.11,nslookup记录显示它的域名是:ns14.inet.tele.dk和ns15.inet.tele.dk,dk是丹麦的国家定级域名。
安装完第一次登录时,HC被初始化,里面包含7对IP与端口,而且基本总是这7个IP和端口,即使包含超过7对,这7对也在其中。当用户安装后第一次登录时,Skype通过其中的一对IP和端口建立TCP连接。
这7个IP-端口对,以及这些IP对应的主机名是:
IP address:port Reverse lookup result
66.235.180.9:33033 sls-cb10p6.dca2.superb.net
66.235.181.9:33033 ip9.181.susc.suscom.net
80.161.91.25:33033 0x50a15b19.boanxx15.adsl-dhcp.tele.dk
80.160.91.12:33033 0x50a15b0c.albnxx9.adsl-dhcp.tele.dk
64.246.49.60:33033 rs-64-246-49-60.ev1.net
64.246.49.61:33033 rs-64-246-49-61.ev1.net
64.246.48.23:33033 ns2.ev1.net
可以看到上述的主机分别属于4个ISP,其中Superb , Suscom, ev1.net是美国的ISP。
Posted by yudunde at 08:41 PM
Skype的主要组成部分-Skype通讯协议分析(2)
1、端口
在Skype的连接属性对话框中可以设置监听的端口号,在安装的时候Skype会随机的选择一个端口作为监听的端口,这一点与HTTP协议等不同,Skype没有默认的服务端口。同时,它还会打开对80和443端口的监听。80是常见的HTTP服务默认端口,而443则是HTTPS服务的默认端口。
2、主机列表(HC,Host Cache)
这里的主机指的是可以提供踏板及广播服务的Super Node(SN)。通常它被存储在注册表里的:HKEY_CURRENT_USER / SOFTWARE / SKYPE / PHONE / LIB / CONNECTION / HOSTCACHE 中.一般情况下,运行两天后,HC中会有约200个机器地址及对应的端口号。
3、编解码器
要能语音通信,编解码器当然少不了。Global IP Sound在他的网站上专用明它为Skype提供点对点语音通讯软件:Global IP Sound provides voice processing software to Skype's peer-to-peer voice-communications software.Skype应该是使用了他们的编解码器实现的语音通讯。
4、好友列表
当你换了一台计算机的时候可能会发现Skype上的好友列表没了,不要奇怪,Skype的好友列表没有保存在服务器上,而是保存在本地的注册表中,当然,是加过密的。
5、加密
Skype使用AES加密标准。
6、NAT与防火墙
Skype应该是使用了STUN和TURN协议来检测所处的NAT及防火墙环境。Skype定期的刷新这些信息,这些信息也是存储在注册表中的。与另外一个点对点文件共享系统Kazza不同,普通客户端无法阻止自己成为Super Node(SN),就是说它随时可能被征用成为别人登录服务和广播服务的提供者,就是类似于BT中的种子提供者的角色。
参考资料:
1、《An Analysis of the Skype Peer-to-Peer Internet Telephony Protocol》.
Posted by yudunde at 01:51 PM | Comments (3)
Skype通讯协议分析(1)

通过分析得出的结论主要有三个:
1、Skype的通话质量较MSN和Yahoo的即时通信工具要好;
2、可以无缝的在NATs和防火墙后使用;
3、安装使用起来确实非常简单。

Skype与以往MSN等IM工具最大的不同在于基除了用户登录,其余工作基本不依赖中央服务器,Skype在穿透防火墙通讯时完全使用了Peer to Peer,而没用到中央服务器。上图中的小黑点是客户端,大黑点是超级节点(用于为其它客户端提供登录踏板及广播服务),灰色的点是Skype的登录服务器。
用户下载安装完Skype后,Skype客户端会发送一段HTTP 1.1的请求到中央服务器,告诉它我装完了一个什么样的版本:
GET /ui/0/97/en/installed HTTP/1.1
User-Agent: Skype™ Beta 0.97
Host: ui.skype.com
Cache-Control: no-cache
服务器会返回一个200 OK的信息:
HTTP/1.1 200 OK
Date: Tue, 20 Apr 2004 04:51:39 GMT
Server: Apache/2.0.47 (Debian GNU/Linux) PHP/4.3.5
mod_ssl/2.0.47 OpenSSL/0.9.7b
X-Powered-By: PHP/4.3.5
Cache-control: no-cache, must revalidate
Pragma: no-cache
Expires: 0
Content-Length: 0
Content-Type: text/html; charset=utf-8
Content-Language: en
客户端会进行登录初始化工作,这一步工作包含很多内容,针对三种不同类型的网络情况有三种不同的登录方式:
1、直接有公众网的IP
2、在内部网,可以通过TCP访问外部网络
3、在内部网,但只能通过有限的几个端口(例如80和443)访问外部网络
Skype在登录的时候会先使用UDP请求HC中的IP,如果不行,就用TCP请求HC中的IP及端口,如果还不行,就用TCP请求HC中的IP及80端口,如果又不行,就再请求HC中的IP及443端口。如果这时候还不行,那就登录不了了。整个过程中传输的数据量大概在8k-10k,持续的时间在3至35秒。
明天继续。
参考资料:
1、《An Analysis of the Skype Peer-to-Peer Internet Telephony Protocol》.
Posted by yudunde at 01:50 AM
January 29, 2005
新浪ViVi
晚上安科发了个网址过来,新浪也出书签类产品了。与博采和365key不同的是,Vivi不需要注册即可收藏,应该是使用cookie来记录未注册用户的收藏信息。当然也可以注册为用户,可能会使用到更多的功能。

Vivi的功能做的比较简单,用起来还算可以。只是不提供xml输出,不提供js输出,只有最基本的摘录功能,不知道是alpha测试中功能没全完成还是想先试试效果,或是根本就没这个打算。没有这两个输出的话,摘录就还是摘录,无法成为一个social network的组成部分,威力也小了许多。
Posted by yudunde at 11:01 PM | Comments (1) | TrackBack
awk学习笔记
awk是一种用于处理数据和生成报告的编程语言。
一般的使用格式是:
awk '{pattern + action}' {filenames}
pattern指在每一行中进行匹配的条件,action指针对符合条件的行进行的操作,filenames是输入的文件名。
假设data文件中有以下数据:
1 donald 305 20050129
2 chin 102 20040129
3 mark 304 20040229
下面对这个文件进行操作:
awk '{print $1, $2, $3, $4}' data
输出:
1 donald 305 20050129
2 chin 102 20040129
3 mark 304 20040229
awk '{print $1"\t", $2"\t", $3"\t", $4}' data
输出:
1 donald 305 20050129
2 chin 102 20040129
3 mark 304 20040229
这里显示的格式并不是输出的真实格式,真实格式是中间会有一个tab符号,格式对的很整齐,只不过在html里看不出来。
awk '/donald/ {print $4}' data匹配当data文件中包含字符串"donald"的行,输出第4列的值:
20050129
awk '/donald|chin/ {print $1, $2}' data这里的"|"应该是或的作用,而不是管道,输出:
1 donald
2 chin
awk '/a[rl]/ {print $1, $2}' data兼容perl的正则表达式,匹配包含"ar"或"al"的列,输出:
1 donald
3 mark
awk '/a[rl]/ {print $1, $2, $3+1}' data给第三列加上1再输出:
1 donald 306
3 mark 305
awk '/a[rl]/ {print $1, $2} {print $3+1}' data匹配只对第一对花括号产生作用,输出:
1 donald
306
103
3 mark
305
awk 'FS="n" {print $1}' data使用"n"而不是空格做为分隔符,输出:
1
2 chi
3 mark 304 20040229
awk 'FS="n" {OFS="-"} {print $1, $2}' data把分隔符输出:
1-donald
2 chi- 102 20040129
3 mark 304 20040229-
awk 'FS="n" {OFS="-"} {print NR, $1, $2}' data使用NR变量,num of row,即行号,输出:
1-1-donald
2-2 chi- 102 20040129
3-3 mark 304 20040229-
awk '{x=x+$3} {print NR, $3, x}' data使用变量进行累加计算,输出:
1 305 305
2 102 407
3 304 711
awk '{x=x+$3} END {print NR, $3, x}' data使用BEGIN和END在处理之前或之后显示结果,输出:
3 304 711
awk '{x=x+$3} {print NR, $3, x | "sort -nr"}' data在awk内使用管道进行排序,输出:
3 304 711
2 102 407
1 305 305
cat command
{x=x+$3}
{print NR, $3, x | "sort -nr"}
awk -f command data将指定写在文件中,输出:
3 304 711
2 102 407
1 305 305
如果简单的输出不能处理您的程序中所需要的复杂信息,则可以尝试由 printf 命令获得的更加复杂的输出,其语法是
printf( format, value, value ...)
该语法类似于 C 语言中的 printf 命令,而格式的规格是相同的。通过插入一项定义如何打印数值的规格,可以定义该格式。格式规格包含一个跟有字母的 %。类似于打印命令,printf 不必包含在圆括号中,但是可以认为使用圆括号是一种良好的习惯。
下表列出 printf 命令提供的各种规格。
规格 说明
%c 打印单个 ASCII 字符
%d 打印十进制数
%e 打印数字的科学计数表示
%f 打印浮点表示
%g 打印 %e 或 %f;两种方式都更简短
%o 打印无符号的八进制数
s 打印 ASCII 字符串
%x 打印无符号的十六进制数
%% 打印百分号;不执行转换
可以在 % 与字符之间提供某些附加的格式化参数。这些参数进一步改进数值的打印方式:
参数 说明
- 将字段中的表达式向左对齐
,width 根据需要将字段补齐到指定宽度(前导零使用零将字段补齐)
.prec 小数点右面数字的最大字符串宽度或最大数量
参考资料:
AWK:Linux 管理员的智能工具包
Posted by yudunde at 08:40 PM | Comments (4) | TrackBack
