PHP读取纯真IP数据库的函数

Discuz  5.0 不在使用自己的IP数据,而是使用纯真IP的数据格式, 存取纯真IP数据库稍微有点麻烦,它的存储格式比较特殊也很有趣,具体的格式分析参考下面两个链接,其他语言实现参考文章末的链接。
《纯真IP数据库格式详解》
链接一:http://blog.csdn.Net/heiyeshuwu/archive/2006/05/12/725675.aspx
链接二:http://lumaqq.Linuxsir.org/article/qqwry_format_detail.html
纯真IP数据库官网:http://www.cz88.Net/ip/
纯真IP数据库下载:http://update.cz88.Net/soft/qqwry.rar
以下函数conrvertip()位于 Discuz!5_GBK/upload/include/misc.func.Php 路径中,有兴趣可以具体去阅读分析。(下面代码我做了简单的修改,更便于阅读,核心没有修改)
<?
//===================================
//
// 功能:IP地址获取真实地址函数
// 参数:$ip - IP地址
// 作者:[Discuz!] (C) Comsenz Inc.
//
//===================================
function convertip($ip) {
    //IP数据文件路径
    $dat_path = ‘QQWry.Dat’;
    //检查IP地址
    if(!preg_match(”/^d{1,3}.d{1,3}.d{1,3}.d{1,3}$/”, $ip)) {
        return ‘IP Address Error’;
    }
    //打开IP数据文件
    if(!$fd = @fopen($dat_path, ‘rb’)){
        return ‘IP date file not exists or access denied’;
    }
    //分解IP进行运算,得出整形数
    $ip = explode(’.', $ip);
    $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
    //获取IP数据索引开始和结束位置
    $DataBegin = fread($fd, 4);
    $DataEnd = fread($fd, 4);
    $ipbegin = implode(”, unpack(’L', $DataBegin));
    if($ipbegin < 0) $ipbegin += pow(2, 32);
    $ipend = implode(”, unpack(’L', $DataEnd));
    if($ipend < 0) $ipend += pow(2, 32);
    $ipAllNum = ($ipend - $ipbegin) / 7 + 1;
    $BeginNum = 0;
    $EndNum = $ipAllNum;
    //使用二分查找法从索引记录中搜索匹配的IP记录
    while($ip1num>$ipNum || $ip2num<$ipNum) {
        $Middle= intval(($EndNum + $BeginNum) / 2);
        //偏移指针到索引位置读取4个字节
        fseek($fd, $ipbegin + 7 * $Middle);
        $ipData1 = fread($fd, 4);
        if(strlen($ipData1) < 4) {
            fclose($fd);
            return ‘System Error’;
        }
        //提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂
        $ip1num = implode(”, unpack(’L', $ipData1));
        if($ip1num < 0) $ip1num += pow(2, 32);
        //提取的长整型数大于我们IP地址则修改结束位置进行下一次循环
        if($ip1num > $ipNum) {
            $EndNum = $Middle;
            continue;
        }
        //取完上一个索引后取下一个索引
        $DataSeek = fread($fd, 3);
        if(strlen($DataSeek) < 3) {
            fclose($fd);
            return ‘System Error’;
        }
        $DataSeek = implode(”, unpack(’L', $DataSeek.chr(0)));
        fseek($fd, $DataSeek);
        $ipData2 = fread($fd, 4);
        if(strlen($ipData2) < 4) {
            fclose($fd);
            return ‘System Error’;
        }
        $ip2num = implode(”, unpack(’L', $ipData2));
        if($ip2num < 0) $ip2num += pow(2, 32);
        //没找到提示未知
        if($ip2num < $ipNum) {
            if($Middle == $BeginNum) {
                fclose($fd);
                return ‘Unknown’;
            }
            $BeginNum = $Middle;
        }
    }
    //下面的代码读晕了,没读明白,有兴趣的慢慢读
    $ipFlag = fread($fd, 1);
    if($ipFlag == chr(1)) {
        $ipSeek = fread($fd, 3);
        if(strlen($ipSeek) < 3) {
            fclose($fd);
            return ‘System Error’;
        }
        $ipSeek = implode(”, unpack(’L', $ipSeek.chr(0)));
        fseek($fd, $ipSeek);
        $ipFlag = fread($fd, 1);
    }
    if($ipFlag == chr(2)) {
        $AddrSeek = fread($fd, 3);
        if(strlen($AddrSeek) < 3) {
            fclose($fd);
            return ‘System Error’;
        }
        $ipFlag = fread($fd, 1);
        if($ipFlag == chr(2)) {
            $AddrSeek2 = fread($fd, 3);
            if(strlen($AddrSeek2) < 3) {
                fclose($fd);
                return ‘System Error’;
            }
            $AddrSeek2 = implode(”, unpack(’L', $AddrSeek2.chr(0)));
            fseek($fd, $AddrSeek2);
        } else {
            fseek($fd, -1, SEEK_CUR);
        }
        while(($char = fread($fd, 1)) != chr(0))
            $ipAddr2 .= $char;
        $AddrSeek = implode(”, unpack(’L', $AddrSeek.chr(0)));
        fseek($fd, $AddrSeek);
        while(($char = fread($fd, 1)) != chr(0))
            $ipAddr1 .= $char;
    } else {
        fseek($fd, -1, SEEK_CUR);
        while(($char = fread($fd, 1)) != chr(0))
            $ipAddr1 .= $char;
        $ipFlag = fread($fd, 1);
        if($ipFlag == chr(2)) {
            $AddrSeek2 = fread($fd, 3);
            if(strlen($AddrSeek2) < 3) {
                fclose($fd);
                return ‘System Error’;
            }
            $AddrSeek2 = implode(”, unpack(’L', $AddrSeek2.chr(0)));
            fseek($fd, $AddrSeek2);
        } else {
            fseek($fd, -1, SEEK_CUR);
        }
        while(($char = fread($fd, 1)) != chr(0)){
            $ipAddr2 .= $char;
        }
    }
    fclose($fd);
    //最后做相应的替换操作后返回结果
    if(preg_match(’/http/i’, $ipAddr2)) {
        $ipAddr2 = ”;
    }
    $ipaddr = “$ipAddr1 $ipAddr2″;
    $ipaddr = preg_replace(’/CZ88.Net/is’, ”, $ipaddr);
    $ipaddr = preg_replace(’/^s*/is’, ”, $ipaddr);
    $ipaddr = preg_replace(’/s*$/is’, ”, $ipaddr);
    if(preg_match(’/http/i’, $ipaddr) || $ipaddr == ”) {
        $ipaddr = ‘Unknown’;
    }
    return $ipaddr;
}
//========================
//
//  调用举例(速度很快)
//
//========================
echo convertip(’219.238.235.10′);
//输出: 北京市 电信通
echo convertip(’23.56.82.12′);
//输出:IANA
echo convertip(’250.69.52.0′);
//输出:IANA保留地址
echo convertip(’238.69.52.0′);
//输出:IANA保留地址 用于多点传送
echo convertip(’192.168.0.1′);
//输出:局域网 对方和您在同一内部网
echo convertip(’255.255.255.255′);
//输出:纯真网络 2006年11月20日IP数据
?>
附:(相应其他实现程序)
Php)” href=”http://www.coolcode.cn/?p=16” rel=bookmark>利用 QQWry.Dat 实现 IP 地址高效检索(Php)(作者: andot)
数据库(QQWry.Dat)查询 C源码” href=”http://www.douzi.org/wp/index.Php/articles/71” rel=bookmark>纯真IP数据库(QQWry.Dat)查询 C源码 (作者:Windix)
该文章转载自网络大本营:http://www.xrss.cn/Info/13278.Html

IP地址与子网掩码

IP地址与子网掩码
IP地址与网络分类
(1)IP地址
不 同的物理网络技术有不同的编址方式;不同物理网络中的主机,有不同的物理网络地址。网间技术是将不同物理网络技术统一起来的高层软件技术。网间技术采用一 种全局通用的地址格式,为全网的每一网络和每一主机都分配一个网间地址,以此屏蔽物理网络地址的差异。IP协议提供一种全网间通用的地址格式,并在统一管 理下进行地址分配,保证一个地址对应一台网间主机(包括网关),这样物理地址的差异被IP层所屏蔽。IP层所用到的地址叫做网间地址,又叫IP地址。它由 网络号和主机号两部分组成,统一网络内的所有主机使用相同的网络号,主机号是唯一的。IP地址是一个32为的二进制数,分成4个字段,每个字段8位。
(2)三类主要的网络地址
我们知道,从LAN到WAN,不同种类网络规模相差很大,必须区别对待。因此按网络规模大小,将网络地址分为主要的三类,如下:
A类:
0 1 2 3 8 16 24
3 1 0网络号主机号
B类:1 0网络号主机号
C类:1 1 0网络号主机号
A类地址用于少量的(最多27个)主机数大于216的大型网,每个A类网络可容纳最多224台主机;B类地址用于主机数介于28~216之间数量不多不少的中型网,B类网络最多214个;C类地址用于每个网络只能容纳28台主机的大量小型网,C类网络最多221个。
除了以上A、B、C三个主类地址外,还有另外两类地址,如下:
D类:1 1 1 0多目地址
E类:1 1 1 1 0留待后用
其中多目地址(multicast address)是比广播地址稍弱的多点传送地址,用于支持多目传输技术。E类地址用于将来的扩展之用。
(3)TCP/IP规定网络地址
除了一般地标识一台主机外,还有几种具有特殊意义的特殊形式。
*广播地址
TCP/IP规定,主机号全为“1”的网络地址用于广播之用,叫做广播地址。所谓广播,指同时向网上所有主机发送报文。
*有限广播
前面提到的广播地址包含一个有效的网络号和主机号,技术上称为直接广播(directed boradcasting)地址。在网间网上的任何一点均可向其他任何网络进行直接广播,但直接广播有一个缺点,就是要知道信宿网络的网络号。
有时需要在本网络内部广播,但又不知道本网络网络号。TCP/IP规定,32比特全为“1”的网间网地址用于本网广播,该地址叫做有限广播地址(limited broadcast address)。
*“0”地址
TCP/IP协议规定,各位全为“0”的网络号被解释成“本”网络。
*回送地址
A类网络地址127是一个保留地址,用于网络软件测试以及本地机进程间通信,叫做回送地址(loopback address)。无论什么程序,一旦使用回送地址发送数据,协议软件立即返回之,不进行任何网络传输。
TCP/IP协议规定,一、含网络号127的分组不能出现在任何网络上;二、主机和网关不能为该地址广播任何寻径信息。由以上规定可以看出,主机号全“0”全“1”的地址在TCP/IP协议中有特殊含义,不能用作一台主机的有效地址。
二、子网掩码
(1) 子网TCP/IP网间网技术产生于大型主流机环境中,它能发展到今天的规模是当初的设计者们始料未及的。网间网规模的迅速扩展对IP地址模式的威胁并不是 它不能保证主机地址的唯一性,而是会带来两方面的负担:第一,巨大的网络地址管理开销;第二,网关寻径急剧膨胀。其中第二点尤为突出,寻径表的膨胀不仅会 降低网关寻径效率(甚至可能使寻径表溢出,从而造成寻径故障),更重要的是将增加内外部路径刷新时的开销,从而加重网络负担。
因此,迫切需要寻求新的技术,以应付网间网规模增长带来的问题。仔细分析发现,网间网规模的增长在内部主要表现为网络地址的增减,因此解决问题的思路集中在:如何减少网络地址。于是IP网络地址的多重复用技术应运而生。
通过复用技术,使若干物理网络共享同一IP网络地址,无疑将减少网络地址数。
子网编址(subnet addressing)技术,又叫子网寻径(subnetrouting),英文简称subnetting,是最广泛使用的IP网络地址复用方式,目前已经标准化,并成为IP地址模式的一部分。
一般的,32位的IP地址分为两部分,即网络号和主机号,我们分别把他们叫做IP地址的“网间网部分”和“本地部分”。子网编址技术将本地部分进一步划分为“物理网络”部分和“主机”部分,如图:
网间网部分物理网络主机
网间网部分.本地部分
其中“物理网络”用于标识同一IP网络地址下的不同物理网络,既是“子网”。
(2)子网掩码IP协议标准规定:每一个使用子网的网点都选择一个32位的位模式,若位模式中的某位置1,则对应IP地址中的某位为网络地址(包括网间 网部分和物理网络号)中的一位;若位模式中的某位置0,则对应IP地址中的某位为主机地址中的一位。例如位模式:11111111 11111111 11111111 00000000中,前三个字节全1,代表对应IP地址中最高的三个字节为网络地址;后一个字节全0,代表对应IP地址中最后的一个字节为主机地址。这种 位模式叫做子网模(subnet mask)或“子网掩码”。
为了使用的方便,常常使用“点分整数表示法”来表示一个IP地址和子网掩码,例如B类地址子网掩码(11111111 11111111 11111111 00000000)为:
255.255.25.0 IP协议关于子网掩码的定义提供一种有趣的灵活性,允许子网掩码中的“0”和“1”位不连续。但是,这样的子网掩码给分配主机地址和理解寻径表都带来一定 困难,并且,极少的路由器支持在子网中使用低序或无序的位,因此在实际应用中通常各网点采用连续方式的子网掩码。像255.255.255.64和 255.255.255.160等一类的子网掩码不推荐使用。
(3)子网掩码与IP地址子网掩码与IP地址结合使用,可以区分出一个网络地址的网络号和主机号。
例如:有一个C类地址为:
192.9.200.13其缺省的子网掩码为:
255.255.255.0则它的网络号和主机号可按如下方法得到:将IP地址192.9.200.13转换为二进制11000000 00001001 11001000 00001101
将子网掩码255.255.255.0转换为二进制11111111 11111111 11111111 00000000
将两个二进制数逻辑与(AND)运算后得出的结果即为网络部分11000000 00001001 11001000 00001101 AND 11111111 11111111 11111111 00000000 11000000 00001001 11001000 00000000结果为192.9.200.0,即网络号为192.9.200.0。
将子网掩码取反再与IP地址逻辑与(AND)后得到的结果即为主机部分11000000 00001001 11001000 00001101 AND 00000000 00000000 00000000 11111111 00000000 00000000 00000000 00001101结果为0.0.0.13,即主机号为13。
(4)子网掩码与IP地址子网掩码与IP地址结合使用,可以区分出一个网络地址的网络号和主机号。
例如:有一个C类地址为:
192.9.200.13 其缺省的子网掩码为:
255.255.255.0 则它的网络号和主机号可按如下方法得到:
将IP地址192.9.200.13转换为二进制11000000 00001001 11001000 00001101
将子网掩码255.255.255.0转换为二进制11111111 11111111 11111111 00000000
将两个二进制数逻辑与(AND)运算后得出的结果即为网络部分11000000 00001001 11001000 00001101 AND 11111111 11111111 11111111 00000000 11000000 00001001 11001000 00000000结果为192.9.200.0,
即网络号为192.9.200.0。
将子网掩码取反再与IP地址逻辑与(AND)后得到的结果即为主机部分11000000 00001001 11001000 00001101 AND 00000000 00000000 00000000 11111111 00000000 00000000 00000000 00001101 结果为0.0.0.13,即主机号为13。
三、子网划分与实例根据以上分析,建议按以下步骤和实例定义子网掩码。
1、将要划分的子网数目转换为2的m次方。如要分8个子网,8=23。
2、取上述要划分子网数的2的m次方的幂。如23,即m=3。
3、将上一步确定的幂m按高序占用主机地址m位后转换为十进制。如m为3 则是11100000,转换为十进制为224,即为最终确定的子网掩码。如果是C类网,则子网掩码为255.255.255.224;如果是B类网,则子 网掩码为255.255.224.0;如果是C类网,则子网掩码为255.224.0.0。
在这里,子网个数与占用主机地址位数有如下等式成 立:2m=n。其中,m表示占用主机地址的位数;n表示划分的子网个数。根据这些原则,将一个C类网络分成4个子网。若我们用的网络号为192.9. 200,则该C类网内的主机IP地址就是192.9.200.1~192.9.200.254(因为全“0”和全“1”的主机地址有特殊含义,不作为有效 的IP地址),现将网络划分为4个部分,按照以上步骤:
4=22,取22的幂,即2,则二进制为11,占用主机地址的高序位即为11000000,转换为十进制为192。这样就可确定该子网掩码为:192.9.200.192,4个子网的IP地址范围分别为:
二进制十进制
11000000 00001001 11001000 00000001 11000000 00001001 11001000 00111110 192.9.200.1
192.9.200.62
11000000 00001001 11001000 01000001 11000000 00001001 11001000 01111110 192.9.200.65
192.9.200.126
11000000 00001001 11001000 10000001 11000000 00001001 11001000 10111110 192.9.200.129
192.9.200.190
11000000 00001001 11001000 11000001 11000000 00001001 11001000 11111110 192.9.200.193
192.9.200.254
在此列出A、B、C三类网络子网数目与子网掩码的转换表,以供参考。
A类:
子网数目 占用位数    子网掩码    子网中主机数
2     1    255.128.0.0    8,388,606
4     2    255.192.0.0    4,194,302
8     3    255.224.0.0    2,097,150
16     4    255.240.0.0    1,048,574
32     5    255.248.0.0    524,286
64     6    255.252.0.0    262,142
128    7    255.254.0.0    131,070
128    8    255.255.0.0    65,534
B类:
子网数目 占用位数    子网掩码    子网中主机数
2     1    255.255.128.0   32,766
4     2    255.255.192.0   16,382
8     3    255.255.224.0   8,190
16     4    255.255.240.0   4,094
32     5    255.255.248.0   2,046
64     6    255.255.252.0   1,022
128    7    255.255.254.0   510
256    8    255.255.255.0   254
C类:
子网数目 占用位数    子网掩码    子网中主机数
2     1    255.255.255.128   126
4     2    255.255.255.192   62
8     3    255.255.255.224   30
16     4    255.255.255.240   14
32     5    255.255.255.248   6
64     6    255.255.255.252   2
子网掩码和ip地址的关系
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,如果得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。就这么简单。
请看以下示例:
运算演示之一:aa
I P 地址  192.168.0.1
子网掩码  255.255.255.0
AND运算
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000
转化为十进制后为:192.168.0.0,运算演示之二:
I P 地址  192.168.0.254,子网掩码  255.255.255.0,AND运算
转化为二进制进行运算:
I P 地址:11010000.10101000.00000000.11111110
子网掩码:11111111.11111111.11111111.00000000
AND运算:11000000.10101000.00000000.00000000
转化为十进制后为:192.168.0.0
运算演示之三:
I P 地址  192.168.0.4,子网掩码  255.255.255.0 ,AND运算,转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.00000100
子网掩码 11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000
转化为十进制后为:192.168.0.0
通过以上对三组计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0
所以计算机就会把这三台计算机视为是同一子网络,然后进行通讯的。我现在单位使用的代理服务器,内部网络就是这样规划的。
也许你又要问,这样的子网掩码究竟有多少了IP地址可以用呢?你可以这样算。
根据上面我们可以看出,局域网内部的ip地址是我们自己规定的(当然和其他的ip地址是一样的),这个是由子网掩码决定的通过对255.255.255.0的分析。可得出:
前三位IP码由分配下来的数字就只能固定为192.168.0  所以就只剩下了最后的一位了,那么显而易见了,ip地址只能有(2的8次方-1),即256-1=255一般末位为0或者是255的都有其特殊的作用。
那么你可能要问了:如果我的子网掩码不是255.255.255.0呢?你也可以这样做啊假设你的子网掩码是255.255.128.0
那么你的局域网内的ip地址的前两位肯定是固定的了(什么,为什么是固定的?你看上边不就明白了吗?·#¥)
这样,你就可以按照下边的计算来看看同一个子网内到底能有多少台机器
1、十进制128 = 二进制1000 0000
2、IP码要和子网掩码进行AND运算
3、I P 地址 00010000.01001001.1*******.********
子网掩码 11111111.11111111.10000000.00000000
AND运算00010000.01001001.10000000.00000000
转化为十进制后为:
16 . 73 . 128 . 0
4、可知我们内部网可用的IP地址为:00010000.01001001.10000000.00000000       到00010000.01001001.11111111.11111111
5、转化为十进制:
16.73.128.0 到 16.73.255.255
6、0和255通常作为网络的内部特殊用途。通常不使用。
7、于是最后的结果如下:我们单位所有可用的IP地址为:
192.168.128.1-192.168.128.254
192.168.129.1-192.168.129.254
. . . . . . . . . . . . .
192.168.142.1-192.168.142.254
192.168.143.1-192.168.143.254
. . . . . . . . . . . . .
192.168.254.1-192.168.254.254
192.168.255.1-192.168.255.254
8、总数为(255-128+1)*(254-1+1) =128 * 254 = 32512
FAINT!!!!@#!@把我们公司都买了还买不了这么多的机器呢!·¥!·#
9、看看的结果是否正确
(1)、设定IP地址为192.168.128.1
Ping 192.168.129.233通过测试
访问http://192.168.129.233可以显示出主页
(2)、设定IP地址为192.168.255.254
Ping 192.168.129.233通过测试
访问http://192.168.129.233可以显示出主页
10、结论
以上证明我们的结论是对的。
现在你就可以看你的子网中能有多少台机器了
255.255.255.128
分解:11111111.11111111.11111111.1000000
所以你的内部网络的ip地址只能是xxxxxxxx.xxxxxxxx.xxxxxxxx.0???????
到xxxxxxxx.xxxxxxxx.xxxxxxxx.01111111

IP地址与网络分类

(1) IP地址
我们知道,不同的物理网络技术有不同的编址方式;不同物理网络中的主
机,有不同的物理网络地址。网间网技术是将不同物理网络技术统一起来的高
层软件技术。网间网技术采用一种全局通用的地址格式,为全网的每一网络和
每一主机都分配一个网间网地址,以此屏蔽物理网络地址的差异。
IP协议提供一种全网间网通用的地址格式,并在统一管理下进行地址分配,保
证一个地址对应一台网间网主机(包括网关),这样物理地址的差异被IP层所
屏蔽。IP层所用到的地址叫做网间网地址,又叫IP地址。它由网络号和主机
号两部分组成,统一网络内的所有主机使用相同的网络号,主机号是唯一的。
IP地址是一个32为的二进制数,分成4个字段,每个字段8位。
(2) 三类主要的网络地址
我们知道,从LAN到WAN,不同种类网络规模相差很大,必须区别对待。因此
按网络规模大小,将网络地址分为主要的三类,如图:

A类: 0 1 2 3 8 16 24

31
0
网络号
主机号

B类:
1
0
网络号
主机号

C类:
1
1
0
网络号
主机号

A类地址用于少量的(最多27个)主机数大于216的大型网,每个A类网络可
容纳最多224台主机;B类地址用于主机数介于28~216之间数量不多不少的
中型网,B类网络最多214个;C类地址用于每个网络只能容纳28台主机的大
量小型网,C类网络最多221个。
除了以上A、B、C三个主类地址外,还有另外两类地址,如图:

D类:
1
1
1
0
多目地址

E类:
1
1
1
1
0
留待后用

其中多目地址(multicast address)是比广播地址稍弱的多点传送地址,用
于支持多目传输技术。E类地址用于将来的扩展之用。
(3) TCP/IP规定
网络地址除了一般地标识一台主机外,还有几种具有特殊意义的特殊形式。
* 广播地址
TCP/IP规定,主机号全为“1”的网络地址用于广播之用,叫做广播地址。

所谓广播,指同时向网上所有主机发送报文。
* 有限广播
前面提到的广播地址包含一个有效的网络号和主机号,技术上称为直接广播
(directed boradcasting)地址。在网间网上的任何一点均可向其他任何网
络进行直接广播,但直接广播有一个缺点,就是要知道信宿网络的网络号。
有时需要在本网络内部广播,但又不知道本网络网络号。TCP/IP规定,32比
特全为“1”的网间网地址用于本网广播,该地址叫做有限广播地址(limited

broadcast address)。
* “0”地址
TCP/IP协议规定,各位全为“0”的网络号被解释成“本”网络。
* 回送地址
A类网络地址127是一个保留地址,用于网络软件测试以及本地机进程间通信,
叫做回送地址(loopback address)。无论什么程序,一旦使用回送地址发送
数据,协议软件立即返回之,不进行任何网络传输。TCP/IP协议规定,一、含
网络号127的分组不能出现在任何网络上;二、主机和网关不能为该地址广播
任何寻径信息。
由以上规定可以看出,主机号全“0”全“1”的地址在TCP/IP协议中有特殊
含义,不能用作一台主机的有效地址。

如何在PuTTY中使用SSH公匙/密匙?

虽然Linux在数据中心的应用越来越普及,不过还是有很多管理员在使用公司Windows桌面办公。而在各种远程登录管理Linux服务器的工具中,PuTTY无疑是最佳选择(Putty是一个免费的、Windows 32平台下的telnet、rlogin和ssh客户端,但是功能丝毫不逊色于商业的telnet类工具,用它来远程管理Linux十分好用)。在这篇文章中,你将了解到如何使用SSH公匙/密匙(public/private keys)使你的Linux服务器与PuTTY之间的通信更加安全。

  通常可以使用三种不同的因素来证明你的身份:你知道的事物、你拥有的事物以及关于你的资料。为了使认证过程更加可靠,你通常应该至少要使用这三个要素中的两个要素。而当你使用SSH公匙/密匙进行认证,并且密匙设定了Passphrase时(即密码短语,功能与密码一样,只是长度比密码更长),你就可以结合两种认证要素,从而使认证过程更加可靠,你的服务器更加安全。

  当使用SSH公匙/密匙进行认证时,用户需要在他的工作站生成一个公匙/密匙对。生成以后,用户必须把公匙复制到名为authorized_keys的文件中。这个文件通常位于服务器的用户主目录里,被放置在一个名为.ssh的隐藏子目录中。在下面的9个步骤中,你将学会如何在一个使用PuTTY的Windows工作站里生成公匙/密匙对:

  1.从http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html站点下载完整的PuTTY安装包,安装包中包含PuTTYgen命令,运行这项命令,它就会打开PuTTYgen Key Generator窗口(密匙生成窗口)。

  2.在窗口的下部明确你想要生成什么类型的密匙。我建议你使用一个2048比特的DSA密匙,因为如果低于该比特数值的话,所获得的安全级别就不够高。选择这个选项后,点击“生成”。为了产生密匙,你必须把鼠标指针在PuTTYgen窗口来来回回地移动,这样可以产生出PuTTYgen用来生成密匙对的随机数据。

  3.一旦密匙对生成后,你就会看到一个窗口。在此窗口中,你需要详细指明密匙的特性。以下你必须完成两项重要任务:首先,你要把你看到的位于窗口上半部分的公匙复制并将它储存在一个文件内。不要使用“保存公匙(Save public key)”选项,因为这样储存的密匙格式在Linux中将不可用。因此,复制这个公匙,打开Notepad,把这个密匙存入一个新建的文件中,接着把该文件存入你的电脑。

  4.下一步,仍然是同一窗口,你可以设定一个密码短语来保护私匙,防止其他人擅自使用。当然,你也可以选择不使用密码短语,但是这中间确实存在不小的安全风险,因此非常推荐使用密码短语来保护私匙。选择一个不是太容易被猜到的字符串,并将它输入“钥匙密码(Key passphrase)”和“确认密码(Confirm passphrase)”方框中。然后,点击“保存私匙”将该密码短语存入一个文件。

  5.现在打开PuTTY窗口,把你想要使用密码短语输入至最终连接配置框。在屏幕的较低部分,打开Connection〉SSH〉Auth。这样就打开了另一个窗口。在这个窗口,点击“浏览”,浏览私匙所保存的地址,然后把私匙添加到这个地址。

  6.接下来,仍然是在PuTTY里,回到窗口左边部分的“Session”选项,然后点击“保存”,这样下次你打开PuTTY界面时,私匙同样是有效可用的。

  7.现在你暂时需要退出PuTTY窗口,打开一个Window命令提示符。在这个命令提示符中,使用“pscp”命令(同样是PuTTY安装包的一部分)将公匙复制在你的Linux服务器的一个临时文件中。在将要使用这个公匙的用户的主目录中创建这个文件;在大多数情况下,那应该是用户根(user root)。在下面的例子中你会看到如何将PuTTY公匙复制到 “myserver.example.com” 服务器的用户根的主目录的一个命名为tempkey的临时文件中,命令如下:

  

以下是引用片段:
pscp pubkey root@myserver.example.com:/root/tempkey

  8.现在需要建立一个SSH连接到服务器,在服务器上,使用cd来启动用户根主目录,并使用下列命令将公匙添加到子目录“ssh”的authorized_keys文件中:

  

以下是引用片段:
cat tempkey >> .ssh/authorized_keys

  9.现在你已经准备就绪了。由于SSH的所有分布区都可以默认接受公匙/私匙登录,所以下次你想建立与那个服务器的连接时,PuTTY就能自动使用钥匙对帮助你登录。

  在这篇文章中,你已经了解到了如何使用公匙/私匙使Windows客户端与Linux服务器之间建立更安全可靠的连接。如果可能的话就使用这些方法吧,因为在使用一个不可信的网络(如因特网)来建立远程连接时,使用密匙要比使用密码安全得多。

Win主机下SSH命令

你可以使用Putty来登录SSH。
Putty中文版本下载地址

首先我们得知道什么叫shell.
操作系统与外部最主要的接口就叫做shell,或许这样说过于术语化,例如cmd命令行,这是windows操作系统下的一个shell。这里说的dreamhost的shell是指dreamhost提供给客户一个命令行,方便客户更好的使用他们的虚拟主机服务。
DreamHost中shell使用指南本shell指令及操作均基于Linuxord2.4.29,即DreamHost现在采用的系统,如果你也是DreamHost的用户,那本文或许对你有所帮助。

目录:
1.BasicInstructions/基本
2.wget/下载工具
3.Crontab/定时任务
4.tar/tar.gz/压缩文件
5.vi/编辑器

cd[目录名]转换路径
cd .. 返回上级目录
ls显示当前目录下所有文件
rm[-r]-f[][文件名]删除文件,加[-r]可以删除文件下所有子文件,如rm -rf [abc]删除abc文件夹及文件夹下的所有文件
tar -[解压下载的压缩包]
unzip[文件名]解压文件
cp -rpf .A/* B 将A文件夹中的所有文件拷贝到其上级目录B中
wget(最爽的一个命令 在linux下可以使用该工具快速地从网络上下载所需要的文件)

1.BasicInstructions基本操作命令
通常来说,使用”$[Instructions]-help”可以获得以下各个命令[instructions]的帮助,包含其参
数列表的定义。

-ls列出当前文件夹下所有内容
$ls-o列出当前文件夹中所有内容,含详细信息,但不列出group
$ls-l同上,含group信息
$ls-a列出当前文件夹中所有内容,包含以”.”开头的文件
$ls-t按更改时间排序
$ls-v按版本

-cd [dir] 进入文件夹
cd.. 退出当前文件夹,返回上级目录
-pwd 显示当前路径
-mkdir [dir] 新建文件夹
-chmod更改文件/文件夹权限
$chmod [Mode] [dir],其中Mode形如”755″或”777″等。
$chmod [Mode] [file]
$chmod -R [Mode] [dir],递归形式,即将目标文件夹内所有文件均改变权限
Mode还有另一种表达方式,”755″即为”-rwxr-xr-x”,不列举了。

-rm [file]删除文件/文件夹
$rm-f [file]强行删除,忽略不存在的文件,无提示
$rm-r [file]递归删除所有内容
$rm -rf 删除文件夹
-cp拷贝
$cp [options] [source] [destination]
其中[options]可以为-f(强行拷贝)或-r(递归拷贝)
-mv重命名或移动
$mv[options][source][destination]
[options]常用:-f(强行移动/重命名),-i(移动/重命名前尝试),-u(更新)
例如
$mvwwwroot/cgi-bin.将/cgi-bin目录移动到当前目录下
$mvcronfile.txtmyfile.txt将cronfile.txt重命名为myfile.txt
cp -rpf .A/* B 将A文件夹中的所有文件拷贝到其上级目录B中

2.wget下载工具
wget是一种非交互式的网络文件下载工具,在linux下可以使用该工具快速地从网络上下载
所需要的文件而不需要经由本
wget[参数列表]URL
最简单的用法:
$wgethttp://targetdomain.com/file.tar
wget的常用参数:-t[nuberoftimes]:尝试次数,当wget无法与服务器建立连接时,尝试连接多少次。比
如”-t120″表示尝试120次。当这一项为”0″的时候,指定尝试无穷多次直到连接成功为止,
这个设置非常有用,当对方服务器突然关机或者网络突然中断的时候,可以在恢复正常后继
续下载没
有传完的文件;-c:断点续传,这也是个非常有用的设置,特别当下载比较大的文件的时候,如果中途意外中断,那么连接恢复的时候会从上

次没传完的地方接着传,而不是又从头开始,使用这一项需要远程服务器也支持断点续传,一般UNIX/linux的Web/FTP服务器都支
持断点续传;-T[numberofseconds]:超时时间,指定多长时间远程服务器没有响应就中断连接,开始
下一次尝试。比如”-T120″表示如果120秒以后远程服务器没有发过来数据,就重新尝试连
接。如果网络速度比较快,这个时间可以设置的短些,相反,可以设置的长一些,一般最多
不超过900,通常也不少于60,一般120左右比较合适;-w[numberofseconds]:在两次尝试之间等待多少秒,比如”-w100″表示两次尝试之间等
待100秒;-nd:不下载目录结构,把从服务器所有指定目录下载的文件都堆到当前目录里;-x:与”-nd”设置刚好相反,创建完整的目录结构,

例如”wget-ndhttp://www.gnu.org/”,
实际的目录结构一级一级建下去,直到所有的文件都传完为止;-nH:不创建以目标主机域名为目录名的目录,将目标主机的目录结构直接下到

当前目录
下;-r:递归下载,在本录结构;-l[depth]:下载远程服务器目录结构的深度,例如”-l5″下载目录深度小于或者等于5以
内的目录结构或者文件;
-m:做站点镜像时的选项,如果你想做一个站点的镜像,使用这个选项,它将自动设定
其他合适的选项以便于站点镜像;-np:只下载目标站点指定目录及其子目录的内容。这也是一个非常有用的选项,我们假
设某个人的个人主页里面有一个指向这个站点其他人个人主页的连接,而我们只想下载这个
人的个人主页,如果不设置这个选项,甚至-有可能把整个站点给抓下来,这显然是我们通
常不希望的;-http-user=username-http-passwd=password:如果Web服务器需要指定用户名和口令,用这两项来设定;-O将数据写入文件中。

3.Crontab定时执行任务
在DreamHost系统下,通过Shell可以建立自己的crontab.具体使用如下:
使用支持shell登录的终端(如fterm或putty),地址栏输入username@qiran.org:22即可以SSH
方式登录至服务器.
常用的crontab命令:
crontab-l显示所有现存cronjob.
crontab-r删除当前cronjobs.
crontab-e编辑当前”crontabfile”.DH推荐使用nano
注意你的crontab包含所有的cronjobs,每个cron一行,断行结尾.一个正常的cron如下所
示:
452***/home/user/script.pl
第一个数字是每小时的第几分钟,
第二个数字是每天的第几小时,
第三个数字是每月的第几天,
第四个数字是每年的第几月,
第五个数字是每周的第几天.
使用方式例如:
32 * * * * : 表示每小时的第32分钟.
12,42 * * * * : 表示每小时的第12及第42分钟两次
*/15 */2 * * *: 表示0:00, 0:15, 0:30, 0:45, 2:00, 2:15, 2:30, …
43 18 * * 7: 表示每个周日的6:43pm运行命令行.

在DreamHost下使用nano编辑完文件后,使用ctrl+o保存,ctrl+x退出编辑。

4.tar命令
tar命令的使用方法如下:
tar[参数列表][文件名]
参数列表:
-c生成新的备份,并同时覆盖旧的备份文件
-x从备份文件中解压缩
-t列出备份文件内的文件目录
-v显示所有被操作文件列表
-f在指定位置生成备份
-u将不存在于备份中的文件,或将已经被更改的文件加入该备份中。

举例说明:
tar cvf filename.tar /*制作备份*/
tar cvf tarfile.tar ./filename /*将filename的文件备份到tarfile.tar里面*/
tar tvf filename.tar /*列出tar文档的内容*/
tar xvf filename.tar /*从tar文档中导出文件*/
tar zxpvf filename.tar.gz /*从tar.gz文档中导出文件*/
tar zxvf filename.tar.gz /*同上*/
tar xvf tarfile.tar ./filename /*导出tar文件中的单个文件*/
tar -xzf filename.tar.gz 解压
打包文件供下载 将目录./www打包到文件www.tar.gz

QUOTE:
tar czvf www.tar.gz ./www

或者直接更简单的 zip ./www
将当前目录下所有.php文件打包并压缩到文件bak.tar.gz

QUOTE:
tar czvf bak.tar.gz ./*.php

怎样利用Putty连接Linux主机

  随着Linux在服务器端应用的普及,Linux系统管理越来越依赖于远程。在各种远程登录工具中,Putty是出色的工具之一。

  Putty是一个免费的、Windows 32平台下的telnet、rlogin和ssh客户端,但是功能丝毫不逊色于商业的telnet类工具。用它来远程管理Linux十分好用,其主要优点如下:

  ◆ 完全免费;

  ◆ 在Windows 9x/NT/2000下运行的都非常好;

  ◆ 全面支持ssh1和ssh2;

  ◆ 绿色软件,无需安装,下载后在桌面建个快捷方式即可使用;

  ◆ 体积很小,仅364KB (0.54 beta版本);

  ◆ 操作简单,所有的操作都在一个控制面板中实现。

  Putty的官方主页是http://www.chiark.greenend.org.uk/~sgtatham/putty/

  快速起步

  把Putty下载到机器上,双击putty.exe,就出现如图1的配置界面。选择“Session”,在“Host Name(or IP address)”输入框中输入欲访问的主机名或IP,比如server1或192.168.9.4。端口号(Port)根据使用的协议有所区别,ssh默认使用22,telnet默认使用23,rlogin默认使用513。在“Protocol”单选栏中选择使用的协议,一般是telnet或ssh,这取决于服务器提供的服务。在“Saved Session”输入栏中输入任务的名字,单击“Save”按钮,就可以把任务配置保存起来了。

  配置完成后单击“Open”按钮,出现如图2的登录界面,就可以使用Putty连接Linux主机了。

  使用技巧

  Putty有很多实用的方法和技巧,可以帮助更得心应手地使用Putty登录到Linux服务器。

  1.中文输入支持

  做如下设置,Putty就可以支持中文输入。

  在Putty配置界面(如图1)的左边,选择“Window→Appearance”,在右面选择“Font:change→宋体”,字符集选择CHINESE_GB2312。
  图1 Putty配置界面

  2.分颜色显示支持

  Putty可支持分颜色显示目录、可执行文件、普通文件等。

  在Putty配置界面的左边选择“connection”,把右面的“terminal type string”单选栏由默认的“xterm”改为“xterm-color”。

  3.建立一个任务快捷方式

  Putty可以为经常访问的服务器建立一个Windows快捷方式。

  首先选中putty.exe,右击鼠标,发送得到桌面。然后右击桌面上Putty的快捷方式,单击“属性”,在“快捷方式→目标”中把“c:putty.exe”改为“c:putty.exe@mysession”。此处“mysession”就是保存的任务名称(Saved Session)。

  4.复制和粘贴

  在Putty窗口中,通过按住鼠标右键拖动,反选要复制的对象,单击鼠标左键可以粘贴。
  图2 使用Putty登录界面

 

windows下如何让php支持curl

首先保证你的php已经可以使用,本文不讲解windows下的php配置,只是增加curl的扩展。
1、拷贝PHP目录中的libeay32.dll 和 ssleay32.dll 两个文件到 system32 目录。
2、修改php.ini。去掉 extension = php_curl.dll 前面的分号。
完成!

curl介绍

curl是一个利用URL语法在命令行方式下工作的文件传输工具。它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传, 上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器, 通过http代理服务器上传文件到FTP服务器等等,功能十分强大。Windows操作系统下的网络蚂蚁,网际快车(FlashGet)的功能它都可以做到。准确的说,curl支持文件的上传和下载,所以是一个综合传输工具,但是按照传统,用户习惯称curl为下载工具。

使用PHP的Curl库模拟访问

bool curl_setopt (int ch, string option, mixed value)

curl_setopt()函数将为一个CURL会话设置选项。option参数是你想要的设置,value是这个选项给定的值。

下列选项的值将被作为长整形使用(在option参数中指定): 

*CURLOPT_INFILESIZE: 当你上传一个文件到远程站点,这个选项告诉PHP你上传文件的大小。
*CURLOPT_VERBOSE: 如果你想CURL报告每一件意外的事情,设置这个选项为一个非零值。
*CURLOPT_HEADER: 如果你想把一个头包含在输出中,设置这个选项为一个非零值。
*CURLOPT_NOPROGRESS: 如果你不会PHP为CURL传输显示一个进程条,设置这个选项为一个非零值。

注意:PHP自动设置这个选项为非零值,你应该仅仅为了调试的目的来改变这个选项。

*CURLOPT_NOBODY: 如果你不想在输出中包含body部分,设置这个选项为一个非零值。
*CURLOPT_FAILONERROR: 如果你想让PHP在发生错误(HTTP代码返回大于等于300)时,不显示,设置这个选项为一人非零值。默认行为是返回一个正常页,忽略代码。
*CURLOPT_UPLOAD: 如果你想让PHP为上传做准备,设置这个选项为一个非零值。
*CURLOPT_POST: 如果你想PHP去做一个正规的HTTP POST,设置这个选项为一个非零值。这个POST是普通的 application/x-www-from-urlencoded 类型,多数被HTML表单使用。
*CURLOPT_FTPLISTONLY: 设置这个选项为非零值,PHP将列出FTP的目录名列表。
*CURLOPT_FTPAPPEND: 设置这个选项为一个非零值,PHP将应用远程文件代替覆盖它。
*CURLOPT_NETRC: 设置这个选项为一个非零值,PHP将在你的 ~./netrc 文件中查找你要建立连接的远程站点的用户名及密码。
*CURLOPT_FOLLOWLOCATION: 设置这个选项为一个非零值(象 “Location: “)的头,服务器会把它当做HTTP头的一部分发送(注意这是递归的,PHP将发送形如 “Location: “的头)。
*CURLOPT_PUT: 设置这个选项为一个非零值去用HTTP上传一个文件。要上传这个文件必须设置CURLOPT_INFILE和CURLOPT_INFILESIZE选项.
*CURLOPT_MUTE: 设置这个选项为一个非零值,PHP对于CURL函数将完全沉默。
*CURLOPT_TIMEOUT: 设置一个长整形数,作为最大延续多少秒。
*CURLOPT_LOW_SPEED_LIMIT: 设置一个长整形数,控制传送多少字节。
*CURLOPT_LOW_SPEED_TIME: 设置一个长整形数,控制多少秒传送CURLOPT_LOW_SPEED_LIMIT规定的字节数。
*CURLOPT_RESUME_FROM: 传递一个包含字节偏移地址的长整形参数,(你想转移到的开始表单)。
*CURLOPT_SSLVERSION: 传递一个包含SSL版本的长参数。默认PHP将被它自己努力的确定,在更多的安全中你必须手工设置。
*CURLOPT_TIMECONDITION: 传递一个长参数,指定怎么处理CURLOPT_TIMEVALUE参数。你可以设置这个参数为TIMECOND_IFMODSINCE 或 TIMECOND_ISUNMODSINCE。这仅用于HTTP。
*CURLOPT_TIMEVALUE: 传递一个从1970-1-1开始到现在的秒数。这个时间将被CURLOPT_TIMEVALUE选项作为指定值使用,或被默认TIMECOND_IFMODSINCE使用。

下列选项的值将被作为字符串: 

*CURLOPT_URL: 这是你想用PHP取回的URL地址。你也可以在用curl_init()函数初始化时设置这个选项。
*CURLOPT_USERPWD: 传递一个形如[username]:[password]风格的字符串,作用PHP去连接。
*CURLOPT_PROXYUSERPWD: 传递一个形如[username]:[password] 格式的字符串去连接HTTP代理。
*CURLOPT_RANGE: 传递一个你想指定的范围。它应该是”X-Y”格式,X或Y是被除外的。HTTP传送同样支持几个间隔,用逗句来分隔(X-Y,N-M)。
*CURLOPT_POSTFIELDS: 传递一个作为HTTP “POST”操作的所有数据的字符串。
*CURLOPT_REFERER: 在HTTP请求中包含一个”referer”头的字符串。
*CURLOPT_USERAGENT: 在HTTP请求中包含一个”user-agent”头的字符串。
*CURLOPT_FTPPORT: 传递一个包含被ftp “POST”指令使用的IP地址。这个POST指令告诉远程服务器去连接我们指定的IP地址。 这个字符串可以是一个IP地址,一个主机名,一个网络界面名(在UNIX下),或是‘-’(使用系统默认IP地址)。
*CURLOPT_COOKIE: 传递一个包含HTTP cookie的头连接。
*CURLOPT_SSLCERT: 传递一个包含PEM格式证书的字符串。
*CURLOPT_SSLCERTPASSWD: 传递一个包含使用CURLOPT_SSLCERT证书必需的密码。
*CURLOPT_COOKIEFILE: 传递一个包含cookie数据的文件的名字的字符串。这个cookie文件可以是Netscape格式,或是堆存在文件中的HTTP风格的头。
*CURLOPT_CUSTOMREQUEST: 当进行HTTP请求时,传递一个字符被GET或HEAD使用。为进行DELETE或其它操作是有益的,更Pass a string to be used instead of GET or HEAD when doing an HTTP request. This is useful for doing or another, more obscure, HTTP request.

注意: 在确认你的服务器支持命令先不要去这样做。

下列的选项要求一个文件描述(通过使用fopen()函数获得):
 
*CURLOPT_FILE: 这个文件将是你放置传送的输出文件,默认是STDOUT.
*CURLOPT_INFILE: 这个文件是你传送过来的输入文件。
*CURLOPT_WRITEHEADER: 这个文件写有你输出的头部分。
*CURLOPT_STDERR: 这个文件写有错误而不是stderr。

用来获取需要登录的页面的例子,当前做法是每次或许都登录一次,有需要的人再做改进了:)

例子:
$cookie_jar = tempnam(’./tmp’,'cookie’);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, ‘http://******’);
curl_setopt($ch, CURLOPT_POST, 1);

$request = ‘email_address=&password=&action=’;
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);

//把返回来的cookie信息保存在$cookie_jar文件中
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);

//设定返回的数据是否自动显示
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//设定是否显示头信息
curl_setopt($ch, CURLOPT_HEADER, false);

//设定是否输出页面内容
curl_setopt($ch, CURLOPT_NOBODY, false);

curl_exec($ch);

curl_close($ch);
//get data after login
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, ‘http://*****’);
curl_setopt($ch2, CURLOPT_HEADER, false);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_jar);

$orders = curl_exec($ch2);
echo ‘<pre>’;
echo strip_tags($orders);
echo ‘</pre>’;
curl_close($ch2);

实践证明很稳定:)

Traceroute使用详解

Internet,即国际互联网,是目前世界上最大的计算机网络,更确切地说是网络的网络。它由遍布全球的几万局域网和数百万台计算机组成,并通过用于异构网络的TCP/IP协议进行网间通信。互联网中,信息的传送是通过网中许多段的传输介质和设备(路由器,交换机,服务器,网关等等)从一端到达另一端。每一个连接在Internet上的设备,如主机、路由器、接入服务器等一般情况下都会有一个独立的IP地址。通过Traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。UNIX系统中,我们称之为Traceroute,MS Windows中为Tracert。 Traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备Traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其IP地址。
在大多数情况下,作为网络工程技术人员或者系统管理员会在UNIX主机系统下,直接执行命令行:
Traceroute hostname
而在Windows系统下是执行Tracert的命令:
Tracerert hostname
比如在北京地区使用windows NT 主机(已经与北京163建立了点对点的连接后)
使用NT系统中的Tracert命令:(用户可用:开始->运行,输入”command” 调出command窗口使用此命令)
C:\>tracert www.yahoo.com
Tracing route to www.yahoo.com [204.71.200.75]
over a maximum of 30 hops:

 

1 161 ms 150 ms 160 ms 202.99.38.67
2 151 ms 160 ms 160 ms 202.99.38.65
3 151 ms 160 ms 150 ms 202.97.16.170
4 151 ms 150 ms 150 ms 202.97.17.90
5 151 ms 150 ms 150 ms 202.97.10.5
6 151 ms 150 ms 150 ms 202.97.9.9
7 761 ms 761 ms 752 ms border7-serial3-0-0.Sacramento.cw.net [204.70.122.69]
8 751 ms 751 ms * core2-fddi-0.Sacramento.cw.net [204.70.164.49]
9 762 ms 771 ms 751 ms border8-fddi-0.Sacramento.cw.net [204.70.164.67]
10 721 ms * 741 ms globalcenter.Sacramento.cw.net [204.70.123.6]
11 * 761 ms 751 ms pos4-2-155M.cr2.SNV.globalcenter.net [206.132.150.237]
12 771 ms * 771 ms pos1-0-2488M.hr8.SNV.globalcenter.net [206.132.254.41]
13 731 ms 741 ms 751 ms bas1r-ge3-0-hr8.snv.yahoo.com [208.178.103.62]
14 781 ms 771 ms 781 ms www10.yahoo.com [204.71.200.75]

Trace complete.
您目前正在ONLINE状态的话,可以直接尝试一下。
参数说明:
tracert [-d] [-h maximum_hops] [-j computer-list] [-w timeout] target_name
该诊断实用程序通过向目的地发送具有不同生存时间 (TL) 的 Internet 控制信息协议 (CMP) 回应报文,以确定至目的地的路由。路径上的每个路由器都要在转发该 ICMP 回应报文之前将其 TTL 值至少减 1,因此 TTL 是有效的跳转计数。当报文的 TTL 值减少到 0 时,路由器向源系统发回 ICMP 超时信息。通过发送 TTL 为 1 的第一个回应报文并且在随后的发送中每次将 TTL 值加 1,直到目标响应或达到最大 TTL 值,Tracert 可以确定路由。通过检查中间路由器发发回的 ICMP 超时 (ime Exceeded) 信息,可以确定路由器。注意,有些路由器“安静”地丢弃生存时间 (TLS) 过期的报文并且对 tracert 无效。
参数
-d
指定不对计算机名解析地址。
-h maximum_hops
指定查找目标的跳转的最大数目。
-jcomputer-list
指定在 computer-list 中松散源路由。
-w timeout
等待由 timeout 对每个应答指定的毫秒数。
target_name
目标计算机的名称。
二、什么是Traceroute网关—— Traceroute Gateway?
一般使用Traceroute(或者是Tracert)是基于一台主机的,但是通常您只能知道以手边的主机为源地址到互联网络上任意一台在线的主机的路由连接质量以及数据传输效率的情况,而使用基于WEB的方式,只要一台主机安装了特定的CGI程序,用户就可以通过这台主机运行相关的程序,执行Traceroute的功能。这台主机我们把它叫做Traceroute网关。Traceroute网关可以帮助用户了解网络的物理与逻辑连接的拓扑情况以及数据传输的效率。如果这种网关足够多,我们就可以方便地了解到各主机之间连接的情况了。
三、为什么要使用Traceroute?
1.几乎每一个网上人(尤其是Webmaster)对他们的计算机(或其它设备)与Internet的连接,路由(径),连通时间,速度等都很关心。使用由ChianNetMap组织起来的各地区Webmaster提供的Traceroute网关的服务,将给你一个满意的答案。从你的计算机到任何别的地方,ChinaNetMap(Traceroute)都能提供其间的每个设备(IP地址)及其连通时间。它可以让你画出通过网络的路径。
2.许多公司和单位都设有或正在设立自己的服务器-尤其是Web服务器。一旦有自己的Web服务器,随着网民数量的日益增加(包括潜在的,没法统计的网民),你一定很想知道是否他们都能与你连接。你的ISP如何与一个或多个NAP连接,以及他们的连接效率会直接影响到你的连接质量.
3.在选择ISP,骨干网连接,你站点的主机时,大多数有见识的网民喜欢检查该Site的连接性能及其它是怎样精确的与谁连,连到哪儿。ChinaNetMap(Traceroute)将给你一个完美的答案。
四、Traceroute的功能介绍:
Traceroute最早是由Van Jacobson在1988写出的小程序。当时主要是解决他自己碰到的一些网络的问题。Traceroute是一个正确理解IP网络并了解路由原理的重要工具。他们对负责网络工程技术与系统管理的Webmaster是一个使用方便的程序。
对ISP而言,设立Traceroute网关,将使网络服务提供商帮助用户建立并维持对服务商服务质量的信心。服务质量高的ISP可以通过设立Traceroute网关,使用户了解其与网络连接以及数据传输的效率。当然,基础设施差,服务质量低的ISP是比较害怕提供这种服务。因为,这样用户可以使用这一工具了解服务商目前的网络连接情况。
在一台主机安装了相关的Traceroute的CGI程序后,您可以输入相应的目的主机的IP地址或者名字,就可以得到相关的数据:
如:在美国的主机http://bs.mit.edu:8001/cgi-bin/traceroute上
查询其到中国南京的北极星站点www.lodesoft.com(中国Webmaster联盟的合作伙伴)数据传输的路径。
查询界面为:
Traceroute Hack
——————————————————————————–

可以搜索该索引。请键入要搜索的关键字:
查询结果为:
Traceroute Hack
1 E40-RTR-E40SERVER72-ETHER.MIT.EDU (18.72.0.1) 4 ms 4 ms 4 ms
2 EXTERNAL-RTR-FDDI.MIT.EDU (18.168.0.12) 4 ms 4 ms 4 ms
3 f1-0.cambridge2-br2.bbnplanet.net (192.233.33.6) 4 ms 4 ms 4 ms
4 s11-0-1.cambridge1-br1.bbnplanet.net (4.0.1.201) 8 ms 4 ms 4 ms
5 p1-0.cambridge1-nbr2.bbnplanet.net (4.0.1.45) 4 ms 4 ms 4 ms
6 p4-1.bstnma1-ba1.bbnplanet.net (4.0.2.170) 4 ms 4 ms 4 ms
7 p1-0.bstnma1-ba2.bbnplanet.net (4.24.4.194) 4 ms 8 ms 8 ms
8 p2-1.nyc4-nbr3.bbnplanet.net (4.24.4.238) 8 ms 12 ms 12 ms
9 p1-0.nyc4-nbr2.bbnplanet.net (4.0.5.25) 8 ms 12 ms 8 ms
10 p4-0.sanjose1-nbr2.bbnplanet.net (4.0.5.97) 70 ms 70 ms 70 ms
11 p1-0.sanjose1-nbr1.bbnplanet.net (4.0.5.85) 70 ms 70 ms 70 ms
12 p4-0.paloalto-nbr2.bbnplanet.net (4.0.1.1) 70 ms 74 ms 70 ms
13 p0-0-0.paloalto-cr18.bbnplanet.net (4.0.3.86) 70 ms 74 ms 74 ms
14 h1-0.atteasylink.bbnplanet.net (4.1.142.254) 74 ms 74 ms 78 ms
15 199.37.127.234 (199.37.127.234) 78 ms 74 ms 78 ms
16 205.174.74.170 (205.174.74.170) 230 ms 238 ms 227 ms
17 202.97.9.65 (202.97.9.65) 238 ms 231 ms 223 ms
18 * 202.97.9.49 (202.97.9.49) 234 ms *
19 202.97.10.110 (202.97.10.110) 246 ms 250 ms *
20 202.97.24.178 (202.97.24.178) 234 ms 238 ms 238 ms
21 202.102.24.74 (202.102.24.74) 234 ms 254 ms *
五、Traceroute的命令参数:
Traceroute的用法为: Traceroute [options] <IP-address or domain-name> [data size]
[options]的内容有:
[-n]:显示的地址是用数字表示而不是符号
[-v]:长输出
[-p]:UDP端口设置(缺省为33434)
[-q]:设置TTL测试数目(缺省为3)
[-t]:设置测包的服务类型
[data size]:每次测试包的数据字节长度(缺省为38)

六、Traceroute的工作原理:
Traceroute最简单的基本用法是:traceroute hostname
Traceroute程序的设计是利用ICMP及IP header的TTL(Time To Live)栏位(field)。首先,traceroute送出一个TTL是1的IP datagram(其实,每次送出的为3个40字节的包,包括源地址,目的地址和包发出的时间标签)到目的地,当路径上的第一个路由器(router)收到这个datagram时,它将TTL减1。此时,TTL变为0了,所以该路由器会将此datagram丢掉,并送回一个「ICMP time exceeded」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),traceroute 收到这个消息后,便知道这个路由器存在于这个路径上,接着traceroute 再送出另一个TTL是2 的datagram,发现第2 个路由器…… traceroute 每次将送出的datagram的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个datagram 抵达目的地。当datagram到达目的地后,该主机并不会送回ICMP time exceeded消息,因为它已是目的地了,那么traceroute如何得知目的地到达了呢?
Traceroute在送出UDP datagrams到目的地时,它所选择送达的port number 是一个一般应用程序都不会用的号码(30000 以上),所以当此UDP datagram 到达目的地后该主机会送回一个「ICMP port unreachable」的消息,而当traceroute 收到这个消息时,便知道目的地已经到达了。所以traceroute 在Server端也是没有所谓的Daemon 程式。
Traceroute提取发 ICMP TTL到期消息设备的IP地址并作域名解析。每次 ,Traceroute都打印出一系列数据,包括所经过的路由设备的域名及 IP地址,三个包每次来回所花时间。
Traceroute face=”宋体” 有一个固定的时间等待响应(ICMP TTL到期消息)。如果这个时间过了,它将打印出一系列的*号表明:在这个路径上,这个设备不能在给定的时间内发出ICMP TTL到期消息的响应。然后,Traceroute给TTL记数器加1,继续进行。

PHP 会话(session 时间设定)使用入门

PHP开发中对比起Cookie,Session是存储在服务器端的会话,相对安全,并且不像 Cookie 那样有存储长度限制,本文简单介绍 Session 的使用。

由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容。实际上在服务器端的 Session 文件,PHP 自动修改 Session 文件的权限,只保留了系统读和写权限,而且不能通过 ftp 修改,所以安全得多。

对于 Cookie 来说,假设我们要验证用户是否登陆,就必须在 Cookie 中保存用户名和密码(可能是 md5 加密后字符串),并在每次请求页面的时候进行验证。如果用户名和密码存储在数据库,每次都要执行一次数据库查询,给数据库造成多余的负担。因为我们并不能 只做一次验证。为什么呢?因为客户端 Cookie 中的信息是有可能被修改的。假如你存储 $admin 变量来表示用户是否登陆,$admin 为 true 的时候表示登陆,为 false 的时候表示未登录,在第一次通过验证后将 $admin 等于 true 存储在 Cookie,下次就不用验证了,这样对么?错了,假如有人伪造一个值为 true 的 $admin 变量那不是就立即取的了管理权限么?非常的不安全。

而 Session 就不同了,Session 是存储在服务器端的,远程用户没办法修改 Session 文件的内容,因此我们可以单纯存储一个 $admin 变量来判断是否登陆,首次验证通过后设置 $admin 值为 true,以后判断该值是否为 true,假如不是,转入登陆界面,这样就可以减少很多数据库操作了。而且可以减少每次为了验证 Cookie 而传递密码的不安全性了(Session 验证只需要传递一次,假如你没有使用 SSL 安全协议的话)。即使密码进行了 md5 加密,也是很容易被截获的。

当然使用 Session 还有很多优点,比如控制容易,可以按照用户自定义存储等(存储于数据库)。我这里就不多说了。

Session 在 php.ini 是否需要设置呢?一般不需要的,因为并不是每个人都有修改 php.ini 的权限,默认 Session 的存放路径是服务器的系统临时文件夹,我们可以自定义存放在自己的文件夹里,这个稍后我会介绍。

开始介绍如何创建 Session。非常简单,真的。

启动 Session 会话,并创建一个 $admin 变量:

<?php
// 启动 Session
session_start();
// 声明一个名为 admin 的变量,并赋空值。
$_SESSION["admin"] = null;
?>

如果你使用了 Seesion,或者该 PHP 文件要调用 Session 变量,那么就必须在调用 Session 之前启动它,使用 session_start() 函数。其它都不需要你设置了,PHP 自动完成 Session 文件的创建。

执行完这个程序后,我们可以到系统临时文件夹找到这个 Session 文件,一般文件名形如:sess_4c83638b3b0dbf65583181c2f89168ec,后面是 32 位编码后的随机字符串。用编辑器打开它,看一下它的内容:

admin|N;

一般该内容是这样的结构:

变量名|类型:长度:值;

并用分号隔开每个变量。有些是可以省略的,比如长度和类型。

我们来看一下验证程序,假设数据库存储的是用户名和 md5 加密后的密码:

<?php

// 表单提交后…
$posts = $_POST;
// 清除一些空白符号
foreach ($posts as $key => $value)
{
$posts[$key] = trim($value);
}
$password = md5($posts["password"]);
$username = $posts["username"];

$query = “SELECT `username` FROM `user` WHERE `password` = ‘$password’”;
// 取得查询结果
$userInfo = $DB->getRow($query);

if (!empty($userInfo))
{
if ($userInfo["username"] == $username)
{
// 当验证通过后,启动 Session
session_start();
// 注册登陆成功的 admin 变量,并赋值 true
$_SESSION["admin"] = true;
}
else
{
die(”用户名密码错误”);
}
}
else
{
die(”用户名密码错误”);
}

我们在需要用户验证的页面启动 Session,判断是否登陆:

<?php
// 防止全局变量造成安全隐患
$admin = false;

// 启动会话,这步必不可少
session_start();

// 判断是否登陆
if (isset($_SESSION["admin"]) && $_SESSION["admin"] === true)
{
echo “您已经成功登陆”;
}
else
{
// 验证失败,将 $_SESSION["admin"] 置为 false
$_SESSION["admin"] = false;
die(”您无权访问”);
}

?>

是不是很简单呢?将 $_SESSION 看成是存储在服务器端的数组即可,我们注册的每一个变量都是数组的键,跟使用数组没有什么分别。

如果要登出系统怎么办?销毁 Session 即可。

<?php

session_start();
// 这种方法是将原来注册的某个变量销毁
unset($_SESSION["admin"]);
// 这种方法是销毁整个 Session 文件
session_destroy();

  Session 能否像 Cookie 那样设置生存周期呢?有了 Session 是否就完全抛弃 Cookie 呢?我想说,结合 Cookie 来使用 Session 才是最方便的。

Session 是如何来判断客户端用户的呢?它是通过 Session ID 来判断的,什么是 Session ID,就是那个 Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安全。一般如果没有设置 Session 的生存周期,则 Session ID 存储在内存中,关闭浏览器后该 ID 自动注销,重新请求该页面后,重新注册一个 Session ID。

  如果客户端没有禁用 Cookie,则 Cookie 在启动 Session 会话的时候扮演的是存储 Session ID 和 Session 生存期的角色。

我们来手动设置 Session 的生存期:

<?php
session_start();
// 保存一天
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, “/”);
?>

其实 Session 还提供了一个函数 session_set_cookie_params(); 来设置 Session 的生存期的,该函数必须在 session_start() 函数调用之前调用:

<?php

// 保存一天
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;
?>

如果客户端使用 IE 6.0 , session_set_cookie_params(); 函数设置 Cookie 会有些问题,所以我们还是手动调用 setcookie 函数来创建 cookie。

假设客户端禁用 Cookie 怎么办?没办法,所有生存周期都是浏览器进程了,只要关闭浏览器,再次请求页面又得重新注册 Session。那么怎么传递 Session ID 呢?通过 URL 或者通过隐藏表单来传递,PHP 会自动将 Session ID 发送到 URL 上,URL 形如:http://www.openphp.cn/index.php?PHPSESSID= bba5b2a240a77e5b44cfa01d49cf9669,其中 URL 中的参数 PHPSESSID 就是 Session ID了,我们可以使用 $_GET 来获取该值,从而实现 Session ID 页面间传递。

<?php

// 保存一天
$lifeTime = 24 * 3600;
// 取得当前 Session 名,默认为 PHPSESSID
$sessionName = session_name();
// 取得 Session ID
$sessionID = $_GET[$sessionName];
// 使用 session_id() 设置获得的 Session ID
session_id($sessionID);

session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;
?>

对于虚拟主机来说,如果所有用户的 Session 都保存在系统临时文件夹里,将给维护造成困难,而且降低了安全性,我们可以手动设置 Session 文件的保存路径,session_save_path()就提供了这样一个功能。我们可以将 Session 存放目录指向一个不能通过 Web 方式访问的文件夹,当然,该文件夹必须具备可读写属性。

<?php
// 设置一个存放目录
$savePath = “./session_save_dir/”;
// 保存一天
$lifeTime = 24 * 3600;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;
?>

同 session_set_cookie_params(); 函数一样,session_save_path() 函数也必须在 session_start() 函数调用之前调用。

我们还可以将数组,对象存储在 Session 中。操作数组和操作一般变量没有什么区别,而保存对象的话,PHP 会自动对对象进行序列化(也叫串行化),然后保存于 Session 中。下面例子说明了这一点:

<?php
class person
{
var $age;
function output() {
echo $this->age;
}

function setAge($age) {
$this->age = $age;
}
}
?>
setage.php
<?php
session_start();
require_once “person.php”;
$person = new person();
$person->setAge(21);
$_SESSION['person'] = $person;
echo “<a href=’output’>check here to output age</a>”;
?>
output.php
<?
// 设置回调函数,确保重新构建对象。
ini_set(’unserialize_callback_func’, ‘mycallback’);
function mycallback($classname) {
$classname . “.php”;
}
session_start();
$person = $_SESSION["person"];
// 输出 21
$person->output();
?>

当我们执行 setage.php 文件的时候,调用了 setage() 方法,设置了年龄为 21,并将该状态序列化后保存在 Session 中(PHP 将自动完成这一转换),当转到 output.php 后,要输出这个值,就必须反序列化刚才保存的对象,又因为在解序列化的时候需要实例化一个未定义类,所以我们定义了以后回调函数,自动包含 person.php 这个类文件,因此对象被重构,并取得当前 age 的值为 21,然后调用 output() 方法输出该值。

另外,我们还可以使用 session_set_save_handler 函数来自定义 Session 的调用方式。

Theme Brought to you by Directory Journal and Elegant Directory