LIULIANG

2013年10月10日

Ubuntu下进行安装视频录制

因为工作需要,所以到网上搜索在Ubuntu系统下的屏幕录制软件。在搜索中遇到RecordMyDesktop这个软件,亲自安装试用了一下操作简单易用。声音和画面可以同步录制。在Ubuntu系统下需要炫自己屏幕作品的人可以下载试用一下。

文件名:recordMyDesktop

参考文献出处:  http://sosyi.iteye.com/blog/1130992

目前为止我只在Gnome桌面环境下使用,所以就gnome环境下的安装方法简要说明。按装方法很简单,在终端输入一下命令就可以安装。

命令行:sudo apt-get install gtk-recordmydesktop

依照上面的文献,KDE环境的用户输入以下命令

命令行:sudo apt-get install qt-recordmydesktop

安装完成后可以在 Applications -> Video & Sound 下面找到。
使用recordMyDesktop录制的视频是ogv格式的视频,将其转换为avi格式的,就要使用到mencoder软件,
安装mencoder软件:
sudo apt-get install mencoder
转换:
mencoder out.ogv -o out.avi -oac mp3lame -ovc lavc
如果不需要声音的话,可以这样
mencoder out.ogv -o out.avi -nosound -ovc lavc

来自:
http://blog.sina.com.cn/s/blog_4a504d380100yees.html
http://www.cnblogs.com/linuxcat/archive/2012/10/04/2711389.html

posted @ 2013-10-10 22:20 BIG森林 阅读(780) | 评论 (0)编辑 收藏

2013年7月6日

Struts2文件上传的大小限制问题 转载

问题:上传大文件大小限制

解决方案:修改struts.xml文件中的参数如下
<constant name="struts.multipart.maxSize" value="55000000"/>

<action name="UploadFile" class="com.buptisc.srpms.action.UploadFileAction">
            
<result name="UploadFileResult">/pages/ShowOtherFiles.jsp</result>
            
<result name="JGBsuccess">/pages/JGBdetail.jsp</result>
            
<interceptor-ref name="fileUpload">
                
<param name="savePath">/data</param>  
                
<param name="maximumSize">52428800</param> 
            
</interceptor-ref>
            
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>

struts.xml文件中的大小与实际文件大小的关系:1048576(Bytes) = 1024*1024 = 1M实际文件大小.
struts.multipart.maxSize掌控整个项目所上传文件的最大的Size
struts.multipart.maxSize和fileUpload拦截器的maximumSize属性分工不同,总结如下:
1.struts.multipart.maxSize掌控整个项目所上传文件的最大的Size。超过了这个size,后台报错,程序处理不了如此大的文件。fielderror里面会有如下的提示:
the request was rejected because its size (16272982) exceeds the configured maximum (9000000)
2.fileUpload拦截器的maximumSize属性必须小于struts.multipart.maxSize的值。
struts.multipart.maxSize默认2M,当maximumSize大于2M时,必须设置struts.multipart.maxSize的值大于maximumSize。
3.当上传的文件大于struts.multipart.maxSize时,系统报错
当上传的文件在struts.multipart.maxSize和maximumSize之间时,系统提示:
File too large: file "MSF的概念.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
当上传的文件小于maximumSize,上传成功。

转自:http://www.cnblogs.com/forlina/archive/2011/9/8.html

posted @ 2013-07-06 16:07 BIG森林 阅读(759) | 评论 (0)编辑 收藏

2013年5月3日

mysql中TIMESTAMP设置默认值的灵活运用

mysql中TIMESTAMP设置默认值的灵活运用 2011-08-18 12:12:51

分类: Mysql/postgreSQL

 

默认值:

CURRENT_TIMESTAMP :当我更新这条记录的时候,这条记录的这个字段不会改变

CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP :当我更新这条记录的时候,这条记录的这个字段将会改变。即时间变为了更新时候的时间。(注意一个UPDATE设置一个列为它已经有的值,这将不引起TIMESTAMP列被更新,因为如果你设置一个列为它当前的值,MySQL为了效率而忽略更改。)

如果有多个TIMESTAMP列,只有第一个自动更新。


#1创建一个有两个timestamp字段的表dj1。
root@localhost:test >create table dj1 (a char(1), b timestamp ,c timestamp);
Query OK, 0 rows affected (0.01 sec)

#2插入两行数据,仅赋值于列A
root@localhost:test >insert into dj1 values (1,null,null);
Query OK, 1 row affected (0.00 sec)

root@localhost:test >insert into dj1 values (2,null,null);
Query OK, 1 row affected (0.00 sec)

#3查询插入数据,b,c两列都使用current timestamp作为默认值。
root@localhost:test >select * from dj1;
+------+---------------------+---------------------+
| a | b | c |
+------+---------------------+---------------------+
| 1 | 2009-09-09 13:48:40 | 2009-09-09 13:48:40 |
| 2 | 2009-09-09 13:48:44 | 2009-09-09 13:48:44 |
+------+---------------------+---------------------+
2 rows in set (0.00 sec)

#4更新一行数据,发现b列timestamp被自动更新,而c列保持不变。
root@localhost:test >update dj1 set a=9 where a=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

root@localhost:test >select * from dj1;
+------+---------------------+---------------------+
| a | b | c |
+------+---------------------+---------------------+
| 9 | 2009-09-09 13:49:08 | 2009-09-09 13:48:40 |
| 2 | 2009-09-09 13:48:44 | 2009-09-09 13:48:44 |
+------+---------------------+---------------------+
2 rows in set (0.00 sec)

#5再更新一列,仍然如#4
root@localhost:test >update dj1 set a=8 where a=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

root@localhost:test >select * from dj1;
+------+---------------------+---------------------+
| a | b | c |
+------+---------------------+---------------------+
| 9 | 2009-09-09 13:49:08 | 2009-09-09 13:48:40 |
| 8 | 2009-09-09 13:49:36 | 2009-09-09 13:48:44 |
+------+---------------------+---------------------+
2 rows in set (0.00 sec)

#6在b列上创建唯一索引
root@localhost:test >create unique index dj1_idx_u1 on dj1(b);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

#7更新所有行a列,报唯一性冲突。
root@localhost:test >update dj1 set a=1;
ERROR 1062 (23000): Duplicate entry '2009-09-09 13:54:45' for key 'dj1_idx_u1'

