2008年11月24日星期一

各种食用油的使用注意

各种食用油的使用注意
hopexjlg 发表于 2007-7-26 18:29:00

生活中,许多人吃惯了一种口味的油,往往会长期食用。其实,不同种类的食用油各具特点,从营养平衡角度出发,选用时不妨经常轮换着吃。
  豆油 含丰富的多不饱和脂肪酸和维生素E、D,有降低心血管疾病、提高免疫力、对体弱消瘦者有增加体重的作用。豆油含的多不饱和脂肪酸较多,所以在各种油脂中最容易酸败变质,因此购买时一定要选出厂不久的,并尽可能趁“新鲜”吃掉。
  玉米油 玉米油极易消化,人体吸收率高达97%。玉米油中不饱和脂肪酸含量达80%以上,其中的亚油酸是人体自身不能合成的必需脂肪酸,还含有丰富的维生素E。从口味和烹调角度来说,玉米油色泽金黄透明,清香扑鼻,除可用于煎、煮、炸外,还可直用于凉拌。
  橄榄油 所含的单不饱和脂肪酸是所有食用油中最高的一类,它有良好的降低低密度胆固醇,提高高密度胆固醇的作用,所以有预防心脑血管疾病、减少胆囊炎、胆结石发生 的作用。橄榄油还含维生素A、D、E、K、胡萝卜素,对改善消化功能、增强钙在骨骼中沉着、延缓脑萎缩有一定的作用。
  花生油 含丰富的油酸、卵磷脂和维生素A、D、E、K及生物活性很强的天然多酚类物质,可降低血小板凝聚,降低总胆固醇和坏胆固醇水平,预防动脉硬化及心脑血管疾病。
  葵花子油 含丰富的必需脂肪酸,其中亚油酸、α-亚麻酸在体内可合成与脑营养有关的DHA,孕妇吃葵花子油有利于胎儿脑发育。含有维生素E、A等,有软化血管、降低 胆固醇、预防心脑血管疾病、延缓衰老、防止干眼症、夜盲症、皮肤干燥的作用。葵花子油也含有较高的多不饱和脂肪酸,所以有与豆油一样的注意事项。
  色拉油 是植物油中加工等级最高的食用油,已基本除尽了植物油中的一切杂质和蜡质,所以颜色最淡。色拉油适用于炒、炸、煎和凉拌,这是其他食用油所不及的。
  猪油 含较高的饱和脂肪酸,吃得太多容易引起高血脂、脂肪肝、动脉硬化、肥胖等。但猪油不可不吃,因为其所含胆固醇是人体制造类固醇激素、肾上腺皮质激素、性激素和自行合成维生素D的原料。猪油中的α-脂蛋白能延长寿命,这是植物油中所缺乏的。

2008年11月11日星期二

To read;

http://svn.perlchina.org/trunk/POD2-CN/lib/POD2/CN/perlvar.pod
NAME

perlvar - Perl 预定义变量



DESCRIPTION

预定义名称

后面列出的名称对 Perl 来说具有特殊含义。

大多数标点名称都有合理的助记方法或类似于在 shell 中的用法。

然而,如果你就是想用长变量名,那只要在程序开头加上



use English;



即可。这样会为所有短名称在当前包中创建长名称别名。

其中一些甚至还有中间名,一般是从 awk 借用过来的。 一般来说,如果不需要

$PREMATCH,$MATCH 和 $POSTMATCH,那最好使用



use English '-no_match_vars';



调用方式,因为它能避免在用正则表达式时出现效率降低的情况。见 English。



依赖当前被选中文件句柄的变量可以通过在 IO::Handle

对象上调用合适的对象方法来设置,

但是这要比使用普通的内建变量效率低一些。(下面的概括行里包含的单词 HANDLE

即指 IO::Handle 对象。) 首先你要声明



use IO::Handle;



然后就可以用



method HANDLE EXPR



或者更安全的形式,



HANDLE->method(EXPR)



每个方法都返回 IO::Handle 属性的旧值,同时接受一个可选的 EXPR。

如果提供了该参数,则其指定了所涉及 IO::Handle

属性的新值。如果不提供该参数, 大多数方法不改变当前值--除了

autoflush(),它会假定给定了参数 1,稍有不同。



载入 IO::Handle

类是一项代价高昂的操作,因此你该知道如何使用常规的内建变量。



这些变量中的少数几个是“只读的”。这意味着如果直接或者通过引用间接向该变

量赋值, 就会引起一个运行时异常。



在修改本文档中描述的大部分特殊变量的缺省值时都需要特别小心。多数情况下应



在修改之前局部化这些变量,如果不这么做,就可能影响依赖于你所修改特殊变量

缺 省值的其他模块。下面是一次性读入整个文件的一种正确方法:



open my $fh, "foo" or die $!;

local $/; # enable localized slurp mode

my $content = <$fh>;

close $fh;



但下面的代码就很糟糕:



open my $fh, "foo" or die $!;

undef $/; # enable slurp mode

my $content = <$fh>;

close $fh;



因为一些模块可能想以默认的“行模式”从文件中读取数据,而一旦我们刚才

列出的代码得到执行,在同一个 Perl 解释器内运行的所有其他代码读到的 $/

全局值都会被改变。



通常,在局部化一个变量时总是想让影响限制在尽可能小的范围内,因此

应该自己建立一个 "{}" 块,除非你已经处于某些小的 "{}" 块内。例如:



my $content = '';

open my $fh, "foo" or die $!;

