显示标签为“linux”的博文。显示所有博文
显示标签为“linux”的博文。显示所有博文

12/20/2009

Linux为什么会比BSD更受到人们的欢迎?

Linux为什么会比BSD更受到人们的欢迎?

来源:http://cnbeta.com/articles/100436.htm

感谢OwnLinux.cn的投递
刚才看了一篇文章《评论:从射手QQ之争看开源许可证的选择》里面讲到了Linux为什么比以BSD成功 下面就来讲讲
说到 Free Software 的 OS,当属 Linux,BSD 相对来讲是冷门多了.但BSD的风评可不会比Linux 差呀?那么是什么原因造成 Linux 比 BSD 更受欢迎呢?
Linux 是出现约在 BSD 官司缠身、以及 Internet 开始风行之际.Linux 的开发者及爱好者正好能透过 Internet 实时得发布新闻、发表新点子、提问讨论、递送程序代码及进行错误回报,这种藉由 Internet 的分布式合作方式带给Linux 惊人的活力和无限的生命力,而经由 Internet 所带来的这种活力和生命力正是 Linux 长久以来能和 BSD 分庭抗礼的主要原因之一.

Linus Torvalds的管理哲学:
也许 Linus Torvalds 并不是像 Bill Joy(BSD 的开创者)那样是个天纵英才的程序设计师,但他无疑的是超一流的领导者.要知道,能参与 Linux Kernel 开发的往往都不是什么泛泛之辈,Linus 如何在这些天资聪颖的计算机怪才之间折冲樽俎是非常耐人寻味的.

硬件支持:
在Linux 现身之时,刚好是人们开始买得起个人计算机时.但糟糕的是,当时的BSD 对于当时的个人计算机所使用的 80386 硬件的支持度并不好,而一般老百姓应该不太会为了玩 BSD 而特地购买高价的服务器设备,因此人们,尤其是穷苦的大学生,若要玩 Unix 时只有 Linux 可供选择,相对来说BSD的吸引力当然就大不如Linux 了.不过说起硬件支持,其实 Linux 和 BSD 也只是难兄难弟,Linux 是较佳,但有些太新太特殊及特定制造商的硬件 Linux 还是无法支持!

GNU 的大力支援
GNU 提供了一个操作系统所需的各式各样必要组件,但最重要的组件 - Kernel 却迟迟没有着落.原本计划好要成为 GNU 官方 Kernel 的 HURD 的发展一直很不顺利,而 Linux 的出现就刚好出现填补了 GNU 这个拼图上最重要的一个大洞.另外,虽然 GNU 的软件质量是毋庸置疑,但 BSD 却希望他们的开发团队所维护的核心工具都能以 BSDL 发行,所以因为授权兼容性的关系,很多GNU 软件就被 BSD 的人们摒除在外了.因此喜爱 GNU 软件的人们除了Linux 之外就似乎别无选择了.Linux 和 GNU 是分不开的:没有 GNU,那么没有任何工具程序的 Linux 根本无用武之地;而没了 Linux,GNU 软件就少了一个可以尽情发挥的舞台了.因此,个人可以接受人们说 Linux 的全名应该是 GNU/Linux.若我们仔细想想 Linux 的发展成长过程,个人认为如此称呼并不为过.

而 Linus 也说过其实他并不是很反对 GNU/Linux 这个名字,饮水思源,毕竟 Linux 的确是藉助了 GNU 太多的核心工具才有今天的成就.若当时没有 GNU 计划,那么 Linux 根本不会出现在这个世界上:当初 Linux 0.0.1 发表时,Linus 就只完成了以下功能:可用 GCC 编译,然后它能做的也只有执行 BASH 这个 Shell 而已,而这2个工具恰巧都是 GNU 的作品.我们可以看到,Linux刚开始就和 GNU 结下不解之缘了.

教堂与市集:
BSD走的是教堂式的学院派路线,而Linux则是代表了市集式的骇客精神;

多样的版本:
Linux 的松散结构也反应在Linux 的发行版上.因为 Linux 并没有什么官方发行版,所以任何人只要有兴趣有能力,都可以自行发行 Linux,这使得我们能轻易得在 Internet 上找到超过 200 种以上的 Linux 发行版,而实际数字恐怕远不止如此.