#8查看表定义,可以看到b列有个属性ON UPDATE CURRENT_TIMESTAMP,导致更新数据时,即便未涉及到该列,该列数据也被自动更新。
另一方面,c列默认值是'0000-00-00 00:00:00',实际插入已经被自动赋值为current_timestamp。
root@localhost:test >show create table dj1\G
*************************** 1. row ***************************
Table: dj1
Create Table: CREATE TABLE `dj1` (
`a` char(1) COLLATE utf8_bin DEFAULT NULL,
`b` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`c` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
UNIQUE KEY `dj1_idx_u1` (`b`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)

#9创建表dj2,列b不带自动更新属性。
root@localhost:test >CREATE TABLE `dj2` (
-> `a` char(1) COLLATE utf8_bin DEFAULT NULL,
-> `b` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,
-> `c` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
-> UNIQUE KEY `dj1_idx_u1` (`b`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Query OK, 0 rows affected (0.01 sec)

#10插入dj2测试数据
root@localhost:test >insert into dj2 values (1,null,null);
Query OK, 1 row affected (0.00 sec)

root@localhost:test >insert into dj2 values (2,null,null);
Query OK, 1 row affected (0.00 sec)

#11查看dj2数据
root@localhost:test >select * from dj2;
+------+---------------------+---------------------+
| a | b | c |
+------+---------------------+---------------------+
| 1 | 2009-09-09 14:02:55 | 2009-09-09 14:02:55 |
| 2 | 2009-09-09 14:03:00 | 2009-09-09 14:03:00 |
+------+---------------------+---------------------+
2 rows in set (0.00 sec)

#12dj2上创建唯一索引
root@localhost:test >create unique index dj2_idx_u1 on dj2(b);
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0

#更新数据成功
root@localhost:test >update dj2 set a=9;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0

root@localhost:test >select * from dj2;
+------+---------------------+---------------------+
| a | b | c |
+------+---------------------+---------------------+
| 9 | 2009-09-09 14:02:55 | 2009-09-09 14:02:55 |
| 9 | 2009-09-09 14:03:00 | 2009-09-09 14:03:00 |
+------+---------------------+---------------------+
2 rows in set (0.00 sec)

#13创建表dj3,b列默认值为CURRENT_TIMESTAMP,c列默认值为CURRENT_TIMESTAMP带自动更新属性,报错,不允许行为。
root@localhost:test >CREATE TABLE `dj3` (
-> `a` char(1) COLLATE utf8_bin DEFAULT NULL,
-> `b` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,
-> `c` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-> UNIQUE KEY `dj1_idx_u1` (`b`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

#14创建表dj4,b列默认值为CURRENT_TIMESTAMP,c列默认值为'0000-00-00 00:00:00'带自动更新属性,报错,不允许行为。
root@localhost:test >CREATE TABLE `dj4` (
-> `a` char(1) COLLATE utf8_bin DEFAULT NULL,
-> `b` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,
-> `c` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
-> UNIQUE KEY `dj1_idx_u1` (`b`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

#15创建表dj5,b列默认值为CURRENT_TIMESTAMP带自动更新属性,c列默认值为CURRENT_TIMESTAMP,报错,不允许行为。
root@localhost:test >CREATE TABLE `dj5` (
-> `a` char(1) COLLATE utf8_bin DEFAULT NULL,
-> `b` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-> `c` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,
-> UNIQUE KEY `dj1_idx_u1` (`b`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

conclusion:
1.MySQL默认表的第一个timestamp字段为NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP属性,必须显式定义改变这种行为。
2.MySQL只允许一个timestamp字段拥有[DEFAULT CURRENT_TIMESTAMP |ON UPDATE CURRENT_TIMESTAMP]属性。 我的理解为要么都是DEFAULT CURRENT_TIMESTAMP 要么都是DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

3.修改字段属性值

show create table tbl_ledgerrecord;
alter table tbl_ledgerrecord change intoStorageDate  intoStorageDate timestamp DEFAULT CURRENT_TIMESTAMP;


转自:http://blog.chinaunix.net/uid-20577907-id-2213871.html

posted @ 2013-05-03 22:20 BIG森林 阅读(673) | 评论 (0)编辑 收藏

2013年1月6日

浅谈Radius协议

一.RADIUS协议原理

 

        RADIUSRemote Authentication Dial In User Service 用户远程拨入认证服务,它主要针对的远程登录类型有:SLIPPPPtelnetrlogin等。RADIUS协议应用范围很广,包括普通电话、上网业务计费,对VPN的支持可以使不同的拨入服务器的用户具有不同权限。

 

RADIUS典型应用环境如下:

 

radius典型应用

 

 

 

 

RADIUS数据包分为5个部分:

(1)       Code:1个字节,用于区分RADIUS包的类型:常用类型有:

接入请求(Access-Request),Code=1;接入允许(Access-Accept),Code=2;接入拒绝(Access-Reject),Code=3;计费请求(Accounting-Request),Code=4等。

2Identifier:一个字节,用于请求和应答包的匹配。

3Length:两个字节,表示RADIUS数据区(包括Code, Identifier, Length, Authenticator, Attributes)的长度,单位是字节,最小为20,最大为4096

4Authenticator:16个字节,用于验证服务器端的应答,另外还用于用户口令的加密。RADIUS服务器和NAS的共享密钥(Shared Secret)与请求认证码(Request Authenticator)和应答认证码(Response Authenticator),共同支持发、收报文的完整性和认证。另外,用户密码不能在NASRADIUS 服务器之间用明文传输,而一般使用共享密钥(Shared Secret)和认证码(Authenticator)通过MD5加密算法进行加密隐藏。

5Attributes:不定长度,最小可为0个字节,描述RADIUS协议的属性,如用户名、口令、IP地址等信息都是存放在本数据段。

各个属性的详细编码信息,以及数据格式,限于篇幅,这里不作具体介绍,感兴趣的,可以参看RFC文档,或与我交流。

 

二.RADIUS协议实现

 

目前,开源软件包freeRadius , tinyRadius,可以下载到其实现的源码。freeRadius是目前功能最强大的开源 RADIUS 服务器软件,采用C语言实现,采用了多进程,进程池的处理方法,拥有很好的吞吐处理能力,同时,提供了连接各种数据库的应用接口,方便用户根据自己的需要进行适当的扩展。值得一提的是,它采用模块化处理,用户可以定做适合自己的认证计费处理模块。

freeRadius的功能强大,也造成了它模块的庞大,不易维护,对安装环境有一些要求。tinyRadius采用Java开发,短小精悍,能接收各种标准协议中的数据包,可以快速的完成对RADIUS数据包的封装与解包,我们可以自己的需要进行某些处理,具有很大的自由度,唯一的缺陷是单线程,没有数据库接口。

 

三.RADIUS协议对安全的考虑

 

RADIUS采用UDP协议基于以下几点原因:

1. NASRADIUS服务器大多在同一个局域网中,使用UDP更加快捷方便。

2. 简化了服务端的实现。

事实证明,采用UDP协议可行,RADIUS有自己的机制,来解决UDP丢包特点。

如果NAS向某个RADIUS服务器提交请求没有收到返回信息,那么可以要求备份RADIUS服务器重传。由于有多个备份RADIUS服务器,因此NAS进行重传的时候,可以采用轮询的方法。如果备份RADIUS服务器的密钥和以前RADIUS服务器的密钥不同,则需要重新进行认证。

下面重点从RADIUS协议来谈下它在身份认证中如何确保安全认证的。

1. Authenticator:鉴别码,分为请求鉴别码,回应鉴别码。                         

“Access-Request”数据包中,Authenticator是一个16字节的随机数,称为“Request Authenticator” 在机密的整个生存周期中(如RADIUAS服务器和客户端共享的机密),这个值应该是不可预测的,并且是唯一的,因为具有相同密码的重复请求值,使黑客有机会用已截取的响应回复用户因为同一机密可以被用在不同地理区域中的服务器的验证中,所以请求认证域应该具有全球和临时唯一性。

为防止数据包中数据被截获被篡改,回应鉴别码采用如下方式生成:

ResponseAuth = MD5(Code+ID+Length+RequestAuth+ Attributes+Secret)

回应鉴别码是对整个数据包进行MD5演算产生的16字节索引,防止伪造服务器的回应。

2.加密方式。PAPCAHPEAP以及Unix登录认证三种加密认证方式。最常用的是前两种,下面介绍下:

PAP加密,采用此加密方法时,密码存放在User-Password属性中。

User-Password加密方法:

1.在密码的末尾用nulls代替填补形成多个十六个字节的二进制数;

2.把密码按16个字节为一组划分为p1p2等等;

 b1=MD5(Secret + Authenticator) c(1) = p1 异或 b1

 b2 = MD5(S + c(1))     c(2) = p2 异或b2

                                .

                                .

                                .

 bi = MD5(S + c(i-1))   c (i) = pi 异或 bi

c(1)+c(2)+...+c (i)

 在接收时,这个过程被反过来,由于采用异或方式贯穿在每16个字节之间,同样的算法再异或一次,然后配合MD5演算,从而生成原始的密码,尽管这种加密方式是可逆的,黑客截获到密文后,能通过一定的手段来破解出密码,但如果共享密钥未知的情况下,很难破解,也就只能采用蛮力破解方法。使用共享密钥应采用合适的长度,来防止破解,不应过短。

 

PAP加密方法使密码以密文的方式在网络中进行传输,使黑客仍有有机可乘的机会,但CHAP加密方法阻止了密码的传输。

CHAP加密,采用此加密方法时,密码存放在Chap-Password属性中。

这种加密方法的原则是不是密码在网络中进行传输,而只是传输一个索引值,从而增加了安全性,但这样做的代价是,RADIUS服务端必须要知道用户的密码,从而再现密码索引值来和发来的认证请求中的密码索引值比对。

Chap-Password加密方法:

Md5(chapId+password+chapChallenge);

chapId :可以是随机产生的一字节码;

chapChallenge :NAS生成一个随机挑战字(16个字节比较合适)

              该字段有时缺失,读取Authenticator域作为挑战字。

3.共享密钥(Secret):共享密钥在密码加密以及数据包的鉴别码部分都参与了运算,即使RADIUS数据包被截获,但不知道共享密钥,很难破解用户的密码伪造数据。共享密钥应采用合适的长度,不应过短,宽大密码范围能有效提供对穷举搜寻攻击的防卫,随着密钥长度的增加,其破解花费的时间将大大增加。

4.为防止非法用户的重放攻击,造成服务器瘫痪。如果在一个很短的时间片段里,一个请求有相同的客户源IP地址、源UDP端口号和标识符,RADIUS服务器会认为这是上一个重复的请求,将直接丢弃,不做任何处理。

 

 

四.总结

 

Radius协议本身比较易掌握,在应用中,可以结合其自身的密码方式,实现满足企业需要的更高强度的强认证,比如结合各种令牌卡,手机短信等等。对协议进行开发,离不开各种抓包工具,像sniffer,tcpdump,ethereal等抓包工具的使用。

 

外部用户要访问某局域网络中计算机设备,其访问方式有多种,比如采用VPN拨号,Telnet等等。如用户Telnet登陆时,产生用户名和密码信息,而NAS服务器AAA配置中指定了采用RADIUS作为认证服务器,则将其封装成RADIUS请求数据包发送到RADIUS服务器进行身份认证,RADIUS服务器通过NAS和用户进行交流,以提示用户认证通过与否,以及是否需要Challenge身份认证。

 

其工作原理为:用户接入NAS Net Access Server),NAS一般为路由器等设备,NASRADIUS服务器使用Access-Request数据包提交用户信息,包括用户名、密码等相关信息,其中用户密码是经过MD5加密的,双方使用共享密钥,这个密钥不经过网络传播;RADIUS服务器对用户名和密码的合法性进行检验,必要时可以提出一个Challenge,要求进一步对用户认证,也可以对NAS进行类似的认证;如果合法,给NAS返回Access-Accept数据包,允许用户进行下一步工作,否则返回Access-Reject数据包,拒绝用户访问;如果允许访问,NASRADIUS服务器提出计费请求Account-RequireRADIUS服务器响应Account-Accept,对用户的计费开始,同时用户可以进行自己的相关操作。

RADIUS还支持代理和漫游功能。简单地说,代理就是一台服务器,可以作为其他RADIUS服务器的代理,负责转发RADIUS认证和计费数据包。所谓漫游功能,就是代理的一个具体实现,这样可以让用户通过本来和其无关的RADIUS服务器进行认证。

RADIUS能够实现其功能依赖于它自身的数据包结构。RADIUS采用的是UDP传输协议,认证和计费监听端口一般分别为:18121813

以太网上的RADIUS封装后的包结构如下:

 

以太帧头

IP包头

UDP包头

RADIUS数据包

以太网FCS

 

 

 

在这里我们关心的是红色RADIUS数据包部分。

RADIUS数据包的格式如下:

 

radius数据包格式


转自:http://blog.csdn.net/cjx1986/article/details/4503524#comments

posted @ 2013-01-06 16:52 BIG森林 阅读(1689) | 评论 (0)编辑 收藏

2012年11月23日

linux查看linux版本,内核版本,系统位数,gcc版本

linux查看linux版本,内核版本,系统位数,gcc版本

1. 查看linux版本

  sunny@ubuntu:~$cat /etc/issue
Ubuntu 11.04 \n \l

 

2. 查看内核版本

1) sunny@ubuntu:~$ cat /proc/version
Linux version 2.6.38-13-generic (buildd@rothera) (gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) ) #57-Ubuntu SMP Mon Mar 5 18:10:14 UTC 2012

2)  uname命令

sunny@ubuntu:~$ uname -a
Linux ubuntu 2.6.38-13-generic #57-Ubuntu SMP Mon Mar 5 18:10:14 UTC 2012 i686 i686 i386 GNU/Linux

 

[ -------------------------------------------------------------------------------
  -a, --all                print all information, in the following order,       查看全部信息
                             except omit -p and -i if unknown:
  -s, --kernel-name        print the kernel name                               查看内核名字
  -n, --nodename           print the network node hostname
  -r, --kernel-release     print the kernel release                              查看内核发行版本
  -v, --kernel-version     print the kernel version                              查看内核版本
  -m, --machine            print the machine hardware name
  -p, --processor          print the processor type or "unknown"           
  -i, --hardware-platform  print the hardware platform or "unknown"
  -o, --operating-system   print the operating system                      查看操作系统
      --help     display this help and exit
      --version  output version information and exit

--------------------------------------------------------------------------------------]

 

3.查看系统位数

1) sunny@ubuntu:~$ getconf WORD_BIT
32

2)sunny@ubuntu:~$ file /bin/bash
/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped

 

4. 查看gcc版本

sunny@ubuntu:~$ gcc --version
gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2

转自:
http://hi.baidu.com/sunnnnnnnnny/item/b20fb816164a445ef0090ebd

posted @ 2012-11-23 11:05 BIG森林 阅读(701) | 评论 (0)编辑 收藏

2012年11月22日

Ubuntu /etc/network/interface

######################################################################
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)
#
# A "#" character in the very first column makes the rest of the line
# be ignored. Blank lines are ignored. Lines may be indented freely.
# A "\" character at the very end of the line indicates the next line
# should be treated as a continuation of the current one.
#
# The "pre-up", "up", "down" and "post-down" options are valid for all
# interfaces, and may be specified multiple times. All other options
# may only be specified once.
#
# See the interfaces(5) manpage for information on what options are
# available.
######################################################################

# We always want the loopback interface.
#
# auto lo
# iface lo inet loopback

# An example ethernet card setup: (broadcast and gateway are optional)
#
# auto eth0
# iface eth0 inet static
#     address 192.168.0.42
#     network 192.168.0.0
#     netmask 255.255.255.0
#     broadcast 192.168.0.255
#     gateway 192.168.0.1

# A more complicated ethernet setup, with a less common netmask, and a downright
# weird broadcast address: (the "up" lines are executed verbatim when the
# interface is brought up, the "down" lines when it's brought down)
#
# auto eth0
# iface eth0 inet static
#     address 192.168.1.42
#     network 192.168.1.0
#     netmask 255.255.255.128
#     broadcast 192.168.1.0
#     up route add -net 192.168.1.128 netmask 255.255.255.128 gw 192.168.1.2
#     up route add default gw 192.168.1.200
#     down route del default gw 192.168.1.200
#     down route del -net 192.168.1.128 netmask 255.255.255.128 gw 192.168.1.2

# A more complicated ethernet setup with a single ethernet card with
# two interfaces.
# Note: This happens to work since ifconfig handles it that way, not because
# ifup/down handles the ':' any differently.
# Warning: There is a known bug if you do this, since the state will not
# be properly defined if you try to 'ifdown eth0' when both interfaces
# are up. The ifconfig program will not remove eth0 but it will be
# removed from the interfaces state so you will see it up until you execute:
# 'ifdown eth0:1 ; ifup eth0; ifdown eth0'
# BTW, this is "bug" #193679 (it's not really a bug, it's more of a
# limitation)
#
# auto eth0 eth0:1
# iface eth0 inet static
#     address 192.168.0.100
#     network 192.168.0.0
#     netmask 255.255.255.0
#     broadcast 192.168.0.255
#     gateway 192.168.0.1
# iface eth0:1 inet static
#     address 192.168.0.200
#     network 192.168.0.0
#     netmask 255.255.255.0

# "pre-up" and "post-down" commands are also available. In addition, the
# exit status of these commands are checked, and if any fail, configuration
# (or deconfiguration) is aborted. So:
#
# auto eth0
# iface eth0 inet dhcp
#     pre-up [ -f /etc/network/local-network-ok ]
#
# will allow you to only have eth0 brought up when the file
# /etc/network/local-network-ok exists.

# Two ethernet interfaces, one connected to a trusted LAN, the other to
# the untrusted Internet. If their MAC addresses get swapped (because an
# updated kernel uses a different order when probing for network cards,
# say), then they don't get brought up at all.
#
# auto eth0 eth1
# iface eth0 inet static
#     address 192.168.42.1
#     netmask 255.255.255.0
#     pre-up /path/to/check-mac-address.sh eth0 11:22:33:44:55:66
#     pre-up /usr/local/sbin/enable-masq
# iface eth1 inet dhcp
#     pre-up /path/to/check-mac-address.sh eth1 AA:BB:CC:DD:EE:FF
#     pre-up /usr/local/sbin/firewall

# Two ethernet interfaces, one connected to a trusted LAN, the other to
# the untrusted Internet, identified by MAC address rather than interface
# name:
#
# auto eth0 eth1
# mapping eth0 eth1
#     script /path/to/get-mac-address.sh
#     map 11:22:33:44:55:66 lan
#     map AA:BB:CC:DD:EE:FF internet
# iface lan inet static
#     address 192.168.42.1
#     netmask 255.255.255.0
#     pre-up /usr/local/sbin/enable-masq $IFACE
# iface internet inet dhcp
#     pre-up /usr/local/sbin/firewall $IFACE

# A PCMCIA interface for a laptop that is used in different locations:
# (note the lack of an "auto" line for any of these)
#
# mapping eth0
#    script /path/to/pcmcia-compat.sh
#    map home,*,*,*                  home
#    map work,*,*,00:11:22:33:44:55  work-wireless
#    map work,*,*,01:12:23:34:45:50  work-static
#
# iface home inet dhcp
# iface work-wireless bootp
# iface work-static static
#     address 10.15.43.23
#     netmask 255.255.255.0
#     gateway 10.15.43.1
#
# Note, this won't work unless you specifically change the file
# /etc/pcmcia/network to look more like:
#
#     if [ -r ./shared ] ; then . ./shared ; else . /etc/pcmcia/shared ; fi
#     get_info $DEVICE
#     case "$ACTION" in
#         'start')
#             /sbin/ifup $DEVICE
#             ;;
#         'stop')
#             /sbin/ifdown $DEVICE
#             ;;
#     esac
#     exit 0

# An alternate way of doing the same thing: (in this case identifying
# where the laptop is is done by configuring the interface as various
# options, and seeing if a computer that is known to be on each particular
# network will respond to pings. The various numbers here need to be chosen
# with a great deal of care.)
#
# (note the lack of an "auto" line for any of these)
#
# mapping eth0
#    script /path/to/pcmcia-compat.sh
#    map home,*,*,*                  home
#    map work,*,*,00:11:22:33:44:55  work-wireless
#    map work,*,*,01:12:23:34:45:50  work-static
#
# iface home inet dhcp
# iface work-wireless bootp
# iface work-static static
#     address 10.15.43.23
#     netmask 255.255.255.0
#     gateway 10.15.43.1
#
# Note, this won't work unless you specifically change the file
# /etc/pcmcia/network to look more like:
#
#     if [ -r ./shared ] ; then . ./shared ; else . /etc/pcmcia/shared ; fi
#     get_info $DEVICE
#     case "$ACTION" in
#         'start')
#             /sbin/ifup $DEVICE
#             ;;
#         'stop')
#             /sbin/ifdown $DEVICE
#             ;;
#     esac
#     exit 0

# An alternate way of doing the same thing: (in this case identifying
# where the laptop is is done by configuring the interface as various
# options, and seeing if a computer that is known to be on each particular
# network will respond to pings. The various numbers here need to be chosen
# with a great deal of care.)
#
# iface eth0 inet manual
#       up ifconfig $IFACE 0.0.0.0 up
#       up ip link set $IFACE promisc on
#       down ip link set $IFACE promisc off
#       down ifconfig $IFACE down

# Set up an interface which will not be allocated an IP address by
# ifupdown but will be configured through external programs. This
# can be useful to setup interfaces configured through other programs,
# like, for example, PPPOE scripts.
#
# auto eth0
# iface eth0 inet manual
#       up ifconfig $IFACE 0.0.0.0 up
#       up /usr/local/bin/myconfigscript
#       down ifconfig $IFACE down

转自:
http://blog.chinaunix.net/uid-93067-id-90196.html

posted @ 2012-11-22 18:58 BIG森林 阅读(2148) | 评论 (0)编辑 收藏

网卡工作原理

网卡工作原理

Linux操作系统的功能可以概括为进程管理、内存管理、文件系统管理、设备管理、网络等几部分。所有的系统操作最终都可以映射到对物理设备的操作。除去对CPU、内存以及其他少数几个物理实体的操作之外,系统对其他设备的所有操作都通过专门的称为驱动程序的代码完成。系统中存在的每种外设在内核中都必须有对应的设备驱动程序对其进行处理。所以分析网卡的工作原理即是分析网卡的驱动程序。

网络是独立的一个模块。为了屏蔽网络环境中物理网络设备的多样性,Linux对所有的设备进行抽象并定义了一个统一的概念,称之为接口。所有对网络硬件的访问都是通过接口进行的,接口提供了一个对所有类型的硬件一致化的操作集合来处理基本数据发送和接收。一个网络接口被看作是一个发送和接收数据包的实体。对于每个网络接口,都用一个net_device的数据结构来表示。net_device中有很多提供系统访问和协议层调用的设备方法,包括提供设备初始化和往系统注册用的init函数,打开和关闭网络设备的openstop函数,处理数据包发送的函数hard_start_xmit,以及中断处理函数。

所有被发送和接收的包都用数据结构sk_buff表示。要发送数据时,网络系统将分局系统路由表选择相应的网络接口进行数据传输;当接收数据包时,通过驱动程序登记的中断服务程序进行数据的接口处理。

Linux网络驱动程序崇尚倒下分为四层:协议接口层、网络设备接口层、设备驱动功能层、网络设备和网络媒介层。如下图所示:

网卡初始化

网络设备初始化主要工作时检测设备的存在、初始化描述设备的net_device结构及在系统中登记该设备。在系统初始化完成以后,系统检测到的网络设备将保存在链表dev_base中,其中每个链表单元net_device对应一个存在的物理网络设备。

初始化过程首先检测网络物理设备是否存在,这是通过检测物理设备的硬件特征来完成;然后对设备进行资源配置,这些完成之后就要构造设备的net_device数据结构,用检测到值对net_device中的变量初始化;最后Linux内核中注册该设备并申请内存空间。

 

网卡的打开与关闭

为了使用网络设备,需要打开网卡,打开和关闭的一个接口是由shell命令ifconfig调用的,而ifconfig则要调用一个通用的设备打开函数dev_opennet/core/dev.c),相应的还有一个dev_close函数,这两个函数提供独立于设备的操作接口的打开和关闭功能。一般打开函数执行的操作包括注册中断函数,分配并初始化网卡所需要的接收与发送缓冲区,启动硬件检查网络连接线状态等。

 

数据包的发送与接收

数据包的发送和接收是实现Linux网络驱动程序中两个最关键的过程。

当物理网络设备接收到数据是,系统通过两种途径解决这个问题。一种方法是轮询方式,另一种方式是中断法师。

在轮询方式中,系统每隔一定的时间间隔就去检查一次物理设备,若设备有数据到达,就调用读取数据的程序。Linux中通过定时器实现,但是此法有一个明显的缺点:不管设备是否有数据,系统总是要固定的消耗CPU资源去查看设备,并且可能对一些紧急数据处理予以延迟。从资源的利用率以及工作的效率上看都不是最优的。

中断方式利用硬件体系结构的中断机制实现设备和系统的应答对话,即当物理设备需要CPU处理数据时,就向CPU发送一个终端信号,系统则在收到信号后调用相应的中断服务程序响应对设备中断的处理。因此,基本在所有的网络设备驱动程序中都是用中断方式的。

每一个网卡上都有一块FIFO存储器,对于NICNetwork Interface Controller),FIFO存储器是用来通过系统总线传送数据到系统存储器之前,缓存从LAN上接收到的数据。对与快速以太网还有一个直接内存存取(DMADirectly Memory Access)控制器,用于提供对系统存储器的可靠访问。