{

local $/;

$content = <$fh>;

}

close $fh;



下面是代码失控的一个例子:



for (1..5){

nasty_break();

print "$_ ";

}

sub nasty_break {

$_ = 5;

# do something with $_

}



你可能希望上述代码打印出:



1 2 3 4 5



但实际上得到的却是:



5 5 5 5 5



为什么?因为 nasty_break() 修改了 $_ 而没有事先将其局部化。

改正方法是增加 local():



local $_ = 5;



虽然在这样一个短小的例子里很容易发现问题,但在更复杂的代码中,如果不

对特殊变量进行局部化更改就是在自找麻烦。



下列内容按照先标量变量、后数组、最后散列的顺序排列。



$ARG

$_ 默认的输入和模式搜索空间。下面的几对代码都是等同的:



while (<>) {...} # equivalent only in while!

while (defined($_ = <>)) {...}



/^Subject:/

$_ =~ /^Subject:/



tr/a-z/A-Z/

$_ =~ tr/a-z/A-Z/



chomp

chomp($_)



以下是几处即使没有写明 Perl 也会假定使用 $_ 的地方:



* 各种单目函数,包括像 ord() 和 int() 这样的函数以及除 "-t"

以外所有的文件 测试操作 ("-f","-d"),"-t" 默认操作 STDIN。



* 各种列表函数,例如 print() 和 unlink()。



* 没有使用 "=~" 运算符时的模式匹配操作 "m//"、"s///" 和

"tr///"。



* 在没有给出其他变量时是 "foreach" 循环的默认迭代变量。



* grep() 和 map() 函数的隐含迭代变量。



* 当 "while" 仅有唯一条件,且该条件是对 ""

操作的结果进行测试时,$_ 就是存放输入记录的默认位置。除了

"while" 测试条件之外不会发生这种情况。



(助记:下划线在特定操作中是可以省略的。)



$a

$b 是使用 sort() 时的特殊包变量,参见 "sort" in perlfunc。

由于这一特殊性,$a 和 $b 即使在用了 "strict 'vars'"

指示符以后也不需要声明(用 use vars 或者 our())。 如果想要在

sort() 的比较块或者函数中使用它们,就不要用 "my $a" 或 "my $b"

将其词法化。



$<*digits*>

含有上次模式匹配中捕获括号集合所对应的子模式,不包括已经退出的嵌

套 块中匹配的模式。(助记:类似 \digits。)

这些变量全都是只读的,对于 当前块来说具有动态作用域。



$MATCH

$& 含有上次成功的模式匹配所匹配到的字符串(不包括任何隐藏在块中的匹?

浠虻鼻?块所包围的 eval())。(助记:同一些编辑器中的 & 类似。)

该变量是只读的, 对于当前块来说具有动态作用域。



在程序中任何地方使用该变量都会使所有正则表达式匹配产生可观的效率

降低。 参见 "BUGS"。



$PREMATCH

$` 含有上次成功的模式匹配内容之前的字符串(不包括任何隐藏在块中的匹?

浠虻鼻?块所包围的 eval)。(助记:"`"

常常出现在引起的字符串之前。) 该变量是只读的。



在程序中任何地方使用该变量都会使所有正则表达式匹配产生可观的效率

降低。 参见 "BUGS"。



$POSTMATCH

$' 含有上次成功的模式匹配内容之后的字符串(不包括任何隐藏在块中的匹?

浠虻鼻?块所包围的 eval())。(助记:"'"

常常跟在引起的字符串之后。) 例如:



local $_ = 'abcdefghi';

/def/;

print "$`:$&:$'\n"; # prints abc:def:ghi



该变量只读且对于当前块具有动态作用域。



在程序中任何地方使用该变量都会使所有正则表达式匹配产生可观的效率

降低。 参见 "BUGS"。



$LAST_PAREN_MATCH

$+ 含有上次成功的搜索模式中最后一个括号匹配的文本。在无法知道可选模

式集中 到底哪一个匹配成功时,该变量是非常有用的。例如:



/Version: (.*)|Revision: (.*)/ && ($rev = $+);