商业公司的支持:
若 说 Linux 为什么能快速得进入商用市场,我想 Red Hat 的成立应该是一个关键性的因素.对于大型企业而言,或许授权费用的多寡并不是重点,他们要的是能够说服上司及股东的解决方案.透过 Red Hat 所提供的技术支持,信息部门也比较敢将 Linux 列入解决方案之中.这项优势是没什么商业支持的 BSD 所难以匹敌的.

媒体的推波助澜:
若 说到自由软件界的代表人物,我想人们脑海中会浮现的名单应该少不了 Richard M. Stallman、Eric S. Raymond 及 Linus Torvalds 这几位指标性人物.Richard M. Stallman 是公认的自由软件界的精神领袖,他的意见对于 GNU 还是具有一定的影响力.Eric Steven Raymond 则是黑客文化的传道士,他发表了不少像是《教堂与市集》、《提问的智慧》之类对黑客文化影响深远的文章.而 Linus Torvalds 则是 Linux Kernel 项目领导人.这几位指标人物彼此之间似乎总是意见不合,但他们却有一个共通点 - 他们都是 Linux 的拥护者.

也就是说,当几位自由软件界的代表人物都在努力为 Linux 宣传的同时,BSD 自然从人们的雷达范围中消失了.不管 BSD 再怎么棒,但人们不晓得的话也是罔然.

GPL vs. BSDL:
Richard M. Stallman 之所以是自由软件界的精神领袖,除了他发起了 GNU 计划之外,个人认为他为了 GNU 而撰写的 GPL 更是决定性的因素.GPL 是一种偏向于开发者的回馈条款:使用者可以自由运用 GPL 程序代码,但所有修改必须也以 GPL 开放,让所有人(包括原始程序设计者)都能受益.这是能确保程序代码永远能让所有人自由使用的终极手段.相较之下,BSDL 应该是偏于使用者的一种无偿授权:使用者如何自由运用这些程序代码,程序设计师无权置喙,只要宣告这个软件是 BSDL 授权即可.因此,BSDL 的软件可能有一天会变成封闭软件,像 Microsoft 在 Windows 2000 核心里就采用了一些来自 BSD 的网络组件,但 BSD 的人们却没有因而受惠.Microsoft 并没有必要回馈那些修改后的程序代码.

软件的支持:
也许这是互为因果关系,因为 BSD 家族的市占率比 Linux 低多了,BSD 的开发者也相对较少,因此有不少缺乏资源的开放原始码软件就没有多余的心力能放在 BSD 上,这导致很多软件对 BSD 的支持度就没 Linux 那么好了.以 FreeBSD为例好了.FreeBSD 是针对 i386 硬件而开发的 BSD 分支,长久以来 FreeBSD 在功能、稳定、安全、效能等各方面的表现颇受好评,您可以在Google 上找到一篇 "Yahoo! and FreeBSD" 以为佐证.


评论:从射手QQ之争看开源许可证的选择

http://www.cnbeta.com/articles/100413.htm
新闻来源:原创
在射手播放器和QQ影音为GPL吵得不可开交的时候,CBer应该少一些无知的谩骂,多学习一下开源许可证的基本知识。要骂也要骂到点子上,别不分是非,指着别人脚骂别人鼻子。在中国这样一个几乎完全不尊重版权,开源软件处于萌芽发展的国家,开源是一个及其冒险的选择,你做出的产品顷刻之间便会被人抄袭。在中国,选择开源是需要勇气的,既然选择了它,就选择了坦然面对这个残酷的现实,开源可不是简单开放了源代码了事就可以了的。

首 先,开源并不代表放弃自身的权力,相反,开源软件之所以存在,正是它非常注重这种权力,并且把这种权力赋予了软件的所有使用者。小心的选择许可证是开发开 源软件的第一步,也是每一个开源软件作者所必须要了解的,这代表了你对你的软件的最基本态度。很多的时候,这背后也隐藏着某种商业策略,特别是有商业公司 支持的项目。