驱动为网卡分配一个环形缓冲区,在一段连续的物理内存中实现。

1、 数据接收

(1)       接收来自MAC的数据包,先暂存于片内FIFO接收队列;

(2)       当接收器达到早期接收上线时就移至环形缓冲区;

(3)       待整个数据包全部从FIFO移至缓存后,将接收状态寄存器和包长度写入接收的数据包头部,并更新CBACurrent Buffer Address)寄存器的值;

(4)       CMDCommand)寄存器中的BufferEmpty位和ISR(中断状态寄存器)寄存器的ROK位置1,并发出ROK的中断;

(5)       ISR中断调用完成后,清除ISRROK)并更新CAPRCurrent Address of Packet Read,指向接收缓存的已读取包的地址),完成本次接收。

2、 数据发送

(1)       将待传送的数据写入主存中一段连续的缓存空间,由OS配合驱动程序完成;

(2)       找到一个可用的描述器,并写入内容,包括该数据包的开始物理地址和传输状态字(包的大小、可传送下限、OWN位);

(3)       OWN位有效,将数据从缓存移至片内FIFO队列;

(4)       FIFO队列中的数据达到早期传送下限,NIC的传送单元就会启动,将数据顺序输出至线路;

(5)       当整个数据包都已经传至FIFOOWN位置1

