有时候,当我孤独地坐着等待生命大门关闭时,一种与世隔绝的感觉就会像冷雾一样笼罩着我。远处有光明、音乐和友谊,但我进不去,命运之神无情地挡住了大门。我真想义正词严地提出抗议,因为我的心仍然充满了热情。但是那些酸楚而无益的话语流溢在唇边,欲言又止,犹如泪水往肚里流,沉默浸透了我的灵魂。然后,希望之神微笑着走来对我轻轻耳语说:“忘我就是快乐。”因而我要把别人眼睛所看见的光明当作我的太阳,别人耳朵所听见的音乐当作我的乐曲,别人嘴角的微笑当作我的快乐。

发布新日志

  • TCL/EXPECT自动化测试脚本实例七 --- 构造报文测试

    2009-07-27 09:58:16

    前面提到过使用nemesis构造报文进行测试的思路,今天介绍一个这样的脚本。
    这个脚本的功能是构造并发送不同源MAC地址的报文,通过这样一个脚本,我们就可以测试交换机每端口最大能学习到的MAC地址的数目。

    简单说一下nemesis,它运行在linux上,也可以在windows上运行。在linux上,需要拥有root权限才能构造报文。
    它可以用来构造arp, enternet, ip, icmp, igmp, dns, tcp, ospf, rip等类型的报文。实际上,用户可以使用一个文件做为它所构造的报文的内容,从这个角度上讲,它可以用来构造任何类型的报文。
    另外,由于它是基于命令行的一组工具,所以能够非常好的和TCL/EXPECT结合使用,完成自动化测试。

    这个脚本仍旧由前面介绍的test.exp脚本调用,调用方式是:
    ./test.exp -ssrc_mac_attack.exp script

    此脚本文件的内容(src_mac_attack.exp)如下:

    # $Id$
    # Construct different source MAC address packets, and send them to switch.

    proc src_mac_attack {mac} {
        set rc [exec echo "src MAC attack packet $mac" \
            | nemesis ethernet -M 00:01:02:03:04:05 -H $mac -T 0x0800 -P -]
        return $rc
    }


    for {set i 1} {$i < 256} {incr i} {
        set mac [constructMac $i]
        src_mac_attack $mac
    }

    脚本很简单,只有一个循环,不断生成新MAC,然后构造报文发送。
    简单介绍一下proc src_mac_attack,这个函数中,使用TCL的exec命令来执行linux下的命令。在这里执行的linux命令就是:
      echo "src MAC attack packet $mac" \
              | nemesis ethernet -M 00:01:02:03:04:05 -H $mac -T 0x0800 -P -
    其中,echo命令的输出通过管道,被送给nemesis命令做输入,echo命令显示的内容将做为所构造的以太报文的内容;
    nemesis ethernet命令表明所构造的是以太报文,-M、-H、-T分别指明报文的目的地址、源地址,报文类型。“-P -”则指明报文的内容由标准输入获得,在此例中就是echo命令的输出。

    脚本中调用了另外一个自定义函数,这个函数放在commonLib.exp中,用来生成MAC地址(最多可生成65535个不重复的MAC地址),函数内容如下,比较简单,不再赘述:

    #************************************************
    # Construct MAC address
    #
    # @PARAMS
    #    rawMac --- raw MAC address, integer
    #
    # @RETURN
    #    the MAC address string
    #************************************************
    proc constructMac {rawMac} {
        set mac "00:00:00:00"
        set j [expr "($rawMac >> 8) & 0xFF"]
        set k [format "%x" $j]
        set mac "$mac:$k"
        set j [expr "$rawMac & 0xFF"]
        set k [format "%x" $j]
        set mac "$mac:$k"

        dbgLog "rawMac = $rawMac, mac = $mac"
        return $mac
    }


  • TCL/EXPECT自动化测试脚本实例六 --- SNMP community长度测试

    2009-07-27 09:57:27

    下面通过一个测试SNMP community最大长度的脚本,介绍一下net-snmp工具。

    net-snmp是一组基于命令行的snmp manager工具,可以在命令行下进行snmp get, snmp set, snmp walk等操作,支持snmp v1/v2c/v3。原来的名字叫做ucd-snmp,也已经被移植到windows NT上。
    它的主页在http://net-snmp.sourceforge.net/

    由于它可以在命令行下进行SNMP操作,所以可以和TCL/expect很好的结合,完成自动化测试的功能。
    下面的脚本(snmp.exp),不断的增加SNMP community,长度从1到256,每增加一个community,就调用snmp-get来进行SNMP get操作,如果get成功,说明此community有效;反之,就说明community已经超出了设备支持的最大长度。
    这个脚本使用前面讲到的test.exp调用,调用方法是:
    ./test.exp -ssnmp.exp script
    对它稍加修改,也可以直接在命令行中调用,此处不再赘述。

    代码如下:
    # $Id$

    proc snmpCommTest {comm} {
        global g_devip

        spawn snmpget -c $comm -v 2c -r 2 $g_devip system.sysUpTime.0
        expect {
            "system.sysUpTime.0*" {
                return 1
            }
            "*Timeout*" {
                return 0
            }
        }

        return 1
    }

    set spawn_id [login $g_devip $g_user $g_passwd]
    if {$spawn_id == 0} {
        errLog "login error\n"
        return 0
    }

    set cmdCommAdd "create snmp community %s rw\n"
    set cmdCommDel "delete snmp community %s\n"
    set cmdHostAdd "create snmp host ip 192.168.1.2 community %s\n"
    set cmdHostDel "delete snmp host ip 192.168.1.2 community %s\n"
    set comm ""

    for {set i 1} {$i < 256} {incr i} {
        set comm "a$comm"
        set cmd [format $cmdCommAdd $comm]
        exp_send $cmd
        expect {
            "Error*" {
                errLog "create comm len $i error"
                continue
            }
            timeout {
                errLog "create comm len $i timeout"
                continue
            }
            "Entry Created"
        }
        set cmd [format $cmdHostAdd $comm]
        exp_send $cmd
        expect {
            "Error*" {
                errLog "create host error"
                continue
            }
            timeout {
                errLog "create host timeout"
                continue
            }
            "Entry Created"
        }

        set rc [snmpCommTest $comm]
        if {$rc == 0} {
            errLog "community len $i failed"
        }

        set cmd [format $cmdHostDel $comm]
        exp_send $cmd
        expect "Entry Deleted"
        set cmd [format $cmdCommDel $comm]
        exp_send $cmd
        expect "Entry Deleted"
    }


  • TCL/EXPECT自动化测试脚本实例五 --- 由文件中读取一行

    2009-07-27 09:56:37

    TCL/EXPECT自动化测试脚本实例五 --- 由文件中读取一行
    代码见下,比较简单,就不再分析了。调用实例见前面的文章。

    #************************************************
    # get a line from file, skip blank lines and
    # comment lines, return the reading line in
    # parameter 'line'.
    #
    # @PARAMS
    # fd     - file fd
    # line   - var used to return the line
    #
    # @RETURN
    # return 1 if read successfully, otherwise 0
    #************************************************
    proc getLine {fd line} {
        upvar $line ln

        # read a line from fd
        while {[set lineLen [gets $fd ln]] >= 0} {
            # blank line
            if { $lineLen == 0 } continue
     
            # trim whitespace
            set ln [string trim $ln]
            if { [string length $ln] == 0 } continue

            # skip comment
            if { [string index $ln 0] == "#" } continue

            # success
            return 1
        }

        return 0
    }


  • TCL/EXPECT自动化测试脚本实例四 --- 批命令执行

    2009-07-27 09:55:51

    在测试过程中,在具体测试某一个功能点时,往往需要为此进行大量的配置。为了简化测试过程,我们可以把所有的配置命令放在一个文本文件中,然后使用测试脚本来执行这些命令。这样就不需要再手工进行配置了,费时费力。
    基于如上考虑,编写了下面的脚本tCmd.exp。这个脚本被我们前面介绍过的test.exp脚本调用。

    # $Id$

    # This file is used to execute specific commands list in a file

    proc execCmdFile {cmdFile} {
        global g_dbgFlag g_prompt

        # enable debug
        set g_dbgFlag 1

        # login
        set spawn_id [login $g_devip $g_user $g_passwd]
        if {$spawn_id == 0} {
            errLog "login $g_devip failed"
            return 0
        }

        # open cmdFile
        set cmdFd [open $cmdFile r]

        while true {
            # get a line
            if {![getLine $cmdFd line]} {
                dbgLog "reached eof"
                break
            }

            # split the line
            set ln [split $line ","]
            set cmd [string trim [lindex $ln 0]]
            set out [string trim [lindex $ln 1]]

            if {$cmd == ""} continue
            if {$out == ""} set out $g_prompt

            # send cmd line
            exp_send "$cmd\n"
            dbgLog "send $cmd"

            # expect output
            dbgLog "expect $out"
            expect {
                timeout {
                    errLog "TIMEOUT: while exec \"$cmd\""
                    continue
                }
                -ex "$out" {
                    continue
                }
            } ;# end expect
        }

        # close cmdFile
        close $cmdFd
    }

    # if no cmdFile, use default
    if {$cmdFile == ""} {
        set cmdFile "cmdFile.txt"
    }

    execCmdFile $cmdFile

    有了这个脚本,我们可以使用"./test.exp -cinterface.txt cmd"来执行interface.txt中的命令。

  • TCL/EXPECT自动化测试脚本实例三 --- 全局变量

    2009-07-27 09:55:12

    下面是global.exp文件的内容,只是定义一些全局变量,供其它文件使用。

    # $Id$

    # global variables
    set g_dbgFlag   1                ;# Debug flag
    set g_bLogFd    0                ;# Error Log FD
    set g_devip     "192.168.1.222" ;# Default device IP address
    set g_prompt    "$"              ;# CLI prompt
    set g_user      "root"           ;# login account name
    set g_passwd    "root"           ;# login password
    set g_usrPrompt "*ogin:"         ;# login prompt
    set g_pwdPrompt "*assword:"      ;# login password prompt


  • TCL/EXPECT自动化测试脚本实例二 --- 主程序

    2009-07-27 09:54:19

    现在介绍一下测试主程序: test.exp。
    为了方便加入新的测试项目,主程序采用了一种灵活的机制,它根据需要通过source命令调用相应的子测试程序。这样一来,每个测试点都可以单独放到一个文件中,然后被主程序引用。
    先看一下代码:

    #! /usr/bin/expect --

    # $Id$
    # Usage:
    #    ./test [-uuser] [-ppassward] [-iip_address]  test_001 ...
    # or ./test [-uuser] [-ppassward] [-iip_address] [-ccommand_file] cmd
    # or ./test [-uuser] [-ppassward] [-iip_address] [-sscript_file] script

    source global.exp
    source commonLib.exp

    # initialize variables
    set cmdFile ""
    set tList $argv
    set execScript. ""

    # process options
    set endOptIndex -1
    foreach arg $argv {
        if {![string match "-\[a-zA-Z]*" $arg]} {
            break
        }

        # inc end option index
        incr endOptIndex

        # get option flag and option value
        set optFlg [string range $arg 1 1]
        set optVal [string range $arg 2 end]
        dbgLog "$optFlg $optVal"
        if {$optVal == ""} {
            dbgLog "option value is null: -$optFlg"
            return -1
        }

        switch $optFlg {
            "u" {
                set g_user $optVal
                dbgLog "user: $g_user"
            }
            "p" {
                set g_passwd $optVal
                dbgLog "password: $g_passwd"
            }
            "i" {
                set g_devip $optVal
                dbgLog "devip: $g_devip"
            }
            "c" {
                set cmdFile $optVal
                dbgLog "cmdFile: $cmdFile"
            }
            "s" {
                set execScript. $optVal
                dbgLog "execScript. $execScript"
            }
            default {
                puts "unknown option: -$optFlg"
                return -1
            }
        } ;# end switch
    } ;# end foreach

    # remove options from list
    if {$endOptIndex != -1} {
        set tList [lreplace $argv 0 $endOptIndex]
    }

    dbgLog "tList is: $tList"

    # create log dir
    if { ![file exist "log"] || ![file isdirectory "log"] } {
        puts "please create directory \"log\""
        return -1
    }

    # read current time
    set clicks [clock clicks]
    set tstr [clock format $clicks -format "%y%m%d%I%M%S"]

    # open log file
    log_file "log/vLog$tstr.log"

    # open brief log file
    set g_bLogFd [open "log/bLog.log" w]

    # start testing
    foreach tItem $tList {
        switch $tItem {
            "sys_001" { ;# test group sys_001
                source snmp.exp
            }
            "cmd" { ;# exec cmd file
                source tCmd.exp
            }
            "script" { ;# exec script. file
                if {$execScript. == ""} {
                    puts "Please specify script. name using -s option"
                    return -1
                }
                source $execScript
            }

            default {
                puts "do you want to test \"$tItem\"\?"
            }
        }
    }

    close $g_bLogFd


    在程序开始,通过source导入两个文件,其中global.exp中主要存放了一些全局变量的定义,因为这些全局变量对每台测试设备可能各不相同,所以把它们提取出来。commonLib.exp文件中存放着一些通用子程序,可供各测试程序调用。我们前面介绍过的login子程序,就放在此文件中。
    接下来,分析命令行参数,首先提取出所有的选项参数,目前支持的命令行选项包括:
    -u :此选项用来更改登录的用户名
    -p :此选项用来更改登录的密码
    -i :此选项用来更改telnet的IP地址
    -c :此选项用来指明批处理文件的文件名,用法在后面描述
    -s :此选项用来指明脚本文件的文件名,用法在后面描述

    最后,命令行参数中所有非选项的部分,都被做为测试项,分别对这些测试项进行测试。
    例如测试项test_001,会使用source命令调用snmp.exp脚本,进行snmp community方面的测试。
    可以根据需要自行添加测试项目。

    有两个特别的测试项名称,分别为cmd和script。
    cmd测试项,会调用cmd.exp脚本,这个脚本在后面介绍,它的主要功能是执行一个文本文件里的所有命令。文本文件名由-c选项提供。
    script测试项,它会调用source命令,执行$execScript脚本。可以使用-s选项为$execScript变量赋值。

    这个测试脚本提供了两种日志,一种是详细的日志(vLog*),包括了telnet的所有交互过程;另外一种是简单的日志,只包含程序中使用errLog输出的信息。日志文件被放在子目录log中,其文件名中包含了脚本执行的时间,方便查找。
    本脚本中使用dbgLog,以及以后将用到的errLog,都是定义在commonLib.exp文件中的子函数,代码如下:

    #************************************************
    # debug output routine
    #
    # @PARAMS
    # arg - variable length arguments
    #************************************************
    proc dbgLog arg {
        global g_dbgFlag

        if {$g_dbgFlag} {
            puts $arg
        }
    }

    #************************************************
    # error output routine
    #
    # @PARAMS
    # arg - variable length arguments
    #************************************************
    proc errLog arg {
        global g_bLogFd
        global g_dbgFlag

        if {$g_dbgFlag} {
            puts $arg
        }

        if { $g_bLogFd != 0 } {
            puts $g_bLogFd $arg
        }
    }


  • TCL/EXPECT自动化测试脚本实例一 --- telnet到目标机器

    2009-07-27 09:53:28



    我的自动化测试脚本运行在debian linux下,使用/usr/bin/expect进行解释执行。为了简化处理,把一些常用的功能编写成函数,放在commonLib.exp文件中,其它脚本文件可以使用source commonLib.exp命令引用这些函数。
    下面的函数完成telenet到目标机器并login。从其实现上大家可以看到tcl/expect编写测试脚本的简洁。
    这个函数带有三个参数,分别是目标机器的IP地址ipaddr,登录用户名user和登录密码,telenet的端口号采用默认的23端口。
    函数中使用了三个全局变量,g_prompt,g_usrPrompt和g_pwdPrompt,分别表示登录后的命令提示符,提示用户名输入的提示符,以及提示密码输入的提示符,这三个全局变量定义在global.exp中。之所以采用全局变量,是因为这些值使用比较广泛,但在不同设备中都不相同。使用全局变量可以方便修改。

    代码如下:

    #************************************************ 全部用#在开头标识,表示#不可执行部分
    # telnet login routine
    #
    # @PARAMS                               参数:
    # ipaddr - remote device ip address
    # user   - user name to login in
    # passwd - login password
    #
    # @RETURN
    # spawn_id if login success, otherwise 0
    #************************************************
    proc login {ipaddr user passwd} {

    proc add {x y } {expr $x+$y}

    proc命令的第一个参数是你要定义的过程的名字,第二个参数是过程的参数列表,参数之间用空格隔开,第三个参数是一个TCL脚本,代表过程体。

    proc生成一个新的命令,可以象固有命令一样调用:

        global g_prompt g_usrPrompt g_pwdPrompt
    全局变量:分别表示登录后的命令提示符,提示用户名输入的提示符,以及提示密码输入的提示符,
        spawn telnet $ipaddr    telnet 方式登陆到目标ip地址上
        expect {
            "$g_usrPrompt" {        提示输入用户名
                exp_send "$user\r\n"  发送用户名
                exp_continue         程序继续
            }
            "$g_pwdPrompt" {         提示密码输入的提示符
                exp_send "$passwd\r\n" 发送密码
                exp_continue           程序继续
            }
            -ex "$g_prompt" {            登录后的命令提示符  exec 命令用于显式地执行外部命令
                dbgLog "Login Successful\n" 显示日志信息,登陆成功
                return $spawn_id           
            }
            timeout {                     超时处理
                send_user "timeout"       发送超时信息
                return 0                  习惯上 return (0); 表示程序运行正常,别的值表示不正常

    在定义过程时,你可以利用return命令在任何地方返回你想要的值。 return命令迅速中断过程,并把它的参数作为过程的结果。


            }
        }
    }


  • spirrent testcenter & expect

    2009-07-27 09:52:12

    这一段时间一直在做使用tcl脚本控制testcenter的工作,同时还需要远程登陆到几台linux主机进行一些测试操作,相关的资料太少了,努力啃英文资料,总算有一点进展。
        说说在这个过程中遇到的一些问题吧。
        1.测试环境:
        window2000下使用komodo调试程序,安装testcenter自带的tcl包后,然后把ActiveTcl8.4.15.0.280619-win32-ix86-threaded自带的expect库文件copy到testcenter安装的目录下,这样tclsh就可以同时导入expect与SpirentTestCenter这两个package了。
        不知道有没有别的更好的方法,呵呵。如果在xp pack2或3下面想使用expect,需要更新系统system32下面的一个debughelp.dll文件。

  • tcl学习笔记(2)-expect实现telnet和ssh

    2009-07-27 09:51:02

     

    这个两个功能在以后的工作中可以以函数实现,完成特定功能。

     

    1.SSH到linux主机上查看linux内核版本号

     

    #!/usr/expect/bin/expect

     

    set HOSTIP [lindex $argv 0]

    set LOGIN [lindex $argv 1]

    set PASS [lindex $argv 2]

     

    set timeout 1

    set cmd {uname -a}

     

    if {$argc<3} {

            puts stderr "Usage:$argv0 hostip login password.\n"

            exit 1

    }

     

    send_user "argv0:  $argv0\n"

    send_user "argv:  $argv\n "

     

    spawn ssh $LOGIN@$HOSTIP

    expect_after eof { exit 0 }

     

    expect "yes/no" { send "yes\r" }

    expect "password:" { send "$PASS\r" }

    expect "#"

    send "$cmd\r"

    expect "*\r"

    send "exit\r"

     

     

     

    2.telnet到3750上添加一条静态路由

     

    #!/usr/expect/bin/expect

     

    spawn telnet 10.255.255.240

    expect "Username:"

    send "admin\n"

    expect "Password:"

    send "XXXXXX\n"

    expect "3750>"

    send "en\n"

    expect "Password:"

    send "XXXXXX\n"

    expect "3750#"

    send "ping 192.168.100.100\n"

    expect "3750#"

    send "config t\n"

    expect "#"

    send "ip route 123.2.1.1 255.255.255.255 null0\n"

    expect "#"

     

    send_user "\n\nOver\n\n"

  • 转贴学习: tcl学习笔记(1)-安装tcl&expect

    2009-07-27 09:49:37

    tcl学习笔记(1)-安装tcl&expect

    创建Tcl

     

    目前最新版本的Tcl8.6.0,但是Expect还没有跟上脚步,如果没有选择好版本会导致安装失败。我使用的是tcl8.4.19-src.tar.gzexpect-5.39.0.tar.gz,把两个软件包放在/tmp/tcl目录下。

     

    Tcl下载:http://sourceforge.net/project/showfiles.php?group_id=10894&package_id=10452

    expect 下载: http://expect.nist.gov/src/

    Expect 补丁下载:http://www.linuxfromscratch.org/patches/downloads/expect/

     

    解压缩源代码包,并进入源代码目录:

     

        #tar -zvxf tcl8.4.19-src.tar.gz

        #cd tcl8.4.19

     

    现在为创建Tcl作准备工作:

     

        #cd unix

        #./configure --prefix=/usr/tcl

     

    开始创建:

     

        #make

     

    安装:

     

        #make install

     

    安装完毕以后,进入tcl源代码的根目录,把子目录unix下面的tclUnixPort.h copy到子目录generic中。暂时不要删除tcl源代码,因为expect的安装过程还需要用。

     

     

    创建Expect

     

        首先解压缩源代码,进入源代码目录:

     

        #tar -zvxf expect-5.39.0.tar.gz

        #cd expect-5.39

     

    打补丁,修Bug

     

        #patch -Np1 -i ../expect-5.39.0-spawn-1.patch

     

    作准备工作:

     

        #./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-x=no --with-tclinclude=/tmp/tcl/tcl8.4.19/generic/

     

    各选项的含义是:

     

        --with-tcl=/usr/tcl/lib

        告诉configure脚本,Tcl解释器在哪里。这里要用刚刚创建的Tcl,否则就会使用你系统的Tcl了。

     

        --with-tclinclude=/tmp/tcl/tcl8.4.19/generic

        告诉configure脚本,Tcl的头文件位置。

     

        --with-x=no

        不使用X图形系统支持,因为没有TkTcl的图形用户界面组件)。

     

    开始创建:

     

        #make

     

    安装:

     

        #make install

  • ARP 协议总结

    2009-07-26 16:29:54

    ARP是地址解析协议。在交换网中,主机之间的通信使用MAC地址,而不是IP地址。

    因此,每台主机都需要维护一张ARP表。保存了IP地址和MAC地址的对应关系。

  • 面试非技术问题汇总

    2009-07-26 15:06:56

     

     

     

    面试问题汇总:


    1 基础知识出现问题。
    说到包,byte 等概念,不知所云。当时记得先别说出自己的疑惑,要不惨了。


    2 深入的问题,如果不清楚,就不要乱说。有时候没有准备的问题,可能会回答不清楚,或者回答错误。这些都不要紧。选择不说反而会好些。
    乱说的话这样反而引起不好的印象,感觉你对于技术不严肃。

    3 对于公司的业务,需要知道些。
    上周四去面试,对于比蒙新帆的业务不清楚,直接询问了,感觉很不关心公司。
    对于上周一去面试的那家,也说不清楚公司业务,同时对于细节问题,没有了解清楚,不过这些问题都是比较深入,也能体现细节的部分。


    4 对自己要有信心。你之前是怎麽样的,别人并不了解,从你的言谈中他们才进行观察的,要不断的肯定自己,技术上的问题是无止境的,只有你认真的态度才能打动他们,让他们信服。

  • xDSL gateways

    2009-07-23 21:31:15

    数字用户线路(xDSL)是在家庭和企业的普通铜质电话线路(POTS)上提供宽带数据访问的一种调制解调器技术。xDSL 是所有 DSL 类型的统称,诸如 ADSL、G.Lite、HDSL、SDSL、IDSL 和 VDSL 等。 xDSL 有时称为“最后一英里”技术,这是因为它们只用于电话交换站和家庭或办公室之间的连接,而不是交换站之间的连接。

    其中x=A/H/S/C/I/V/RA等

     

    类型 描述 数据速率 模式 距离 应用
    IDSL ISDN 数字用户线 128 kbps 双工 18k ft on 24 gauge wire ISDN服务于语音和数据通信
    HDSL 高速率数字用户线 1.544 Mbps 到 42.048 Mbps 双工 12k ft on 24 gauge wire T1/E1 服务于WAN、LAN访问和服务器访问
    SDSL 单线对数字用户线 1.544 Mbps到 2.048 Mbps 双工 12k ft on 24 gauge wire 与HDSL应用相同,另外为对称服务提供场所访问。
    ADSL 非对称数字用户线 1.5 到9 Mbps 16 到 640 kbps 下行 Up to 18k ft on 24 gauge wire Internet 访问,视频点播、单一视频、远程 LAN 访问、交互多媒体
    DSL Lite (G.Lite) “Splitterless” DSL 1.544 Mbps到 6 Mbps 16 到640 kbps 下行 18k ft on 24 gauge wire 标准ADSL;在用户场所无需安装splitter。
    VDSL 甚高数据速率数字用户线 13 到52 Mbps 1.5 到2.3 Mbps 下行 1k to 4.5k ft depending on data rate 与ADSL相同,另外可以传送HDTV节目。

     

    Kbps:首先要了解的是,ps指的是/s,即每秒。Kbps又称比特率,指的是数字信号的传输速率,也就是每秒钟传送多少个千位的信息(K表示千位,Kb表示的是多少千个位);Kbps也可以表示网络的传输速度,为了在直观上显得网络的传输速度较快,一般公司都使用kb(千位)来表示,如果是KBps,则表示每秒传送多少千字节。1KByte/s=8Kbps(一般简写为1KB/s=8Kbps)。ADSL上网时的网速是512Kbps,如果转换成字节,就是512/8=64KBps(即64千字节每秒)。

    Mbps 2.、每秒百万个位元(MEGABIT)。我们通常说的Mbps是指第二个每秒百万个位元,有就是每秒百万个位。 1Byte=8bit

  • ATM学习

    2009-07-23 20:19:17

    ATM 是异步转移模式。通过信元实现信息的传输,复接和交换,将图像,声音和数据分解成定长的信息并在信息头部添加地址,优先级控制信息的信头构成信元。

    ATM的目标,就是对任何形式的业务分布都能达到最佳的网络资源利用率。要达到这一目标就需要对网络资源进行统计复用。统计复用就是根据各种各种业务的统计特性,在保证各种网络资源的传输质量情况下,在各类业务间动态的分配网络资源。

  • PPPOA学习

    2009-07-23 17:42:09

    PPPOA和PPPOEP,PPOE的主要区别在于发起PPP连接的设备不同,,PPOE由用户的以太网卡发起,适合普通用户,PPPOA由ATM设备由ATM专用设备
  • PPPoE协议

    2009-07-23 15:52:34

    PPPoE协议是一种点到点的链路协议,它提供了点到点的一种封装,传递数据的一种方法。

    以太网是一种广播网,本身不能提供身份验证的功能。ppp协议提供了通信双方身份验证的功能,但是PPP协议是一种是一种点对点协议,通信双方没有提供地址信息。如果PPPoE应用在以太网链路上,必须进行又一次封装,PPPoE提供了在以太网广播链路上进行点对点通讯的能力。

    ppp协议包含LCP协议,认证阶段(pap或者CHAP),NCP协议。

    另一种说法是ppp协议包含LCP协议,NCP协议。和ppp的扩展协议

    LCP协议用于协商ppp协议的参数选项;NCP协议网络控制协议,常用IPCP,用来通信双方的网络地址。

    lcp协议包含三类报文:链路配置报文,链路终止报文,链路维护报文。

    链路配置报文用于协商一些报文可选参数选项。是sp还是mp、验证方式和最大传输单元等

    链路终止报文用于终止一条链路 引起链路终止的原因很多:载波丢失、认证失败、链路质量失败、空闲周期定时器期满、或者管理员关闭链路。

    链路维护报文用于测试和调试ppp链路。

    lcp 协议中Config-request报文中,认证配置选项可以选择其一。

    PAP(密码认证协议)认证:采用2次握手。认证方向被验证方发送Config-Request 报文中含有认证配置选项,参数数据为0XC023.

    完成链路建立阶段之后,对等结点持续重复发送 ID/ 密码给验证者,直至认证得到响应或连接终止。

    CHAP(挑战握手协议)认证是3次握手。

    1 由验证方发出一段随机数和验证方的主机名A。

    2 被验证方收到后,将随机数,报文ID以及本机上主机名A下对应的密钥,经过MD5加密算法之后,生成应答,随后将应答和自己的主机名B填写好,送回信息

    3 验证方查找到被验证方的主机名B,然后用名下的密钥,保留报文ID和随机报文用MD5加密算法生成结果。

    4 验证方将刚刚生成的结果和被验证方的比较,如果计算结果一致,返回ACK信息,否则返回NAK信息。

    PPPoE协议

    PPPoE流程:

    1 从PPPoE客户端向PPPoE服务器发送PADI(PPPOE Active Discovery Initiation)广播报文,用于寻找PPPoE服务器,请求PPPoE接入。

    2 PPPoE服务器向PPPoE客户端发送PADO(PPPOE Active Discovery Offer)报文。

    3 客户端根据回应,向PPPoE服务器发送PADR(PPPOE Active Discovery Request)请求。

    4 PPPoE服务器产生一个session id ,通过PADS(PPPOE Active Discovery Session-confirmation)发送给客户端。

    5、PADT(PPPOE Active Discovery Terminate)报文
    当用户或者服务器需要终止会话时,可以发送这种PADT报文。

    5 客户端和PPPoE服务器之间进行PPP的LCP协商,建立LCP通信。同时,确定认证模式是CHAP模式。

    6 由PPPoE服务器向客户端发送一个随机数,成为chanllage.

    7 客户端接收后,把随机数、session id 以及存放在客户端本地的服务器名称下的密钥,用MD5算法加密后,发送给PPPoE服务器。

    8 服务器把客户端用户名下的密钥,随机数和保留ID一起送到Rdius服务器进行验证。

    9 Radius服务器根据用户信息进行验证,如果验证通过,就连同配置信息一起发送给PPPoE服务器。如果认证失败,流程到此结束。

    10 PPPoE服务器将认证结果返回给客户端。

    11 用户进行NCP(如IPNP)协商,通过PPPoE服务器获取到规划的IP地址等参数。

    ncp协商支持ipcp和ipxcp协商,ipcp协商主要包括双方的ip地址,ipxcp协商主要包括双方的网络号和节点号。通过ncp协商来选择和配置一个或多个网络层协议。每个选中的网络层协议配置成功后,该网络层协议就可通过这条链路发送报文了。

    12 如果认证通过,PPPoE服务器向Radius服务器发送计费开始请求。

    13 Radius服务器向用户发送计费回应。

    14用户此时通过认证,并且获得合法权限,可以展开网络业务。

    用户下线业务:包含用户正常下线和用户意外下线。正常下线流程:

    1 用户向PPPoE服务器发送下线申请。

    2 服务器响应客户端信息。

    3 服务器向AAA服务器发送计费终止请求

    4 AAA服务器终止计费,同时返回计费终止响应。

    意外下线:

    1 PPPoE服务器检测到PPPoE客户端已经不在线。

    3 服务器向AAA服务器发送计费终止请求

    4 AAA服务器终止计费,同时返回计费终止响应。

     

     

  • 转载学习:PPPOE宽带接入技术及常见故障分析

    2009-07-23 14:07:35

     

    目前各地广电建设数据网主要是以太网,广电作为运营商来说,除建立一个稳定可靠的网络外,选择一个好的宽带接入方式也尤为重要。一个好的接入方式不仅能够使网络安全稳定地运营,也能使运营商方便地开展各种业务,实现灵活的计费,更好地对用户进行管理。目前以太网接入方式主要有3种:固定IP,DHCP,PPPOE,而PPPOE+VLAN是一种比较理想的宽带接入方式。
      1、宽带接入网需要实现的基本功能
      宽带接入网需要实现的基本功能可以归纳为以下几个方面:
      (1)用户管理
      掌握用户的信息,在用户进行通信时对用户进行认证、授权,使合法用户方便快捷地接入网中,杜绝非法用户接入,防止非法用户占用网络资源。
      (2)安全管理
      合法用户在通信时要保障其数据的安全性,隔离带有用户个人信息的数据包,对于主要的网络设备防止其受到攻击而造成网络瘫痪。由于用户终端是以普通网卡与网络设备相连,在通信时会发送一些广播地址的帧(如ARP,DHCP消息等),而这些消息会携带用户的个人信息(如用户的MAC地址),如不隔离这些消息让其他用户接收到,容易发生MAC/IP地址的仿冒,影响合法用户上网。对于运营商来说,保护其系统设备的安全性,防止恶意攻击是十分重要的。
      (3)业务管理
      需要为保证QoS提供一定的手段。为了保证业务的QoS,网管人员根据具体情况为用户提供一定的带宽控制能力,例如保证用户的最低接入速率,限制用户的最高接入速率等。
      (4)计费管理
      接入网要能够对用户进行灵活的计费,根据用户类别、使用时长、用户流量等数据进行计费。
      2、固定IP,DHCP,PPPOE 3种宽带接入方式的比较
      2.1用户管理和开销方面
      固定IP方式:对IP地址管理不易,用户恶意更改或者尝试自行设置自己的IP地址,都会造成管理上的麻烦,增加运营商的额外开销。
      DHCP方式:一方面DHCP存在较多的广播开销,对于用户量较多的城域网会造成网络运行效率下降和配置困难;另一方面,仍然无法解决用户自行配置IP地址的问题。
      PPPOE:由于采用动态分配IP地址方式,用户拨号后无需自行配置IP地址、网关、域名等,它们均是自动生成,不存在用户自行更改IP地址的问题,对用户管理方便,而且PPPOE协议是在包头和用户数据之间插入PPPOE和PPP封装,这两个封装加起来也只有8个字节,广播开销很小。
      2.2计费策略方面
      固定IP和DHCP方式的计费策略不灵活,一般采用包月制,如要实现流量计费功能则必须要有相应的流量监视或采集系统,或在高端路由器上启动记账功能,然后应用SNMP进行计费,这有可能使路由器运行效率下降。
      PPPOE可以实现对用户的灵活计费,可以按时长、流量计费,也可采用包月制。
      2.3用户服务策略定制方面
      固定IP和DHCP方式只能配合IP地址转换和地址访问列表控制来制定简单的服务,如果要实现按特定用户进行流量控制,必须购买流量控制设备。
      PPPOE支持业务QoS保证,可方便地对用户进行实时流量控制。
      2.4信息安全方面
      固定IP,DHCP和PPPOE都可以采用细化VLAN的方式来解决用户信息的安全问题,将局域网交换机的每个端口配置成独立的VLAN,利用VLAN 可以隔离ARP,DHCP等携带用户信息的广播消息,从而使用户数据安全性得到提高。固定IP地址方式为了识别用户的合法性必须将IP地址和端口VID进行绑定,因为每个用户处于逻辑上独立的网内,所以对每个用户要配置一个子网的4个IP地址:子网地址、网关地址、子网广播地址和用户主机地址,这样会造成地址利用率降低,而PPPOE采用认证、授权的方式不存在这个问题。
      2.5第三层广播风暴
      固定IP和DHCP方式都不能解决第三层广播风暴问题,第三层广播风暴影响同一IP子网所有用户的使用质量。而PPPOE方式由于采用二层隧道认证,所有链路设备都工作在第二层,不存在第三层广播风暴问题。
      从以上的比较可以看出,PPPOE同其他两种接入方式相比具有较大的优势,因此PPPOE目前被各大运营商普遍采用。
      3、PPPOE的认证
      PPPOE认证首先要在客户机上安装PPPOE协议的驱动软件,在前端由BRAS服务器配合RADIUS服务器实现对用户的认证、计费。
      认证过程:用户拨号发出请求,经过网络传送到BRAS服务器,BRAS服务器接到请求后向RADIUS服务器发出ACCESS REQUEST请求包,其中含有用户的账号、密码、端口类型等,经RADIUS服务器核实后,向BRAS回送ACCESS REPONSE响应包,其中包含用户的合法性和一些设置,如用户IP地址、掩码、网关、域名、用户可使用的带宽等。用户接收到这些信息后就可以上网,上网期间BRAS不断地向RADIUS发送计费信息,这些信息包括用户的上网时间、用户流量、用户下网时间等,以便RADIUS准确计费。
      从 PPPOE认证过程可以看出,BRAS服务器在整个链路中起到关键的作用,因此BRAS服务器也要实现大而全的功能,包括认证、连接、终接、安全管理、计费业务汇聚、收敛等功能,设备复杂。由于建立连接后数据必须经过BRAS,BRAS很容易成为“瓶颈”,最易出问题,堵塞严重时用户连接速度慢或根本连接不上,解决的办法是在前端采用多台BRAS并接或将多台BRAS放到各中继机房,采用分布认证方法。
      4、PPPOE常见故障代码及分析
      (1)645故障描述:拨号适配器未装
      这种情况主要针对Windows ME和Windows98而言,解决办法是在Windows98下添加拨号适配器组件即可。对Windows ME而言,因为它没有直接添加拨号适配器的选项,所以必须在控制面板中先删除拨号网络组件,再添加拨号网络组件完成适配器的添加。
      (2)691/629故障描述:不能通过验证
      可能的原因是用户的账户或者密码输入错误,或用户的账户余额不足,用户在使用时未正常退出而造成用户账号驻留,可等待几分钟或重新启动后再拨号。
      (3)630故障描述:无法拨号,没有合适的网卡和驱动
      可能的原因是网卡未安装好、网卡驱动不正常或网卡损坏。检查网卡是否工作正常或更新网卡驱动。
      (4)633故障描述:找不到电话号码簿,没有找到拨号连接
      这可能是没有正确安装PPPOE驱动或者驱动程序已遭损坏,或者Windows系统有问题。建议删除已安装的PPPOE驱动程序,重新安装PPPOE驱动,同时检查网卡是否工作正常。如仍不能解决问题,可能是系统有问题,建议重装系统后再添加PPPOE驱动。
      (5)720故障描述:不支持PPPOE连接
      它是Windows 2000特有的故障,建议重新启动后再进行连接,如仍不能排除故障,建议重装系统。
      (6)697故障描述:网卡禁用
      只要在设备管理中重新启用网卡即可。
      (7)769故障描述:拨号时报769错误
      在Windows XP系统中网卡被禁用、系统检测不到网卡或者拨号软件故障,有时会报769错误。重新启用网卡、检查网卡工作是否正常或重装拨号软件即可解决。
      (8)678故障描述:无法建立连接
      这个故障比较复杂,用户和BRAS链路中任何一个环节有问题,都可能导致678故障,应根据不同的情况作相应处理。
      5、结语
      PPPOE宽带接入方式对于用户管理的方便性、计费的灵活性都有一定的优势,但也有它的不足,需要在客户机上安装客户端软件,增加了调试、维修的工作量,而且PPPOE是点到点的接入方式,不支持组播功能。目前Windows XP系统本身已提供了对PPPOE协议的支持,可以在不另外安装客户端软件的情况下实现对PPPOE的接入,解决了用户安装PPPOE软件的问题。 PPPOE宽带接入是一种技术成熟、运营管理方便的接入方式,目前已被包括广电在内的各运营商普遍采用。
  • 测试经验小结

    2009-07-23 13:50:15

    在测试中遇到很多 问题。

    手工测试中

    技术问题:在开始测试的一段时间,问题发现比较少。原因是:按照系统功能和流程测试,基本上没啥问题。
    后来总结发现:问题都是在变化中的。从技术流程上,进行发现。
    从测试思路上,不断改变才是关键的。客户端的多元化:测试仪构造流量。Pc机申请流量。
    系统配置修改和下发。端口修改,配置删除增加。
    在高压环境上测试。制造系统处于工作环境,然后再做各种动作。
    与其它特性相结合,进行测试。
    借助其它测试工具,进行多流量测试。龙卷风。
    看看之前版本的问题单,载验证。这些问题还比较多。
    发散测试。在测试后有新的发现,可以补充测试。

    诚恳对待漏测:
    漏测的问题总是困扰着大家。第一次开漏测分析会议,我比较紧张,感觉很有挫败感。其实从现实情况来说,漏测是不可避免的,但是又是需要不断改进的。抓好漏测,是提高问题发现率的第一步。后来开会,大有一种虱子多了不怕痒,脸皮放厚,思想放活,继续测试。

    如何和开发沟通:不要完全相信开发的话。这不是对于诚信的否定,而是对于看问题的角度不同,产生的差异。 问题有了合理的解释后,才可以放下。
    如:有些问题是很难修改的。回归测试的时候需要擦亮眼睛,按照完成的功能反复测试,很可能又是问题。看到开发给你的问题单修改后,拍拍胸脯说:已经改好了,你会怎么想?抱着有问题的心态,按照不同的顺序,验证功能,可能又是一个问题。

    如:在问题定位的初期,开发人员说这是相同的问题,但是他的解释还是让你有些疑惑。这个时候你要和他交流清楚,才可以。往往最开始认为是一个问题,后来发现根本不是这么回事。这就是漏测啦!

    注意工作的效率和阶段。不是所有的时候都会对问题咬住不放。易用性问题,可以一起提单,很多问题都是容易复现和定位的,自己进行操作,发现出现问题的根源,既是锻炼了自己,同时也是提高技术的一种方法。

    工作中总有很多冲突,不要觉得麻烦,不好意思,尤其是自己还是菜鸟的时候。明确你的原则,就能做对事。问一遍,问2遍,绝不问第3遍。

    帮助别人,也是一种快乐!
    很多时候,我们不是全能专家。搭建一个环境,讲解一个问题,都会形成良好的友谊。当你面对一大堆问题而都很茫然的时候,你的朋友的到来,就是提高效率的有力武器。

     

    自动化测试:

    自动化测试是正向验证的多。但是不回避问题。自动化测试发现的问题按照几个来算的。是衡量整个版本的质量。

    自动化脚本的可维护性,可读性是很重要的。
    脚本的修改比较容易,维护时间短,不会给系统造成其他问题。
    脚本的可读性好,出现问题后就能说清楚。这两点对于后期都是很重要的。
    自动化一个脚本执行的时间不要太长,重新复现的时候需要的时间就比较短。

    自动化脚本的写作人员既是技术的专家,同时也是脚本编制的高手。自动化是全员都能参与的。

  • 转载学习:TCP/IP传送方式有三种:单播,广播,组播。

    2009-07-23 11:32:59


    TCP/IP传送方式

      组播技术是TCP/IP传送方式的一种。在我们讨论组播技术之前先来看看

      TCP/IP传送方式。TCP/IP传送方式有三种:单播,广播,组播。

      单播(Unicast)传输:在发送者和每一接收者之间需要单独的数据信道。 如果一台主机同时给很少量的接收者传输数据,一般没有什么问题。但如果有大量主机希望获得数据包的同一份拷贝时却很难实现。 这将导致发送者负担沉重、延迟长、网络拥塞;为保证一定的服务质量需增加硬件和带宽。

      组播(Multicast)传输:它提高了数据传送效率。减少了主干网出现拥塞的可能性。组播组中的主机可以是在同一个物理网络, 也可以来自不同的物理网络(如果有组播路由器的支持)。

      广播(Broadcast)传输:是指在IP子网内广播数据包,所有在子网内部的主机都将收到这些数据包。 广播意味着网络向子网主机都投递一份数据包,不论这些主机是否乐于接收该数据包。然而广播的使用范围非常小, 只在本地子网内有效,因为路由器会封锁广播通信。广播传输增加非接收者的开销。

    二、组播技术

    2.1、组播技术的原理

      组播是一种允许一个或多个发送者(组播源)发送单一的数据包到多个接收者(一次的,同时的)的网络技术。 组播源把数据包发送到特定组播组,而只有属于该组播组的地址才能接收到数据包。组播可以大大的节省网络带宽, 因为无论有多少个目标地址,在整个网络的任何一条链路上只传送单一的数据包。 它提高了数据传送效率。减少了主干网出现拥塞的可能性。组播组中的主机可以是在同一个物理网络, 也可以来自不同的物理网络(如果有组播路由器的支持)。

    其网络模型如下图所示:

     

    2.2、实现组播技术的前提条件

      实现IP组播传输,则组播源和接收者以及两者之间的下层网络都必须支持组播。这包括以下几方面:

    * 主机的TCP/IP实现支持发送和接收IP组播;

    * 主机的网络接口支持组播;

    * 有一套用于加入、离开、查询的组管理协议,即IGMP(v1,v2);

    * 有一套IP地址分配策略,并能将第三层IP组播地址映射到第二层MAC地址;

    * 支持IP组播的应用软件;

    * 所有介于组播源和接收者之间的路由器、集线器、交换机、TCP/IP栈、防火墙均需支持组播;

    2.3、组播地址

      在组播通信中,我们需要两种地址:一个IP组播地址和一个Ethernet组播地址。其中,IP组播地址标识一个组播组。 由于所有IP数据包都封装在Ethernet帧中,所以还需要一个组播Ethernet地址。为使组播正常工作, 主机应能同时接收单播和组播数据,这意味着主机需要多个IP和Ethernet地址。 IP地址方案专门为组播划出一个地址范围,在IPv4中为D类地址,范围是224.0.0.0到239.255.255.255, 并将D类地址划分为局部链接组播地址、预留组播地址、管理权限组播地址。

      局部链接地址:224.0.0.0~224.0.0.255,用于局域网,路由器不转发属于此范围的IP包;

      预留组播地址:224.0.1.0~238.255.255.255,用于全球范围或网络协议;

      管理权限地址:239.0.0.0~239.255.255.255,组织内部使用,用于限制组播范围;

      D类地址的最后28比特没有结构化,即没有网络ID和主机ID之分。响应某一个IP多播地址的主机构成一个主机组,主机组可跨越多个网络。主机组的成员数是动态的,主机可以通过IGMP协议加入或离开某个主机组。IP多播地址影射到以太网地址的方法见下图。因为IP多播地址的高5位未影射,因此,影射的以太网地址不是唯一的,共有32个IP多播地址影射到一个以太网地址。

    2.4、组播协议:

      组播协议主要包括组管理协议(IGMP)和组播路由协议(密集模式协议(如DVMRP,PIM-DM)、稀疏模式协议(如PIM-SM,CBT) 和链路状态协议(MOSPF))

    * 组管理协议IGMP

      主机使用IGMP通知子网组播路由器,希望加入组播组;路由器使用IGMP查询本地子网中是否有属于某个组播组的主机。

    * 加入组播组

      当某个主机加入某一个组播组时,它通过“成员资格报告”消息通知它所在的IP子网的组播路由器,同时将自己的IP模块做相应的准备, 以便开始接收来自该组播组传来的数据。如果这台主机是它所在的IP子网中第一台加入该组播组的主机, 通过路由信息的交换,组播路由器加入组播分布树。

    * 退出组播组

      在IGMP v1中,当主机离开某一个组播组时,它将自行退出。组播路由器定时(如120秒) 使用“成员资格查询” 消息向IP子网中的所有主机的组地址(224.0.0.1)查询,如果某一组播组在IP子网中已经没有任何成员, 那么组播路由器在确认这一事件后, 将不再在子网中转发该组播组的数据。与此同时,通过路由信息交换, 从特定的组播组分布树中删除相应的组播路由器。 这种不通知任何人而悄悄离开的方法, 使得组播路由器知道IP子网中已经没有任何成员的事件延时了一段时间,所以在IGMP v2.0中,当每一个主机离开某一个组播组时, 需要通知子网组播路由器,组播路由器立即向IP子网中的所有组播组询问,从而减少了系统处理停止组播的延时。

    * 组播路由协议

      要想在一个实际网络中实现组播数据包的转发,必须在各个互连设备上运行可互操作的组播路由协议。 组播路由协议可分为三类:密集模式协议(如DVMRP,PIM-DM)、稀疏模式协议(如PIM-SM,CBT) 和链路状态协议(MOSPF),下面分别介绍各个协议的工作原理。

    * 距离向量组播路由协议(Distance Vector Multicast Routing Protocol:DVMRP)

      DVMRP由单播路由协议RIP扩展而来,两者都使用距离向量算法得到网络的拓扑信息,不同之处在于RIP根据路由表前向转发数据, 而DVMRP则是基于RPF。为了使新加入的组播成员能及时收到组播数据,DVMPR采用定时发送数据包给所有的LAN的方法, 然而这种方法导致大量路由控制数据包的扩散,这部分开销限制了网络规模的扩大。另一方面,DVMRP使用跳数作为计量尺度, 其上限为32跳,这对网络规模也是一个限制。目前提出了分层DVMRP,即对组播网络划分区域, 在区域内的组播可以按照任何协议进行,而对于跨区域的组播则由边界路由器在DVMRP协议下进行,这样可大大减少路由开销。

    * 开放式组播最短路径优先协议(Multicast Open Shortest Path First:MOSPF)

  • 转载学习:关于组播(多播)

    2009-07-23 10:07:32


    本文只对IP协议进行说明。

    组播,也称多播,其实只是一个英文单词Multicast的不同翻译而已。

    在网络会议系统中常使用组播技术,避免各个网络节点间都建立连接(TCP)或者源需要向目的列表循环发送相同的数据包。

    组播地址在224.0.0.0 到 239.255.255.255之间。但实际应用中,由于224.0.*.*网段中有些地址已经用作其他特殊用途,所以建议开发组播程序的时候从224.1.0.0开始选择。

    多播地址

    用途

    2 2 4 . 0 . 0 . 0

    基本地址(保留)

    2 2 4 . 0 . 0 . 1

    子网内的所有系统

    2 2 4 . 0 . 0 . 2

    子网内的所有路由器

    2 2 4 . 0 . 1 . 1

    网络时间协议

    2 2 4 . 0 . 0 . 9

    R I P第2版本组地址

    2 2 4 . 0 . 1 . 2 4

    W I N S服务器组地址

    ... ...

    如果想进行组播,要使用UDP协议来进行。简单描述如下:

    角色 步骤
    发送方 建立UDP socket, 直接向组播地址端口发送即可。
    接收方 1,建立UDP socket 假设命名为localsocket, 绑定组播的地址的端口
    2,加入组,返回一个组的socket,假设为multisocket;
    3,按需要从localsocket接收数据;
    4,如果需要退出,先close掉multisocket退出组, 再close掉localsocket.

    当然,如果既要发送也要接收,只要按照接收的步骤做就可以了。另外需要说明的是,目前跨路由器的组播都需要在路由器上面进行设置,否则路由器处于性能等方面(会出现几个应用使用的同一组播地址和端口的情况,世界大乱:))考虑是不会转发组播报到其他路由器的。

1164/6<123456>
Open Toolbar