比如Android为什么是Apache 2.0而不是LGPL/GPL发布?为什么Linux是以GPL发布?其中绝对不是简简单单的看哪个许可证用得多就选择哪个,而是深思熟虑的结果。千万不 要小看这个选择,一个许可证之于软件就相当于价值观之于普通人,代表了这个软件的基本品性。一个错误的许可证选择可能会直接导致整个项目的失 败,XFree86就是一个好例子,所以,选择许可证是一件小心、谨慎的事情。

各种开源的许可证主要的限制还是在redistribution(发布),所以个人/商业公司开发的软件包含了GPL的代码,只要你不发布,是可以任意使用的。

GPL
这里不想再解释长篇的GPL译文和更长的FAQ。 简单说,GPL软件的使用者有权力得到软件的代码,只要使用了GPL,在发布(redistribution)的时候,整个项目也必须是GPL的,即主程 序和静态链接的库(Linux的.a和Windows的.lib)必须是GPL的,动态链接库(Linux的.so,Windows的.dll)必须是比 GPL兼容的。所谓GPL兼容,也就是GPL软件中可以使用的库,这些许可证必须比GPL弱(如LGPL,BSD),而不能是某个商业许可证。这里有一个 兼容列表 List of FSF approved software licenses。正因如此,GPL是带有很强的传染性,只要你的软件使用了GPL的代码,那么就请以GPL开放源代码吧,并且你的项目中也不能有任何和GPL不兼容的库。

LGPL
GPL 带有很强的传染性,那么如果一个库使用GPL发布,那么使用这个库的所有软件也必须使用GPL发布,这对不想开放源代码的商业软件来讲是致命的打击——你 可以不使用其他的库,但最基本的libc是无论如何绕不开的,如果libc是以GPL发布,就相当于所有软件必须以GPL发布了。所 以,LGPL(Lesser GPL)诞生了。LGPL定义为,在以LGPL发布的库的基础上开发新的库的时候,新的库必须以LGPL发布,但是如果仅仅是动态链接,那么则不受任何限 制。这样商业软件就可以随意的使用LGPL的库了。因此,LGPL也具有传染性,但限制在在其基础上开发的库上,而并不限制使用它的程序本身——它的传染 性远小于GPL。

BSD、Apache 2.0

相对GPL/LGPL的开放源代码,BSD,Apache 2.0就宽松许多——商业软件可以任意的使用BSD,Apache 2.0发布的软件代码,而不需要开放源代码,只需要提及代码的原出处就可以了。BSD和Apache 2.0提及的方式稍有不同,具体可以参考协议的详细内容。它们是GPL兼容的。

了解了几种常用许可证的异同,再来看许可证的选择。

Android 使用宽松的Apache 2.0发布,因为Google作为一个商业公司,并不想失去商业软件的支持,它希望团结一切可以团结的力量加入的Android的开发中来,壮大自己的阵 营,使用Apache 2.0就无可厚非了。而Google本身,并没有丧失对Android的控制权,不会担心另外一个公司拿走了Android的代码开发出一个闭源 Android的对手。因为,只要Android不断的出新版,社区不停的跟进,并且不停的修改API,其他基于Android开发的公司不得不把自己的 Patch提回到主干上,否则,必然将耗费大量人力物力在维护自己的Patch上(钱这方面你斗得过Google?),得不偿失。而且,闭源之后,与整个 社区为敌,作为一个定位软件平台的项目,会流失大量应用软件开发者,以小博大,任何一个商业公司都不会干这种胜算不高的蠢事。

在看以 GPL发布的Linux为什么比以BSD发布的FreeBSD成功。其实正是因为GPL的传染性。当一个开发人员在Linux基础上开发一个新功能之后, 不得不以GPL开放源代码,贡献回Linux,这样Linux本身才能越来也越壮大而且留住了相当的开发人员,形成了一个 优秀软件->很多使用者和贡献者->贡献->更优秀的软件->更多的使用者和贡献者... 的良性循环。

正如每一个成功的男人背后都有一个女人,每一个成功的开源软件背后都有一个符合它策略的开源许可证。许可证明确的版权划分,明确的版权划分为软件发展提供 了一个良好的环境。正是因为老外重视版权,天天为版权争吵,才会有一个良好的商业软件和自由软件大环境。相对的,漠视版权的中国无论商业还是开源软件,才 会沦落到毫无创新能力,只能给外国打打下手,作点边角外包的境地。