(6)       当整个数据包都已经传至线路上, TOK寄存器置1

(7)       TOKIMR)和TOKISR)多置1,就发出TOK中断;

(8)       TOK中断调用完成以后,清除TSD状态字,完成本次传送。

 

可以看出,网卡需要发送/接收数据,都必须以中断的方式告诉系统,系统处理中断后做出相应操作。

网卡存在一定大小的FIFO存储器,同时还有缓冲区,缓冲区是由系统以及驱动共同分配一段连续的物理内存,所有的发送/接收的数据,都必须通过FIFO已经缓冲区,只有一包数据都发送成功后,才能继续发送下一包数据。系统维护缓冲区,只有当缓冲区有空间时才会接受上层来的数据,而网卡处理数据的速率远高于接收数据的最大速率,因此在网卡上不会存在堵塞情况。

对编程而言,在应用层调用传输层函数send/sendto,使用套接字传送数据,屏蔽了底层的所有实现。此时,send/sendto函数是没有阻塞的,只要调用,必然有返回值,成功返回发送数据的长度,失败则返回负值(失败的主要原因是网络连接的问题),因此可能存在数据丢失的现象,需要写程序的时候保证数据的传输成功。但是只有send/sendto函数返回后,程序才会执行下一次发送,因此编程时没必要考虑数据会在传输层上出现阻塞。