(助记:积极一点儿向前看。)(译注:“积极”与“正号”是同一个单词?

? 该变量只读且相对于当前块具有动态作用域。



$^N 含有上一次成功搜索模式中最近闭合的组(即最右边的右括号构成的组)所

匹配 的文本。(助记:最近闭合的(可能)嵌套的括号。)

(译注:嵌套的单词为 Nest。)



该变量主要用在 "(?{...})"

块的内部,以便检查最近匹配到的文本。例如,

为了有效地用一个变量($1、$2 等等之外的变量)捕获文本,可以将

"(...)" 替换为



(?:(...)(?{ $var = $^N }))



像这样设置并使用 $var 就能把你从计算括号个数的烦恼中解放出来了。



该变量对于当前块具有动态作用域。



@LAST_MATCH_END

@+ 该数组保存了当前活动的动态作用域中最近成功的子匹配结束处的偏移量

。 $+[0]

为整个匹配在字符串中结束处的偏移量,这同用被匹配的变量调用 "pos"

函数得到的值一样。该数组的第 *n* 个元素保存了第 *n* 个子匹配

的偏移量,因此 $+[1] 就是紧接着 $1 结束处的偏移量,$+[2] 是

紧接着 $2 结束处的偏移量,以此类推。可以用 $#+

得知最近成功的匹配 中有多少个组。参见为 "@-" 变量给出的例子。



$* 将其设为非零整数值就可以进行字符串内的多行匹配,设为

0(或未定义值) 相当于告诉 Perl

可以假定字符串都是单行的,从而能进行模式匹配的优化。当 $* 为 0

或未定义值时,对含有多个换行符的字符串进行模式匹配会产生很难

理解的结果。它默认为未定义值。(助记:* 匹配很多东西。)

该变量只影响对 "^" 和 "$" 的解释。即使在 "$* == 0"

时也可以搜索一个字面的换行符。



在现在的 Perl 里不应使用 $*,在模式匹配中可以用 "/s" 和 "/m"

修饰符取代 它的功能。



对 $* 赋非数值量会触发一个警告(并使 $* 表现为 "$* == 0"),对 $*

赋数值量则会隐含对其应用 "int"。



HANDLE->input_line_number(EXPR)

$INPUT_LINE_NUMBER

$NR

$. 为最后访问的文件句柄对应的当前行号。



Perl 中每个文件句柄都记录从其中读出的行数。(Perl

中行的概念也许和你不一 样,要看 $/ 的值是什么。)

当从某个文件句柄中读出一行(通过 readline() 或 "<>")或对其调用

tell() 或 seek() 时,$. 即成为那个句柄的行 计数器的别名。



你可以通过向 $. 赋值来调整计数器,但这并不会实际移动文件指针。

*局部化 $. 不会使对应文件句柄的行计数器局部化*,而只会局部化 $.

和文件句柄的别名关系。



关闭文件句柄时会复位 $.,但在没有 close()

就重新打开一个已打开的文件句柄 时不会这样。更多细节参见 "I/O

Operators" in perlop。"<>" 从不显式关闭文件,因此行号会在 ARGV

文件之间持续增长(不过请看看 "eof" in perlfunc 中的例子)。



你还可以用 "HANDLE->input_line_number(EXPR)"

访问一个给定文件句柄的

行计数器,这样就无需担心最后访问的是哪个句柄了。



(助记:很多程序用“.”表示当前行号。)



IO::Handle->input_record_separator(EXPR)

$INPUT_RECORD_SEPARATOR

$RS

$/ 为输入记录分隔符,默认为换行符。该变量会影响 Perl

对“行”这一概念 的理解。其功能类似于 awk 中的 RS

变量,在被设置为空字符串时同样

会将空白行作为终止标志。(空白行不能含有任何空格或制表符。)

你可以将其

设置为含有多个字符的字符串,以匹配多字符的终止标志;也可以设为

"undef" 以便一直读到文件结束。当文件含有连续的空白行时,把它设为

"\n\n" 和设为 "" 有少许不同:设为 ""

会把两个或更多连续的空白行视为单个 空白行;而设为 "\n\n"

则只是盲目地假定其后输入的字符属于下一段,即使

这些字符是换行符也一样。(助记:在引用诗句时会用 /

作为行间的分隔。)



local $/; # enable "slurp" mode

local $_ = ; # whole file now here

s/\n[ \t]+/ /g;



切记:$/ 的内容是一个字符串,而不是正则表达式。awk

得在某些方面改进 一下了。:-)



将 $/

设为整数、存有整数的标量或可转换成整数的标量这些值的引用时,Perl

会尝试读入记录而不是行,最大记录长度就是引用的那个整数。因此这段

代码:



local $/ = \32768; # or \"32768", or \$var_containing_32768

open my $fh, $myfile or die $!;

local $_ = <$fh>;



会从 FILE 读取一条不长于 32768

字节的记录。如果你不是在读取一个面向记录 的文件(或者所用的 OS

没有面向记录的文件类型),那很可能每次读取都得到一

整块的数据。若某条记录比你所设置的记录长度还大,就会把该记录拆成

若干片 返回。



在 VMS 上,记录读取是用 "sysread"

的等价物完成的,因此最好不要在同一个

文件上混合使用记录和非记录读。(这不太可能成为问题,因为任何你想?

约锹寄J?读取的文件也许都不能在行模式下用。) 非 VMS 系统用普通

I/O 进行读取,因此 在一个文件中混合记录和非记录读是安全的。



参见 "Newlines" in perlport 以及 $.。



HANDLE->autoflush(EXPR)

$OUTPUT_AUTOFLUSH

$| 若将该变量设为非零值,就会立刻强制进行刷新,并且当前选中的输出通

道在每次 打印或写之后都会进行刷新。默认值为 0

(不管选中的通道实际上是否被系统所缓冲, $| 只是告诉你 Perl

是否在每次写完之后显式刷新)。典型情况下,若 STDOUT

的输出是终端则是行缓冲的,否则就是块缓冲。设置该变量在向管道或套

接字输出 时很有用,比如你正在 rsh 下运行一个 Perl

程序并且想在输出时马上就能看到

输出内容。该变量不影响输入缓冲。关于输入缓冲请参见 "getc" in

perlfunc。 (助记:when you want your pipes to be piping hot.)



IO::Handle->output_field_separator EXPR

$OUTPUT_FIELD_SEPARATOR

$OFS

$, 为 print 的输出域分隔符。通常 print

不经任何修饰就输出它的参数,要 得到更像 awk

的行为,可以将该变量设置成和 awk 的 OFS 变量一样

,以指定域之间打印什么。(助记:当 print

语句里有“,”时会打印的东西。)



IO::Handle->output_record_separator EXPR

$OUTPUT_RECORD_SEPARATOR

$ORS

$\ 为 print 的输出记录分隔符。通常 print

简单地原样输出它的参数,不增加