最后,回到射手和QQ,他们都使用的ffmpeg作为解码器。 ffmpeg本身是LGPL的,使用它开发闭源软件是无可厚非的。但是ffmpeg有部分可选GPL的解码器主要是xvid和x264,由于GPL的传染 性,打开了可选的GPL解码器后的ffmpeg也成了GPL的,所以,基于ffmpeg的射手播放器和QQ影音从法律上讲,必须以 GPL发 布源代码,这个是强制的,不是可选项。射手的申明中引用的GPL FAQ的话已经很明确了,GPL软件中使用的动态链接库必须是GPL兼容的,也就是说,射手的字幕模块(它是动态链接到射手播放器本身),也必须是使用 GPL兼容的许可证发布,闭源显然是一个错误。

射手播放器的作者Tomasen发现了这个错误之后,很快开放了这部分的代码,弥补了自己的失误,这为射手播放器以后的发展扫清了一个大障碍,下一个障碍 是把非GPL兼容的CoreAVC商业解码器踢出发行包,这不是一个GPL软件该有的东西。理清了许可证,和赋予开发者的权力,才有可能吸引到开发者。




10/30/2009

Ubuntu 官方正式发布 Ubuntu 9.10

经过了漫长的等待,Ubuntu 官方在刚刚已经正式发布了被受期待的 Ubuntu 9.10 ( Karmic Koala ) !其实在这之前就可以在镜像服务器下载 Ubuntu 9.10 ( Karmic Koala ) 正式版的ISO镜像文件了,为了不影响 Ubuntu 9.10 正式版的ISO文件向各地镜像服务器分发的进度,OwnLinux 并没有公布下载链接。目前官方已经正式开放了 Ubuntu 9.10 正式版的ISO文件下载服务。 今天从世界各地涌入的巨大下载量也是对各个官方服务器一次严峻的考验。 官方的下载界面已经从 Ubuntu 9.10 RC 更改为 Ubuntu 9.10 ( Karmic Koala ) 正式版了:

ubuntu-910-final-released-1
Ubuntu 9.10 ( Karmic Koala ) 正式版的下载地址:
http://cn.releases.ubuntu.com/9.10/
http://tw.releases.ubuntu.com/9.10/
http://releases.ubuntu.com/releases/9.10/

Ubuntu 9.10 ( Karmic Koala ) 正式版ISO镜像文件MD5码列表
836440698456aa2936a4347b5485fdd6 *ubuntu-9.10-alternate-amd64.iso
3faa345d298deec3854e0e02410973dc *ubuntu-9.10-alternate-i386.iso
dc51c1d7e3e173dcab4e0b9ad2be2bbf *ubuntu-9.10-desktop-amd64.iso
d91659de6e945dbb96eb8970b2b4590a *ubuntu-9.10-desktop-armel+dove.img
297875d2a7531824a0fb08f241d33e85 *ubuntu-9.10-desktop-armel+imx51.img
8790491bfa9d00f283ed9dd2d77b3906 *ubuntu-9.10-desktop-i386.iso
ed6e77587b87fe0d92a2f21855869f00 *ubuntu-9.10-netbook-remix-i386.iso
14707e8847b9c9ba2dd1869fb5086e4f *ubuntu-9.10-server-amd64.iso
55618ad5f180692f9dac20cbff352634 *ubuntu-9.10-server-i386.iso
37a04db193b1a342f961f59aea2fada8 *wubi.exe

友情提示: alternate 为文字界面的安装版本, desktop 为包含 Live CD 的图形界面安装版本, server 为服务器版本, i386 为32位的系统版本, amd64 为64位的系统系统版本,请根据你自己的需要下载相应的版本。由于版本比较多,下载的时候不要下错版本了哟,做了又费带宽又费电又费精力的事就不好了:) 最后建议大家:使用P2P下载以减轻官方服务器的负担。

10/04/2009

Apache系统中.htaccess文件的应用