转自:http://blog.chinaunix.net/uid-25839577-id-3035405.html

posted @ 2012-11-22 18:01 BIG森林 阅读(695) | 评论 (0)编辑 收藏

2012年11月18日

ASCII,Unicode和UTF-8

UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的编码里去就是由三个字节来组织,所以可以看出unicode是给出一个字符的范围,定义了这个字是码值是多少,至于具体的实现方式可以有多种多样来实现。



UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。 
如表: 
1字节 0xxxxxxx 
2字节 110xxxxx 10xxxxxx 
3字节 1110xxxx 10xxxxxx 10xxxxxx 
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
因此UTF-8中可以用来表示字符编码的实际位数最多有31位,即上表中x所表示的位。除去那些控制位(每字节开头的10等),这些x表示的位与UNICODE编码是一一对应的,位高低顺序也相同。 
实际将UNICODE转换为UTF-8编码时应先去除高位0,然后根据所剩编码的位数决定所需最小的UTF-8编码位数。 
因此那些基本ASCII字符集中的字符(UNICODE兼容ASCII)只需要一个字节的UTF-8编码(7个二进制位)便可以表示。 

对于上面的问题,代码中给出的两个字节是 
十六进制:C0 B1 
二进制:11000000 10110001 
对比两个字节编码的表示方式: 
110xxxxx 10xxxxxx 
提取出对应的UNICODE编码: 
00000 110001 
可以看出此编码并非“标准”的UTF-8编码,因为其第一个字节的“有效编码”全为0,去除高位0后的编码仅有6位。由前面所述,此字符仅用一个字节的UTF-8编码表示就够了。 
JAVA在把字符还原为UTF-8编码时,是按照“标准”的方式处理的,因此我们得到的是仅有1个字节的编码。 

大家可以试试运行这段代码: 

public class TestUTF8 { 
public static void main(String[] args) throws Exception { 
byte[][] bytes = { 
// 00110001 
{(byte)0x31}, 
// 11000000 10110001 
{(byte)0xC0,(byte)0xB1}, 
// 11100000 10000000 10110001 
{(byte)0xE0,(byte)0x80,(byte)0xB1}, 
// 11110000 10000000 10000000 10110001 
{(byte)0xF0,(byte)0x80,(byte)0x80,(byte)0xB1}, 
// 11111000 10000000 10000000 10000000 10110001 
{(byte)0xF8,(byte)0x80,(byte)0x80,(byte)0x80,(byte)0xB1}, 
// 11111100 10000000 10000000 10000000 10000000 10110001 
{(byte)0xFC,(byte)0x80,(byte)0x80,(byte)0x80,(byte)0x80,(byte)0xB1}, 
}; 
for (int i = 0; i < 6; i++) { 
String str = new String(bytes[i], "UTF-8"); 
System.out.println("原数组长度:" + bytes[i].length + 
"/t转换为字符串:" + str + 
"/t转回后数组长度:" + str.getBytes("UTF-8").length); 
}

  运行结果为: 

原数组长度:1 转换为字符串:1 转回后数组长度:1 
原数组长度:2 转换为字符串:1 转回后数组长度:1 
原数组长度:3 转换为字符串:1 转回后数组长度:1 
原数组长度:4 转换为字符串:1 转回后数组长度:1 
原数组长度:5 转换为字符串:1 转回后数组长度:1 
原数组长度:6 转换为字符串:1 转回后数组长度:1 





另转:

字符编码笔记:ASCII,Unicode和UTF-8

今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料。

结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚。

下面就是我的笔记,主要用来整理自己的思路。但是,我尽量试图写得通俗易懂,希望能对其他朋友有用。毕竟,字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识。

1. ASCII码

我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。

上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。

ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。

2、非ASCII编码

英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。

但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段。

至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。

中文编码的问题需要专文讨论,这篇笔记不涉及。这里只指出,虽然都是用多个字节表示一个符号,但是GB类的汉字编码与后文的Unicode和UTF-8是毫无关系的。

3.Unicode

正如上一节所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。

可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。

Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表

4. Unicode的问题

需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

比如,汉字“严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。

这里就有两个严重的问题,第一个问题是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。

它们造成的结果是:1)出现了unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示unicode。2)unicode在很长一段时间内无法推广,直到互联网的出现。