任何结尾的换行符或其他表征记录结束的字符串。要得到更像 awk

的行为, 可以将该变量设为同 awk 的 ORS 变量一样,以指定在 print

的结尾输出 什么。(助记:设置 $\ 而不是在 print

结尾加“\n”。另外,它长得和 $/ 很像,但却是你从 Perl

那里拿“回”的东西。) (译注:“回”原文为

单词“back”,还指代反斜杠“backslash”,起一语双关作用。)



$LIST_SEPARATOR

$" 该变量同 $,

类似,但应用于向双引号引起的字符串(或类似的内插字符串)

中内插数组和切片值的场合。默认为一个空格。(助记:我觉得显而易见?

?



$SUBSCRIPT_SEPARATOR

$SUBSEP

$; 为模拟多维数组时的下标分隔符。如果你这样引用一个散列元素



$foo{$a,$b,$c}



实际上意思就是



$foo{join($;, $a, $b, $c)}



但是别这么写



@foo{$a,$b,$c} # a slice--note the @



它的意思是



($foo{$a},$foo{$b},$foo{$c})



默认为“\034”,同 awk 的 SUBSEP

一样。如果你的散列键包含二进制数据, 可能 $;

就没法包含任何可靠的值了。

(助记:逗号(语法上的下标分隔符)是半个分号。是啊,我知道这完全没?

兴捣

2008年11月8日星期六

p2pover

什么是ARP?

我们知道,当我们在浏览器里面输入网址时,DNS服务器会自动把它解析为IP地址,浏览器实际上查找的是IP地址而不是网址。那么IP地址是如何转 换为第二层物理地址(即MAC地址)的呢?在局域网中,这是通过ARP协议来完成的。ARP协议对网络安全具有重要的意义。通过伪造IP地址和MAC地址 实现 ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞。所以网管们应深入理解ARP协议。

一、什么是ARP协议

ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机要和另一个 主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发 送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。

二、ARP协议的工作原理

在每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的,如下表所示。

主机 IP地址 MAC地址
A 192.168.16.1 aa-aa-aa-aa-aa-aa
B 192.168.16.2 bb-bb-bb-bb-bb-bb

C 192.168.16.3 cc-cc-cc-cc-cc-cc
D 192.168.16.4 dd-dd-dd-dd-dd-dd

我们以主机A(192.168.1.5)向主机B(192.168.1.1)发送数据为例。

当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标 IP地址。如果找到了,也就知道了目标MAC地址,直接把目标MAC地址写入帧里面发送就可以了;如果在ARP缓存表中没有找到相对应的IP地址,主机A 就会在网络上发送一个广播,目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问: “192.168.1.1的MAC地址是什么?”网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应: “192.168.1.1的MAC地址是00-aa-00-62-c6-09”。这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了。 同时它还更新了自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可以了。ARP缓存表采用了老化机制,在一段时间内如果表中的 某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。

三、如何查看ARP缓存表

ARP缓存表是可以查看的,也可以添加和修改。在命令提示符下,输入“arp -a”就可以查看ARP缓存表中的内容了,如附图所示。

用“arp -d”命令可以删除ARP表中某一行的内容;用“arp -s”可以手动在ARP表中指定IP地址与MAC地址的对应。

四、ARP欺骗

其实,此起彼伏的瞬间掉线或大面积的断网大都是ARP欺骗在作怪。ARP欺骗攻击已经成了破坏网吧经营的罪魁祸首,是网吧老板和网管员的心腹大患。

从影响网络连接通畅的方式来看,ARP欺骗分为二种,一种是对路由器ARP表的欺骗;另一种是对内网PC的网关欺骗。

第一种ARP欺骗的原理是——截获网关数据。它通知路由器一系列错误的内网MAC地址,并按照一定的频率不断进行,使真实的地址信息无法通过更新保存在路 由器中,结果路由器的所有数据只能发送给错误的MAC地址,造成正常PC无法收到信息。第二种ARP欺骗的原理是——伪造网关。它的原理是建立假网关,让 被它欺骗的PC向假网关发数据,而不是通过正常的路由器途径上网。在PC看来,就是上不了网了,“网络掉线了”。

一般来说,ARP欺骗攻击的后果非常严重,大多数情况下会造成大面积掉线。有些网管员对此不甚了解,出现故障时,认为PC没有问题,交换机没掉线的“本事 ”,电信也不承认宽带故障。而且如果第一种ARP欺骗发生时,只要重启路由器,网络就能全面恢复,那问题一定是在路由器了。为此,宽带路由器背了不少 “黑锅”。

作为网吧路由器的厂家,对防范ARP欺骗不得已做了不少份内、份外的工作。一、在宽带路由器中把所有PC的IP-MAC输入到一个静态表中,这叫路由器 IP-MAC绑定。二、力劝网管员在内网所有PC上设置网关的静态ARP信息,这叫PC机IP-MAC绑定。一般厂家要求两个工作都要做,称其为IP- MAC双向绑定。

五、如何实现ARP攻击?针对ARP原理的例子:

了解上面这些常识后,现在就可以谈在网络中如何实现ARP欺骗了,可以看看这样一个例子:

一个入侵者想非法进入某台主机,他知道这台主机的防火墙只对192.0.0.3(假设)这个ip开放23口(telnet),而他必须要使用telnet来进入这台主机,所以他要这么做:
1、他先研究192.0.0.3这台主机,发现这台95的机器使用一个oob就可以让他死掉。
2、于是,他送一个洪水包给192.0.0.3的139口,于是,该机器应包而死。
3、这时,主机发到192.0.0.3的ip包将无法被机器应答,系统开始更新自己的arp对应表。将192.0.0.3的项目搽去。
4、这段时间里,入侵者把自己的ip改成192.0.0.3
5、他发一个ping(icmp 0)给主机,要求主机更新主机的arp转换表。
6、主机找到该ip,然后在arp表中加入新的ip-->mac对应关系。
7、防火墙失效了,入侵的ip变成合法的mac地址,可以telnet了。

六、其他相关知识:

tcp/ip
TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议,又叫网络通讯协议,这个协议是Internet国际互联网络的基础。

TCP/IP是网络中使用的基本的通信协议。虽然从名字上看TCP/IP包括两个协议,传输控制协议(TCP)和网际协议(IP),但TCP/IP实际上 是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传输和电子邮件等,而TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说 TCP/IP是Internet协议族,而不单单是TCP和IP。

TCP/IP是用于计算机通信的一组协议,我们通常称它为TCP/IP协议族。它是70年代中期美国国防部为其ARPANET广域网开发的网络体系结构和 协议标准,以它为基础组建的INTERNET是目前国际上规模最大的计算机网络,正因为INTERNET的广泛使用,使得TCP/IP成了事实上的标准。

之所以说TCP/IP是一个协议族,是因为TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、TELNETFTP、SMTP、ARP、TFTP等许多协议,这些协议一起称为TCP/IP协议。以下我们对协议族中一些常用协议英文名:

TCP(Transmission Control Protocol)传输控制协议

IP(Internet Protocol)网际协议

UDP(User Datagram Protocol)用户数据报协议

ICMP(Internet Control Message Protocol)互联网控制信息协议

SMTP(Simple Mail Transfer Protocol)简单邮件传输协议

SNMP(Simple Network manage Protocol)简单网络管理协议

FTP(File Transfer Protocol)文件传输协议

ARP(Address Resolation Protocol)地址解析协议

从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层。

其中:

网络接口层 这是TCP/IP软件的最低层,负责接收IP数据报并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层。

网络层负责相邻计算机之间的通信。其功能包括三方面。一、处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往 信宿机的路径,然后将数据报发往适当的网络接口。二、处理输入数据报:首先检查其合法性,然后进行寻径--假如该数据报已到达信宿机,则去掉报头,将剩下 部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。三、处理路径、流控、拥塞等问题。

传输层 提供应用程序间的通信。其功能包括:一、格式化信息流;二、提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。

应用层向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。远程登录TELNET使用TELNET协议提供在网络其它主机上注册的接 口。 TELNET会话提供了基于字符的虚拟终端。文件传输访问FTP使用FTP协议来提供网络内机器间的文件拷贝功能。

前面我们已经学过关于OSI参考模型的相关概念,现在我们来看一看,相对于七层协议参考模型,TCP/IP协议是如何实现网络模型的。

OSI中的层 功能 TCP/IP协议族

应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet

表示层 数据格式化,代码转换,数据加密 没有协议

会话层 解除或建立与别的接点的联系 没有协议

传输层 提供端对端的接口 TCP,UDP

网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP

数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU

物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802。IEEE802.2

数据链路层包括了硬件接口和协议ARP,RARP,这两个协议主要是用来建立送到物理层上的信息和接收从物理层上传来的信息;

网络层中的协议主要有IP,ICMP,IGMP等,由于它包含了IP协议模块,所以它是所有机遇TCP/IP协议网络的核心。在网络层中,IP模块完成大 部分功能。ICMP和IGMP以及其他支持IP的协议帮助IP完成特定的任务,如传输差错控制信息以及主机/路由器之间的控制电文等。网络层掌管着网络中 主机间的信息传输。

传输层上的主要协议是TCP和UDP。正如网络层控制着主机之间的数据传递,传输层控制着那些将要进入网络层的数据。两个协议就是它管理这些数据的两种方 式:TCP是一个基于连接的协议(还记得我们在网络基础中讲到的关于面向连接的服务和面向无连接服务的概念吗?忘了的话,去看看);UDP则是面向无连接 服务的管理方式的协议。

应用层位于协议栈的顶端,它的主要任务就是应用了。上面的协议当然也是为了这些应用而设计的,具体说来一些常用的协议功能如下:

Telnet:提供远程登录(终端仿真)服务,好象比较古老的BBS就是用的这个登陆。

FTP :提供应用级的文件传输服务,说的简单明了点就是远程文件访问等等服务;

SMTP:不用说拉,天天用到的电子邮件协议。

TFTP:提供小而简单的文件传输服务,实际上从某个角度上来说是对FTP的一种替换(在文件特别小并且仅有传输需求的时候)。

SNTP:简单网络管理协议。看名字就不用说什么含义了吧。

DNS:域名解析服务,也就是如何将域名映射城IP地址的协议。

HTTP:不知道各位对这个协议熟不熟悉啊?这是超文本传输协议,你之所以现在能看到网上的图片,动画,音频,等等,都是仰仗这个协议在起作用啊!

2008年11月7日星期五

zzVim的编码及字体问题详解

Vim的编码及字体问题详解

2007-07-30 09:58:19 Linux联盟收集整理

和所有的流行文本编辑器一样,Vim 可以很好的编辑各种字符编码的文件,这当然包括UCS-2、UTF-8 等流行的 Unicode 编码方式。然而不幸的是,和很多来自 Linux 世界的软件一样,这需要你自己动手设置。

Vim 有四个跟字符编码方式有关的选项,encoding、fileencoding、fileencodings、termencoding (这些选项可能的取值请参考 Vim 在线帮助 :help encoding-names),它们的意义如下:

* encoding: Vim 内部使用的字符编码方式,包括 Vim 的 buffer (缓冲区)、菜单文本、消息文本等。默认是根据你的locale选择.用户手册上建议只在 .vimrc 中改变它的值,事实上似乎也只有在.vimrc 中改变它的值才有意义。你可以用另外一种编码来编辑和保存文件,如你的vim的encoding为utf-8,所编辑的文件采用cp936编码,vim会 自动将读入的文件转成utf-8(vim的能读懂的方式),而当你写入文件时,又会自动转回成cp936(文件的保存编码).

* fileencoding: Vim 中当前编辑的文件的字符编码方式,Vim 保存文件时也会将文件保存为这种字符编码方式 (不管是否新文件都如此)。

* fileencodings: Vim自动探测fileencoding的顺序列表, 启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将Unicode 编码方式放到这个列表的最前面,将拉丁语系编码方式 latin1 放到最后面。

* termencoding: Vim 所工作的终端 (或者 Windows 的 Console 窗口) 的字符编码方式。如果vim所在的term与vim编码相同,则无需设置。如其不然,你可以用vim的termencoding选项将自动转换成term 的编码.这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效,而对 Console 模式的Vim 而言就是 Windows 控制台的代码页,并且通常我们不需要改变它。

好了,解释完了这一堆容易让新手犯糊涂的参数,我们来看看 Vim 的多字符编码方式支持是如何工作的。

1. Vim 启动,根据 .vimrc 中设置的 encoding 的值来设置 buffer、菜单文本、消息文的字符编码方式。

2. 读取需要编辑的文件,根据 fileencodings 中列出的字符编码方式逐一探测该文件编码方式。并设置 fileencoding 为探测到的,看起来是正确的 (注1) 字符编码方式。

3. 对比 fileencoding 和 encoding 的值,若不同则调用 iconv 将文件内容转换为encoding 所描述的字符编码方式,并且把转换后的内容放到为此文件开辟的 buffer 里,此时我们就可以开始编辑这个文件了。注意,完成这一步动作需要调用外部的 iconv.dll(注2),你需要保证这个文件存在于 $VIMRUNTIME 或者其他列在 PATH 环境变量中的目录里。

4. 编辑完成后保存文件时,再次对比 fileencoding 和 encoding 的值。若不同,再次调用 iconv 将即将保存的 buffer 中的文本转换为 fileencoding 所描述的字符编码方式,并保存到指定的文件中。同样,这需要调用 iconv.dll由于 Unicode 能够包含几乎所有的语言的字符,而且 Unicode 的 UTF-8 编码方式又是非常具有性价比的编码方式 (空间消耗比 UCS-2 小),因此建议 encoding 的值设置为utf-8。这么做的另一个理由是 encoding 设置为 utf-8 时,Vim 自动探测文件的编码方式会更准确 (或许这个理由才是主要的 ;)。我们在中文 Windows 里编辑的文件,为了兼顾与其他软件的兼容性,文件编码还是设置为 GB2312/GBK 比较合适,因此 fileencoding 建议设置为 chinese (chinese 是个别名,在 Unix 里表示 gb2312,在 Windows 里表示cp936,也就是 GBK 的代码页)。

以 下是我的 .vimrc(见附件) 中关于字符编码方式设置的内容,这个设置比较有弹性,可以根据系统中的环境变量 $LANG (当然,Windows 中的写法是 %LANG%) 的值来自动设置合适的字符编码方式。此时,推荐设置 %LANG% = zh_CN.UTF-8,可以通过后面的 Windows 注册表脚本文件来方便的做到。

注1: 事实上,Vim 的探测准确度并不高,尤其是在 encoding 没有设置为 utf-8 时。因此强烈建议将 encoding 设置为 utf-8,虽然如果你想 Vim 显示中文菜单和提示消息的话这样会带来另一个小问题。

注2: 在 GNU 的 FTP 上可以下载到 iconv 的 Win32 版(http://mirrors.kernel.org/gnu/libiconv/libiconv-1.9.1.bin.woe32.zip),不 推荐去GnuWin32(http://gnuwin32.sourceforge.net/) 下载 libiconv,因为那个版本旧一些,并且需要自己改名 dll 文件。

注3: 查看帮助 :h iconv-dynamic

On MS-Windows Vim can be compiled with the |+iconv/dyn| feature. This means

Vim will search for the "iconv.dll" and "libiconv.dll" libraries. When

neither of them can be found Vim will still work but some conversions won't be

possible.

附1:vimrc文件

" Multi-encoding setting, MUST BE IN THE BEGINNING OF .vimrc!
"
if has("multi_byte")
" When 'fileencodings' starts with 'ucs-bom', don't do this manually
"set bomb
set fileencodings=ucs-bom,chinese,taiwan,japan,korea,utf-8,latin1
" CJK environment detection and corresponding setting
if v:lang =~ "^zh_CN"
" Simplified Chinese, on Unix euc-cn, on MS-Windows cp936
set encoding=chinese
set termencoding=chinese
if &fileencoding == ''
set fileencoding=chinese
endif
elseif v:lang =~ "^zh_TW"
" Traditional Chinese, on Unix euc-tw, on MS-Windows cp950
set encoding=taiwan
set termencoding=taiwan
if &fileencoding == ''
set fileencoding=taiwan
endif
elseif v:lang =~ "^ja_JP"
" Japanese, on Unix euc-jp, on MS-Windows cp932
set encoding=japan
set termencoding=japan
if &fileencoding == ''
set fileencoding=japan
endif
elseif v:lang =~ "^ko"
" Korean on Unix euc-kr, on MS-Windows cp949
set encoding=korea
set termencoding=korea
if &fileencoding == ''
set fileencoding=korea
endif
endif
" Detect UTF-8 locale, and override CJK setting if needed
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set encoding=utf-8
endif
else
echoerr 'Sorry, this version of (g)Vim was not compiled with "multi_byte"'
endif

附2:

Supported 'encoding' values are:                        *encoding-values*
1 latin1 8-bit characters (ISO 8859-1)
1 iso-8859-n ISO_8859 variant (n = 2 to 15)
1 koi8-r Russian
1 koi8-u Ukrainian
1 macroman MacRoman (Macintosh encoding)
1 8bit-{name} any 8-bit encoding (Vim specific name)
1 cp437 similar to iso-8859-1
1 cp737 similar to iso-8859-7
1 cp775 Baltic
1 cp850 similar to iso-8859-4
1 cp852 similar to iso-8859-1
1 cp855 similar to iso-8859-2
1 cp857 similar to iso-8859-5
1 cp860 similar to iso-8859-9
1 cp861 similar to iso-8859-1
1 cp862 similar to iso-8859-1
1 cp863 similar to iso-8859-8
1 cp865 similar to iso-8859-1
1 cp866 similar to iso-8859-5
1 cp869 similar to iso-8859-7
1 cp874 Thai
1 cp1250 Czech, Polish, etc.
1 cp1251 Cyrillic
1 cp1253 Greek
1 cp1254 Turkish
1 cp1255 Hebrew
1 cp1256 Arabic
1 cp1257 Baltic
1 cp1258 Vietnamese
1 cp{number} MS-Windows: any installed single-byte codepage
2 cp932 Japanese (Windows only)
2 euc-jp Japanese (Unix only)
2 sjis Japanese (Unix only)
2 cp949 Korean (Unix and Windows)
2 euc-kr Korean (Unix only)
2 cp936 simplified Chinese (Windows only)
2 euc-cn simplified Chinese (Unix only)
2 cp950 traditional Chinese (on Unix alias for big5)
2 big5 traditional Chinese (on Windows alias for cp950)
2 euc-tw traditional Chinese (Unix only)
2 2byte-{name} Unix: any double-byte encoding (Vim specific name)
2 cp{number} MS-Windows: any installed double-byte codepage
u utf-8 32 bit UTF-8 encoded Unicode (ISO/IEC 10646-1)
u ucs-2 16 bit UCS-2 encoded Unicode (ISO/IEC 10646-1)
u ucs-2le like ucs-2, little endian
u utf-16 ucs-2 extended with double-words for more characters
u utf-16le like utf-16, little endian
u ucs-4 32 bit UCS-4 encoded Unicode (ISO/IEC 10646-1)
u ucs-4le like ucs-4, little endian

The {name} can be any encoding name that your system supports. It is passed
to iconv() to convert between the encoding of the file and the current locale.
For MS-Windows "cp{number}" means using codepage {number}.

Several aliases can be used, they are translated to one of the names above.
An incomplete list:

1 ansi same as latin1 (obsolete, for backward compatibility)
2 japan Japanese: on Unix "euc-jp", on MS-Windows cp932
2 korea Korean: on Unix "euc-kr", on MS-Windows cp949
2 prc simplified Chinese: on Unix "euc-cn", on MS-Windows cp936
2 chinese same as "prc"
2 taiwan traditional Chinese: on Unix "euc-tw", on MS-Windows cp950
u utf8 same as utf-8
u unicode same as ucs-2
u ucs2be same as ucs-2 (big endian)
u ucs-2be same as ucs-2 (big endian)
u ucs-4be same as ucs-4 (big endian)
default stands for the default value of 'encoding', depends on the
environment



http://www.xxlinux.com/linux/article/accidence/technique/20070730/9171.html

//-------------------------------------------------------------------------------------------



http://www.pmme.cn/archives/the-encoding-of-vim/

一般的,vim打开中文文件时会出现乱码,原因比较复杂,不罗嗦了。直接讲解决办法

set fileencoding=gb18030
set fileencodings=utf-8,gb18030,utf-16,big5

想看这样设置的原因吗?请继续。下文在网络中广泛流传

vim里面的编码主要跟三个参数有关:enc(encoding), fenc(fileencoding)和fencs(fileencodings)

其中fenc是当前文件的编码,也就是说,一个在vim里面已经正确显示了的文件(前提是你的系统环境跟你的enc设置匹配),你可以通过改变 fenc后再w来将此文件存成不同的编码。比如说,我:set fenc=utf-8然后:w就把文件存成utf-8的了,:set fenc=gb18030再:w就把文件存成gb18030的了。这个值对于打开文件的时候是否能够正确地解码没有任何关系。

fencs就是用来在打开文件的时候进行解码的猜测列表。文件编码没有百分百正确的判断方法,所以vim只能猜测文件编码。比如我的vimrc里面这个的设置是

set fileencodings=utf-8,gb18030,utf-16,big5

所以我的vim每打开一个文件,先尝试用utf-8进行解码,如果用utf-8解码到了一半出错(所谓出错的意思是某个地方无法用utf-8正确地解 码),那么就从头来用gb18030重新尝试解码,如果gb18030又出错(注意gb18030并不是像utf-8似的规则编码,所以所谓的出错只是说 某个编码没有对应的有意义的字,比如0),就尝试用utf-16,仍然出错就尝试用big5。这一趟下来,如果中间的某次解码从头到尾都没有出错,那么 vim就认为这个文件是这个编码的,不会再进行后面的尝试了。这个时候,fenc的值就会被设为vim最后采用的编码值,可以用:set fenc?来查看具体是什么。

当然这个也是有可能出错的,比如你的文件是gb18030编码的,但是实际上只有一两个字符是中文,那么有可能他们正好也能被utf-8解码,那么这个文件就会被误认为是utf-8的导致错误解码。

至于enc,其作用基本只是显示。不管最后的文件是什么编码的,vim都会将其转换为当前系统编码来进行处理,这样才能在当前系统里面正确地显示出来,因 此enc就是干这个的。在windows下面,enc默认是cp936,这也就是中文windows的默认编码,所以enc是不需要改的。在 linux下,随着你的系统locale可能设为zh_CN.gb18030或者zh_CN.utf-8,你的enc要对应的设为gb18030或者 utf-8(或者gbk之类的)。

最后再来说一下新建空文件的默认编码。看文档好像说会采用fencs里面的第一个编码作为新建文件的默认编码。但是这里有一个问题,就是fencs 的顺序跟解码成功率有很大关系,根据我的经验utf-8在前比gb18030在前成功率要高一些,那么如果我新建文件默认想让它是gb18030编码怎么 办?一个方法是每次新建文件后都:set fenc=gb18030一下,不过我发现在vimrc里面设置fenc=gb18030也能达到这个效果。

另外,在ubuntu中文论坛还有人提出了这样的办法,直接就配置了

所有代码直接粘贴到终端运行即可!
安装程序
代码:
sudo apt-get install vim-gtk vim-doc cscope

创建启动项
代码:

cat > /usr/share/applications/gvim.desktop < $HOME/.vimrc << “EOF”
“===========================================================================
” 项目: gvim 配置文件
” 作者: yonsan [QQ:82555472]
” 安装: sudo apt-get install vim-gtk
” 用法: 将本文件(.vimrc)拷贝到$HOME/
“===========================================================================

” 使用 murphy 调色板
colo murphy
” 设置用于GUI图形用户界面的字体列表。
set guifont=SimSun 10

set nocompatible
” 设定文件浏览器目录为当前目录
set bsdir=buffer
set autochdir
” 设置编码
set enc=utf-8
” 设置文件编码
set fenc=utf-8
” 设置文件编码检测类型及支持格式
set fencs=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
” 指定菜单语言
set langmenu=zh_CN.UTF-8
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
” 设置语法高亮度
set syn=cpp
“显示行号
set nu!
” 查找结果高亮度显示
set hlsearch
” tab宽度
set tabstop=4
set cindent shiftwidth=4
set autoindent shiftwidth=4
” C/C++注释
set comments=://
” 修正自动C式样注释功能
set comments=s1:/*,mb:*,ex0:/
” 增强检索功能
set tags=./tags,./../tags,./**/tags
” 保存文件格式
set fileformats=unix,dos
” 键盘操作
map gk
map gj
” 命令行高度
set cmdheight=1
” 使用cscope
if has(”cscope”)
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb
” add any database in current directory
if filereadable(”cscope.out”)
cs add cscope.out
” else add database pointed to by environment
elseif $CSCOPE_DB != “”
cs add $CSCOPE_DB
endif
set csverb
endi
” 中文帮助
if version > 603
set helplang=cn
endi
EOF

locale为zh_CN.gbk的配置文件
代码:

cat > $HOME/.vimrc << “EOF”
“===========================================================================
” 项目: gvim 配置文件
” 作者: yonsan [QQ:82555472]
” 安装: sudo apt-get install vim-gtk
” 用法: 将本文件(.vimrc)拷贝到$HOME/
“===========================================================================

” 使用 murphy 调色板
colo murphy
” 设置用于GUI图形用户界面的字体列表。
set guifont=SimSun 10

set nocompatible
” 设定文件浏览器目录为当前目录
set bsdir=buffer
set autochdir
” 设置编码
set enc=chinese
” 设置文件编码
set fenc=chinese
” 设置文件编码检测类型及支持格式
set fencs=gbk,utf-8,ucs-bom,gb18030,gb2312,cp936
” 指定菜单语言
set langmenu=zh_CN.GBK
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
” 设置语法高亮度
set syn=cpp
“显示行号
set nu!
” 查找结果高亮度显示
set hlsearch
” tab宽度
set tabstop=4
set cindent shiftwidth=4
set autoindent shiftwidth=4
” C/C++注释
set comments=://
” 修正自动C式样注释功能
set comments=s1:/*,mb:*,ex0:/
” 增强检索功能
set tags=./tags,./../tags,./**/tags
” 保存文件格式
set fileformats=unix,dos
” 键盘操作
map gk
map gj
” 命令行高度
set cmdheight=1
” 使用cscope
if has(”cscope”)
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb
” add any database in current directory
if filereadable(”cscope.out”)
cs add cscope.out
” else add database pointed to by environment
elseif $CSCOPE_DB != “”
cs add $CSCOPE_DB
endif
set csverb
endi
” 中文帮助
if version > 603
set helplang=cn
endi

EOF