Apache系统中的.htaccess文件(或者”分布式配置文件”提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。子目录中的指令 会覆盖更高级目录或者主服务器配置文件中的指令。.htaccess必须以ASCII模式上传,最好将其权限设置为644。
创建 .htaccess 文件时可能给你带来一些问题。写入内容到这个文件是非常容易的,你只需输入合适的代码到文本编辑器中(如记事本)。但是你可能在保存文件的时候碰到问题。 因为 .htaccess 是一个非常奇怪的文件名(这个文件没有名字而只有一个8字符的扩展名)。这个可能在特定的系统中不能被接受(如 Windows 95)。在绝大多数的操作系统中,你可以尝试在保存文件的时候输入以下文件名:”.htaccess”(包括引号)。如果这不起作用,你可能需要先把它命 名为别的名字(如 htaccess.txt),然后上传到服务器。上传之后,在 FTP 工具中重命名它。
尽管通过 .htaccess 可以做很多事情,但是这篇日志主要关注的是如何提高 WordPress 的安全性和可用性。
  1. 保护 .htaccess 自身的安全性。阻止用户通过读取和写入 .htaceess 来更改安全性的设置。

    order allow,deny
    deny from all
  2. 隐藏服务器的数字签名。隐藏服务器的数字签名之后,入侵者将很难找到有机会找到安全漏洞,因为他们不知道背后的服务器是什么。
    ServerSignature Off
  3. 限制上传文件的大小。这个能够帮助阻止 DoS 攻击(用户通过上传巨大的文件来冲垮服务器)并且能够节约带宽。
    LimitRequestBody 10240000
    # limit file uploads to 10mb
  4. 停止 mod_security 过滤器。这是一个可选的设置并且要小心处理。这些指令告诉服务器不要使用 mod_security 过滤器,因为 mod_security 过滤器不允许用户发表含有这些单词 “curl”,“lynx” 或者 “wget” 等等单词的文章。这个看起来有点琐碎,但是这个让一些站点头痛,因为这些单词几乎那些站点每天都会用到。
    SecFilterInheritance Off
  5. 保护 wp-config.php 文件。我们可以通过 .htaccess 文件阻止用户读取和写入 WordPress 的主配置文件。这个指令假设 WordPress 是安装在站带你的根目录。

    order allow,deny
    deny from all
  6. 指定自定义错误文档。这条指令做的更多是站点的可用性而不是安全性。它们指定了哪个页面将被显示,一旦服务器错误,如页面找不到(代码 404) 禁止访问(代码 403)等等。
    ErrorDocument 404 /notfound.php
    ErrorDocument 403 /forbidden.php
    ErrorDocument 500 /error.php
  7. 禁止浏览目录。这将阻止服务器在没有找到 index 文件(如 index.html,index.php 等等)的情况下显示文件夹目录内容。这能阻止用户看到文件夹的内容使得更难对网站发动攻击。
    # disable directory browsing
    Options All -Indexes
  8. 防止图片盗链。这个能够阻止其他网站盗链本网站的图片,迫使他们 要么指向整个页面,或者其他存储图像的地方。这个保存了宝贵的带宽并且能够增加流量(虽然只是一点点)。下面的代码将会显示 stealingisbad.gif 这张图片,当有人试着热链到到你的网站来显示图片
    #disable hotlinking of images
    RewriteEngine on
    RewriteCond %{HTTP_REFERER} !^$
    RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain.com/.*$ [NC]
    #RewriteRule \.(gif|jpg|png)$ http://www.yourdomain.com/stealingisbad.gif [R,L]
  9. 在你的站点给每个 URL 设置符合规定的或者“标准”的链接。这能够帮助提高网站的可用性和提高网站在搜索引擎中的排名。总之,它会把来自 http://yourdomain.com 的请求重定向到 http://www.yourdomain.com/.
    # set the canonical url
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^yourdomain\.com$ [NC]
    RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
  10. 保护博客免受垃圾留言的侵扰(和普通方式提交的垃圾留言)。最后的那条指令将会阻止用户直接从其他网站的留言提交框发表留言,虽然这不是一个包罗 万象的反垃圾留言的方法,但是它确实能够帮助你。
    # protect from spam comments
    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} POST
    RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
    RewriteCond %{HTTP_REFERER} !.*yourdomain.com.* [OR]
    RewriteCond %{HTTP_USER_AGENT} ^$
    RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]