5.UTF-8

互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

下表总结了编码规则,字母x表示可用编码的位。

Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

下面,还是以汉字“严”为例,演示如何实现UTF-8编码。

已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。

6. Unicode与UTF-8之间的转换

通过上一节的例子,可以看到“严”的Unicode码是4E25,UTF-8编码是E4B8A5,两者是不一样的。它们之间的转换可以通过程序实现。

在Windows平台下,有一个最简单的转化方法,就是使用内置的记事本小程序Notepad.exe。打开文件后,点击“文件”菜单中的“另存为”命令,会跳出一个对话框,在最底部有一个“编码”的下拉条。

bg2007102801.jpg

里面有四个选项:ANSI,Unicode,Unicode big endian 和 UTF-8。

1)ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。

2)Unicode编码指的是UCS-2编码方式,即直接用两个字节存入字符的Unicode码。这个选项用的little endian格式。

3)Unicode big endian编码与上一个选项相对应。我在下一节会解释little endian和big endian的涵义。

4)UTF-8编码,也就是上一节谈到的编码方法。

选择完”编码方式“后,点击”保存“按钮,文件的编码方式就立刻转换好了。

7. Little endian和Big endian

上一节已经提到,Unicode码可以采用UCS-2格式直接存储。以汉字”严“为例,Unicode码是4E25,需要用两个字节存储,一个字节是4E,另一个字节是25。存储的时候,4E在前,25在后,就是Big endian方式;25在前,4E在后,就是Little endian方式。

这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》。在该书中,小人国里爆发了内战,战争起因是人们争论,吃鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。为了这件事情,前后爆发了六次战争,一个皇帝送了命,另一个皇帝丢了王位。

因此,第一个字节在前,就是”大头方式“(Big endian),第二个字节在前就是”小头方式“(Little endian)。

那么很自然的,就会出现一个问题:计算机怎么知道某一个文件到底采用哪一种方式编码?

Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格“(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。

如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。

8. 实例

下面,举一个实例。

打开”记事本“程序Notepad.exe,新建一个文本文件,内容就是一个”严“字,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8编码方式保存。

然后,用文本编辑软件UltraEdit中的”十六进制功能“,观察该文件的内部编码方式。

1)ANSI:文件的编码就是两个字节“D1 CF”,这正是“严”的GB2312编码,这也暗示GB2312是采用大头方式存储的。

2)Unicode:编码是四个字节“FF FE 25 4E”,其中“FF FE”表明是小头方式存储,真正的编码是4E25。

3)Unicode big endian:编码是四个字节“FE FF 4E 25”,其中“FE FF”表明是大头方式存储。

4)UTF-8:编码是六个字节“EF BB BF E4 B8 A5”,前三个字节“EF BB BF”表示这是UTF-8编码,后三个“E4B8A5”就是“严”的具体编码,它的存储顺序与编码顺序是一致的。

9. 延伸阅读

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets(关于字符集的最基本知识)

谈谈Unicode编码

RFC3629:UTF-8, a transformation format of ISO 10646(如果实现UTF-8的规定)

(完)



转自:http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html

posted @ 2012-11-18 21:00 BIG森林 阅读(612) | 评论 (0)编辑 收藏

2012年11月17日

Ubuntu常用命令大全

Ubuntu常用命令大全

查看软件xxx安装内容
#dpkg -L xxx

查找软件
#apt-cache search 正则表达式
查找文件属于哪个包
#dpkg -S filename apt-file search filename

查询软件xxx依赖哪些包
#apt-cache depends xxx

查询软件xxx被哪些包依赖
#apt-cache rdepends xxx

增加一个光盘源
#sudo apt-cdrom add

系统升级
#sudo apt-get update
#sudo apt-get upgrade
#sudo apt-get dist-upgrade

清除所以删除包的残余配置文件
#dpkg -l |grep ^rc|awk ‘{print $2}’ |tr [”"n”] [” “]|sudo xargs dpkg -P -

编译时缺少h文件的自动处理
#sudo auto-apt run ./configure

查看安装软件时下载包的临时存放目录
#ls /var/cache/apt/archives

备份当前系统安装的所有包的列表
#dpkg –get-selections | grep -v deinstall > ~/somefile

从上面备份的安装包的列表文件恢复所有包
#dpkg –set-selections < ~/somefile sudo dselect

清理旧版本的软件缓存
#sudo apt-get autoclean

清理所有软件缓存
#sudo apt-get clean

删除系统不再使用的孤立软件
#sudo apt-get autoremove

查看包在服务器上面的地址
#apt-get -qq –print-uris install ssh | cut -d"’ -f2

系统

查看内核
#uname -a

查看Ubuntu版本
#cat /etc/issue

查看内核加载的模块
#lsmod

查看PCI设备
#lspci

查看USB设备
#lsusb

查看网卡状态
#sudo ethtool eth0

查看CPU信息
#cat /proc/cpuinfo

显示当前硬件信息
#lshw

硬盘

查看硬盘的分区
#sudo fdisk -l

查看IDE硬盘信息
#sudo hdparm -i /dev/hda

查看STAT硬盘信息
#sudo hdparm -I /dev/sda

#sudo apt-get install blktool
#sudo blktool /dev/sda id

查看硬盘剩余空间
#df -h
#df -H

查看目录占用空间
#du -hs 目录名

优盘没法卸载
#sync fuser -km /media/usbdisk

内存

查看当前的内存使用情况
#free -m

进程

查看当前有哪些进程
#ps -A

中止一个进程
#kill 进程号(就是ps -A中的第一列的数字) 或者 killall 进程名

强制中止一个进程(在上面进程中止不成功的时候使用)
#kill -9 进程号 或者 killall -9 进程名

图形方式中止一个程序
#xkill 出现骷髅标志的鼠标,点击需要中止的程序即可

查看当前进程的实时状况
#top

查看进程打开的文件
#lsof -p

ADSL 配置 ADSL
#sudo pppoeconf

ADSL手工拨号
#sudo pon dsl-provider

激活 ADSL
#sudo /etc/ppp/pppoe_on_boot

断开 ADSL
#sudo poff

查看拨号日志
#sudo plog

如何设置动态域名
#首先去http://www.3322.org申请一个动态域名
#然后修改 /etc/ppp/ip-up 增加拨号时更新域名指令 sudo vim /etc/ppp/ip-up
#在最后增加如下行 w3m -no-cookie -dump

网络

根据IP查网卡地址
#arping IP地址

查看当前IP地址
#ifconfig eth0 |awk ‘/inet/ {split($2,x,”:”);print x[2]}’

查看当前外网的IP地址
#w3m -no-cookie -dumpwww.edu.cn|grep-o‘[0-9]"{1,3"}".[0-9]"{1,3"}".[0-9]"{1,3"}".[0-9]"{1,3"}’
#w3m -no-cookie
-dumpwww.xju.edu.cn|grep-o’[0-9]"{1,3"}".[0-9]"{1,3"}".[0-9]"{1,3"}".[0-9]"{1,3"}’
#w3m -no-cookie -dump ip.loveroot.com|grep -o’[0-9]"{1,3"}".[0-9]"{1,3"}".[0-9]"{1,3"}".[0-9]"{1,3"}’

查看当前监听80端口的程序
#lsof -i :80

查看当前网卡的物理地址
#arp -a | awk ‘{print $4}’ ifconfig eth0 | head -1 | awk ‘{print $5}’

立即让网络支持nat
#sudo echo 1 > /proc/sys/net/ipv4/ip_forward
#sudo iptables -t nat -I POSTROUTING -j MASQUERADE

查看路由信息
#netstat -rn sudo route -n

手工增加删除一条路由
#sudo route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1
#sudo route del -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1

修改网卡MAC地址的方法
#sudo ifconfig eth0 down 关闭网卡
#sudo ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE
然后改地址
#sudo ifconfig eth0 up 然后启动网卡

统计当前IP连接的个数
#netstat -na|grep ESTABLISHED|awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -r -n
#netstat -na|grep SYN|awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -r -n

统计当前20000个IP包中大于100个IP包的IP地址
#tcpdump -tnn -c 20000 -i eth0 | awk -F “.” ‘{print $1″.”$2″.”$3″.”$4}’ | sort | uniq -c | sort -nr | awk ‘ $1 > 100 ‘

屏蔽IPV6
#echo “blacklist ipv6″ | sudo tee /etc/modprobe.d/blacklist-ipv6

服务

添加一个服务
#sudo update-rc.d 服务名 defaults 99

删除一个服务
#sudo update-rc.d 服务名 remove

临时重启一个服务
#/etc/init.d/服务名 restart

临时关闭一个服务
#/etc/init.d/服务名 stop

临时启动一个服务
#/etc/init.d/服务名 start

设置

配置默认Java使用哪个
#sudo update-alternatives –config java

修改用户资料
#sudo chfn userid

给apt设置代理
#export http_proxy=http://xx.xx.xx.xx:xxx

修改系统登录信息
#sudo vim /etc/motd

中文

转换文件名由GBK为UTF8
#sudo apt-get install convmv convmv -r -f cp936 -t utf8 –notest –nosmart *

批量转换src目录下的所有文件内容由GBK到UTF8
#find src -type d -exec mkdir -p utf8/{} "; find src -type f -exec iconv -f GBK -t UTF-8 {} -o utf8/{} "; mv utf8/* src rm -fr utf8

转换文件内容由GBK到UTF8
#iconv -f gbk -t utf8 $i > newfile

转换 mp3 标签编码
#sudo apt-get install python-mutagen find . -iname “*.mp3” -execdir mid3iconv -e GBK {} ";

控制台下显示中文
#sudo apt-get install zhcon 使用时,输入zhcon即可

文件

快速查找某个文件
#whereis filename
#find 目录 -name 文件名

查看文件类型
#file filename

显示xxx文件倒数6行的内容
#tail -n 6 xxx

让tail不停地读地最新的内容
#tail -n 10 -f /var/log/apache2/access.log

查看文件中间的第五行(含)到第10行(含)的内容
#sed -n ‘5,10p’ /var/log/apache2/access.log

查找包含xxx字符串的文件
#grep -l -r xxx .

全盘搜索文件(桌面可视化)
gnome-search-tool

查找关于xxx的命令
#apropos xxx man -k xxx

通过ssh传输文件
#scp -rp /path/filenameusername@remoteIP:/path
#将本地文件拷贝到服务器上
#scp -rpusername@remoteIP:/path/filename/path
#将远程文件从服务器下载到本地

查看某个文件被哪些应用程序读写
#lsof 文件名

把所有文件的后辍由rm改为rmvb
#rename ’s/.rm$/.rmvb/’ *

把所有文件名中的大写改为小写
#rename ‘tr/A-Z/a-z/’ *

删除特殊文件名的文件,如文件名:–help.txt
#rm — –help.txt 或者 rm ./–help.txt

查看当前目录的子目录
#ls -d */. 或 echo */.

将当前目录下最近30天访问过的文件移动到上级back目录
#find . -type f -atime -30 -exec mv {} ../back ";

将当前目录下最近2小时到8小时之内的文件显示出来
#find . -mmin +120 -mmin -480 -exec more {} ";

删除修改时间在30天之前的所有文件
#find . -type f -mtime +30 -mtime -3600 -exec rm {} ";

查找guest用户的以avi或者rm结尾的文件并删除掉
#find . -name ‘*.avi’ -o -name ‘*.rm’ -user ‘guest’ -exec rm {} ";

查找的不以java和xml结尾,并7天没有使用的文件删除掉
#find . ! -name *.java ! -name ‘*.xml’ -atime +7 -exec rm {} ";

统计当前文件个数
#ls /usr/bin|wc -w

统计当前目录个数
#ls -l /usr/bin|grep ^d|wc -l

显示当前目录下2006-01-01的文件名
#ls -l |grep 2006-01-01 |awk ‘{print $8}’

FTP

上传下载文件工具-filezilla
#sudo apt-get install filezilla

filezilla无法列出中文目录?
站点->字符集->自定义->输入:GBK

本地中文界面
1)下载filezilla中文包到本地目录,如~/
2)#unrar x Filezilla3_zhCN.rar
3) 如果你没有unrar的话,请先安装rar和unrar
#sudo apt-get install rar unrar
#sudo ln -f /usr/bin/rar /usr/bin/unrar
4)备份原来的语言包,再安装;实际就是拷贝一个语言包。
#sudo cp /usr/share/locale/zh_CN/filezilla.mo /usr/share/locale/zh_CN/filezilla.mo.bak
#sudo cp ~/locale/zh_CN/filezilla.mo /usr/share/locale/zh_CN/filezilla.mo
5)重启filezilla,即可!

解压缩

解压缩 xxx.tar.gz
#tar -zxvf xxx.tar.gz

解压缩 xxx.tar.bz2
#tar -jxvf xxx.tar.bz2

压缩aaa bbb目录为xxx.tar.gz
#tar -zcvf xxx.tar.gz aaa bbb

压缩aaa bbb目录为xxx.tar.bz2
#tar -jcvf xxx.tar.bz2 aaa bbb

解压缩 RAR 文件
1) 先安装
#sudo apt-get install rar unrar
#sudo ln -f /usr/bin/rar /usr/bin/unrar
2)
解压
#unrar x aaaa.rar

解压缩 ZIP 文件
1) 先安装
#sudo apt-get install zip unzip
#sudo ln -f /usr/bin/zip /usr/bin/unzip
2)
解压
#unzip x aaaa.zip

Nautilus

显示隐藏文件
Ctrl+h

显示地址栏
Ctrl+l

特殊 URI 地址
* computer:/// - 全部挂载的设备和网络
* network:/// - 浏览可用的网络
* burn:/// - 一个刻录 CDs/DVDs 的数据虚拟目录
* smb:/// - 可用的 windows/samba 网络资源
* x-nautilus-desktop:/// - 桌面项目和图标
*file:///- 本地文件
* trash:/// - 本地回收站目录
* ftp:// - FTP 文件夹
* ssh:// - SSH 文件夹
* fonts:/// - 字体文件夹,可将字体文件拖到此处以完成安装
* themes:/// - 系统主题文件夹

查看已安装字体
在nautilus的地址栏里输入”fonts:///“,就可以查看本机所有的fonts

程序

详细显示程序的运行信息
#strace -f -F -o outfile

日期和时间

设置日期
#date -s mm/dd/yy

设置时间
#date -s HH:MM

将时间写入CMOS
#hwclock –systohc

读取CMOS时间
#hwclock –hctosys