加入这些指令之后,你应该添加 WordPress 用于管理永久链接的代码。还有很多的指令和很多的方法可以提高网站的可用性和安全性,不过这里所列出的应该占了日常所需的大部分了。当你上传该文件到服务 器上之后,你应该一遍有一遍的测试直到你觉得所有的东西都工作正常,再测试一遍。检查下是否受保护的文件还能不能被访问,你依旧允许访问的文件和文件夹能 否还能访问。常规的经验可能是棘手的事情,它们可能导致看似随机的问题,所以在你发布你的网站之前务必完全的测试你的网站。
原文地址:http://fairyfish.net/2007/08/01/using-htaccess-to-secure-and- improve-wordpress/
关于正则表达式的学习http://www.javey.org/class/WebDev/Regex/30Minutes,Regex.html
本文来自: http://www.javey.org/archives/40

7/06/2009

Last-Modified ETag

1) 什么是”Last-Modified”?
  在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的 属性标记此文件在服务期端最后被修改的时间,格式类似这样:
Last-Modified: Fri, 12 May 2006 18:53:33 GMT
客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过:
If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT
如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而 保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。
2) 什么是”Etag”?
   HTTP 协议规格说明定义ETag为“被请求变量的实体值” (参见 —— 章节 14.19)。 另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单 独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,以下是服务器端返回的格式:
ETag: "50b1c1d4f775c61:df3"
客户端的查询更新格式是这样的:
If-None-Match: W/"50b1c1d4f775c61:df3"
如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。本人测试Etag主要在断点下载时比较有用。
Last-Modified和Etags如何帮助提高性能?
   聪明的开发者会把Last-Modified 和ETags请求的http报头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服务器首先产生 Last-Modified/Etag标记,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客 户端)缓存。
过程如下:
  1. 客户端请求一个页面(A)。
  2. 服务器返回页面A,并在给A加上一个Last-Modified/ETag。
  3. 客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。
  4. 客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。
  5. 服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应 体。

------------------------------
我们都知道,HTTP/1.1中有一个Etag,用来判断请求的文件是否被修改。
为什么要使用Etag呢?Etag主要为了解决Last-Modified无法解决的一些问题
1、一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;
2、某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这 种修改无法判断(或者说UNIX记录MTIME只能精确到秒)
3、某些服务器不能精确的得到文件的最后修改时间;

为此,HTTP/1.1引入了Etag(Entity Tags).Etag仅仅是一个和文件相关的标记,可以是一个版本标记,比如说v1.0.0或者说"2e681a-6-5d044840"这么一串看起来 很神秘的编码。但是HTTP/1.1 标准并没有规定Etag的内容是什么或者说要怎么实现,唯一规定的是Etag需要放在""内。

Etag由服务器端生成,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改。我们常见的是使用If- None-Match.请求一个文件的流程可能如下:
====第一次请求===
1.客户端发起HTTP GET请求一个文件;
2.服务器处理请求,返回文件内容和一堆Header,当然包括Etag(例如"2e681a-6-5d044840")(假设服务器支持Etag生成和 已经开启了Etag). 状态码200

====第二次请求===
1.客户端发起HTTP GET请求一个文件,注意这个时候客户端同时发送一个If-None-Match头,这个头的内容就是我们第一次请求时服务器返回的 Etag:2e681a-6-5d044840
2.服务器判断发送过来的Etag和计算出来的Etag匹配,因此If-None-Match为False,不返回200,返回304,客户端继续使用本 地缓存;

流程很简单,问题是,如果服务器又设置了Cache-Control:max-age和Expires呢,怎么办?
答案是同时使用,也就是说在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和Etag之后,服务器才能返回 304.(不要陷入到底使用谁的问题怪圈)

我们来看Apache中的Etag实现。
1.Apache首先判断是不是弱Etag,这个留在下面讲。如果不是,进入第二种情况:

强Etag根据配置文件中的配置来设置Etag值,默认的Apache的FileEtag设置为:
FileEtag INode Mtime Size
也就是根据这三个属性来生成Etag值,他们之间通过一些算法来实现,并输出成hex的格式,相邻属性之间用-分隔,比如:
Etag "2e681a-6-5d044840"
这里面的三个段,分别代表了INode,MTime,Size根据算法算出的值的Hex格式,(如果你在这里看到了非Hex里面的字符(也就是0-f), 那你可能看见神了:))

当然,我们可以改变Apache的FileEtag设置,比如设置成FileEtag Size,那么得到的Etag可能为:
Etag "6"
总之,设置了几个段,Etag值就有几个段。(不要误以为Etag就是固定的3段式)

说明
这里说的都是Apache 2.2里面的Etag实现,因为HTTP/1.1并没有规定Etag必须是什么样的实现或者格式,因此,你也可以修改或者完全编写自己的算法得到 Etag,比如 "2e681a65d044840",客户端会记住并缓存下这个Etag(Windows里面保存在哪里,我还没找到:(), 下次访问的时候直接拿这个值去和服务器生成的Etag对比。

注意
不管怎么样的算法,在服务器端都要进行计算,计算就有开销,会带来性能损失。因此为了榨干这一点点性能,不少网站完全把Etag禁用了(比如 Yahoo!),这其实不符合HTTP/1.1的规定,因为HTTP/1.1总是鼓励服务器尽可能的开启Etag。

弱校验(弱Etag)
重新考虑前面提到的3个问题:
问题1、一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为 这个文件被修改了,而重新GET;

解决办法:如果使用强Etag,每次得会要求重新GET页面,如果使用Etag,比方说设置成FileEtag Size等,就可以忽略MTime造成的Last-Modified时间修改从而影响了If-Modified-Since(IMS)这个校验了。这点和 弱Etag无关。

问题2、某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If- Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒)

解决办法:如果是这种情况,Apache会自动判断请求时间和修改时间之间的差值,如果小于1s,Apache会认为 这个文件在这1秒内可能会再次被修改,因此生成一个弱Etag(Weak Etag),这个Etag仅仅基于MTime来生成,因此MTime只能精确到s,所以1s内生成的Etag总是一样,这样就避免了使用强Etag造成的 1s内频繁的刷新Cache的情况。(貌似不用Etag,仅仅使用Last-Modified就可以解决,但是这针对的仅仅是修改超级频繁的情况,很多文 件可能同时也使用强Etag验证)。弱Etag以W/开始,比如:W/"2e681a"

问题3、某些服务器不能精确的得到文件的最后修改时间;

解决办法:生成Etag,因为Etag可以综合Inode,MTime和Size,可以避免这个问题

7/31/2008

QQ for Linux 发布

腾讯公司发布的基于Linux平台的即时通讯软件,
为Linux电脑用户带来更加快捷方便的聊天体验。

当前版本功能介绍


色彩丰富的界面
在Linux平台率先支持更换软件的色调和底纹,配套用户不同的Linux版本,体现不同的个性和风格。
管理多个会话窗口
用户可以用多标签的方式管理多个会话窗口,并且每个子会话窗口可以从母会话窗口中分离,成为一个独立的聊天窗口。
丰富的聊天表情
用户可以和好友或者群进行即时的交流,收发默认表情,并且能接收对方发出的自定义表情。
整合QQ核心功能
为用户提供QQ最核心的聊天,查找,设置等功能,可以享受到最快捷的聊天体验,没有任何打扰。
自定义分组的顺序
用户可以在好友列表中自由的拖拽分组,把常用的分组移动到最上端,快速选中常用好友。
丰富的新消息提示
当用户收到新消息,不仅在任务栏会有消息盒子提示,而且在聊天的窗口和标签也有丰富的动画效果。
http://im.qq.com/qq/linux/download.shtml
http://dl_dir.qq.com/linuxqq/linuxqq_1.0-Preview2008_i386.deb
文件大小:4.7M Ubuntu 7.10 或更高
http://dl_dir.qq.com/linuxqq/linuxqq-1.0-Preview2008.i386.rpm
文件大小:4.7M SuSE 9 或更高 Fedora Core 8 或更高
http://dl_dir.qq.com/linuxqq/linuxqq_1.0-Preview2008_i386.tar.gz
文件大小:4.8M 所有Linux系统用户均可下载