从服务器上同步时间
#sudo ntpdate time.nist.gov
#sudo ntpdate time.windows.com

控制台

不同控制台间切换
Ctrl + ALT + ← Ctrl + ALT + →

指定控制台切换
Ctrl + ALT + Fn(n:1~7)

控制台下滚屏
SHIFT + pageUp/pageDown

控制台抓图
#setterm -dump n(n:1~7)

数据库

mysql的数据库存放在地方
#/var/lib/mysql

从mysql中导出和导入数据
#mysqldump 数据库名 > 文件名
#导出数据库
#mysqladmin create 数据库名 #建立数据库
#mysql 数据库名 < 文件名 #导入数据库

忘了mysql的root口令怎么办
#sudo /etc/init.d/mysql stop
#sudo mysqld_safe –skip-grant-tables
#sudo mysqladmin -u user password ‘newpassword”
#sudo mysqladmin flush-privileges

修改mysql的root口令
#sudo mysqladmin -uroot -p password ‘你的新密码’

其它

下载网站文档
#wget -r -p -np -khttp://www.21cn.com
· r:在本机建立服务器端目录结构;
· -p: 下载显示HTML文件的所有图片;
· -np:只下载目标站点指定目录及其子目录的内容;
· -k: 转换非相对链接为相对链接。

如何删除Totem电影播放机的播放历史记录
#rm ~/.recently-used

如何更换gnome程序的快捷键
点击菜单,鼠标停留在某条菜单上,键盘输入任意你所需要的键,可以是组合键,会立即生效; 如果要清除该快捷键,请使用backspace

vim 如何显示彩色字符
#sudo cp /usr/share/vim/vimcurrent/vimrc_example.vim /usr/share/vim/vimrc

如何在命令行删除在会话设置的启动程序
#cd ~/.config/autostart rm 需要删除启动程序

如何提高wine的反应速度
#sudo sed -ie ‘/GBK/,/^}/d’ /usr/share/X11/locale/zh_CN.UTF-8/XLC_LOCALE

#chgrp
[语法]: chgrp [-R] 文件组 文件…
[说明]: 文件的GID表示文件的文件组,文件组可用数字表示, 也可用一个有效的组名表示,此命令改变一个文件的GID,可参看chown。
-R 递归地改变所有子目录下所有文件的存取模式
[例子]:
#chgrp group file 将文件 file 的文件组改为 group

#chmod
[语法]: chmod [-R] 模式 文件…
或 chmod [ugoa] {+|-|=} [rwxst] 文件…
[说明]: 改变文件的存取模式,存取模式可表示为数字或符号串,例如:
#chmod nnnn file , n为0-7的数字,意义如下:
4000 运行时可改变UID
2000 运行时可改变GID
1000 置粘着位
0400 文件主可读
0200 文件主可写
0100 文件主可执行
0040 同组用户可读
0020 同组用户可写
0010 同组用户可执行
0004 其他用户可读
0002 其他用户可写
0001 其他用户可执行
nnnn 就是上列数字相加得到的,例如 chmod 0777 file 是指将文件 file 存取权限置为所有用户可读可写可执行。
-R 递归地改变所有子目录下所有文件的存取模式
u 文件主
g 同组用户
o 其他用户
a 所有用户
+ 增加后列权限
- 取消后列权限
= 置成后列权限
r 可读
w 可写
x 可执行
s 运行时可置UID
t 运行时可置GID
[例子]:
#chmod 0666 file1 file2 将文件 file1 及 file2 置为所有用户可读可写
#chmod u+x file 对文件 file 增加文件主可执行权限
#chmod o-rwx 对文件file 取消其他用户的所有权限

#chown
[语法]: chown [-R] 文件主 文件…
[说明]: 文件的UID表示文件的文件主,文件主可用数字表示, 也可用一个有效的用户名表示,此命令改变一个文件的UID,仅当此文件的文件主或超级用户可使用。
-R 递归地改变所有子目录下所有文件的存取模式
[例子]:
#chown mary file 将文件 file 的文件主改为 mary
#chown 150 file 将文件 file 的UID改为150

Ubuntu命令行下修改网络配置

以eth0为例
1. 以DHCP方式配置网卡
编辑文件/etc/network/interfaces:
#sudo vi /etc/network/interfaces
并用下面的行来替换有关eth0的行:
# The primary network interface - use DHCP to find our address
auto eth0
iface eth0 inet dhcp
用下面的命令使网络设置生效:
#sudo /etc/init.d/networking restart
当然,也可以在命令行下直接输入下面的命令来获取地址
#sudo dhclient eth0

2. 为网卡配置静态IP地址
编辑文件/etc/network/interfaces:
#sudo vi /etc/network/interfaces
并用下面的行来替换有关eth0的行:
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.3.90
gateway 192.168.3.1
netmask 255.255.255.0
network 192.168.3.0
broadcast 192.168.3.255
将上面的ip地址等信息换成你自己就可以了.

用下面的命令使网络设置生效:
#sudo /etc/init.d/networking restart

3. 设定第二个IP地址(虚拟IP地址)
编辑文件/etc/network/interfaces:
#sudo vi /etc/network/interfaces
在该文件中添加如下的行:
auto eth0:1
iface eth0:1 inet static
address 192.168.1.60
netmask 255.255.255.0
network x.x.x.x
broadcast x.x.x.x
gateway x.x.x.x
根据你的情况填上所有诸如address,netmask,network,broadcast和gateways等信息.
用下面的命令使网络设置生效:
#sudo /etc/init.d/networking restart

4. 设置主机名称(hostname)
使用下面的命令来查看当前主机的主机名称:
#sudo /bin/hostname
使用下面的命令来设置当前主机的主机名称:
#sudo /bin/hostname newname
系统启动时,它会从/etc/hostname来读取主机的名称.

5. 配置DNS
首先,你可以在/etc/hosts中加入一些主机名称和这些主机名称对应的IP地址,这是简单使用本机的静态查询.
要访问DNS 服务器来进行查询,需要设置/etc/resolv.conf文件.
假设DNS服务器的IP地址是192.168.3.2, 那么/etc/resolv.conf文件的内容应为:
search test.com
nameserver 192.168.3.2

安装AMP服务

如果采用Ubuntu Server CD开始安装时,可以选择安装,这系统会自动装上apache2,php5和mysql5。下面主要说明一下如果不是安装的Ubuntu server时的安装方法。
用命令在Ubuntu下架设Lamp其实很简单,用一条命令就完成。在终端输入以下命令:
#sudo apt-get install apache2 mysql-server php5 php5-mysql php5-gd #phpmyadmin
装好后,mysql管理员是root,无密码,通过http://localhost/phpmyadmin就可以访问mysql了

修改 MySql 密码
终端下输入:
#mysql -u root
#mysql> GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY “123456″;
’123456‘是root的密码,可以自由设置,但最好是设个安全点的。
#mysql> quit; 退出mysql

apache2的操作命令
启动:#sudo /etc/init.d/apache2 start
重启:#sudo /etc/init.d/apache2 restart
关闭:#sudo /etc/init.d/apache2 stop
apache2的默认主目录:/var/www/



转自:http://www.blogjava.net/bukebushuo/archive/2009/08/27/283427.html

posted @ 2012-11-17 14:17 BIG森林 阅读(564) | 评论 (0)编辑 收藏

2012年11月14日

http请求方式

     摘要: HTTP请求格式 当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成: l   请求方法URI协议/版本 l   请求头(Request Header) l   请求正文 下面是一个HTTP请求的例子: GET/sample.jspHTTP/1.1   ...  阅读全文

posted @ 2012-11-14 20:39 BIG森林 阅读(540) | 评论 (0)编辑 收藏

仅列出标题  下一页
<2018年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