<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    GONE WITH THE WIND

    --tomorrow is another day

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      30 隨筆 :: 19 文章 :: 0 評(píng)論 :: 0 Trackbacks

    2009年3月26日 #

    LI代碼的格式化:
    A).運(yùn)用CSS格式化列表符: ul li{
    list-style-type:none;
    }
    B).假如你想將列表符換成圖像,則: ul li{
    list-style-type:none;
    list-style-image: url(/blog/images/icon.gif);
    }
    C).為了左對(duì)齊,可以用如下代碼: ul{
    list-style-type:none;
    margin:0px;
    }
    D).假如想給列表加背景色,可以用如下代碼: ul{
    list-style-type: none;
    margin:0px;
    }
    ul li{
    background:#CCC;
    }
    E).假如想給列表加MOUSEOVER背景變色效果,可以用如下代碼: ul{ list-style-type: none; margin:0px; }
    ul li a{ display:block; width: 100%; background:#ccc; }
    ul li a:hover{ background:#999; }說(shuō)明:display:block;這一行必須要加的,這樣才能塊狀顯示!

    F).LI中的元素水平排列,要害FLOAT:LEFT: ul{
    list-style-type:none;
    width:100%;
    }
    ul li{
    width:80px;
    float:left;
    }
    <ul><li>的區(qū)別
    <LI> 的參數(shù)設(shè)定(常用):
     


    例如: <li type="square" value="4">

    type="square"
    只適用于非順序清單,設(shè)定符號(hào)款式,其值有三種,如下,內(nèi)定為 type="disc":
    符號(hào) 是當(dāng) type="disc" 時(shí)的列項(xiàng)符號(hào)。
    符號(hào) if" width=10 height=10 border=0> 是當(dāng) type="circle" 時(shí)的列項(xiàng)符號(hào)。
    符號(hào) 是當(dāng) type="square" 時(shí)的列項(xiàng)符號(hào)。
    value="4"
    只適用于順序清單,設(shè)定該一項(xiàng)的數(shù)目,其後各項(xiàng)將以此作為起始數(shù)目而遞增,但前面各項(xiàng)則不受影響,其值只能是 1,2,3.. 等整數(shù),沒(méi)有內(nèi)定值。
    <UL>稱為無(wú)序清單標(biāo)記。
    所謂無(wú)序清單就是在每一項(xiàng)前面加上 、、等符號(hào),故又稱符號(hào)清單。
    <UL> 的參數(shù)設(shè)定(常用):
    例如: <UL type="square">

    type="square"
    設(shè)定符號(hào)款式,其值有三種,如下,內(nèi)定為 type="disc":
    符號(hào) 是當(dāng) type="disc" 時(shí)的列項(xiàng)符號(hào)。
    符號(hào) 是當(dāng) type="circle" 時(shí)的列項(xiàng)符號(hào)。
    符號(hào) 是當(dāng) type="square" 時(shí)的列項(xiàng)符號(hào)。

    <ul>是項(xiàng)目列表,<li>是列表項(xiàng),項(xiàng)目列表就是用符號(hào)來(lái)列的,所以你列出來(lái)默認(rèn)的就是黑點(diǎn)啦,還有一個(gè)是<ol>這個(gè)是編號(hào)列表,用數(shù)字來(lái)列的,也是用<li>做列表項(xiàng)

     


    <li>是 list item 即列表項(xiàng),但列表有很兩種,所以外面得有 <ul> 或者 <ol> 用來(lái)區(qū)別無(wú)序列表(小點(diǎn)點(diǎn))和有序列表(1,2,3...)。

    posted @ 2009-04-13 09:22 張永耀 閱讀(401) | 評(píng)論 (0)編輯 收藏

    (from:http://www.0574dh.com/article.asp?id=420)

    /* mozilla.org Base Styles
    * maintained by fantasai
    * (classes defined in the Markup Guide - http://mozilla.org/contribute/writing/markup)
    */
    /* Suggested order:
    //顯示屬性
    * display
    * list-style
    * position
    * float
    * clear
    //自身屬性
    * width
    * height
    * margin
    * padding
    * border
    * background
    //文本屬性
    * color
    * font
    * text-decoration
    * text-align
    * vertical-align
    * white-space
    * other text
    * content
    *
    */
    posted @ 2009-04-08 12:31 張永耀 閱讀(191) | 評(píng)論 (0)編輯 收藏

    (from: http://www.webwoo.net/bc/bencandy-38-20144-1.htm)
    優(yōu)化代碼:網(wǎng)頁(yè)技術(shù)CSS的font屬性的縮寫(xiě)的技巧,縮寫(xiě)有利于減少代碼,優(yōu)化CSS,使之更加合理。

      css font屬性是用來(lái)控制文字字體、顏色、大小等。而font的屬性有多種,在通常情況下,我們用縮寫(xiě)的辦法將多種屬性概括在一句css代碼中。這樣極大的減小了代碼,優(yōu)化css文件。

      我們常用的font屬性有下面這六種:

    font-style設(shè)定斜體 如:font-style: italic;
    font-weight設(shè)定文字粗細(xì) 如:font-weight: bold;
    font-size設(shè)定文字大小 如:font-size: 12px;
    line-height設(shè)定行距 如:line-height: 150%;
    color設(shè)定文字顏色(注意不是font-color) 如:color: red;
    font-family設(shè)定字體 如:font-family : "Lucida Grande", Verdana, Lucida, Arial, Helvetica, 宋體,sans-serif;

      上述的屬性,我們可以概括寫(xiě)在一行font屬性里。需要注意的是color屬性我們需要單獨(dú)定義。

    font: italic bold 12px/150% "Lucida Grande", Verdana, Lucida, Arial, Helvetica, 宋體,sans-serif;}

      上面的例子用一行來(lái)定義font屬性,分別是:font-style font-weight font-size line-height font-family;而color設(shè)定文字顏色需要單獨(dú)進(jìn)行定義。

    posted @ 2009-04-08 12:30 張永耀 閱讀(198) | 評(píng)論 (0)編輯 收藏

    使用PHP編程的人都會(huì)碰到這樣一個(gè)問(wèn)題:當(dāng)PHP代碼和HTML代碼在一起的時(shí)候,看PHP代碼很費(fèi)勁,整個(gè)文件也無(wú)法用Dreamweaver來(lái)編輯,這對(duì)于PHP程序員和美工來(lái)講,修改這樣的文件就象一個(gè)噩夢(mèng)。
    PHP中的模板(Template)技術(shù)就是為了解決這個(gè)問(wèn)題而出現(xiàn)的。PHP模板類有很多,比較常見(jiàn)的是 FastTemplate 和 PHPLib, 因?yàn)槌霈F(xiàn)得早,在PHP編程界名聲很大。PHP程序員不知道這兩個(gè)類,就象VB程序員不知道MsgBox函數(shù)一樣,是一件不可思議的事情。
    以前我們需要去下載PHP模板類,現(xiàn)在PHP4有了自己的模板類 IntegratedTemplate 和 IntegratedTemplateExtension,功能和PHPLib 差不多。這兩個(gè)類是子類和父類的關(guān)系。一般我們用 IntegratedTemplateExtension 就可以了。讓人感到不可思議的是 IntegratedTemplate 不是從 PEAR 類繼承過(guò)來(lái),無(wú)法用到 PEAR 類的 debug 功能。
    以下舉例子說(shuō)明它們的用法,假設(shè) IntegratedTemplate 類和 IntegratedTemplateExtension 類分別在 C:\php4\pear\HTML\ITX.php 和 C:\php4\pear\HTML\ITX.php 中。我們寫(xiě)的代碼放在C:\TestPHP\PHP4\Welcome.htm 和 C:\TestPHP\HTML\Welcome.php 中。將C:\TestPHP\PHP4 在Web Server 上設(shè)成虛擬目錄 /testphp 并且給與腳本執(zhí)行權(quán)限,確認(rèn)C:\TestPHP\HTML\Welcome.htm 無(wú)法通過(guò)遠(yuǎn)端瀏覽器訪問(wèn)。在 php.ini 里面設(shè)置 include_path = ".;C:\php4\pear"
    例1:
    我們?cè)贖TML文件中放置變量的標(biāo)記,用PHP代碼設(shè)置變量的值,然后將HTML中的標(biāo)記替換掉,最后輸出到客戶瀏覽器。
    以下是 Welcome.htm 代碼,我們放了三個(gè)PHP tag(變量標(biāo)記)為: {WelcomeTitle}、{UserName}、{WelcomeMessage}



    您好,{UserName}


    {WelcomeMessage}



    以下是Welcome.php代碼
    <?php
    require_once "HTML/ITX.php";

    //以下是給變量賦值,在實(shí)際代碼中可能從Database中取得數(shù)據(jù)然后賦值
    $WelcomeTitle = "歡迎來(lái)到網(wǎng)頁(yè)天堂";
    $UserName = "皮皮魯";
    $WelcomeMessage = "您的到來(lái)讓我們深感榮幸!";

    //一般來(lái)說(shuō)這種全局變量放在單獨(dú)的一個(gè)文件中,便于維護(hù)
    $HTML_CODE_FILE_ROOT = "../HTML/";

    $tpl = new IntegratedTemplateExtension($HTML_CODE_FILE_ROOT);

    指定要替換 tag 的 HTML 文件
    $tpl->loadTemplatefile("Welcome.htm");

    替換HTML 文件中的 tag
    $tpl->setVariable( array (
    "WelcomeTitle" => $WelcomeTitle,
    "UserName" =>$UserName,
    "WelcomeMessage" =>$WelcomeMessage
    ) );

    輸出替換后的 HTML
    $tpl->show();
    ?>

    這樣寫(xiě)好后,Welcome.htm 仍然可以使用網(wǎng)頁(yè)編輯器如Dreamweaver、FrontPage 進(jìn)行編輯,Welcome.php中是純粹的PHP代碼,不含HTML,方便以后的代碼修改和維護(hù)。
    如果將 IntegratedTemplateExtension 類和 PHP4中的 Cache 類 聯(lián)合使用,在速度上可以得到很好的效果。
    PHP4 模板類還可以使用 Block,配合其他 PHP4 中的類 可以很輕松地實(shí)現(xiàn)數(shù)據(jù)庫(kù)數(shù)據(jù)檢索的翻頁(yè),可以很輕松寫(xiě)出論壇之類的軟件。

    補(bǔ)充說(shuō)明:為了防止用戶直接用 Welcome.htm 看網(wǎng)頁(yè),將 Welcome.htm 放在客戶訪問(wèn)不到的目錄(只要不在Web Server 的虛擬目錄下即可)。對(duì)于大型的PHP項(xiàng)目,圖片、PHP代碼、HTML文件、多語(yǔ)言字符串文件都應(yīng)該放在不同的目錄,這樣在多人共同做一個(gè)項(xiàng)目時(shí)不至于混亂。
    posted @ 2009-04-08 12:29 張永耀 閱讀(373) | 評(píng)論 (0)編輯 收藏

    分離內(nèi)容和表現(xiàn)
    HTML從來(lái)就不是表現(xiàn)的手段,但從用戶端結(jié)合元素來(lái)格式化文本,開(kāi)發(fā)者從中找到操作布局的方法。CSS的強(qiáng)大,使得現(xiàn)在不再需要用HTML做任何表現(xiàn)了,而內(nèi)容也可以完全從表現(xiàn)(CSS)中分離出來(lái)。

    這樣做有很多好處──通常可以壓縮文件容量,有著用一個(gè)主要樣式表就可控制整個(gè)網(wǎng)站而不是單個(gè)頁(yè)面的靈活性,也可能使頁(yè)面更易用,更具親和力。

    遵循這些基本原則基本上意味著你不應(yīng)該在HTML內(nèi)使用樣式化的任何事物了。比如font的標(biāo)簽,比如bgcolor的屬性不應(yīng)該再使用。甚至在圖像標(biāo)簽img內(nèi)的邊框?qū)傩詁order在XHTML 1.1中也是非法的了。別擔(dān)心,過(guò)時(shí)的HTML可以樣式化,CSS更可以樣式化,而且可以做得更好。

    不僅僅是從HTML內(nèi)剝離表現(xiàn),內(nèi)容的結(jié)構(gòu)意味著在適合的地方使用明確的HTML標(biāo)簽。比如,h1,h2等應(yīng)用在標(biāo)題上──而不僅僅是使用CSS使字體變大而已。

    最佳指引就是一個(gè)可視化的瀏覽器上使用其默認(rèn)的樣式來(lái)呈現(xiàn)一個(gè)沒(méi)有樣式表(或者有樣式表,但不支援樣式表的文本瀏覽器,比如lynx——譯者注)的頁(yè)面。

    表格不應(yīng)該用在布局上──表格用來(lái)表示表格式的數(shù)據(jù)(我們已經(jīng)不厭其煩地說(shuō)了很多次──譯者注)。也許對(duì)于已經(jīng)習(xí)慣傳統(tǒng)結(jié)構(gòu)的HTMLer來(lái)說(shuō),完全改變有很大的技術(shù)難度。這個(gè)方法很大程度上壓縮了文件,而且,基于這些顯性代碼,它變得更易用,更具親和力。

    關(guān)于更多,請(qǐng)閱讀CSS高級(jí)指南的布局。


    在XHTML中所有的標(biāo)簽都必須小寫(xiě)和關(guān)閉。沒(méi)有閉合標(biāo)簽的(如br和img)必須用英文半角正斜杠“/”在后面自關(guān)閉(如<br />)。注意在斜杠前應(yīng)該有一個(gè)英文半角空格。

    標(biāo)記也必須是合式的,使元素正確嵌套(比如<strong><em>this</em></strong>,而不是<strong><em>this</strong></em>)。

    所有的文檔都要有html,head,title和body元素。也必須從文檔類型聲明開(kāi)始。

    文檔主體應(yīng)該從 p, h1,h2, h3,h4,h5,h6,div, pre,address,ins或者del開(kāi)始。

    屬性
    所有的屬性必須是小寫(xiě)的,它們的值也要用英文半角引號(hào)括(")起來(lái)。

    精簡(jiǎn)屬性是不允許的(比如<input type="checkbox" checked />)。按慣例,精簡(jiǎn)屬性必須給出跟屬性名稱一樣的值(如 <input type="checkbox" checked="checked" />)。

    名字 name屬性不再是合法的了(除了在表單元素中),應(yīng)該使用id來(lái)代替。

    目標(biāo)屬性target不是一個(gè)合法的屬性。慶幸吧,它有些癲狂。

    在img里,alt屬性是必須的。

    親和力
    為殘障人士制做具有親和力網(wǎng)頁(yè)的理由是不證而明的。不僅是人道的,而且也對(duì)老年用戶和五官功能減退的用戶有利(想一想,有一天我們老了,視力消退,五官不靈,怎么瀏覽互聯(lián)網(wǎng)?為年老積點(diǎn)德,現(xiàn)在就考慮親和力吧!——譯者注)。親和力不僅與有嚴(yán)重殘障人士方便,也使大部分少量消退功能(特別是視覺(jué))的用戶更為易用。

    這個(gè)問(wèn)題越來(lái)越牽涉法律問(wèn)題了,比如美國(guó)的“508條款”的采用,試圖積極推動(dòng)強(qiáng)制使用親和力;在英國(guó),所有的政府網(wǎng)站必須有一個(gè)指定的親和力程度。什么時(shí)候才可以有像在建筑物上的親和措施的立法,以便普遍用在商業(yè)網(wǎng)站上?(中國(guó)還不知道什么時(shí)候有這種立法呢!但不等于我們就不要關(guān)注我們?cè)O(shè)計(jì)的網(wǎng)頁(yè)的合法性。——譯者注)

    如果能遵循上述的建議,你的HTML應(yīng)該已經(jīng)具備了為殘障用戶服務(wù)的高度親和力。還有更多的創(chuàng)作使你的親和力更上一層樓,而且不難。見(jiàn)親和連接和親和表單指南。

    posted @ 2009-04-08 12:28 張永耀 閱讀(367) | 評(píng)論 (0)編輯 收藏

    怎么改善現(xiàn)有網(wǎng)站

    我們大部分的設(shè)計(jì)師依舊在采用傳統(tǒng)的表格布局、表現(xiàn)與結(jié)構(gòu)混雜在一起的方式來(lái)建立網(wǎng)站。學(xué)習(xí)使用XHTML CSS的方法需要一個(gè)過(guò)程,使現(xiàn)有網(wǎng)站符合網(wǎng)站標(biāo)準(zhǔn)也不可能一步到位。最好的方法是循序漸進(jìn),分階段來(lái)逐步達(dá)到完全符合網(wǎng)站標(biāo)準(zhǔn)的目標(biāo)。如果你是新手,或者對(duì)代碼不是很熟悉,也可以采用遵循標(biāo)準(zhǔn)的編輯工具,例如Dreamweaver MX 2004,它是目前支持CSS標(biāo)準(zhǔn)最完善的工具。

    1.初級(jí)改善

    • 為頁(yè)面添加正確的DOCTYPE

    很多設(shè)計(jì)師和開(kāi)發(fā)者都不知道什么是DOCTYPE,DOCTYPE有什么用。DOCTYPE是document type的簡(jiǎn)寫(xiě)。主要用來(lái)說(shuō)明你用的XHTML或者HTML是什么版本。瀏覽器根據(jù)你DOCTYPE定義的DTD(文檔類型定義)來(lái)解釋頁(yè)面代碼。所以,如果你不注意設(shè)置了錯(cuò)誤的DOCTYPE,結(jié)果會(huì)讓你大吃一驚。XHTML1.0提供了三種DOCTYPE可選擇:

    (1)過(guò)渡型(Transitional )

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    (2)嚴(yán)格型(Strict )

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

    (3)框架型(Frameset )

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

    對(duì)于我們初級(jí)改善來(lái)說(shuō),只要選用過(guò)渡型的聲明就可以了。它依然可以兼容你的表格布局、表現(xiàn)標(biāo)識(shí)等,不至于讓你覺(jué)得變化太大,難以掌握。

    Tip:你懶得輸入上面過(guò)渡型代碼的話,可以訪問(wèn)http://www.macromedia.com/網(wǎng)站的首頁(yè),然后查看源代碼,把head區(qū)同樣的代碼拷貝粘貼就可以了。

    • 設(shè)定一個(gè)名字空間(Namespace)

    直接在DOCTYPE聲明后面添加如下代碼:

    <html XMLns="http://www.w3.org/1999/xhtml" >

    一個(gè)namespace是收集元素類型和屬性名字的一個(gè)詳細(xì)的DTD,namespace聲明允許你通過(guò)一個(gè)在線地址指向來(lái)識(shí)別你的namespace。只要照樣輸入代碼就可以。

    • 聲明你的編碼語(yǔ)言

    為了被瀏覽器正確解釋和通過(guò)標(biāo)識(shí)校驗(yàn),所有的XHTML文檔都必須聲明它們所使用的編碼語(yǔ)言。代碼如下:

    <meta http-equiv="Content-Type" content="text/html; charset=GB2312" />

    這里聲明的編碼語(yǔ)言是簡(jiǎn)體中文GB2312,你如果需要制作繁體內(nèi)容,可以定義為BIG5。

    • 用小寫(xiě)字母書(shū)寫(xiě)所有的標(biāo)簽

    XML對(duì)大小寫(xiě)是敏感的,所以,XHTML也是大小寫(xiě)有區(qū)別的。所有的XHTML元素和屬性的名字都必須使用小寫(xiě)。否則你的文檔將被W3C校驗(yàn)認(rèn)為是無(wú)效的。例如下面的代碼是不正確的:

    <TITLE>公司簡(jiǎn)介</TITLE>

    正確的寫(xiě)法是:

    <title>公司簡(jiǎn)介</title>

    同樣的,<P>改成<p>,<B>改成<b>等等。這步轉(zhuǎn)換很簡(jiǎn)單。
    • 為圖片添加 alt 屬性

    為所有圖片添加alt屬性。alt屬性指定了當(dāng)圖片不能顯示的時(shí)候就顯示供替換文本,這樣做對(duì)正常用戶可有可無(wú),但對(duì)純文本瀏覽器和使用屏幕閱讀機(jī)的用戶來(lái)說(shuō)是至關(guān)重要的。只有添加了alt屬性,代碼才會(huì)被W3C正確性校驗(yàn)通過(guò)。注意的是我們要添加有意義的alt屬性,象下面這樣的寫(xiě)法毫無(wú)意義:

    <img src="logo_unc_120x30.gif" alt="logo_unc_120x30.gif">

    正確的寫(xiě)法:

    <img src="logo_unc_120x30.gif" alt="UNC公司標(biāo)志,點(diǎn)擊返回首頁(yè)">

    • 給所有屬性值加引號(hào)

    在HTML中,你可以不需要給屬性值加引號(hào),但是在XHTML中,它們必須被加引號(hào)。

    例:height="100",而不能是height=100。

    • 關(guān)閉所有的標(biāo)簽

    在XHTML中,每一個(gè)打開(kāi)的標(biāo)簽都必須關(guān)閉。就象這樣:

    <p>每一個(gè)打開(kāi)的標(biāo)簽都必須關(guān)閉。</p>

    <b>HTML可以接受不關(guān)閉的標(biāo),XHTML就不可以。</b>

    這個(gè)規(guī)則可以避免HTML的混亂和麻煩。舉例來(lái)說(shuō):如果你不關(guān)閉圖像標(biāo)簽,在一些瀏覽器中就可能出現(xiàn)CSS顯示問(wèn)題。用這種方法能確保頁(yè)面和你設(shè)計(jì)的一樣顯示。需要說(shuō)明的是:空標(biāo)簽也要關(guān)閉,在標(biāo)簽尾部使用一個(gè)正斜杠"/"來(lái)關(guān)閉它們自己。例如:

    <br />

    <img src="webstandards.gif" />

    經(jīng)過(guò)上述七個(gè)規(guī)則處理后,頁(yè)面就基本符合XHTML1.0的要求。但我們還需要校驗(yàn)一下是否真的符合標(biāo)準(zhǔn)了。我們可以利用W3C提供免費(fèi)校驗(yàn)服務(wù)(http://validator.w3.org/)。發(fā)現(xiàn)錯(cuò)誤后逐個(gè)修改。在后面的資源列表中我們也提供了其他校驗(yàn)服務(wù)和對(duì)校驗(yàn)進(jìn)行指導(dǎo)的網(wǎng)址,可以作為W3C校驗(yàn)的補(bǔ)充。當(dāng)最后通過(guò)了XHTML驗(yàn)證,恭喜你已經(jīng)向網(wǎng)站標(biāo)準(zhǔn)邁出了一大步。不是想象中的那么難吧!

    2.中級(jí)改善

    接下來(lái)我們的改善主要在結(jié)構(gòu)和表現(xiàn)相分離上,這一步不象第一步那么容易實(shí)現(xiàn),我們需要觀念上的轉(zhuǎn)變,以及對(duì)CSS2技術(shù)的學(xué)習(xí)和運(yùn)用。但學(xué)習(xí)任何新知識(shí)都需要花點(diǎn)時(shí)間的,不是嗎?訣竅在于邊做邊學(xué)。假如你一直采用表格布局,根本沒(méi)用過(guò) CSS,也不必急于跟表格布局說(shuō)再見(jiàn),你可以先用樣式表代替 font 標(biāo)簽。隨著你學(xué)到的越多,你能做的就越多。好,一起來(lái)看看我們需要做哪些事:

    • 用CSS定義元素外觀

    我們?cè)趯?xiě)標(biāo)識(shí)時(shí)已經(jīng)養(yǎng)成習(xí)慣,當(dāng)希望字體大點(diǎn)就用<h1>,希望在前面加個(gè)點(diǎn)符號(hào)就用<li>。我們總是想<h1>的意思是大的,<li>的意思是圓點(diǎn),<b>的意思是“加粗文本”。而實(shí)際上, <h1>能變成你想要的任何樣子,通過(guò)CSS,<h1>能變成小的字體,<p>文本能夠變成巨大的、粗體的,<li>能夠變成一張圖片等等。我們不能強(qiáng)迫用結(jié)構(gòu)元素實(shí)現(xiàn)表現(xiàn)效果,我們應(yīng)該使用CSS來(lái)確定那些元素的外觀。例如,我們可以使原來(lái)默認(rèn)的6級(jí)標(biāo)題可以看起來(lái)大小一樣:

    h1, h2, h3, h4, h5, h6{ font-family: 宋體, serif; font-size: 12px; }

    • 用結(jié)構(gòu)化元素代替無(wú)意義的垃圾

    許多人可能從來(lái)都不知道HTML和XHTML元素設(shè)計(jì)本意是用來(lái)表達(dá)結(jié)構(gòu)的。我們很多人已經(jīng)習(xí)慣用元素來(lái)控制表現(xiàn),而不是結(jié)構(gòu)。例如,一段列表內(nèi)容可能會(huì)使用下面這樣的標(biāo)識(shí):

    句子一<br /> 句子二<br /> 句子三<br />

    如果我們采用一個(gè)無(wú)序列表代替會(huì)更好:

    <ul> <li>句子一</li> <li>句子二</li> <li>句子三</li> </ul>

    你或許會(huì)說(shuō)“但是<li>顯示的是一個(gè)圓點(diǎn),我不想用圓點(diǎn)”。事實(shí)上,CSS沒(méi)有設(shè)定元素看起來(lái)是什么樣子,你完全可以用CSS關(guān)掉圓點(diǎn)。

    • 給每個(gè)表格和表單加上id

    給表格或表單賦予一個(gè)唯一的、結(jié)構(gòu)的標(biāo)記,例如

    <table id="menu">

    接下來(lái),在書(shū)寫(xiě)樣式表的時(shí)候,你就可以創(chuàng)建一個(gè)“menu”的選擇器,并且關(guān)聯(lián)一個(gè)CSS規(guī)則,用來(lái)告訴表格單元、文本標(biāo)簽和所有其他元素怎么去顯示。這樣,不需要對(duì)每個(gè)<td>標(biāo)簽附帶一些多余的、占用帶寬的表現(xiàn)層的高、寬、對(duì)齊和背景顏色等等屬性。只需要一個(gè)附著的標(biāo)記(標(biāo)記“menu”的id標(biāo)記),你就可以在一個(gè)分離的樣式表內(nèi)為干凈的、緊湊的代碼標(biāo)記進(jìn)行特別的表現(xiàn)層處理。

    中級(jí)改善我們這里先列主要的三點(diǎn),但其中包含的內(nèi)容和知識(shí)點(diǎn)非常多,需要我們逐步學(xué)習(xí)和掌握,直到最后實(shí)現(xiàn)完全采用CSS而不才用任何表格實(shí)現(xiàn)布局。

    posted @ 2009-04-08 12:21 張永耀 閱讀(138) | 評(píng)論 (0)編輯 收藏

    CREATE USER 'dream2008'@'%' IDENTIFIED BY 'dream1234';
    GRANT ALL PRIVILEGES ON *.* TO 'dream2008'@'localhost' IDENTIFIED BY 'dream1234'WITH GRANT OPTION


    MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;

    MYSQL數(shù)據(jù)庫(kù)實(shí)用學(xué)習(xí)資料之常用命令集合
    2007-10-12 源自:賽迪網(wǎng) 網(wǎng)友評(píng)論 0 條 進(jìn)入視頻教程
    Mysql數(shù)據(jù)庫(kù)是一個(gè)多用戶,多線程的關(guān)系型數(shù)據(jù)庫(kù),是一個(gè)客戶機(jī)/服務(wù)器結(jié)構(gòu)的應(yīng)用程序。它是對(duì)個(gè)人用戶和商業(yè)用戶是免費(fèi)的.


    Mysql數(shù)據(jù)庫(kù)具有以下優(yōu)點(diǎn):


    1.同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)的用戶的數(shù)量不受限制

    2.可以保存超過(guò)5千萬(wàn)條的記錄

    3.是目前市場(chǎng)上現(xiàn)有數(shù)據(jù)庫(kù)產(chǎn)品中運(yùn)行速度最快的數(shù)據(jù)庫(kù)系統(tǒng)

    4.用戶權(quán)限設(shè)置簡(jiǎn)單、有效。


    Mysql數(shù)據(jù)庫(kù)常用命令:


    啟動(dòng)Mysql數(shù)據(jù)庫(kù)


    C:/>cd Mysql5.0/bin

    C:/Mysql5.0/bin>mysqld –install 安裝Mysql服務(wù)

    C:/Mysql5.0/bin>net start mysql 啟動(dòng)Mysql服務(wù)

    請(qǐng)求的服務(wù)已經(jīng)啟動(dòng)。


    連接mysql

    用戶需要提供Mysql的用戶名和密碼來(lái)連接服務(wù)器,如果服務(wù)器不是在本機(jī),則還需要一個(gè)主機(jī)名或IP來(lái)指定服務(wù)器的位置。

    C:/Mysql5.0/bin>mysql -h localhost -u root -p

    Enter password: ****

    Welcome to the MySQL monitor. Commands end with ; or /g.

    Your MySQL connection id is 6 to server version: 5.0.18-nt


    Type 'help;' or '/h' for help. Type '/c' to clear the buffer.


    mysql>

    使用一條簡(jiǎn)單的查詢語(yǔ)句


    mysql> select version(),current_date;

    mysql> select version();select now();


    新建或刪除一個(gè)數(shù)據(jù)庫(kù)


    Mysql>create database mydb;

    Mysql> drop database mydb;


    打開(kāi)的數(shù)據(jù)庫(kù)的命令


    mysql> use mysql

    Database changed


    查看數(shù)據(jù)庫(kù)的命令


    mysql> show databases;


    查看數(shù)據(jù)表的詳細(xì)結(jié)構(gòu)


    mysql> desc func;


    新建數(shù)據(jù)庫(kù)


    mysql> create database school;

    Query OK, 1 row affected (0.00 sec)


    新建表


    mysql> create table user01(

    -> id varchar(20) NOT NULL,

    -> userName varchar(10) NOT NULL,

    -> age int(11) default'0',

    -> sex char(2) NOT NULL default'm',

    -> PRIMARY KEY (id)

    -> )TYPE=InnoDB;

    Query OK, 0 rows affected, 1 warning (0.02 sec)mysql>desc student;


    插入和刪除表中的數(shù)據(jù)


    Create table student(stuName varchar(20),age varchar(20),id varchar(20),set0 char(1));


    插入


    mysql> insert into student(id,stuName) values('1','tomcat');

    Query OK, 1 row affected (0.00 sec)


    刪除


    mysql> delete from student where id='1';

    Query OK, 1 row affected (0.01 sec)


    刪除表中所有數(shù)據(jù)


    mysql> truncate table student;

    Query OK, 1 row affected (0.01 sec)


    刪除表


    mysql> create table temp(t varchar(1));

    Query OK, 0 rows affected (0.00 sec)


    mysql> drop table temp;

    Query OK, 0 rows affected (0.00 sec)


    創(chuàng)建新用戶并給予權(quán)限


    mysql> grant all privileges on *.* to dbuser@localhost identified by '1234'

    with grant option;


    更改Mysql用戶密碼


    c:/Mysql5.0/bin>mysqladmin -u root -p password 1234

    Enter password: ****


    備份數(shù)據(jù)庫(kù)及表


    我們用mysqldump命令來(lái)備份數(shù)據(jù)庫(kù)

    c:/mysql/bin/>mysqldump –u root –p 3306 mysql>d:/backup.sql

    執(zhí)行此語(yǔ)句將把mydb 備份到D盤(pán)的backup.sql文件中


    備份多個(gè)數(shù)據(jù)庫(kù)表


    c:/mysql/bin/>mysqldump –u root –p 3306 school user01 user >d:/backup.sql

    此句的意思是把school庫(kù)中的user01表和user表的內(nèi)容和表的定義備份到D盤(pán)backup.sql文件中。


    備份所有的數(shù)據(jù)庫(kù)


    c:/myql/bin>mysqldump –u root –p 3306 –all –database>d:backup.sql


    還原Mysql數(shù)據(jù)庫(kù)

    c:/mysql/bin/mysql –u root –p 3306 school

    還原其中的一個(gè)表


    mysql> source d:/books.sql;

    ERROR:

    Unknown command '/b'.

    Query OK, 0 rows affected (0.00 sec)

    Query OK, 1 row affected (0.00 sec)


    退出Mysql連接


    mysql>quit(exit)


    關(guān)閉mysql服務(wù)


    C:/mysql/bin>net mysql

    (責(zé)任編輯:盧兆林)


    mysql4.0.26 win32 下載及安裝方法
    [color=blue]mysql4.0.26安裝方法:[/color]
      
         解壓下載后的mysql-4.0.26-win32.rar,執(zhí)行setup.exe,默認(rèn)安裝,一路NEXT就可以了.
        
         安裝完畢后,在“開(kāi)始”菜單的“運(yùn)行”中輸入:C:\MySQL\bin\mysqld-nt.exe -install ([color=Red]這個(gè)版本建議安裝在C盤(pán)[/color]),運(yùn)行成功之后再在“開(kāi)始”菜單的“運(yùn)行”輸入:net mysql start ,將會(huì)啟動(dòng) MySQL 服務(wù).
        
         默認(rèn)管理員root 密碼空 請(qǐng)使用PHPMYADMIN 修改.

    [color=red]注: 這個(gè)版本建議安裝在C盤(pán),如果安裝后不能啟動(dòng),重啟服務(wù)器后,請(qǐng)直接到系統(tǒng)服務(wù)里面去啟動(dòng)MYSQL.

    [/color][color=Blue]怎么刪除mysql服務(wù)?[/color]
    開(kāi)始-運(yùn)行-CMD-進(jìn)入MYsql的安裝目錄下的bin目錄輸入下面命令
    D:\mysql5\bin>mysqld-nt.exe -remove

     


     

    posted @ 2009-04-02 15:10 張永耀 閱讀(641) | 評(píng)論 (0)編輯 收藏

    PHPCMS2008模板教程 默認(rèn)模板解析及模板制作教程 PHPCMS2008官方默認(rèn) 模板解讀 首先打開(kāi)后臺(tái),官方默認(rèn)模板的存放位置,存放在 ./templates/default/ php cms/ 目錄里,從這里我們就知道如果我們要新那建一套模板應(yīng)該怎么做了: 方法:把全套模板放在一個(gè)文
      

    PHPCMS2008模板教程 默認(rèn)模板解析及模板制作教程
    首先打開(kāi)后臺(tái),官方默認(rèn)模板的存放位置,存放在 ./templates/default/phpcms/ 目錄里,從這里我們就知道如果我們要新那建一套模板應(yīng)該怎么做了:
    方法:把全套模板放在一個(gè)文件夾內(nèi),如:W3ZZ,然后上傳至templates下面,進(jìn)入后臺(tái),我們?cè)诜桨腹芾硖幘涂梢钥吹轿覀儎倓偵蟼鞯腤3ZZ了,把該方案設(shè)置成默認(rèn)方案,更新模板緩存,然后更新首頁(yè)就完全是我們W3ZZ里面的模板了,就這樣簡(jiǎn)單……
    如圖:
     這里就是我們W3ZZ文件夾下面PHPCMS里的所有模板,也就是整站核心的模板,包括首頁(yè),欄目首頁(yè),列表頁(yè),內(nèi)容頁(yè),標(biāo)簽模板……
    接下來(lái)看一下header.html、index.html、footer.html 三個(gè)模板文件。這是首頁(yè)模板的靈魂!不僅是首頁(yè),其它頁(yè)面的頭部文件和頁(yè)腳文件也是header.html,footer.html這個(gè)不用我說(shuō)了,因?yàn)榭纯茨0逯械?/font>{template 'phpcms','header'}{template 'phpcms','footer'}說(shuō)一下這三個(gè)參數(shù)的含義:
    第一個(gè)template,是整個(gè)系統(tǒng)的模板文件夾,也就是前面講的為什么要傳到templates下面的原因,因?yàn)橄到y(tǒng)定義的模板文件夾就為templates,也就是這里的template;第二個(gè)phpcms,就是目前你的模板所在phpcms文件夾名稱,如果你要新建一個(gè)頭部,只要在phpcms里面新建一個(gè)文件,如:header_w3zz.html,然后用{template 'phpcms','header_w3zz'}就可以了,這樣第三個(gè)header這個(gè)就明白了,是要包含的模板文件的名稱,footer這個(gè)就一樣了。
    完整頁(yè)面模板是header+index+footer,有了這三部分,首頁(yè)模板就可以說(shuō)結(jié)構(gòu)完整了。
    對(duì)應(yīng)2008的默認(rèn)模板看:(因?yàn)槎加心J(rèn)的,所以就不貼出來(lái)了,占地方,也不方便看)
    現(xiàn)在我們開(kāi)始分析header.html的構(gòu)造
    1、<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
    http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">    w3c國(guó)際標(biāo)準(zhǔn)


    2、<meta http-equiv="Content-Type" c />     

    這里定義字符編碼,也就是我們下載的時(shí)候是GBK還是UTF-8的,這個(gè){CHARSET}就是編碼變量,這個(gè)你在安裝的時(shí)候就已經(jīng)確定,所以以后的任何操作都要在該編碼下操作,否則就會(huì)出現(xiàn)亂碼,也就是說(shuō),出現(xiàn)亂碼這些的原因就在于此。

    3、<title>{$head[title]}</title>               
    這個(gè)就是網(wǎng)站名稱-網(wǎng)站標(biāo)題,在后臺(tái)系統(tǒng)設(shè)置--基本設(shè)置--網(wǎng)站名稱-網(wǎng)站標(biāo)題,在首頁(yè)會(huì)兩個(gè)都顯示出來(lái),其它的頁(yè)面就只顯示網(wǎng)站名稱

    4、<meta c name="keywords" />     
    在后臺(tái)系統(tǒng)設(shè)置--基本設(shè)置--網(wǎng)頁(yè)關(guān)鍵詞

    5、<meta c name="description" />   
    在后臺(tái)系統(tǒng)設(shè)置--基本設(shè)置--網(wǎng)頁(yè)描述

    6、<base href="{SITE_URL}" _fcksavedurl=""{SITE_URL}"" />              
    這是全部定義的,就相當(dāng)于2007里面的{PHPCMS_PATH},同時(shí)2008也用。但是在這里定義之后你的模板里面的調(diào)用任何文件都不用定義{PHPCMS_PATH}了,如:我要調(diào)用images下面的一個(gè)圖片,你只要寫(xiě)<img src="images/w3zz.jpg">這樣就好。{SITE_URL}這個(gè)就是你網(wǎng)站的在后臺(tái)系統(tǒng)設(shè)置--基本設(shè)置--網(wǎng)站地址

    7、<link href="favicon.ico" rel="shortcut icon" />   
    這個(gè)效果就是:  就是網(wǎng)站地址前面的標(biāo)識(shí),也就調(diào)用images/favicon.ico文件,這個(gè)可以制作,有制作工具

    8、<link href="{SKIN_PATH}{$mod}.css" rel="stylesheet" type="text/css" />   
    引用全部CSS文件,即templates/default/skins/default下面的CSS文件{SKIN_PATH}就是templates/default/skins/default這個(gè)地址,{$mod}是當(dāng)前模型的變量,如:當(dāng)前是phpcms那就說(shuō)明CSS文件是phpcms.css

    9、<link rel="alternate" type="application/rss+xml" title="{$head[title]}" href="/rss.php?rssid={$catid}" />  
    網(wǎng)站標(biāo)題,即訂閱的地址

    10<script language="JavaScript" src="data/config.js"></script>  _fcksavedurl=""data/config.js"></script> "        
    配置js文件      

    <script language="JavaScript" src="images/js/jquery.min.js"></script>  
    框架js文件

    <script language="JavaScript" src="images/js/css.js"></script>              
    cssjs文件

    <script language="JavaScript" src="images/js/common.js"></script>      
    配置js包括添加收藏夾,設(shè)置為首頁(yè)
    <script language="JavaScript" src="images/js/login.js"></script>            
    登陸js文件

    <script language="JavaScript" src="images/js/validator.js"></script>         
    cookie等的js文件

    出現(xiàn)相對(duì)應(yīng)的問(wèn)題,首先檢查這里的js是否調(diào)用
     

    11、<body   
    頁(yè)面載入的時(shí)候調(diào)用輸出catid或者mod,所以說(shuō)$catid和$mod即欄目ID和模型名稱是全局變量

    12、<div id="top">
    {if isset($MODULE['search'])}
    {php $types = cache_read('search_type.php');}
      <div class="f_r">
         <form name="site_search" action="{$MODULE[search][url]}" target="_blank">
       <input type="hidden" name="type" value="all"/>
          <input type="text" name="q" size="20"/>
          <select>
            <option value="all">全部</option>
      {loop $types $k $name}
            <option value="{$k}">{$name}</option>
      {/loop}
          </select>
          <input type="submit" name="s" id="button" value="搜索" />
      </form>
      </div>
    {/if}
      <div class="f_l">
        <div id="div_login" style="display:block">
      <form action="{$MODULE[member][url]}login.php" method="post" name="login" >
      用戶名:<input type="text" name="username" size="12"/>
      密碼:<input type="password" name="password" size="12"/>
         <input type="submit" name="dosubmit" value="登錄" />
         <input type="button" name="register" value="注冊(cè)" />
         <input type="hidden" name="cookietime" value="0"/>
      </form>
    </div>
        <div id="div_logined" style="display:none">
      <strong id="logined_username" ></strong>,<a href="{$MODULE[member][url]}">會(huì)員中心</a> |
            <a href="{if $PHPCMS['uc']}{$MODULE[member][url]}logout.php{else}javascript:logout('{$MODULE[member][url]}logout.php?action=ajax');{/if}">退出登錄</a>
    </div>
      </div>
    </div>   

    這就是網(wǎng)站首頁(yè)頂站的搜索框和登陸框,以及登陸后的效果。
    如圖: 
    13、<div id="head">
      <div id="logo">
        <a href="{SITE_URL}"><img src="images/logo.gif" _fcksavedurl=""images/logo.gif"" alt="{$PHPCMS[sitename]}" /></a>
        <a href="{SITE_URL}rss.php" target="_blank"><img src="images/rss.jpg" alt="rss信息聚合" /></a></div>
    <div class="ad" id="topbanner"><script language="javascript" src="data/js.php?id=1"></script></div>
    </div>
    <div id="menu">
    <ul>
       <li><a href="" id="menu_phpcms"><span>首頁(yè)</span></a></li>
       {tag_一級(jí)欄目}
    </ul>
    </div>     
    頭部里面的head  包括logo,訂閱標(biāo)志,banner,導(dǎo)航
    效果如圖: 

    主體頁(yè)面index.html代碼解析
    1、第一個(gè)div  <div id="main"></div>   這個(gè)主要控制頁(yè)面的寬度,框加顯示,具體樣式對(duì)應(yīng)看CSS文件里面的#main這樣就明白了,所以說(shuō)看了模板就知道CSS樣式是如何的了,這里就告訴需要修改樣式的朋友,要修改哪里,先看那里的模板,然后對(duì)應(yīng)<div>的class或者id去相應(yīng)的CSS里面查找,然后按著你的想法修改
    同時(shí)我們也可以這樣實(shí)現(xiàn)。如:我要把整個(gè)頁(yè)面改成960px的寬度,<div id="main" style="width:960px;"></div>這樣改是最保險(xiǎn)的,既不會(huì)影響全局的CSS,也不會(huì)影響其它頁(yè)面的,我只是舉個(gè)例子,其它的當(dāng)然也可以這樣改,這樣操作最方便。
    2、第二個(gè)div <div id="main_l"></div>   這個(gè)一看就知道是main里面的left了,這就id是main_l,如果要修改可參考1的說(shuō)明。這個(gè)div里面包含了幻燈片,搜索框,欄目首頁(yè)列表。下面我們具體分析:
    第一塊:幻燈片 首頁(yè)頭條首頁(yè)推薦
    <div class="cribox_bdr">
          <!--幻燈片-->
          <div id="slide">{tag_首頁(yè)幻燈片}</div>
          <!--熱點(diǎn)文章-->
          <div id="hotnews" class="f_r"> {tag_網(wǎng)站首頁(yè)頭條}
            <ul class="text_list">
              {tag_網(wǎng)站首頁(yè)推薦}
            </ul>
          </div>
        </div>這個(gè)里面有注釋一看就懂了,里面也就是三個(gè)標(biāo)簽,{tag_首頁(yè)幻燈片}  {tag_網(wǎng)站首頁(yè)頭條}  {tag_網(wǎng)站首頁(yè)推薦}這個(gè)在PHPCMS2008里面分別通過(guò)三個(gè)推薦位置來(lái)實(shí)現(xiàn)的,幻燈片是首頁(yè)焦點(diǎn),首頁(yè)頭條就是首頁(yè)頭條,首頁(yè)推薦就是首頁(yè)推薦,這個(gè)一看標(biāo)簽設(shè)置就可以明白了,同樣你也可以修改這些設(shè)置。標(biāo)簽設(shè)置的教程我以后補(bǔ)上。
    第二塊:搜索框
    <!--{if isset($MODULE['search'])}-->      這里判斷是否安裝最搜索模塊,安裝了就顯示,否則不顯示
    <script type="text/javascript">
    function set_type(type)
    {
    $('#type').val(type);
    $('#search_tag>span').removeClass('selected');
    $('#type_'+type).addClass('selected');
    }
    </script>                   這里是用JSfunction調(diào)用全站搜索的分類,分類設(shè)置在模塊管理--全站搜索--分類管理
        <form name="search" action="{$MODULE[search][url]}" target="_blank">    全站搜索的表單里面包含name和動(dòng)作action
          <div class="search_tag_top mar_10">
            <p id="search_tag"> <span id="type_all" class="selected" >全部</span> {php $types = cache_read('search_type.php');}       搜索條件的讀取如:圖片,資訊,cache_read()讀取緩存文件函數(shù),只要保存在緩存文件里面的都可以直接用該函數(shù)讀取。
              {loop $types $type $name} <span id="type_{$type}" >{$name}</span> {/loop}   循環(huán)出全站搜索的分類  $types是在cache_read()函數(shù)讀取緩存的時(shí)候?qū)⑺袛?shù)據(jù)保存在該數(shù)組里面的,$type就是你在模塊管理--全站搜索--類別管理的類別,如:news。$name是你想要保存的變量,可以自己定義,注意下面的輸出是由這個(gè)變量控制的。
    </p>
          </div>     
          <div class="cribox_bdr_1">
            <input type="hidden" name="type" value="all" id="type"/>
            <input type="text" name="q" size="50"/>
            <input type="submit" name="s" id="button" value="搜索" />
          </div>
        </form>
        <div class="cribox_btm"></div>
    <!--{/if}-->
    效果圖:
     
    posted @ 2009-04-01 10:32 張永耀 閱讀(1315) | 評(píng)論 (0)編輯 收藏

    tcp/ip

      TCP/IP協(xié)議(Transmission Control Protocol/Internet Protocol)叫做傳輸控制/網(wǎng)際協(xié)議,又叫網(wǎng)絡(luò)通訊協(xié)議,這個(gè)協(xié)議是Internet國(guó)際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ)。
      TCP/IP是用于計(jì)算機(jī)通信的一組協(xié)議,我們通常稱它為TCP/IP協(xié)議族。它是70年代中期美國(guó)國(guó)防部為其ARPANET廣域網(wǎng)開(kāi)發(fā)的網(wǎng)絡(luò)體系結(jié)構(gòu)和協(xié)議標(biāo)準(zhǔn),以它為基礎(chǔ)組建的INTERNET是目前國(guó)際上規(guī)模最大的計(jì)算機(jī)網(wǎng)絡(luò),正因?yàn)镮NTERNET的廣泛使用,使得TCP/IP成了事實(shí)上的標(biāo)準(zhǔn)。
      TCP/IP是網(wǎng)絡(luò)中使用的基本的通信協(xié)議。雖然從名字上看TCP/IP包括兩個(gè)協(xié)議,傳輸控制協(xié)議(TCP)和網(wǎng)際協(xié)議(IP),但TCP/IP實(shí)際上是一組協(xié)議,它包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP、TFTP等許多協(xié)議,這些協(xié)議一起稱為TCP/IP協(xié)議。
      TCP/IP由四個(gè)層次組成:數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、應(yīng)用層。
      一數(shù)據(jù)鏈路層
      這是TCP/IP軟件的最低層,負(fù)責(zé)接收IP數(shù)據(jù)報(bào)并通過(guò)網(wǎng)絡(luò)發(fā)送之,或者從網(wǎng)絡(luò)上接收物理幀,抽出IP數(shù)據(jù)報(bào),交給IP層。
      二網(wǎng)絡(luò)層
      負(fù)責(zé)相鄰計(jì)算機(jī)之間的通信。其功能包括三方面:
      1、處理來(lái)自傳輸層的分組發(fā)送請(qǐng)求,收到請(qǐng)求后,將分組裝入IP數(shù)據(jù)報(bào),填充報(bào)頭,選擇去往信宿機(jī)的路徑,然后將數(shù)據(jù)報(bào)發(fā)往適當(dāng)?shù)木W(wǎng)絡(luò)接口。
      2、處理輸入數(shù)據(jù)報(bào):首先檢查其合法性,然后進(jìn)行尋徑--假如該數(shù)據(jù)報(bào)已到達(dá)信宿機(jī),則去掉報(bào)頭,將剩下部分交給適當(dāng)?shù)膫鬏攨f(xié)議;假如該數(shù)據(jù)報(bào)尚未到達(dá)信宿,則轉(zhuǎn)發(fā)該數(shù)據(jù)報(bào)。
      3、處理路徑、流控、擁塞等問(wèn)題。
      三傳輸層
      提供應(yīng)用程序間的通信。其功能包括:
      1、格式化信息流;
      2、提供可靠傳輸。為實(shí)現(xiàn)后者,傳輸層協(xié)議規(guī)定接收端必須發(fā)回確認(rèn),并且假如分組丟失,必須重新發(fā)送。
      四應(yīng)用層
      向用戶提供一組常用的應(yīng)用程序,比如電子郵件、文件傳輸訪問(wèn)、遠(yuǎn)程登錄等。遠(yuǎn)程登錄TELNET使用TELNET協(xié)議提供在網(wǎng)絡(luò)其它主機(jī)上注冊(cè)的接口。TELNET會(huì)話提供了基于字符的虛擬終端。文件傳輸訪問(wèn)FTP使用FTP協(xié)議來(lái)提供網(wǎng)絡(luò)內(nèi)機(jī)器間的文件拷貝功能。
      OSI七層模型與TCP/IP協(xié)議的對(duì)應(yīng)關(guān)系。
      OSI中的層 功能 TCP/IP協(xié)議族
      應(yīng)用層 文件傳輸,電子郵件,文件服務(wù),虛擬終端 TFTP,HTTP,SNMP,F(xiàn)TP,SMTP,DNS,Telnet
      表示層 數(shù)據(jù)格式化,代碼轉(zhuǎn)換,數(shù)據(jù)加密 沒(méi)有協(xié)議
      會(huì)話層 解除或建立與別的接點(diǎn)的聯(lián)系 沒(méi)有協(xié)議
      傳輸層 提供端對(duì)端的接口 TCP,UDP
      網(wǎng)絡(luò)層 為數(shù)據(jù)包選擇路由 IP,ICMP,RIP,OSPF,BGP,IGMP
      數(shù)據(jù)鏈路層 傳輸有地址的幀以及錯(cuò)誤檢測(cè)功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
      物理層 以二進(jìn)制數(shù)據(jù)形式在物理媒體上傳輸數(shù)據(jù) ISO2110,IEEE802。IEEE802.2
      TCP/IP協(xié)議中一些常用協(xié)議英文名:
      TCP(Transmission Control Protocol)傳輸控制協(xié)議
      IP(Internet Protocol)網(wǎng)際協(xié)議
      UDP(User Datagram Protocol)用戶數(shù)據(jù)報(bào)協(xié)議
      ICMP(Internet Control Message Protocol)互聯(lián)網(wǎng)控制信息協(xié)議
      SMTP(Simple Mail Transfer Protocol)簡(jiǎn)單郵件傳輸協(xié)議
      SNMP(Simple Network manage Protocol)簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議
      FTP(File Transfer Protocol)文件傳輸協(xié)議
      ARP(Address Resolation Protocol)地址解析協(xié)議
    posted @ 2009-03-31 11:15 張永耀 閱讀(163) | 評(píng)論 (0)編輯 收藏

    TCP/IP協(xié)議

     

      TCP/IP(Transmission Control Protocol/Internet Protocol)的簡(jiǎn)寫(xiě),中文譯名為傳輸控制協(xié)議/互聯(lián)網(wǎng)絡(luò)協(xié)議)協(xié)議是Internet最基本的協(xié)議,簡(jiǎn)單地說(shuō),就是由網(wǎng)絡(luò)層的IP協(xié)議和傳輸層的TCP協(xié)議組成的。

      眾所周知,如今電腦上因特網(wǎng)都要作TCP/IP協(xié)議設(shè)置,顯然該協(xié)議成了當(dāng)今地球村“人與人”之間的“牽手協(xié)議”。

      1997年,為了褒獎(jiǎng)對(duì)因特網(wǎng)發(fā)展作出突出貢獻(xiàn)的科學(xué)家,并對(duì)TCP/IP協(xié)議作出充分肯定,美國(guó)授予為因特網(wǎng)發(fā)明和定義TCP/IP協(xié)議的文頓·瑟夫和卡恩“國(guó)家技術(shù)金獎(jiǎng)”。這無(wú)疑使人們認(rèn)識(shí)到TCP/IP協(xié)議的重要性。

      在阿帕網(wǎng)(ARPR)產(chǎn)生運(yùn)作之初,通過(guò)接口信號(hào)處理機(jī)實(shí)現(xiàn)互聯(lián)的電腦并不多,大部分電腦相互之間不兼容,在一臺(tái)電腦上完成的工作,很難拿到另一臺(tái)電腦上去用,想讓硬件和軟件都不一樣的電腦聯(lián)網(wǎng),也有很多困難。當(dāng)時(shí)美國(guó)的狀況是,陸軍用的電腦是DEC系列產(chǎn)品,海軍用的電腦是Honeywell中標(biāo)機(jī)器,空軍用的是IBM公司中標(biāo)的電腦,每一個(gè)軍種的電腦在各自的系里都運(yùn)行良好,但卻有一個(gè)大弊病:不能共享資源。

      當(dāng)時(shí)科學(xué)家們提出這樣一個(gè)理念:“所有電腦生來(lái)都是平等的。”為了讓這些“生來(lái)平等”的電腦能夠?qū)崿F(xiàn)“資源共享”就得在這些系統(tǒng)的標(biāo)準(zhǔn)之上,建立一種大家共同都必須遵守的標(biāo)準(zhǔn),這樣才能讓不同的電腦按照一定的規(guī)則進(jìn)行“談判”,并且在談判之后能“握手”。

      在確定今天因特網(wǎng)各個(gè)電腦之間“談判規(guī)則”過(guò)程中,最重要的人物當(dāng)數(shù)瑟夫(Vinton G.Cerf)。正是他的努力,才使今天各種不同的電腦能按照協(xié)議上網(wǎng)互聯(lián)。瑟夫也因此獲得了與克萊因羅克(“因特網(wǎng)之父”)一樣的美稱“互聯(lián)網(wǎng)之父”。

      瑟夫從小喜歡標(biāo)新立異,堅(jiān)強(qiáng)而又熱情。中學(xué)會(huì)書(shū)時(shí),就被允許使用加州大學(xué)洛杉磯分校的電腦,他認(rèn)為“為電腦編程序是個(gè)非常激動(dòng)人心的事,…只要把程序編好,就可以讓電腦做任何事情。”1965年,瑟夫從斯坦福大學(xué)畢業(yè)到IBM的一家公司當(dāng)系統(tǒng)工程師,工作沒(méi)多久,瑟夫就覺(jué)得知識(shí)不夠用,于是到加州大學(xué)洛杉磯分校攻讀博士,那時(shí),正逢阿帕網(wǎng)的建立,“接口信號(hào)處理機(jī)”(IMP)的研試及網(wǎng)絡(luò)測(cè)評(píng)中心的建立,瑟夫也成了著名科學(xué)家克萊因羅克手下的一位學(xué)生。瑟夫與另外三位年輕人(溫菲爾德、克羅克、布雷登)參與了阿帕網(wǎng)的第一個(gè)節(jié)點(diǎn)的聯(lián)接。此后不久,BBN公司對(duì)工作中各種情況發(fā)展有很強(qiáng)判斷能力、被公認(rèn)阿帕網(wǎng)建成作出巨大貢獻(xiàn)的鮑伯·卡恩(Bob Kahn)也來(lái)到了加州大學(xué)洛杉磯分校。 在那段日子里,往往是卡恩提出需要什么軟件,而瑟夫則通宵達(dá)旦地把符合要求的軟件給編出來(lái),然后他們一起測(cè)試這些軟件,直至能正常運(yùn)行。當(dāng)時(shí)的主要格局是這樣的,羅伯茨提出網(wǎng)絡(luò)思想設(shè)計(jì)網(wǎng)絡(luò)布局,卡恩設(shè)計(jì)阿帕網(wǎng)總體結(jié)構(gòu),克萊因羅克負(fù)責(zé)網(wǎng)絡(luò)測(cè)評(píng)系統(tǒng),還有眾多的科學(xué)家、研究生參與研究、試驗(yàn)。69年9月阿帕網(wǎng)誕生、運(yùn)行后,才發(fā)現(xiàn)各個(gè)IMP連接的時(shí)候,需要考慮用各種電腦都認(rèn)可的信號(hào)來(lái)打開(kāi)通信管道,數(shù)據(jù)通過(guò)后還要關(guān)閉通道。否則這些IMP不會(huì)知道什么時(shí)候應(yīng)該接收信號(hào),什么時(shí)候該結(jié)束,這就是我們現(xiàn)在所說(shuō)的通信“協(xié)議”的概念。70年12月制定出來(lái)了最初的通信協(xié)議j 由卡恩開(kāi)發(fā)、瑟夫參與的“網(wǎng)絡(luò)控制協(xié)議”(NCP),但要真正建立一個(gè)共同的標(biāo)準(zhǔn)很不容易,72年10月國(guó)際電腦通信大會(huì)結(jié)束后,科學(xué)家們都在為此而努力。“包切換”理論為網(wǎng)絡(luò)之間的聯(lián)接方式提供了理論基礎(chǔ)。卡恩在自己研究的基礎(chǔ)上,認(rèn)識(shí)到只有深入理解各種操作系統(tǒng)的細(xì)節(jié)才能建立一種對(duì)各種操作系統(tǒng)普適的協(xié)議,73年卡恩請(qǐng)瑟夫一起考慮這個(gè)協(xié)議的各個(gè)細(xì)節(jié),他們這次合作的結(jié)果產(chǎn)生了目前在開(kāi)放系統(tǒng)下的所有網(wǎng)民和網(wǎng)管人員都在使用的“傳輸控制協(xié)議”(TCP,Transsmission-Control Protocol)和“因特網(wǎng)協(xié)議”(IP,Internet Protocol)即TCP/IP協(xié)議。

      通俗而言:TCP負(fù)責(zé)發(fā)現(xiàn)傳輸?shù)膯?wèn)題,一有問(wèn)題就發(fā)出信號(hào),要求重新傳輸,直到所有數(shù)據(jù)安全正確地傳輸?shù)侥康牡亍6鳬P是給因特網(wǎng)的每一臺(tái)電腦規(guī)定一個(gè)地址。1974年12月,卡恩、瑟夫的第一份TCP協(xié)議詳細(xì)說(shuō)明正式發(fā)表。當(dāng)時(shí)美國(guó)國(guó)防部與三個(gè)科學(xué)家小組簽定了完成TCP/IP的協(xié)議,結(jié)果由瑟夫領(lǐng)銜的小組捷足先登,首先制定出了通過(guò)詳細(xì)定義的TCP/IP協(xié)議標(biāo)準(zhǔn)。當(dāng)時(shí)作了一個(gè)試驗(yàn),將信息包通過(guò)點(diǎn)對(duì)點(diǎn)的衛(wèi)星網(wǎng)絡(luò),再通過(guò)陸地電纜,再通過(guò)衛(wèi)星網(wǎng)絡(luò),再由地面?zhèn)鬏敚灤畾W洲和美國(guó),經(jīng)過(guò)各種電腦系統(tǒng),全程9.4萬(wàn)公里竟然沒(méi)有丟失一個(gè)數(shù)據(jù)位,遠(yuǎn)距離的可靠數(shù)據(jù)傳輸證明了TCP/IP協(xié)議的成功。

      1983年1月1日,運(yùn)行較長(zhǎng)時(shí)期曾被人們習(xí)慣了的NCP被停止使用,TCP/IP協(xié)議作為因特網(wǎng)上所有主機(jī)間的共同協(xié)議,從此以后被作為一種必須遵守的規(guī)則被肯定和應(yīng)用。正是由于TCP/IP協(xié)議,才有今天“地球村”因特網(wǎng)的巨大發(fā)展。

     
    什么是 TCP/IP?

      TCP/IP 是供已連接因特網(wǎng)的計(jì)算機(jī)進(jìn)行通信的通信協(xié)議。

      TCP/IP 指?jìng)鬏斂刂茀f(xié)議/網(wǎng)際協(xié)議 (Transmission Control Protocol / Internet Protocol)。

      TCP/IP 定義了電子設(shè)備(比如計(jì)算機(jī))如何連入因特網(wǎng),以及數(shù)據(jù)如何在它們之間傳輸?shù)臉?biāo)準(zhǔn)。
     

    TCP/IP協(xié)議介紹

      

    TCP/IP的通訊協(xié)議



      

      這部分簡(jiǎn)要介紹一下TCP/IP的內(nèi)部結(jié)構(gòu),為討論與互聯(lián)網(wǎng)有關(guān)的安全問(wèn)題打下基礎(chǔ)。TCP/IP協(xié)議組之所以流行,部分原因是因?yàn)樗梢杂迷诟鞣N各樣的信道和底層協(xié)議(例如T1和X.25、以太網(wǎng)以及RS-232串行接口)之上。確切地說(shuō),TCP/IP協(xié)議是一組包括TCP協(xié)議和IP協(xié)議,UDP(User Datagram Protocol)協(xié)議、ICMP(Internet Control Message Protocol)協(xié)議和其他一些協(xié)議的協(xié)議組。

      

    TCP/IP整體構(gòu)架概述



      

      TCP/IP協(xié)議并不完全符合OSI的七層參考模型。傳統(tǒng)的開(kāi)放式系統(tǒng)互連參考模型,是一種通信協(xié)議的7層抽象的參考模型,其中每一層執(zhí)行某一特定任務(wù)。該模型的目的是使各種硬件在相同的層次上相互通信。這7層是:物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層和應(yīng)用層。而TCP/IP通訊協(xié)議采用了4層的層級(jí)結(jié)構(gòu),每一層都呼叫它的下一層所提供的網(wǎng)絡(luò)來(lái)完成自己的需求。這4層分別為:

      應(yīng)用層:應(yīng)用程序間溝通的層,如簡(jiǎn)單電子郵件傳輸(SMTP)、文件傳輸協(xié)議(FTP)、網(wǎng)絡(luò)遠(yuǎn)程訪問(wèn)協(xié)議(Telnet)等。

      傳輸層:在此層中,它提供了節(jié)點(diǎn)間的數(shù)據(jù)傳送服務(wù),如傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù)報(bào)協(xié)議(UDP)等,TCP和UDP給數(shù)據(jù)包加入傳輸數(shù)據(jù)并把它傳輸?shù)较乱粚又校@一層負(fù)責(zé)傳送數(shù)據(jù),并且確定數(shù)據(jù)已被送達(dá)并接收。

      互連網(wǎng)絡(luò)層:負(fù)責(zé)提供基本的數(shù)據(jù)封包傳送功能,讓每一塊數(shù)據(jù)包都能夠到達(dá)目的主機(jī)(但不檢查是否被正確接收),如網(wǎng)際協(xié)議(IP)。

      網(wǎng)絡(luò)接口層:對(duì)實(shí)際的網(wǎng)絡(luò)媒體的管理,定義如何使用實(shí)際網(wǎng)絡(luò)(如Ethernet、Serial Line等)來(lái)傳送數(shù)據(jù)。

      

    TCP/IP中的協(xié)議



      以下簡(jiǎn)單介紹TCP/IP中的協(xié)議都具備什么樣的功能,都是如何工作的:

      1. IP

      網(wǎng)際協(xié)議IP是TCP/IP的心臟,也是網(wǎng)絡(luò)層中最重要的協(xié)議。

      IP層接收由更低層(網(wǎng)絡(luò)接口層例如以太網(wǎng)設(shè)備驅(qū)動(dòng)程序)發(fā)來(lái)的數(shù)據(jù)包,并把該數(shù)據(jù)包發(fā)送到更高層---TCP或UDP層;相反,IP層也把從TCP或UDP層接收來(lái)的數(shù)據(jù)包傳送到更低層。IP數(shù)據(jù)包是不可靠的,因?yàn)镮P并沒(méi)有做任何事情來(lái)確認(rèn)數(shù)據(jù)包是按順序發(fā)送的或者沒(méi)有被破壞。IP數(shù)據(jù)包中含有發(fā)送它的主機(jī)的地址(源地址)和接收它的主機(jī)的地址(目的地址)。

      高層的TCP和UDP服務(wù)在接收數(shù)據(jù)包時(shí),通常假設(shè)包中的源地址是有效的。也可以這樣說(shuō),IP地址形成了許多服務(wù)的認(rèn)證基礎(chǔ),這些服務(wù)相信數(shù)據(jù)包是從一個(gè)有效的主機(jī)發(fā)送來(lái)的。IP確認(rèn)包含一個(gè)選項(xiàng),叫作IP source routing,可以用來(lái)指定一條源地址和目的地址之間的直接路徑。對(duì)于一些TCP和UDP的服務(wù)來(lái)說(shuō),使用了該選項(xiàng)的IP包好像是從路徑上的最后一個(gè)系統(tǒng)傳遞過(guò)來(lái)的,而不是來(lái)自于它的真實(shí)地點(diǎn)。這個(gè)選項(xiàng)是為了測(cè)試而存在的,說(shuō)明了它可以被用來(lái)欺騙系統(tǒng)來(lái)進(jìn)行平常是被禁止的連接。那么,許多依靠IP源地址做確認(rèn)的服務(wù)將產(chǎn)生問(wèn)題并且會(huì)被非法入侵。

      2. TCP

      如果IP數(shù)據(jù)包中有已經(jīng)封好的TCP數(shù)據(jù)包,那么IP將把它們向‘上’傳送到TCP層。TCP將包排序并進(jìn)行錯(cuò)誤檢查,同時(shí)實(shí)現(xiàn)虛電路間的連接。TCP數(shù)據(jù)包中包括序號(hào)和確認(rèn),所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。

      TCP將它的信息送到更高層的應(yīng)用程序,例如Telnet的服務(wù)程序和客戶程序。應(yīng)用程序輪流將信息送回TCP層,TCP層便將它們向下傳送到IP層,設(shè)備驅(qū)動(dòng)程序和物理介質(zhì),最后到接收方。

      面向連接的服務(wù)(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它們使用了TCP。DNS在某些情況下使用TCP(發(fā)送和接收域名數(shù)據(jù)庫(kù)),但使用UDP傳送有關(guān)單個(gè)主機(jī)的信息。

      3.UDP

      UDP與TCP位于同一層,但它不管數(shù)據(jù)包的順序、錯(cuò)誤或重發(fā)。因此,UDP不被應(yīng)用于那些使用虛電路的面向連接的服務(wù),UDP主要用于那些面向查詢---應(yīng)答的服務(wù),例如NFS。相對(duì)于FTP或Telnet,這些服務(wù)需要交換的信息量較小。使用UDP的服務(wù)包括NTP(網(wǎng)絡(luò)時(shí)間協(xié)議)和DNS(DNS也使用TCP)。

      欺騙UDP包比欺騙TCP包更容易,因?yàn)閁DP沒(méi)有建立初始化連接(也可以稱為握手)(因?yàn)樵趦蓚€(gè)系統(tǒng)間沒(méi)有虛電路),也就是說(shuō),與UDP相關(guān)的服務(wù)面臨著更大的危險(xiǎn)。

      4.ICMP

      ICMP與IP位于同一層,它被用來(lái)傳送IP的的控制信息。它主要是用來(lái)提供有關(guān)通向目的地址的路徑信息。ICMP的‘Redirect’信息通知主機(jī)通向其他系統(tǒng)的更準(zhǔn)確的路徑,而‘Unreachable’信息則指出路徑有問(wèn)題。另外,如果路徑不可用了,ICMP可以使TCP連接‘體面地’終止。PING是最常用的基于ICMP的服務(wù)。

      5. TCP和UDP的端口結(jié)構(gòu)

      TCP和UDP服務(wù)通常有一個(gè)客戶/服務(wù)器的關(guān)系,例如,一個(gè)Telnet服務(wù)進(jìn)程開(kāi)始在系統(tǒng)上處于空閑狀態(tài),等待著連接。用戶使用Telnet客戶程序與服務(wù)進(jìn)程建立一個(gè)連接。客戶程序向服務(wù)進(jìn)程寫(xiě)入信息,服務(wù)進(jìn)程讀出信息并發(fā)出響應(yīng),客戶程序讀出響應(yīng)并向用戶報(bào)告。因而,這個(gè)連接是雙工的,可以用來(lái)進(jìn)行讀寫(xiě)。

      兩個(gè)系統(tǒng)間的多重Telnet連接是如何相互確認(rèn)并協(xié)調(diào)一致呢?TCP或UDP連接唯一地使用每個(gè)信息中的如下四項(xiàng)進(jìn)行確認(rèn):

      源IP地址 發(fā)送包的IP地址。

      目的IP地址 接收包的IP地址。

      源端口 源系統(tǒng)上的連接的端口。

      目的端口 目的系統(tǒng)上的連接的端口。

      端口是一個(gè)軟件結(jié)構(gòu),被客戶程序或服務(wù)進(jìn)程用來(lái)發(fā)送和接收信息。一個(gè)端口對(duì)應(yīng)一個(gè)16比特的數(shù)。服務(wù)進(jìn)程通常使用一個(gè)固定的端口,例如,SMTP使用25、Xwindows使用6000。這些端口號(hào)是‘廣為人知’的,因?yàn)樵诮⑴c特定的主機(jī)或服務(wù)的連接時(shí),需要這些地址和目的地址進(jìn)行通訊。

      

    IP協(xié)議



       IP(Internet Protocol)協(xié)議的英文名直譯就是:因特網(wǎng)協(xié)議。從這個(gè)名稱我們就可以知道IP協(xié)議的重要性。在現(xiàn)實(shí)生活中,我們進(jìn)行貨物運(yùn)輸時(shí)都是把貨物包裝成一個(gè)個(gè)的紙箱或者是集裝箱之后才進(jìn)行運(yùn)輸,在網(wǎng)絡(luò)世界中各種信息也是通過(guò)類似的方式進(jìn)行傳輸?shù)摹P協(xié)議規(guī)定了數(shù)據(jù)傳輸時(shí)的基本單元和格式。如果比作貨物運(yùn)輸,IP協(xié)議規(guī)定了貨物打包時(shí)的包裝箱尺寸和包裝的程序。 除了這些以外,IP協(xié)議還定義了數(shù)據(jù)包的遞交辦法和路由選擇。同樣用貨物運(yùn)輸做比喻,IP協(xié)議規(guī)定了貨物的運(yùn)輸方法和運(yùn)輸路線。

      

    TCP協(xié)議



       我們已經(jīng)知道了IP協(xié)議很重要,IP協(xié)議已經(jīng)規(guī)定了數(shù)據(jù)傳輸?shù)闹饕獌?nèi)容,那TCP(Transmission Control Protocol)協(xié)議是做什么的呢?不知大家發(fā)現(xiàn)沒(méi)有,在IP協(xié)議中定義的傳輸是單向的,也就是說(shuō)發(fā)出去的貨物對(duì)方有沒(méi)有收到我們是不知道的。就好像8毛錢一份的平信一樣。那對(duì)于重要的信件我們要寄掛號(hào)信怎么辦呢?TCP協(xié)議就是幫我們寄“掛號(hào)信”的。TCP協(xié)議提供了可靠的面向?qū)ο蟮臄?shù)據(jù)流傳輸服務(wù)的規(guī)則和約定。簡(jiǎn)單的說(shuō)在TCP模式中,對(duì)方發(fā)一個(gè)數(shù)據(jù)包給你,你要發(fā)一個(gè)確認(rèn)數(shù)據(jù)包給對(duì)方。通過(guò)這種確認(rèn)來(lái)提供可靠性。

      

    1.1 TCP/IP參考模型



      TCP/IP協(xié)議并不完全符合OSI的七層參考模型。傳統(tǒng)的開(kāi)放式系統(tǒng)互連參考模型,是一種通信協(xié)議的7層抽象的參考模型,其中每一層執(zhí)行某一特定任務(wù)。該模型的目的是使各種硬件在相同的層次上相互通信。這7層是:物理層、數(shù)據(jù)鏈路層、網(wǎng)路層、傳輸層、話路層、表示層和應(yīng)用層。而TCP/IP通訊協(xié)議采用了4層的層級(jí)結(jié)構(gòu),每一層都呼叫它的下一層所提供的網(wǎng)絡(luò)來(lái)完成自己的需求。這4層分別為:

      應(yīng)用層:應(yīng)用程序間溝通的層,如簡(jiǎn)單電子郵件傳輸(SMTP)、文件傳輸協(xié)議(FTP)、網(wǎng)絡(luò)遠(yuǎn)程訪問(wèn)協(xié)議(Telnet)等。

      傳輸層:在此層中,它提供了節(jié)點(diǎn)間的數(shù)據(jù)傳送服務(wù),如傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù)報(bào)協(xié)議(UDP)等,TCP和UDP給數(shù)據(jù)包加入傳輸數(shù)據(jù)并把它傳輸?shù)较乱粚又校@一層負(fù)責(zé)傳送數(shù)據(jù),并且確定數(shù)據(jù)已被送達(dá)并接收。

      互連網(wǎng)絡(luò)層:負(fù)責(zé)提供基本的數(shù)據(jù)封包傳送功能,讓每一塊數(shù)據(jù)包都能夠到達(dá)目的主機(jī)(但不檢查是否被正確接收),如網(wǎng)際協(xié)議(IP)。

      網(wǎng)絡(luò)接口層:對(duì)實(shí)際的網(wǎng)絡(luò)媒體的管理,定義如何使用實(shí)際網(wǎng)絡(luò)(如Ethernet、Serial Line等)來(lái)傳送數(shù)據(jù)。

      

    1. 2 網(wǎng)間協(xié)議IP



       Internet 上使用的一個(gè)關(guān)鍵的底層協(xié)議是網(wǎng)際協(xié)議,通常稱IP協(xié)議。我們利用一個(gè)共同遵守的通信協(xié)議,從而使 Internet 成為一個(gè)允許連接不同類型的計(jì)算機(jī)和不同操作系統(tǒng)的網(wǎng)絡(luò)。要使兩臺(tái)計(jì)算機(jī)彼此之間進(jìn)行通信,必須使兩臺(tái)計(jì)算機(jī)使用同一種"語(yǔ)言"。通信協(xié)議正像兩臺(tái)計(jì)算機(jī)交換信息所使用的共同語(yǔ)言,它規(guī)定了通信雙方在通信中所應(yīng)共同遵守的約定。

      計(jì)算機(jī)的通信協(xié)議精確地定義了計(jì)算機(jī)在彼此通信過(guò)程的所有細(xì)節(jié)。例如,每臺(tái)計(jì)算機(jī)發(fā)送的信息格式和含義,在什么情況下應(yīng)發(fā)送規(guī)定的特殊信息,以及接收方的計(jì)算機(jī)應(yīng)做出哪些應(yīng)答等等。

      網(wǎng)際協(xié)議IP協(xié)議提供了能適應(yīng)各種各樣網(wǎng)絡(luò)硬件的靈活性,對(duì)底層網(wǎng)絡(luò)硬件幾乎沒(méi)有任何要求,任何一個(gè)網(wǎng)絡(luò)只要可以從一個(gè)地點(diǎn)向另一個(gè)地點(diǎn)傳送二進(jìn)制數(shù)據(jù),就可以使用IP協(xié)議加入 Internet 了。

      如果希望能在 Internet 上進(jìn)行交流和通信,則每臺(tái)連上 Internet 的計(jì)算機(jī)都必須遵守IP協(xié)議。為此使用 Internet 的每臺(tái)計(jì)算機(jī)都必須運(yùn)行IP軟件,以便時(shí)刻準(zhǔn)備發(fā)送或接收信息。

      IP協(xié)議對(duì)于網(wǎng)絡(luò)通信有著重要的意義:網(wǎng)絡(luò)中的計(jì)算機(jī)通過(guò)安裝IP軟件,使許許多多的局域網(wǎng)絡(luò)構(gòu)成了一個(gè)龐大而又嚴(yán)密的通信系統(tǒng)。從而使 Internet 看起來(lái)好像是真實(shí)存在的,但實(shí)際上它是一種并不存在的虛擬網(wǎng)絡(luò),只不過(guò)是利用IP協(xié)議把全世界上所有愿意接入 Internet 的計(jì)算機(jī)局域網(wǎng)絡(luò)連接起來(lái),使得它們彼此之間都能夠通信。

      

    1.3 傳輸控制協(xié)議TCP



      盡管計(jì)算機(jī)通過(guò)安裝IP軟件,從而保證了計(jì)算機(jī)之間可以發(fā)送和接收資料,但I(xiàn)P協(xié)議還不能解決資料分組在傳輸過(guò)程中可能出現(xiàn)的問(wèn)題。因此,若要解決可能出現(xiàn)的問(wèn)題,連上 Internet 的計(jì)算機(jī)還需要安裝TCP協(xié)議來(lái)提供可靠的并且無(wú)差錯(cuò)的通信服務(wù)。

      TCP協(xié)議被稱作一種端對(duì)端協(xié)議。這是因?yàn)樗鼮閮膳_(tái)計(jì)算機(jī)之間的連接起了重要作用:當(dāng)一臺(tái)計(jì)算機(jī)需要與另一臺(tái)遠(yuǎn)程計(jì)算機(jī)連接時(shí),TCP協(xié)議會(huì)讓它們建立一個(gè)連接、發(fā)送和接收資料以及終止連接。

      傳輸控制協(xié)議TCP協(xié)議利用重發(fā)技術(shù)和擁塞控制機(jī)制,向應(yīng)用程序提供可靠的通信連接,使它能夠自動(dòng)適應(yīng)網(wǎng)上的各種變化。即使在 Internet 暫時(shí)出現(xiàn)堵塞的情況下,TCP也能夠保證通信的可靠。

      眾所周知, Internet 是一個(gè)龐大的國(guó)際性網(wǎng)絡(luò),網(wǎng)絡(luò)上的擁擠和空閑時(shí)間總是交替不定的,加上傳送的距離也遠(yuǎn)近不同,所以傳輸資料所用時(shí)間也會(huì)變化不定。TCP協(xié)議具有自動(dòng)調(diào)整"超時(shí)值"的功能,能很好地適應(yīng) Internet 上各種各樣的變化,確保傳輸數(shù)值的正確。

      因此,從上面我們可以了解到:IP協(xié)議只保證計(jì)算機(jī)能發(fā)送和接收分組資料,而TCP協(xié)議則可提供一個(gè)可靠的、可流控的、全雙工的信息流傳輸服務(wù)。

      綜上所述,雖然IP和TCP這兩個(gè)協(xié)議的功能不盡相同,也可以分開(kāi)單獨(dú)使用,但它們是在同一時(shí)期作為一個(gè)協(xié)議來(lái)設(shè)計(jì)的,并且在功能上也是互補(bǔ)的。只有兩者的結(jié)合,才能保證 Internet 在復(fù)雜的環(huán)境下正常運(yùn)行。凡是要連接到 Internet 的計(jì)算機(jī),都必須同時(shí)安裝和使用這兩個(gè)協(xié)議,因此在實(shí)際中常把這兩個(gè)協(xié)議統(tǒng)稱作TCP/IP協(xié)議。

      

    1.4 IP地址及其分類



      在Internet上連接的所有計(jì)算機(jī),從大型機(jī)到微型計(jì)算機(jī)都是以獨(dú)立的身份出現(xiàn),我們稱它為主機(jī)。為了實(shí)現(xiàn)各主機(jī)間的通信,每臺(tái)主機(jī)都必須有一個(gè)唯一的網(wǎng)絡(luò)地址。就好像每一個(gè)住宅都有唯一的門牌一樣,才不至于在傳輸資料時(shí)出現(xiàn)混亂。

      Internet的網(wǎng)絡(luò)地址是指連入Internet網(wǎng)絡(luò)的計(jì)算機(jī)的地址編號(hào)。所以,在Internet網(wǎng)絡(luò)中,網(wǎng)絡(luò)地址唯一地標(biāo)識(shí)一臺(tái)計(jì)算機(jī)。

      我們都已經(jīng)知道,Internet是由幾千萬(wàn)臺(tái)計(jì)算機(jī)互相連接而成的。而我們要確認(rèn)網(wǎng)絡(luò)上的每一臺(tái)計(jì)算機(jī),靠的就是能唯一標(biāo)識(shí)該計(jì)算機(jī)的網(wǎng)絡(luò)地址,這個(gè)地址就叫做IP(Internet Protocol的簡(jiǎn)寫(xiě))地址,即用Internet協(xié)議語(yǔ)言表示的地址。

      目前,在Internet里,IP地址是一個(gè)32位的二進(jìn)制地址,為了便于記憶,將它們分為4組,每組8位,由小數(shù)點(diǎn)分開(kāi),用四個(gè)字節(jié)來(lái)表示,而且,用點(diǎn)分開(kāi)的每個(gè)字節(jié)的數(shù)值范圍是0~255,如202.116.0.1,這種書(shū)寫(xiě)方法叫做點(diǎn)數(shù)表示法。

      IP地址可確認(rèn)網(wǎng)絡(luò)中的任何一個(gè)網(wǎng)絡(luò)和計(jì)算機(jī),而要識(shí)別其它網(wǎng)絡(luò)或其中的計(jì)算機(jī),則是根據(jù)這些IP地址的分類來(lái)確定的。一般將IP地址按節(jié)點(diǎn)計(jì)算機(jī)所在網(wǎng)絡(luò)規(guī)模的大小分為A,B,C三類,默認(rèn)的網(wǎng)絡(luò)屏蔽是根據(jù)IP地址中的第一個(gè)字段確定的。

      1. A類地址

      A類地址的表示范圍為:10.0.0.0~126.255.255.255,默認(rèn)網(wǎng)絡(luò)屏蔽為:255.0.0.0;A類地址分配給規(guī)模特別大的網(wǎng)絡(luò)使用。A類網(wǎng)絡(luò)用第一組數(shù)字表示網(wǎng)絡(luò)本身的地址,后面三組數(shù)字作為連接于網(wǎng)絡(luò)上的主機(jī)的地址。分配給具有大量主機(jī)(直接個(gè)人用戶)而局域網(wǎng)絡(luò)個(gè)數(shù)較少的大型網(wǎng)絡(luò)。例如IBM公司的網(wǎng)絡(luò)。

      2. B類地址

      B類地址的表示范圍為:127.0.0.0~191.255.255.255,默認(rèn)網(wǎng)絡(luò)屏蔽為:255.255.0.0;B類地址分配給一般的中型網(wǎng)絡(luò)。B類網(wǎng)絡(luò)用第一、二組數(shù)字表示網(wǎng)絡(luò)的地址,后面兩組數(shù)字代表網(wǎng)絡(luò)上的主機(jī)地址。

      3. C類地址

      C類地址的表示范圍為:192.0.0.0~223.255.255.255,默認(rèn)網(wǎng)絡(luò)屏蔽為:255.255.255.0;C類地址分配給小型網(wǎng)絡(luò),如一般的局域網(wǎng),它可連接的主機(jī)數(shù)量是最少的,采用把所屬的用戶分為若干的網(wǎng)段進(jìn)行管理。C類網(wǎng)絡(luò)用前三組數(shù)字表示網(wǎng)絡(luò)的地址,最后一組數(shù)字作為網(wǎng)絡(luò)上的主機(jī)地址。

      RFC 1918留出了3塊IP地址空間(1個(gè)A類地址段,16個(gè)B類地址段,256個(gè)C類地址段)作為私有的內(nèi)部使用的地址。在這個(gè)范圍內(nèi)的IP地址不能被路由到Internet骨干網(wǎng)上;Internet路由器將丟棄該私有地址。

      IP地址類別 RFC 1918內(nèi)部地址范圍

      A類 10.0.0.0到10.255.255.255

      B類 172.16.0.0到172.31.255.255

      C類 192.168.0.0到192.168.255.255

      使用私有地址將網(wǎng)絡(luò)連至Internet,需要將私有地址轉(zhuǎn)換為公有地址。這個(gè)轉(zhuǎn)換過(guò)程稱為網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation,NAT),通常使用路由器來(lái)執(zhí)行NAT轉(zhuǎn)換。

      實(shí)際上,還存在著D類地址和E類地址。但這兩類地址用途比較特殊,在這里只是簡(jiǎn)單介紹一下:D類地址稱為廣播地址,供特殊協(xié)議向選定的節(jié)點(diǎn)發(fā)送信息時(shí)用。E類地址保留給將來(lái)使用。

      連接到Internet上的每臺(tái)計(jì)算機(jī),不論其IP地址屬于哪類都與網(wǎng)絡(luò)中的其它計(jì)算機(jī)處于平等地位,因?yàn)橹挥蠭P地址才是區(qū)別計(jì)算機(jī)的唯一標(biāo)識(shí)。所以,以上IP地址的分類只適用于網(wǎng)絡(luò)分類。

      在Internet中,一臺(tái)計(jì)算機(jī)可以有一個(gè)或多個(gè)IP地址,就像一個(gè)人可以有多個(gè)通信地址一樣,但兩臺(tái)或多臺(tái)計(jì)算機(jī)卻不能共享一個(gè)IP地址。如果有兩臺(tái)計(jì)算機(jī)的IP地址相同,則會(huì)引起異常現(xiàn)象,無(wú)論哪臺(tái)計(jì)算機(jī)都將無(wú)法正常工作。

      順便提一下幾類特殊的IP地址:

      1. 廣播地址 目的端為給定網(wǎng)絡(luò)上的所有主機(jī),一般主機(jī)段為全0

      2. 單播地址 目的端為指定網(wǎng)絡(luò)上的單個(gè)主機(jī)地址

      3. 組播地址 目的端為同一組內(nèi)的所有主機(jī)地址

      4. 環(huán)回地址 127.0.0.1 在環(huán)回測(cè)試和廣播測(cè)試時(shí)會(huì)使用

      

    1.5 子網(wǎng)的劃分



      

      若公司不上Internet,那一定不會(huì)煩惱IP地址的問(wèn)題,因?yàn)榭梢匀我馐褂盟械腎P地址,不管是A類或是B類,這個(gè)時(shí)候不會(huì)想到要用子網(wǎng),但若是上Internet那IP地址便彌足珍貴了,目前全球一陣Internet熱,IP地址已經(jīng)愈來(lái)愈少了,而所申請(qǐng)的IP地址目前也趨保守,而且只有經(jīng)申請(qǐng)的IP地址能在Internet使用,但對(duì)某些公司只能申請(qǐng)到一個(gè)C類的IP地址,但又有多個(gè)點(diǎn)需要使用,那這時(shí)便需要使用到子網(wǎng),這就需要考慮子網(wǎng)的劃分,下面簡(jiǎn)介子網(wǎng)的原理及如何規(guī)劃。

      1.5.1 子網(wǎng)掩碼(Subnet Mask)的介紹

      設(shè)定任何網(wǎng)絡(luò)上的任何設(shè)備不管是主機(jī)、個(gè)人電腦、路由器等皆需要設(shè)定IP地址,而跟隨著IP地址的是所謂的子網(wǎng)掩碼(NetMask,Subnet Mask),這個(gè)子網(wǎng)掩碼主要的目的是由IP地址中也能獲得網(wǎng)絡(luò)編碼,也就是說(shuō)IP地址和子網(wǎng)掩碼作和而得到網(wǎng)絡(luò)編碼,如下所示:

      IP地址

      192.10.10.6 11000000.00001010.00001010.00000110

      子網(wǎng)掩碼

      255.255.255.0 11111111.11111111.11111111.00000000

      AND

      -------------------------------------------------------------------

      Network Number

      192.10.10.0 11000000.00001010.00001010.00000000

      子網(wǎng)掩碼有所謂的默認(rèn)值,如下所示

      類 IP地址 范圍 子網(wǎng)掩碼

      A 1.0.0.0-126.255.255.255 255.0.0.0

      B 128.0.0.0-191.255.255.255 255.255.0.0

      C 192.0.0.0-223.255.255.255 255.255.255.0

      在預(yù)設(shè)的子網(wǎng)掩碼(Net Mask)都只有255的值,在談到子網(wǎng)掩碼(Subnet Mask)時(shí)這個(gè)值便不一定是255了。在完整一組C類地址中如203.67.10.0-203.67.10.255 子網(wǎng)掩碼255.255.255.0,203.67.10.0稱之網(wǎng)絡(luò)編碼(Network Number,將IP 地址和子網(wǎng)掩碼作和),而203.67.10.255是廣播的IP地址,所以這兩者皆不能使用,實(shí)際只能使用203.67.10.1--203.67.10.254等254個(gè)IP地址,這是以255.255.255.0作子網(wǎng)掩碼的結(jié)果,而所謂Subnet Msk尚可將整組C類地址分成數(shù)組網(wǎng)絡(luò)編碼,這要在子網(wǎng)掩碼上作手腳,若是要將整組C類地址分成2個(gè)網(wǎng)絡(luò)編碼那子網(wǎng)掩碼設(shè)定為255.255.255.128,若是要將整組C類分成8組網(wǎng)絡(luò)編碼則子網(wǎng)掩碼要為255.255.255.224,這是怎么來(lái)的,由以上知道網(wǎng)絡(luò)編碼是由IP地址和子網(wǎng)掩碼作AND而來(lái)的,而且將子網(wǎng)掩碼以二進(jìn)制表示法知道是1的會(huì)保留,而為0的去掉

      192.10.10.193--11000000.00001010.00001010.11000001

      255.255.255.0--11111111.11111111.11111111.00000000

      --------------------------------------------------------------

      192.10.10.0--11000000.00001010.00001010.00000000

      以上是以255.255.255.0為子網(wǎng)掩碼的結(jié)果,網(wǎng)絡(luò)編碼是192.10.10.0,若是使用255.255.255.224作子網(wǎng)掩碼結(jié)果便有所不同

      192.10.10.193--11000000.00001010.00001010.11000001

      255.255.255.224--11111111.11111111.11111111.11100000

      --------------------------------------------------------------

      192.10.10.192--11000000.00001010.00001010.11000000

      此時(shí)網(wǎng)絡(luò)編碼變成了192.10.10.192,這便是子網(wǎng)。那要如何決定所使用的子網(wǎng)掩碼,255.255.255.224以二進(jìn)制表示法為11111111.11111111.11111111.11100000,變化是在最后一組,11100000便是224,以三個(gè)位(Bit)可表示2的3次方便是8個(gè)網(wǎng)絡(luò)編碼

      子網(wǎng)掩碼二進(jìn)制表示法可分幾個(gè)網(wǎng)絡(luò)

      255.255.255.011111111.11111111.11111111.000000001

      255.255.255.128

      11111111.11111111.11111111.100000002

      255.255.255.192

      11111111.11111111.11111111.110000004

      255.255.255.224

      11111111.11111111.11111111.111000008

      255.255.255.240

      11111111.11111111.11111111.1111000016

      255.255.255.248

      11111111.11111111.11111111.1111100032

      255.255.255.252

      11111111.11111111.11111111.1111110064

      以下使用255.255.255.224將C類地址203.67.10.0分成8組網(wǎng)絡(luò)編碼,各個(gè)網(wǎng)絡(luò)編碼及其廣播IP地址及可使用之IP地址序號(hào)網(wǎng)絡(luò)編碼廣播可使用之IP地址

      (1)203.67.10.0--203.67.10.31

      203.67.10.1--203.67.10.30

      (2)203.67.10.32--203.67.10.63

      203.67.10.33--203.67.10.62

      (3)203.67.10.64--203.67.10.95

      203.67.10.65--203.67.10.94

      (4)203.67.10.96--203.67.10.127

      203.67.10.97--203.67.10.126

      (5)203.67.10.128--203.67.10.159

      203.67.10.129--203.67.10.158

      (6)203.67.10.160--203.67.10.191

      203.67.10.161--203.67.10.190

      (7)203.67.10.192--203.67.10.223

      203.67.10.193--203.67.10.222

      (8)203.67.10.224--203.67.10.255

      203.67.10.225--203.67.10.254

      可驗(yàn)證所使用的IP地址是否如上表所示

      203.67.10.115--11001011.01000011.00001010.01110011

      255.255.255.224--11111111.11111111.11111111.11100000

      --------------------------------------------------------------

      203.67.10.96--11001011.01000011.00001010.01100000

      203.67.10.55--11001011.01000011.00001010.00110111

      255.255.255.224--11111111.11111111.11111111.11100000

      --------------------------------------------------------------

      203.67.10.32--11001011.01000011.00001010.00100000

      其它的子網(wǎng)掩碼所分成的網(wǎng)絡(luò)編碼可自行以上述方法自行推演出來(lái)。

      1.5.3 子網(wǎng)的應(yīng)用

      使用子網(wǎng)是要解決只有一組C類地址但需要數(shù)個(gè)網(wǎng)絡(luò)編碼的問(wèn)題,并不是解決IP地址不夠用的問(wèn)題,因?yàn)槭褂米泳W(wǎng)反而能使用的IP地址會(huì)變少,子網(wǎng)通常是使用在跨地域的網(wǎng)絡(luò)互聯(lián)之中,兩者之間使用路由器連線,同時(shí)也上Internet,但只申請(qǐng)到一組C 類IP地址,過(guò)路由又需不同的網(wǎng)絡(luò),所以此時(shí)就必須使用到子網(wǎng),當(dāng)然二網(wǎng)絡(luò)間也可以遠(yuǎn)程橋接(Remote Bridge,字面翻譯)連接,那便沒(méi)有使用子網(wǎng)的問(wèn)題。

      網(wǎng)關(guān)地址

      若要使兩個(gè)完全不同的網(wǎng)絡(luò)(異構(gòu)網(wǎng))連接在一起,一般使用網(wǎng)關(guān),在Internet中兩個(gè)網(wǎng)絡(luò)也要通過(guò)一臺(tái)稱為網(wǎng)關(guān)的計(jì)算機(jī)實(shí)現(xiàn)互聯(lián)。這臺(tái)計(jì)算機(jī)能根據(jù)用戶通信目標(biāo)計(jì)算機(jī)的IP地址,決定是否將用戶發(fā)出的信息送出本地網(wǎng)絡(luò),同時(shí),它還將外界發(fā)送給屬于本地網(wǎng)絡(luò)計(jì)算機(jī)的信息接收過(guò)來(lái),它是一個(gè)網(wǎng)絡(luò)與另一個(gè)網(wǎng)絡(luò)相聯(lián)的通道。為了使TCP/IP協(xié)議能夠?qū)ぶ罚撏ǖ辣毁x予一個(gè)IP地址,這個(gè)IP地址稱為網(wǎng)關(guān)地址。

      完美測(cè)試TCP/IP協(xié)議簡(jiǎn)介

      安裝網(wǎng)絡(luò)硬件和網(wǎng)絡(luò)協(xié)議之后,我們一般要進(jìn)行TCP/IP協(xié)議的測(cè)試工作,那么怎樣測(cè)試才算是比較全面的測(cè)試呢?我們認(rèn)為,全面的測(cè)試應(yīng)包括局域網(wǎng)和互聯(lián)網(wǎng)兩個(gè)方面,因此應(yīng)從局域網(wǎng)和互聯(lián)網(wǎng)兩個(gè)方面測(cè)試,以下是我們?cè)趯?shí)際工作中利用命令行測(cè)試TCP/IP配置的步驟:

      1、 單擊“開(kāi)始”/“運(yùn)行”,輸入CMD按回車,打開(kāi)命令提示符窗口。

      2、 首先檢查IP地址、子網(wǎng)掩碼、默認(rèn)網(wǎng)關(guān)、DNS服務(wù)器地址是否正確,輸入命令ipconfig /all,按回車。此時(shí)顯示了你的網(wǎng)絡(luò)配置,觀查是否正確。

      3、 輸入ping 127.0.0.1,觀查網(wǎng)卡是否能轉(zhuǎn)發(fā)數(shù)據(jù),如果出現(xiàn)“Request timed out”,表明配置差錯(cuò)或網(wǎng)絡(luò)有問(wèn)題。

      4、 Ping一個(gè)互聯(lián)網(wǎng)地址,如ping 202.102.128.68,看是否有數(shù)據(jù)包傳回,以驗(yàn)證與互聯(lián)網(wǎng)的連接性。

      5、 Ping 一個(gè)局域網(wǎng)地址,觀查與它的連通性。

      6、 用nslookup測(cè)試DNS解析是否正確,輸入如nslookup www.ccidnet.com,查看是否能解析。

      如果你的計(jì)算機(jī)通過(guò)了全部測(cè)試,則說(shuō)明網(wǎng)絡(luò)正常,否則網(wǎng)絡(luò)可能有不同程度的問(wèn)題。在此不展開(kāi)詳述。不過(guò),要注意,在使用 ping命令時(shí),有些公司會(huì)在其主機(jī)設(shè)置丟棄ICMP數(shù)據(jù)包,造成你的ping命令無(wú)法正常返回?cái)?shù)據(jù)包,不防換個(gè)網(wǎng)站試試。

      補(bǔ)充:
     

    TCP/IP 協(xié)議簇

      TCP/IP(Transmission Control Protocol/Internet Protocol)已成為一個(gè)事實(shí)上的工業(yè)

      標(biāo)準(zhǔn)。

      TCP/IP是一組協(xié)議的代名詞,它還包括許多協(xié)議,組成了TCP/IP協(xié)議簇。

      TCP/IP協(xié)議簇分為四層,IP位于協(xié)議簇的第二層(對(duì)應(yīng)OSI的第三層),TCP位于協(xié)議簇的第

      三層(對(duì)應(yīng)OSI的第四層)。

      TCP和IP是TCP/IP協(xié)議簇的中間兩層,是整個(gè)協(xié)議簇的核心,起到了承上啟下的作用。

      1、接口層

      TCP/IP的最低層是接口層,常見(jiàn)的接口層協(xié)議有:

      Ethernet 802.3、Token Ring 802.5、X.25、Frame reley、HDLC、PPP等。

      2、網(wǎng)絡(luò)層

      網(wǎng)絡(luò)層包括:IP(Internet Protocol)協(xié)議、ICMP(Internet Control Message Protocol)

      控制報(bào)文協(xié)議、ARP(Address Resolution Protocol)地址轉(zhuǎn)換協(xié)議、RARP(Reverse ARP)反向

      地址轉(zhuǎn)換協(xié)議。

      IP是網(wǎng)絡(luò)層的核心,通過(guò)路由選擇將下一跳IP封裝后交給接口層。IP數(shù)據(jù)報(bào)是無(wú)連接服務(wù)

      。

      ICMP是網(wǎng)絡(luò)層的補(bǔ)充,可以回送報(bào)文。用來(lái)檢測(cè)網(wǎng)絡(luò)是否通暢。

      Ping命令就是發(fā)送ICMP的echo包,通過(guò)回送的echo relay進(jìn)行網(wǎng)絡(luò)測(cè)試。

      ARP是正向地址解析協(xié)議,通過(guò)已知的IP,尋找對(duì)應(yīng)主機(jī)的MAC地址。

      RARP是反向地址解析協(xié)議,通過(guò)MAC地址確定IP地址。比如無(wú)盤(pán)工作站和DHCP服務(wù)。

      3、傳輸層

      傳輸層協(xié)議主要是:傳輸控制協(xié)議TCP(Transmission Control Protocol)和用戶數(shù)據(jù)報(bào)協(xié)

      議UDP(User Datagram rotocol)。

      TCP是面向連接的通信協(xié)議,通過(guò)三次握手建立連接,通訊時(shí)完成時(shí)要拆除連接,由于TCP

      是面向連接的所以只能用于點(diǎn)對(duì)點(diǎn)的通訊。

      TCP提供的是一種可靠的數(shù)據(jù)流服務(wù),采用“帶重傳的肯定確認(rèn)”技術(shù)來(lái)實(shí)現(xiàn)傳輸?shù)目煽?br />
      性。TCP還采用一種稱為“滑動(dòng)窗口”的方式進(jìn)行流量控制,所謂窗口實(shí)際表示接收能力,用

      以限制發(fā)送方的發(fā)送速度。

      UDP是面向無(wú)連接的通訊協(xié)議,UDP數(shù)據(jù)包括目的端口號(hào)和源端口號(hào)信息,由于通訊不需要

      連接,所以可以實(shí)現(xiàn)廣播發(fā)送。

      UDP通訊時(shí)不需要接收方確認(rèn),屬于不可靠的傳輸,可能會(huì)出丟包現(xiàn)象,實(shí)際應(yīng)用中要求

      在程序員編程驗(yàn)證。

      4、應(yīng)用層

      應(yīng)用層一般是面向用戶的服務(wù)。如FTP、TELNET、DNS、SMTP、POP3。

      FTP(File Transmision Protocol)是文件傳輸協(xié)議,一般上傳下載用FTP服務(wù),數(shù)據(jù)端口

      是20H,控制端口是21H。

      Telnet服務(wù)是用戶遠(yuǎn)程登錄服務(wù),使用23H端口,使用明碼傳送,保密性差、簡(jiǎn)單方便。

      DNS(Domain Name Service)是域名解析服務(wù),提供域名到IP地址之間的轉(zhuǎn)換。

      SMTP(Simple Mail Transfer Protocol)是簡(jiǎn)單郵件傳輸協(xié)議,用來(lái)控制信件的發(fā)送、中

      轉(zhuǎn)。 

      POP3(Post Office Protocol 3)是郵局協(xié)議第3版本,用于接收郵件。

      數(shù)據(jù)格式:

      數(shù)據(jù)幀:幀頭+I(xiàn)P數(shù)據(jù)包+幀尾 (幀頭包括源和目標(biāo)主機(jī)MAC地址及類型,幀尾是校驗(yàn)字)

      IP數(shù)據(jù)包:IP頭部+TCP數(shù)據(jù)信息 (IP頭包括源和目標(biāo)主機(jī)IP地址、類型、生存期等)

      TCP數(shù)據(jù)信息:TCP頭部+實(shí)際數(shù)據(jù) (TCP頭包括源和目標(biāo)主機(jī)端口號(hào)、順序號(hào)、確認(rèn)號(hào)、校

      驗(yàn)字等)
    posted @ 2009-03-31 10:54 張永耀 閱讀(202) | 評(píng)論 (0)編輯 收藏

    TCP:Transmission Control Protocol 傳輸控制協(xié)議

      首先,TCP建立連接之后,通信雙方都同時(shí)可以進(jìn)行數(shù)據(jù)的傳輸,其次,他是全雙工的;在保證可靠性上,采用超時(shí)重傳和捎帶確認(rèn)機(jī)制。

      在流量控制上,采用滑動(dòng)窗口協(xié)議,協(xié)議中規(guī)定,對(duì)于窗口內(nèi)未經(jīng)確認(rèn)的分組需要重傳。

      在擁塞控制上,采用慢啟動(dòng)算法。

      注解:該協(xié)議主要用于在主機(jī)間建立一個(gè)虛擬連接,以實(shí)現(xiàn)高可靠性的數(shù)據(jù)包交換。IP協(xié)議可以進(jìn)行IP數(shù)據(jù)包的分割和組裝,但是通過(guò)IP協(xié)議并不能清楚地了解到數(shù)據(jù)包是否順利地發(fā)送給目標(biāo)計(jì)算機(jī)。而使用TCP協(xié)議就不同了,在該協(xié)議傳輸模式中在將數(shù)據(jù)包成功發(fā)送給目標(biāo)計(jì)算機(jī)后,TCP會(huì)要求發(fā)送一個(gè)確認(rèn);如果在某個(gè)時(shí)限內(nèi)沒(méi)有收到確認(rèn),那么TCP將重新發(fā)送數(shù)據(jù)包。另外,在傳輸?shù)倪^(guò)程中,如果接收到無(wú)序、丟失以及被破壞的數(shù)據(jù)包,TCP還可以負(fù)責(zé)恢復(fù)。

      傳輸控制協(xié)議(Transmission Control Protocol,TCP)是一種面向連接的、可靠的、基于字節(jié)流的運(yùn)輸層通信協(xié)議,通常由IETF的RFC 793說(shuō)明。在簡(jiǎn)化的計(jì)算機(jī)網(wǎng)絡(luò)OSI模型中,它完成運(yùn)輸層所指定的功能。

      什么是TCP/IP?

      TCP/IP(Transmission Control Protocol/Internet Protocol) 即傳輸控制協(xié)議/網(wǎng)間協(xié)議,是一個(gè)工業(yè)標(biāo)準(zhǔn)的協(xié)議集,它是為廣域網(wǎng)(WANs)設(shè)計(jì)的。它是由ARPANET網(wǎng)的研究機(jī)構(gòu)發(fā)展起來(lái)的。

      有時(shí)我們將TCP/IP描述為互聯(lián)網(wǎng)協(xié)議集\"Internet Protocol Suite\",TCP和IP是其中的兩個(gè)協(xié)議(后面將會(huì)介紹)。由于TCP和IP是大家熟悉的協(xié)議,以至于用TCP/IP或IP/TCP這個(gè)詞代替了整個(gè)協(xié)議集。這盡管有點(diǎn)奇怪,但沒(méi)有必要去爭(zhēng)論這個(gè)習(xí)慣。例如,有時(shí)我們討論NFS 是基于TCP/IP時(shí),盡管它根本沒(méi)用到TCP(只用到IP,和另一種交互式 協(xié)議UDP而不是TCP)。

      Internet是網(wǎng)絡(luò)的集合,包括ARPANET、NSFNET、分布在各地的局域網(wǎng)、以及其它類型的網(wǎng)絡(luò),如(DDN,Defense Data Network美國(guó)國(guó)防數(shù)據(jù)網(wǎng)絡(luò)),這些統(tǒng)稱為Internet。所有這些大大小小的網(wǎng)絡(luò)互聯(lián)在一起。(因?yàn)榇蠖鄶?shù)網(wǎng)絡(luò)基本協(xié)議是由DDN組織開(kāi)發(fā)的,所以以前有時(shí)DDN與Internet在某種意義上具有相同的含義)。網(wǎng)絡(luò)上的用戶可以互相傳送信息,除一些有授權(quán)限制和安全考慮外。一般的講,互聯(lián)網(wǎng)協(xié)議文檔案是Internet委員會(huì)自己采納的基本標(biāo)準(zhǔn)。 TCP/IP標(biāo)準(zhǔn)與其說(shuō)由委員會(huì)指定,倒不如說(shuō)由\"輿論\"來(lái)開(kāi)發(fā)的。 任何人都可以提供一個(gè)文檔,以RFC(Request for Comment需求注釋) 方式公布。

      TCP/IP的標(biāo)準(zhǔn)在一系列稱為RFC的文檔中公布。文檔由技術(shù)專家、特別工作組、或RFC編輯修訂。公布一個(gè)文檔時(shí),該文檔被賦予一個(gè)RFC量,如RFC959說(shuō)明FTP、RFC793說(shuō)明TCP、RFC791說(shuō)明IP等。 最初的RFC一直保留而從來(lái)不會(huì)被更新,如果修改了該文檔,則該文檔又以一個(gè)新號(hào)碼公布。因此,重要的是要確認(rèn)你擁有了關(guān)于某個(gè)專題的最新RFC文檔。文后會(huì)列出主要的RFC文檔號(hào)。

      不管怎樣,TCP/IP是一個(gè)協(xié)議集。為應(yīng)用提供一些\"低級(jí)\"功能,這些包括IP、TCP、UDP。其它是執(zhí)行特定任務(wù)的應(yīng)用協(xié)議,如計(jì)算機(jī)間傳送文件、發(fā)送電子郵件、或找出誰(shuí)注冊(cè)到另外一臺(tái)計(jì)算機(jī)。因此, 最重要的\"商業(yè)\"TCP/IP服務(wù)有:

      * 文件傳送File Transfer。

      文件傳送協(xié)議FTP(File Transfer Protocol)允許用戶從一臺(tái)計(jì)算機(jī)到另一臺(tái)取得文件,或發(fā)送文件到另外一臺(tái)計(jì)算機(jī)。從安全性方面考慮,需要用戶指定一個(gè)使用其它計(jì)算機(jī)的用戶名和口令。它不同與NFS(Network File System)和Netbios協(xié)議。一旦你要訪問(wèn)另一臺(tái) 系統(tǒng)中的文件,任何時(shí)刻都要運(yùn)行FTP。而且你只能拷貝文件到自己的機(jī)器中去來(lái)使用它。(RFC 959中關(guān)于FTP的說(shuō)明)

      * 遠(yuǎn)程登錄Remote login

      網(wǎng)絡(luò)終端協(xié)議TELNET允許用戶登錄到網(wǎng)絡(luò)上任一計(jì)算機(jī)上。你可啟動(dòng)一個(gè)遠(yuǎn)程進(jìn)程連接到指定的計(jì)算機(jī),直到進(jìn)程結(jié)束,期間你所鍵入的內(nèi)容被送到所指定的計(jì)算機(jī)。值得注意的是,這時(shí)你實(shí)際上是與你的計(jì)算機(jī)進(jìn)行對(duì)話。TELENET程序使得你的計(jì)算機(jī)在整個(gè)過(guò)程中不見(jiàn)了,所敲的每一個(gè)字符直接送到所登錄的計(jì)算機(jī)系統(tǒng)。一般的說(shuō),這種遠(yuǎn)程連接是通過(guò)類式撥號(hào)連接的,也就是,撥通后,遠(yuǎn)程系統(tǒng)提示你輸入注冊(cè)名和口令,退出遠(yuǎn)程系統(tǒng),TELNET程序也就退出,你又與自己的計(jì)算機(jī)對(duì)話了。微電腦中的TELNET工具一般含有一個(gè)終端仿真程序。

      * 計(jì)算機(jī)郵件Mail

      允許你發(fā)送消息給其它計(jì)算機(jī)的用戶。通常,人們趨向于使用指定的一臺(tái)或兩臺(tái)計(jì)算機(jī)。計(jì)算機(jī)郵件系統(tǒng)只需你簡(jiǎn)單地往另一用戶的郵件文件中添加信息,但隨之產(chǎn)生問(wèn)題,使用的微電腦的環(huán)境不同,還有重要的是宏(MICRO)不適合于接受計(jì)算機(jī)郵件。為了發(fā)送電子郵件,郵件軟件希望連接到目的計(jì)算機(jī),如果是微電腦,也許它已關(guān)機(jī),或者正在運(yùn)行另一個(gè)應(yīng)用程序呢?出于這種原因,通常由一個(gè)較大的系統(tǒng)來(lái)處理這些郵件,也就是一個(gè)一直運(yùn)行著的郵件服務(wù)器。郵件軟件成為用戶從郵件服務(wù)器取回郵件的一個(gè)界面。

      任何一個(gè)的TCP/IP工具提供上述這些服務(wù)。這些傳統(tǒng)的應(yīng)用功能在基于TCP/IP的網(wǎng)絡(luò)中一直扮演非常重要的角色。目前情況有點(diǎn)變化,這些功能使用也發(fā)生變化,如老系統(tǒng)的改造,計(jì)算機(jī)的發(fā)展等,出現(xiàn)了各種安裝版本,如:微電腦、工作站、小型機(jī)、和巨型機(jī)等。這些計(jì)算機(jī)好像在一起完成指定的任務(wù),盡管有時(shí)看來(lái)像是只用到某個(gè)指定 的計(jì)算機(jī),但它是通過(guò)網(wǎng)絡(luò)得到其它計(jì)算機(jī)系統(tǒng)的服務(wù)。服務(wù)器Server是為網(wǎng)絡(luò)上其它提供指定服務(wù)的系統(tǒng),客戶Client是得到這種服務(wù)的另外計(jì)算機(jī)系統(tǒng)。(值得注意的是,服務(wù)/客戶機(jī)不一定是不同的計(jì)算機(jī),有可能是同一計(jì)算機(jī)中的不同運(yùn)行程序)。以下是幾種目前計(jì)算機(jī)上典型的一些服務(wù),這些服務(wù)可在TCP/IP網(wǎng)絡(luò)上調(diào)用。

      * 網(wǎng)絡(luò)文件系統(tǒng)(NFS)

      這種訪問(wèn)另一計(jì)算機(jī)的文件的方法非常接近于流行的FTP。網(wǎng)絡(luò)文件系統(tǒng)提供磁盤(pán)或設(shè)備服務(wù),而無(wú)需特定的網(wǎng)絡(luò)實(shí)用程序來(lái)訪問(wèn)另一系統(tǒng)的文件。可以簡(jiǎn)單地認(rèn)為它是一個(gè)外加的磁盤(pán)驅(qū)動(dòng)器。這種額外\"虛擬\"磁盤(pán)驅(qū)動(dòng)器就是其它計(jì)算機(jī)系統(tǒng)的磁盤(pán)。這非常有用。你只需加大幾臺(tái)計(jì)算機(jī)的磁盤(pán)容量,就可使網(wǎng)絡(luò)上其他用戶訪問(wèn)它,且不說(shuō)所帶來(lái)的經(jīng)濟(jì)效益,它還能夠讓幾臺(tái)工作的計(jì)算機(jī)共享相同的文件。它也使得系統(tǒng)維護(hù)和備份易如反掌,因?yàn)樵俨槐貫榇罅康牟煌瑱C(jī)器上 的文件的升級(jí)和備份而擔(dān)心。

      * 遠(yuǎn)程打印(Remote printing)

      允許你使用其它計(jì)算機(jī)上的打印機(jī),好像這些打印機(jī)直接連到你的計(jì)算機(jī)上。

      * 遠(yuǎn)程執(zhí)行(Remote execution)

      允許你請(qǐng)求運(yùn)行在不同計(jì)算機(jī)上的特殊程序。當(dāng)你在一個(gè)很小的計(jì)算機(jī)上運(yùn)行一個(gè)需要大機(jī)系統(tǒng)資源的程序時(shí),這時(shí)候遠(yuǎn)程執(zhí)行非常有用。

      * 名字服務(wù)器(Name servers)

      在一個(gè)大的系統(tǒng)安裝過(guò)程中,需要用到大量的各種名字,包括用戶名、口令,姓名、網(wǎng)絡(luò)地址、帳號(hào)等,管理這些是非常令人乏味的。因此將這些數(shù)據(jù)形成數(shù)據(jù)庫(kù),放到一個(gè)小系統(tǒng)中去,其它系統(tǒng)通過(guò)網(wǎng)絡(luò)來(lái)訪問(wèn)這些數(shù)據(jù)。

      * 終端服務(wù)器(Terminal servers)

      很多的終端連接安裝不再直接將終端連到計(jì)算機(jī),取而代之的是,將他們連接到終端服務(wù)器上。終端服務(wù)器是一個(gè)小的計(jì)算機(jī),它只需知道怎樣運(yùn)行TELNET(或其它一些完成遠(yuǎn)程登錄的協(xié)議)。如果你的終端想連上去,只用鍵入要連的計(jì)算機(jī)名就可。通常有可能同時(shí)有幾個(gè)這種連接,這時(shí)終端服務(wù)器采用快速開(kāi)關(guān)技術(shù)來(lái)切換。

      上述所描述的一些協(xié)議是由Berkeley, Sun,或其它組織定義的。因此,它們不是互聯(lián)網(wǎng)協(xié)議集(Internet Protocol Suite)的一部分, 只是使用到TCP/IP的工具,如同一般的TCP/IP 應(yīng)用協(xié)議。因?yàn)閰f(xié)議的定義不一致,并且商業(yè)支持的TCP/IP工具廣泛應(yīng)用,也許會(huì)把這些協(xié)議作為互聯(lián)協(xié)議集中的一部分。上述列出的只是基于TCP/IP部分服務(wù)的一些簡(jiǎn)單例子,但包含了一些\"主要\"的應(yīng)用。

      TCP的服務(wù)

      TCP協(xié)議提供的是可靠的、面向連接的傳輸控制協(xié)議,即在傳輸數(shù)據(jù)前要先建立邏輯連接,然后再傳輸數(shù)據(jù),最后釋放連接3個(gè)過(guò)程。TCP提供端到端、全雙工通信;采用字節(jié)流方式,如果字節(jié)流太長(zhǎng),將其分段;提供緊急數(shù)據(jù)傳送功能。

      盡管TCP和UDP都使用相同的網(wǎng)絡(luò)層(IP),TCP卻向應(yīng)用層提供與UDP完全不同的服務(wù)。

      TCP提供一種面向連接的、可靠的字節(jié)流服務(wù)。

      面向連接意味著兩個(gè)使用TCP的應(yīng)用(通常是一個(gè)客戶和一個(gè)服務(wù)器)在彼此交換數(shù)據(jù)之前必須先建立一個(gè)TCP連接。這一過(guò)程與打電話很相似,先撥號(hào)振鈴,等待對(duì)方摘機(jī)說(shuō)“喂”,然后才說(shuō)明是誰(shuí)。

      在一個(gè)TCP連接中,僅有兩方進(jìn)行彼此通信。廣播和多播不能用于TCP。

      TCP通過(guò)下列方式來(lái)提供可靠性:

      •應(yīng)用數(shù)據(jù)被分割成TCP認(rèn)為最適合發(fā)送的數(shù)據(jù)塊。這和UDP完全不同,應(yīng)用程序產(chǎn)生的數(shù)據(jù)報(bào)長(zhǎng)度將保持不變。由TCP傳遞給IP的信息單位稱為報(bào)文段或段(segment)TCP如何確定報(bào)文段的長(zhǎng)度。

      •當(dāng)TCP發(fā)出一個(gè)段后,它啟動(dòng)一個(gè)定時(shí)器,等待目的端確認(rèn)收到這個(gè)報(bào)文段。如果不能及時(shí)收到一個(gè)確認(rèn),將重發(fā)這個(gè)報(bào)文段。•當(dāng)TCP收到發(fā)自TCP連接另一端的數(shù)據(jù),它將發(fā)送一個(gè)確認(rèn)。這個(gè)確認(rèn)不是立即發(fā)送,通常將推遲幾分之一秒

      •TCP將保持它首部和數(shù)據(jù)的檢驗(yàn)和。這是一個(gè)端到端的檢驗(yàn)和,目的是檢測(cè)數(shù)據(jù)在傳輸過(guò)程中的任何變化。如果收到段的檢驗(yàn)和有差錯(cuò),TCP將丟棄這個(gè)報(bào)文段和不確認(rèn)收到此報(bào)文段(希望發(fā)端超時(shí)并重發(fā))。

      •既然TCP報(bào)文段作為IP數(shù)據(jù)報(bào)來(lái)傳輸,而IP數(shù)據(jù)報(bào)的到達(dá)可能會(huì)失序,因此TCP報(bào)文段的到達(dá)也可能會(huì)失序。如果必要,TCP將對(duì)收到的數(shù)據(jù)進(jìn)行重新排序,將收到的數(shù)據(jù)以正確的順序交給應(yīng)用層。

      •既然IP數(shù)據(jù)報(bào)會(huì)發(fā)生重復(fù),TCP的接收端必須丟棄重復(fù)的數(shù)據(jù)。

      •TCP還能提供流量控制。TCP連接的每一方都有固定大小的緩沖空間。TCP的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)。這將防止較快主機(jī)致使較慢主機(jī)的緩沖區(qū)溢出。

      兩個(gè)應(yīng)用程序通過(guò)TCP連接交換8bit字節(jié)構(gòu)成的字節(jié)流。TCP不在字節(jié)流中插入記錄標(biāo)識(shí)符。我們將這稱為字節(jié)流服務(wù)(bytestreamservice)。如果一方的應(yīng)用程序先傳10字節(jié),又傳20字節(jié),再傳50字節(jié),連接的另一方將無(wú)法了解發(fā)方每次發(fā)送了多少字節(jié)。收方可以分4次接收這80個(gè)字節(jié),每次接收20字節(jié)。一端將字節(jié)流放到TCP連接上,同樣的字節(jié)流將出現(xiàn)在TCP連接的另一端。

      另外,TCP對(duì)字節(jié)流的內(nèi)容不作任何解釋。TCP不知道傳輸?shù)臄?shù)據(jù)字節(jié)流是二進(jìn)制數(shù)據(jù),還是ASCII字符、EBCDIC字符或者其他類型數(shù)據(jù)。對(duì)字節(jié)流的解釋由TCP連接雙方的應(yīng)用層解釋。

      這種對(duì)字節(jié)流的處理方式與Unix操作系統(tǒng)對(duì)文件的處理方式很相似。Unix的內(nèi)核對(duì)一個(gè)應(yīng)用讀或?qū)懙膬?nèi)容不作任何解釋,而是交給應(yīng)用程序處理。對(duì)Unix的內(nèi)核來(lái)說(shuō),它無(wú)法區(qū)分一個(gè)二進(jìn)制文件與一個(gè)文本文件。

      TCP是因特網(wǎng)中的傳輸層協(xié)議,使用三次握手協(xié)議建立連接。當(dāng)主動(dòng)方發(fā)出SYN連接請(qǐng)求后,等待對(duì)方回答SYN,ACK。這種建立連接的方法可以防止產(chǎn)生錯(cuò)誤的連接,TCP使用的流量控制協(xié)議是可變大小的滑動(dòng)窗口協(xié)議。第一次握手:建立連接時(shí),客戶端發(fā)送SYN包(SEQ=x)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn)。第二次握手:服務(wù)器收到SYN包,必須確認(rèn)客戶的SYN(ACK=x+1),同時(shí)自己也送一個(gè)SYN包(SEQ=y),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)。第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ACK=y+1),此包發(fā)送完畢,客戶端和服務(wù)器時(shí)入Established狀態(tài),完成三次握手。

      TCP建立連接時(shí)的三次握手
    posted @ 2009-03-31 10:06 張永耀 閱讀(180) | 評(píng)論 (0)編輯 收藏

    1.作用的范圍不同:

    1)inverse :<set/>,<map/>,<list/>,<array/>,<bag/>

    2)cascade :<many-to-one>,<one-to-one/>,<set/>,<map/>,<list/>,<array/>,<bag/>.

    2.執(zhí)行策略不同

    1)inverse :首先判斷集合的變化情況,然后針對(duì)變化執(zhí)行相應(yīng)的處理。

    2)cascade :直接對(duì)集合中的每個(gè)元素執(zhí)行相應(yīng)的處理。

    3.執(zhí)行的時(shí)機(jī)不同

    1)inverse :在執(zhí)行SQL語(yǔ)句之前判斷是否要執(zhí)行該SQL語(yǔ)句。

    2)cascade :在主控方發(fā)生操作時(shí)用來(lái)判斷是否進(jìn)行級(jí)聯(lián)操作。

    4.執(zhí)行的目標(biāo)不同

    1)inverse :對(duì)于<one-to-many>處理被管理表,<many-to-many/>處理中間表。

    2)cascade :都只只對(duì)被關(guān)聯(lián)表。

    總結(jié):書(shū)上說(shuō)了inverse 一對(duì)多的時(shí)候最好把多的一方設(shè)置成false由一的一方來(lái)控制;cascade盡量別使,進(jìn)行顯示的添加刪除。

    posted @ 2009-03-30 16:46 張永耀 閱讀(181) | 評(píng)論 (0)編輯 收藏

    構(gòu)造這樣一個(gè)例子,在測(cè)試過(guò)程中來(lái)說(shuō)明一些Hibernate的高級(jí)配置及其相關(guān)機(jī)制:
    有三個(gè)類:Category.java,Prodcuct.java,ConfigurationTest.java,其中第三個(gè)類是用來(lái)測(cè)試的。
    Category.java代碼:
           

    package unsaved_value;    
    import ......    
    public class Category {    
        private Integer id;    
        private String name;    
        private String description;    
        private Set products;    
        public Category(){    
             id=null;    
             name=null;    
            description=null;    
            products=new HashSet ();    
         }    
         public void addProduct(Product p){    
             products.add(p);    
        }    
         //**********setter and getter    
        ........    
    }   


    Product.java代碼:


    package unsaved_value;      
    public class Product {      
        private Integer id;      
        private String name;      
        private Category category;      
        private String description;      
        public Product(){     
             
        }      
         //*******getter and setter      
         .........      
    }      

    ConfigurationTest.java

    public void testSave()throws Exception{    
            Category category=new Category();    
            category.setName("java編程書(shū)籍2");    
            category.setDescription("編程經(jīng)典書(shū)籍2");    
            Product pro=new Product();    
            pro.setName("java編程思想2");    
            pro.setDescription("第四版中文版2");     
            pro.setCategory(category);    
            category.addProduct(pro);    
            Transaction tx=session.beginTransaction();    
            assert (session!=null):("session is null");    
            session.save(category);    
            tx.commit();    
        }    

         
    Category代表產(chǎn)品目錄,而Product代表產(chǎn)品,顯然Category與Product是一對(duì)多的關(guān)系。Hibernate在映射一對(duì)多關(guān)系時(shí),有兩種方式,一種是單向一對(duì)多,一種是雙向關(guān)系。兩者相比,雙向一對(duì)多的好處體現(xiàn)在兩方面:首先,也是很明顯的一點(diǎn),由于是雙向關(guān)聯(lián),我們?cè)趯?shí)際業(yè)務(wù)邏輯時(shí)將更方便,例如我們可以檢索一個(gè)Category下的所有Product,同時(shí)還可以檢索出Product屬于哪個(gè)。其次,雙向關(guān)系相對(duì)單向關(guān)系而言,在數(shù)據(jù)庫(kù)的訪問(wèn)方面更有優(yōu)勢(shì)。這一點(diǎn)留在后面講inverse時(shí)講
    。雙向關(guān)聯(lián)比單向關(guān)聯(lián)唯一的”劣勢(shì)“,就在于雙向關(guān)聯(lián)需要比單向關(guān)聯(lián)多寫(xiě)一個(gè)映射文件,這不問(wèn)題。使用雙向關(guān)聯(lián)實(shí)現(xiàn)這兩個(gè)類同數(shù)據(jù)庫(kù)的映射:

    Category.hbm.xml:  
    version="1.0" encoding="UTF-8"?>  

    " <hibernate-mapping package="unsaved_value">  
       <class name="Category" table="category">  
         <id name="id" column="id">  
           <generator class="native">generator>  
         id>  
         
         <property name="name" column="name"/>  
         <property name="description" column="description"/>


         <set name="products" table="product" lazy="true" inverse="true" cascade="all">  
             <key column="category"/>  
                <one-to-many class="Product"/>  
         set>  
         
       class>  
    hibernate-mapping>  
      
    Product.hbm.xml:


    version="1.0" encoding="UTF-8"?>    
    "
    <hibernate-mapping package="unsaved_value">    
    <class name="Product" table="product">    
         <id name="id" column="id" unsaved-value="null">    
             <generator class="native">generator>    
         id>    
             
         <property name="name" column="name"/>    
         <property name="description" column="description"/>    
           
         <many-to-one name="category"    
                      column="category"     
                      class="Category"    
         />    
       class>    
    hibernate-mapping>    
            
    現(xiàn)在把這個(gè)例子所牽涉到的知識(shí)一一展開(kāi):
    一.inverse
        該詞的譯意是“反轉(zhuǎn)”,反轉(zhuǎn)什么——反轉(zhuǎn)控制端,這項(xiàng)配置決定了由關(guān)聯(lián)雙方中的哪一方來(lái)維持關(guān)聯(lián)關(guān)系(在數(shù)據(jù)庫(kù)中表現(xiàn)為外鍵約束)。上述配置中,在Category.hbm.xml中將inverse設(shè)置為true,意思是說(shuō)“我需要反轉(zhuǎn)(控制端)”,反轉(zhuǎn)的結(jié)果是由對(duì)方即Product來(lái)維持關(guān)聯(lián)關(guān)系。用單向關(guān)聯(lián)更容易說(shuō)明”維持關(guān)聯(lián)關(guān)系“是什么意思:考慮用單向關(guān)系來(lái)實(shí)現(xiàn)這個(gè)映射關(guān)系的情況,即由Category關(guān)聯(lián)到Product,考慮下面的代碼:

    Product p=new Product();  
    ..setXXX  
    Category c=new Category();  
    ..設(shè)置Category的屬性  
    c.addProduct(p);//建立起了c和p的關(guān)聯(lián)關(guān)系  
    session.save(c);  

    會(huì)執(zhí)行三條SQL語(yǔ)句:兩條插入語(yǔ)句,分別插入c和p,然后還有一條update語(yǔ)句建立起c和p的關(guān)聯(lián)(更新p的外鍵)。上面,我們說(shuō)由Category端控制關(guān)聯(lián),因此p.setCategory(c)這樣一句話是沒(méi)用的,它并不會(huì)導(dǎo)致在插入p的時(shí)候就設(shè)置p的外鍵以建立起兩者的關(guān)聯(lián)關(guān)系,從而節(jié)省一條update語(yǔ)句。同時(shí)我們還會(huì)看到,如果在數(shù)據(jù)庫(kù)模式中將p的外鍵設(shè)置成非空,這些代碼將不能執(zhí)行,因?yàn)樵诓迦雙時(shí),由于c和p的關(guān)聯(lián)關(guān)系還未建立起來(lái),因此p的外鍵為空。回到雙向關(guān)聯(lián)上來(lái),為了更清楚地明白inverse在雙向關(guān)聯(lián)中到底起什么作用,我們分別將其值設(shè)為true和false,看看打印出的的SQL有何區(qū)別:

    inverse=true時(shí)的打印結(jié)果:

    Hibernate: insert into category (name, description) values (?, ?)  
    Hibernate: insert into product (name, description, category) values (?, ?, ?)   
    inverse=false時(shí)的打印結(jié)果:

    Hibernate: insert into category (name, description) values (?, ?)    
    Hibernate: insert into product (name, description, category) values (?, ?, ?)    
    Hibernate: update product set category=? where id=?   
           為什么inverse=true時(shí)會(huì)比inverse=false時(shí)少執(zhí)行一條SQL語(yǔ)句?這是由控制端的不同造成的。前者說(shuō)"我要反轉(zhuǎn)控制,由Product來(lái)控制關(guān)聯(lián)",因此在將p對(duì)象insert時(shí),p已經(jīng)設(shè)置了其category字段,從而建立了關(guān)聯(lián)關(guān)系,而后者說(shuō)"我不反轉(zhuǎn)控制,由我自己來(lái)控制關(guān)聯(lián)",因此在將p對(duì)象insert后,c為了維持兩者的關(guān)聯(lián),還要去執(zhí)行一次update,以更新p的外鍵,從而建立起兩者的關(guān)聯(lián)關(guān)系。
    結(jié)論:對(duì)于一對(duì)多雙向關(guān)系,始終在“一”那一方將其inverse設(shè)置成true,這樣會(huì)提高性能。

    二.cascade
       級(jí)聯(lián)。當(dāng)關(guān)聯(lián)的"一"方進(jìn)行某種動(dòng)作(更新,刪除)時(shí),"多"方即使沒(méi)有顯式地進(jìn)行編碼,它也會(huì)自動(dòng)進(jìn)行同樣的動(dòng)作。cascade的可選值有:
    all : 所有情況下均進(jìn)行關(guān)聯(lián)操作。即是save-update + delete
    none:所有情況下均不進(jìn)行關(guān)聯(lián)操作。這是默認(rèn)值。
    save-update:在執(zhí)行save/update/saveOrUpdate時(shí)進(jìn)行關(guān)聯(lián)操作。
    delete:在執(zhí)行delete時(shí)進(jìn)行關(guān)聯(lián)操作。
    all-delete-orphan:A:級(jí)聯(lián)save-update B級(jí)聯(lián)delete C:刪除所有孤兒項(xiàng)(orphan孤兒)。先看看父子關(guān)系,例如在Customer和Order的模型中,這兩者便是父子關(guān)系,當(dāng)一個(gè)Customer的生命周期決定Order的生命周期,如果一個(gè)Customer不在了,其相關(guān)的Order繼續(xù)存在是毫無(wú)業(yè)務(wù)意義的。刪除所有孤兒項(xiàng)的意思即是,刪除所有與父對(duì)象失去關(guān)聯(lián)關(guān)系的子對(duì)象。

    三.lazy
        是否延遲加載。一般來(lái)說(shuō),應(yīng)該延遲加載,即將lazy設(shè)為true。延遲加載的相關(guān)點(diǎn)很多,這在另外的學(xué)習(xí)筆記中總結(jié)。

    四.unsaved-value
        以上是"一"方的重要配置,再看看"多"方的一個(gè)重要配置:unsaved-value,就像上面Product.hbm.xml中的設(shè)置那樣,這一項(xiàng)在id的配置中設(shè)置。這一設(shè)置是與級(jí)聯(lián)一起工作的。關(guān)于這一點(diǎn),robbin講的很清楚:
    當(dāng)你顯式的使用session.save()或者session.update()操作一個(gè)對(duì)象的時(shí)候,實(shí)際上是用不到unsaved-value 的。某些情況下(父子表關(guān)聯(lián)保存),當(dāng)你在程序中并沒(méi)有顯式的使用save或者update一個(gè)持久對(duì)象,那么Hibernate需要判斷被操作的對(duì)象究竟是一個(gè)已經(jīng)持久化過(guò)的持久對(duì)象,是一個(gè)尚未被持久化過(guò)的內(nèi)存臨時(shí)對(duì)象。例如:
           Session session = ...;
    Transaction tx = ...;  
    Parent parent = (Parent) session.load(Parent.class, id);  
    Child child = new Child();  
    child.setParent(parent);  
    child.setName("sun");  
    parent.addChild(child);  
    s.update(parent);  
    s.flush();  
    tx.commit();  
    s.close();  
         在上例中,程序并沒(méi)有顯式的session.save(child); 那么Hibernate需要知道child究竟是一個(gè)臨時(shí)對(duì)象,還是已經(jīng)在數(shù)據(jù)庫(kù)中有的持久對(duì)象。如果child是一個(gè)新創(chuàng)建的臨時(shí)對(duì)象(本例中就是這種情況),那么Hibernate應(yīng)該自動(dòng)產(chǎn)生session.save(child)這樣的操作,如果child是已經(jīng)在數(shù)據(jù)庫(kù)中有的持久對(duì)象,那么 Hibernate應(yīng)該自動(dòng)產(chǎn)生session.update(child)這樣的操作。因此我們需要暗示一下Hibernate,究竟 child對(duì)象應(yīng)該對(duì)它自動(dòng)save還是update。在上例中,顯然我們應(yīng)該暗示Hibernate對(duì)child自動(dòng)save,而不是自動(dòng) update。那么Hibernate如何判斷究竟對(duì)child是save還是update呢?它會(huì)取一下child的主鍵屬性 child.getId() ,這里假設(shè)id是 java.lang.Integer類型的。如果取到的Id值和hbm映射文件中指定的unsave-value相等,那么Hibernate認(rèn)為 child是新的內(nèi)存臨時(shí)對(duì)象,發(fā)送save,如果不相等,那么Hibernate認(rèn)為child是已經(jīng)持久過(guò)的對(duì)象,發(fā)送update。unsaved-value="null" (默認(rèn)情況,適用于大多數(shù)對(duì)象類型主鍵 Integer/Long/String/...)
    當(dāng)Hibernate取一下child的Id,取出來(lái)的是null(在上例中肯定取出來(lái)的是null),和unsaved-value設(shè)定值相等,發(fā)送save(child)
    當(dāng)Hibernate取一下child的id,取出來(lái)的不是null,那么和unsaved-value設(shè)定值不相等,發(fā)送update(child)
       unsaved-value的可選配置有:
    none,any,null
    unsaved-value="none"和unsaved-value="any"主要用在主鍵屬性不是通過(guò)Hibernate生成,而是程序自己setId()的時(shí)候。unsaved-value="none"和unsaved-value="any"究竟有什么含義了。如果你非要用assigned不可,那么繼續(xù)解釋一下:
    unsaved-value="none" 的時(shí)候,由于不論主鍵屬性為任何值,都不可能為none,因此Hibernate總是對(duì)child對(duì)象發(fā)送update(child)
    unsaved-value="any" 的時(shí)候,由于不論主鍵屬性為任何值,都肯定為any,因此Hibernate總是對(duì)child對(duì)象發(fā)送save(child)
          大多數(shù)情況下,可以避免使用assigned,只有當(dāng)你使用復(fù)合主鍵的時(shí)候不得不手工setId(),這時(shí)候需要你自己考慮究竟怎么設(shè)置unsaved-value了,根據(jù)你自己的需要來(lái)定。
          關(guān)于為什么不要使主鍵帶有義務(wù)意義,robbin的解釋很清楚:還是以上面的例子打比方,如果我們將Category的某一個(gè)性質(zhì)(比如產(chǎn)品序號(hào)或者名稱)作為主鍵,如果后來(lái)由于業(yè)務(wù)需要,我們把這個(gè)性質(zhì)改了,那將不可僻免地要去修改與這個(gè)對(duì)象相關(guān)聯(lián)的所有數(shù)據(jù)的外鍵,而如果我們只要代理主鍵,這個(gè)問(wèn)題就可完全僻免。


    今天在寫(xiě)程序的時(shí)候發(fā)現(xiàn)了一個(gè)很奇怪的問(wèn)題“ResultSet can not re-read row data for column”,用google一搜,原來(lái)是微軟公司的驅(qū)動(dòng)的兼容性不太好。有熱心人總結(jié)了微軟驅(qū)動(dòng)的缺點(diǎn):(1)如果采用jdbc-odbc驅(qū)動(dòng),那么就必須按照查詢順序來(lái)一次讀取(不論有沒(méi)有image或text,ntext類型)(2)如果采用微軟提供的ms sql server jdbc driver,如果查詢語(yǔ)句中,不存在image或text,ntext類型字段,那么可以按照無(wú)序獲取(3)如果采用微軟提供的ms sql server jdbc driver,如果查詢語(yǔ)句中,存在image或text,ntext類型字段,那么就必須按照順序讀取,否則就會(huì)報(bào)告Driver]ResultSet can not re-read row data for column之類的錯(cuò)誤(4)如果想不查詢語(yǔ)句中有沒(méi)有image或text,,ntext類型字段,都可以不按照順序獲取,或重復(fù)獲取。那么就必須更換驅(qū)動(dòng),改用第三方的。 最后,我改用了第三方的驅(qū)動(dòng)。測(cè)試成功。
    posted @ 2009-03-27 14:25 張永耀 閱讀(311) | 評(píng)論 (0)編輯 收藏

    用delphi和VB實(shí)現(xiàn)瀏覽器中超長(zhǎng)文件的上傳
     

    摘 要 本文通過(guò)delphi的Tihttp控件,將超大文件分割成幾個(gè)小文件,通過(guò)構(gòu)造的表單數(shù)據(jù)流,

                直接發(fā)送到接收數(shù)據(jù)網(wǎng)頁(yè),由vb編寫(xiě)的服務(wù)器端進(jìn)行文件接收和還原

    一、問(wèn)題的提出:

    本單位在開(kāi)發(fā)課件生成系統(tǒng)時(shí),需要通過(guò)瀏覽器向服務(wù)器指定目錄傳送大的音、視頻文件。在微軟asp中未提供相應(yīng)的控件,asp.net雖然提供了form表單中的file控件進(jìn)行文件上傳,但對(duì)上傳的文件有長(zhǎng)度限制,文件長(zhǎng)度大于50M上傳會(huì)失敗,而微軟基于安全考量,file控件中的文件名在運(yùn)行期間只讀,這樣利用微軟提供的控件向服務(wù)器端上傳長(zhǎng)度超過(guò)50M的文件變?yōu)椴豢尚校仨毩砼鑿健?/span>

    二、解決方案

    delphi以其強(qiáng)大的控件集,快速的RAD開(kāi)發(fā),深得程序開(kāi)發(fā)人員的青睞,其最新控件集Indy,集成了大部分流行的Internet協(xié)議,包括TCPUDPDNSICMPFINGERFTPGOPHERHTTPPOP3SMTPTELNETWHOIS,而瀏覽器的傳輸協(xié)議為http。這樣我們可以利用delphi7中的TIHTTP控件,將數(shù)據(jù)打包后上傳到服務(wù)器端。基本思路為:開(kāi)發(fā)兩部分功能程序,一個(gè)為ActiveX控件,嵌入到網(wǎng)頁(yè)中,負(fù)責(zé)將客戶端本地上傳文件分解成n個(gè)數(shù)據(jù)包,每個(gè)數(shù)據(jù)包直接編碼成“multipart/form-data”格式的表單信息,依次調(diào)用TIhttp控件的post方法向服務(wù)器端發(fā)送信息。另一個(gè)為服務(wù)器端的com組件,接受發(fā)送過(guò)來(lái)的原始信息,將數(shù)據(jù)包拼接還原成文件保存到服務(wù)器的指定目錄中。

    三、技術(shù)要點(diǎn):

        1Delyhi 7開(kāi)發(fā)Active X控件要點(diǎn):選擇新建項(xiàng)目→Active x標(biāo)簽→Active Form→填入控件名可快速搭建一個(gè)Acfire X控件架構(gòu),產(chǎn)生一個(gè)表單和一個(gè)框架代碼文件。

    2.上傳Active x控件設(shè)計(jì)要點(diǎn):①表單控件中放置一個(gè)編輯控件、三個(gè)命令按鈕、一個(gè)進(jìn)度條控件、一個(gè)文本標(biāo)簽控件、一個(gè)文件對(duì)話框控件。編輯控件用來(lái)放置上傳文件名。一個(gè)瀏覽按鈕打開(kāi)文件選擇對(duì)話框,選擇上傳文件;進(jìn)度條控件顯示上傳文件進(jìn)度;文本標(biāo)簽顯示上傳文件百分比,取消按鈕可中斷文件上傳。

    ②項(xiàng)目包含兩個(gè)代碼文件,其中一個(gè)文件用來(lái)將上傳文件拆分成小數(shù)據(jù)包。其關(guān)鍵代碼如下:

        for y:=0 to filenum  do

           begin

             if y=0  then   //第一個(gè)包

                 begin

                if y <> filenum then

                      begin

                          for i:=1 to basenum do

                            begin

                               read(f,ch);

                               tempf:=chr(ch);

                               temp:=temp+tempf;

                              application.ProcessMessages;

                            end;

                        vflag:=postdata(vurl,vfilename,temp,'0');

                        end

                      else

                             begin

                             j:=0;

                                while not eof(f) do

                                begin

                                  read(f,ch);

                                tempf:=chr(ch);

                                temp:=temp+tempf;

                                j:=j+1;

                                application.ProcessMessages;

                      vflag:=postdata(vurl,vfilename,temp,'-2');

                    end;

                   end

                   else if y<> filenum then //中間包

                       begin

                          for i:=1 to basenum do

                            begin

                               read(f,ch);

                              tempf:=chr(ch);

                               temp:=temp+tempf;

                                application.ProcessMessages;

                            end;

                              vflag:=postdata(vurl,vfilename,temp,'1');

                      end

                   else  //最后一個(gè)包

                     begin

                            j:=0;

                            while not eof(f) do

                           begin

                             read(f,ch);

                             tempf:=chr(ch);

                             temp:=temp+tempf;

                             j:=j+1;

                              application.ProcessMessages;

                         end;

                       vflag:=postdata(vurl,vfilename,temp,'-1');

                     end;

           end;

    end;

    ③另一個(gè)文件用來(lái)將小數(shù)據(jù)包按照http格式封裝成二進(jìn)制文件上傳數(shù)據(jù)流發(fā)送到指定的接收頁(yè)面(URL),數(shù)據(jù)流除必要的頭信息,包含兩個(gè)表單城,一個(gè)數(shù)據(jù)塊,其中一個(gè)表單域用來(lái)傳遞文件標(biāo)記,用來(lái)區(qū)分本數(shù)據(jù)包是第一個(gè)包,中間包還是最后一個(gè)包,另一個(gè)表單域傳遞上傳文件名,其關(guān)鍵代碼如下:

       try

         filedata.Seek(0,sofrombeginning);

         tempstring:='';

         tempstring:=tempstring+'------------------------------7cf87224d2020a'+

             newline;

         tempstring:=tempstring+'Content-Disposition: form-data;name="vflag"'+newline;

         tempstring:=tempstring+''+newline;

         tempstring:=tempstring+vflag+newline;

         tempstring:=tempstring+''+newline;

         tempstring:=tempstring+''+newline;

         tempstring:=tempstring+'Content-Disposition: form-data; name="editfilename"; filename="'+infile+'"'+newline;

         tempstring:=tempstring+'Content-Type: application/octet-stream'+newline;

         tempstring:=tempstring+''+newline;

         fillchar(temparray,sizeof(temparray),#0);

         strpcopy(temparray,tempstring);

         request.Write(temparray,length(tempstring));

         request.seek(0,sofromend);

         request.CopyFrom(filedata,filedata.size);

         tempstring:='';

         tempstring:=tempstring+''+newline;

         tempstring:=tempstring+'------------------------------7cf87224d2020a--'

              +newline;

         fillchar(temparray,sizeof(temparray),#0);

         strpcopy(temparray,tempstring);

         request.write(temparray,length(tempstring));

         try

           http.Post(url,request,response);

           if pos('成功',response.datastring)<>0 then

              flag:=1

         end.

    End.

    ④本ActiveX控件特色:可以實(shí)時(shí)顯示上傳進(jìn)度,并能隨時(shí)中斷文件的上傳,上傳頁(yè)面畫(huà)面如圖所示,可不能隨時(shí)中斷文件上傳,即應(yīng)用程序能隨時(shí)從循環(huán)語(yǔ)句中跳出,在循環(huán)語(yǔ)句中使用了ayydicdition Process Messages語(yǔ)句,該語(yǔ)句用來(lái)監(jiān)聽(tīng)和處理系統(tǒng)消息這樣就有效避免了文件上傳時(shí),不能進(jìn)行系統(tǒng)的其它操作。

    3.用VB6.0開(kāi)發(fā)服務(wù)器端接收文件的Activeex dll,主要利用VB6.0強(qiáng)大的網(wǎng)頁(yè)操作功能,引用庫(kù)文件microsoft Active sever Page object library。其中包含有asp對(duì)象Asp library request。創(chuàng)建一個(gè)接收函數(shù)load,使用request對(duì)象讀取上傳給接收頁(yè)面的二進(jìn)制數(shù)據(jù)流,分離出上傳標(biāo)志、上傳文件名以及文件內(nèi)容,根據(jù)上傳標(biāo)志將分段傳送來(lái)的文件內(nèi)容拼接成一個(gè)完整的文件,保存到指定目錄。

    四、幾點(diǎn)說(shuō)明

        1.本程序在操作系統(tǒng)為Win98 Win2000的客戶端機(jī)器,IIS服務(wù)器端為Win 2000的環(huán)境下調(diào)試通過(guò);

    2.將upfile.htmupload.aspmyget.dllupfileproj1.ocx文件放置到IIS服務(wù)之虛擬目錄upfile下(缺省目錄為C:"Inetpub"unnroot"upfile);

    3.修改upfile.htmcodebase屬性(缺省為http://11.68.17.80/upfile/upfileproj1.ocx)中的IP地址為服務(wù)器端地址;

    4.修改delphi工程文件upfileprojl中的upfilelmpl1文件中的Button2 click事件中的vulstring=’http://11.68.17.80/upfile/upload.asp’一行數(shù)據(jù),將其中的IP地址轉(zhuǎn)接為服務(wù)器端地址,重新編譯后將upfrleprojl.ocx放置到虛擬目錄下;

    5.上傳文件在服務(wù)器端的默認(rèn)保存目錄為c:"temp;

    6.須手工注冊(cè)myget.dll,命令語(yǔ)句為regsvr32  C:"inetpub"wwwroot"upfile"myget.dll

    7.覽器中敲擊網(wǎng)站地址執(zhí)行,缺省地址為http://11.68.17.80/upfile/upfile.htm
    posted @ 2009-03-27 08:48 張永耀 閱讀(492) | 評(píng)論 (0)編輯 收藏

    我們的產(chǎn)品中間件的啟動(dòng)是由批處理文件開(kāi)始,這就導(dǎo)致,始終有個(gè)DOS窗口,來(lái)顯示服務(wù)器的運(yùn)行情況。可客戶不樂(lè)意啊:他們就想萬(wàn)一誰(shuí)不小心把那窗口給關(guān)了,損害了數(shù)據(jù),那問(wèn)題可就大了!這個(gè)問(wèn)題確實(shí)是挺有價(jià)值的。
    首先,我們考慮WINDOWS環(huán)境吧,我不認(rèn)為WINDOWS環(huán)境下和*NIX環(huán)境下的實(shí)現(xiàn)有很大差別。想到以前看到的,聽(tīng)到的,再加上自己的經(jīng)驗(yàn),大概有這么集中方式:
  • 包裝bat文件為exe文件,然后以后臺(tái)服務(wù)的形式注冊(cè)
  • 利用windows自帶的Wscript.Shell
  • 寫(xiě)個(gè)Swing界面小程序,利用多線程,啟動(dòng)應(yīng)用服務(wù),把DOS窗口替換成應(yīng)用窗口。
  • 但我們需要考慮另外一點(diǎn):我們的應(yīng)用在運(yùn)行的時(shí)候,會(huì)向dos窗口輸出一些出來(lái)的一些信息,這些信息在很多情況下都是很有用的。現(xiàn)在如果把DOS窗口隱藏了,那么那些信息我把他們存放到哪兒呢?我想最好還是以文件的形式保存起來(lái),將來(lái)如有問(wèn)題還可以追查!
    現(xiàn)在考慮各種實(shí)現(xiàn)方式。包裝為exe的形式,也只能在windows環(huán)境下運(yùn)行,并且需要額外的工具;Swing界面小程序這個(gè)其實(shí)是最可行的,但我這個(gè)人比較懶,比較討厭寫(xiě)界面;利用windows自帶的Wscript.Shell,自然也只能依賴于windows環(huán)境,后來(lái)我想了下,其實(shí)這個(gè)方案可以和swing界面那個(gè)方案有不少東西是可以公用的。最后決定,為了簡(jiǎn)單期間,偶就先用Wscript.Shell,來(lái)做測(cè)試了。
    實(shí)際的情況大致是:
  • 應(yīng)用服務(wù)的啟動(dòng)腳本是/startup.bat 實(shí)際中我們可以使用vbs腳本:
  • dim ws
    Set ws = CreateObject("Wscript.Shell")
    ws.run "cmd /c /startup.bat >> myServer.log" ,vbhide
    通過(guò)這樣簡(jiǎn)單的設(shè)置,我們可以做到隱藏DOS窗口,但是,如果我們的應(yīng)用一下子運(yùn)行好幾個(gè)月,那我們的日志文件myServer.log的日積月累地,就太大了。我們?cè)诓檎覇?wèn)題的時(shí)候,也很不容易!所以我們應(yīng)該想法子把日志文件myServer.log,按時(shí)間或者按大小分開(kāi)存儲(chǔ)。這也是我們應(yīng)用服務(wù)器日志的做法。所以,我們需要再做一步中間處理,想想看"appRoot/startup.bat"這一步,我們?cè)诔绦虍?dāng)中還是可以獲得它的輸出結(jié)果的。看下面java程序:
    package nc.client.StartupUtil;

    import java.lang.ProcessBuilder;
    import java.util.Vector ;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.FileWriter;
    import java.io.BufferedWriter;
    import java.util.Collections ;

    public class NC50StartUtil
    {

    public static final String logFileNamePrefix = "ncconsolelogs";

    public static void main(String[] args)
    {
    ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/C", args[0]+"/startup.bat");
    processBuilder.directory(new File(args[0]));
    Process process = null;
    try
    {
    process = processBuilder.start();
    BufferedReader datais =
    new BufferedReader(
    new InputStreamReader( process.getInputStream()));


    // 服務(wù)器日志目錄
    String serverLogDirName = args[0] + "/nclogs/server";
    File serverLogDir = new File (serverLogDirName);
    if (!serverLogDir.exists())
    {
    serverLogDir.mkdirs();
    }

    int maxFileIndex = getMaxFileIndex(serverLogDirName).intValue();
    File logFile = new File(serverLogDirName+"/ncconsolelogs.log");
    if (!logFile.exists())
    {
    logFile.createNewFile();
    }
    else
    {
    // 如果已經(jīng)存在日志文件,則先把原來(lái)的文件歸檔,然后新創(chuàng)建一個(gè)日志文件
    StringBuffer oldFileName = new StringBuffer();
    oldFileName.append(serverLogDirName);
    oldFileName.append("/");
    oldFileName.append(logFileNamePrefix).append("[").append(maxFileIndex).append("].log");
    logFile.renameTo(new File(oldFileName.toString()));
    maxFileIndex++;
    //創(chuàng)建新的日志文件
    if (!logFile.exists())
    {
    logFile.createNewFile();
    }

    }

    BufferedWriter writer = new BufferedWriter(new FileWriter(logFile));

    // 文件的最大大小是2M
    int maxlength = 1024*1024*2;

    String c;
    while ((c = datais.readLine()) != null)
    {

    writer.write(c);
    writer.newLine();
    writer.flush();

    // 超過(guò)日志文件規(guī)定的大小了,則把日志文件歸檔,然后新創(chuàng)建一個(gè)日志文件
    if (logFile.length() > maxlength)
    {
    writer.close();
    StringBuffer oldFileName = new StringBuffer();
    oldFileName.append(serverLogDirName);
    oldFileName.append("/");
    oldFileName.append(logFileNamePrefix).append("[").append(maxFileIndex).append("].log");
    logFile.renameTo(new File(oldFileName.toString()));
    maxFileIndex++;

    // 創(chuàng)建新的日志文件
    if (!logFile.exists())
    {
    logFile.createNewFile();
    }
    writer =   new BufferedWriter(new FileWriter(logFile));
    }

    }
    }
    catch(IOException e)
    {
    e.printStackTrace ();
    }
    }

    public static Integer getMaxFileIndex(String ncconsolelogdirname)
    {
    File ncconsolelogdir = new File(ncconsolelogdirname);
    File[] ncconsolelogs = ncconsolelogdir.listFiles(new NcLogFileNameFilter(logFileNamePrefix));

    if (ncconsolelogs != null && ncconsolelogs.length > 0)
    {
    Vector v = new Vector();
    for (int i=0, len=ncconsolelogs.length; i startIndex)
    {
    String index = logFileName.substring (startIndex+1, endIndex);
    int ind = -1;
    try
    {
    ind = Integer.parseInt(index);
    }
    catch(Exception e)
    {

    }

    if (ind > 0)
    {
    v.add(ind);
    }
    }
    }
    if (v.size() > 0)
    {
    return Collections.max(v) + 1;
    }
    else
    {
    return 1;
    }
    }

    return 1;
    }
    }
    package nc.client.StartupUtil;

    import java.io.File;
    import java.io.FilenameFilter;

    // 一個(gè)簡(jiǎn)單的文件名過(guò)濾類
    public class NcLogFileNameFilter implements FilenameFilter {

    private String fileNamePrefix = null;

    public NcLogFileNameFilter(String fileNamePrefix)
    {
    this.fileNamePrefix = fileNamePrefix;
    }

    public boolean accept(File dir, String name)
    {
    if (name.toLowerCase().startsWith(fileNamePrefix))
    {
    return true;
    }
    return false;
    }
    }
    之后,為了運(yùn)行方便,我們把這兩個(gè)類編譯后打成可執(zhí)行的jar包,例如ncstartuputil.jar。并修改vbs腳本為:
    dim ws
    Set ws = CreateObject("Wscript.Shell")
    ws.run "cmd /c java -jar ncstartuputil.jar E:/nchome_zhengshi" ,vbhide
    如果換做swing界面,其實(shí)僅僅需要寫(xiě)另外一個(gè)Thread,thread的主體也正式上面static main方法主體,然后通過(guò)多線程,可以獲得原始start.bat批處理文件的輸出,并且把輸出的信息放到一個(gè)textarea里面顯示出來(lái)。:-)....
    posted @ 2009-03-26 17:16 張永耀 閱讀(741) | 評(píng)論 (0)編輯 收藏

    最近做在做一個(gè)項(xiàng)目,涉及到文件上傳的問(wèn)題。 以前也做過(guò)文件上傳。但都是些小文件,不超過(guò)2M。 這次要求上傳1G以上的東西。 沒(méi)辦法找來(lái)資料研究了一下。 基于WEB的文件上傳可以使用FTP和HTTP兩種協(xié)議,用FTP的話雖然傳輸穩(wěn)定,但安全性是個(gè)嚴(yán)重的問(wèn)題,所以沒(méi)有考慮。 剩下只有HTTP。 在HTTP中有3種方式,PUT、WEBDAV、RFC1867,前2種方法不適合大文件上傳,在這里也不說(shuō)了。
    確定使用RFC1867格式處理之后開(kāi)始分析流行的上傳組件。看了N多代碼之后發(fā)現(xiàn),目前無(wú)組件程序和一些COM組件都是使用Request.BinaryRead方法。一次性得到上傳的數(shù)據(jù),然后分析處理。這就是為什么上傳大文件很慢的原因了,IIS超時(shí)不說(shuō),就算1G文件上去了,分析處理也得一陣子。 之后我把注意力放在國(guó)外商業(yè)組件上,比較流行的有Power-Web,AspUpload,ActiveFile,ABCUpload,aspSmartUpload,SA-FileUp。其中比較優(yōu)秀的是ASPUPLOAD和SA-FILE,他們號(hào)稱可以處理2G的文件(SA-FILE EE版甚至沒(méi)有文件大小的限制),而且效率也是非常棒,難道編程語(yǔ)言的效率差這么多?(我的編程環(huán)境是VB6) 查了一些資料,覺(jué)得他們都是直接操作文件流。這樣就不受文件大小的制約。 真是個(gè)好方法。
    但老外的東西也不是絕對(duì)完美,ASPUPLOAD處理大文件后,內(nèi)存占用情況驚人。1G左右都是稀松平常。我用的是3.0.0.3版。至于SA-FILE雖然是好東西但是破解難尋(郁悶死..) 失望之際,發(fā)現(xiàn)2款上傳組件,Lion.Web.UpLoadModule和AspnetUpload,都是.NET的,估計(jì)也是操作文件流。但是上傳速度和CPU占用率都不如老外的商業(yè)組件。
    做了個(gè)測(cè)試,LAN內(nèi)傳1G的文件。ASPUPLOAD上傳速度平均是4.4M/s,CPU占用10-15,內(nèi)存占用700M。SA-FILE也差不多這樣。而AspnetUpload最快也只有1.5M/s,平均是700K/s,CPU占用15-39,測(cè)試環(huán)境:PIII800,256M內(nèi)存,100M LAN。我想AspnetUpload速度慢是可能因?yàn)橐贿吔邮瘴募贿厡?xiě)硬盤(pán)。資源占用低的代價(jià)就是降低傳輸速度。 但也不得不佩服老外的程序,CPU占用如此之低.....這樣2個(gè).net的組件也被PASS.

    稍帶2個(gè)問(wèn)題就是上傳進(jìn)度和斷點(diǎn)續(xù)傳。
    顯示上傳進(jìn)度比較簡(jiǎn)單,主要是查詢用戶上傳的狀態(tài),用Script顯示到瀏覽器中,至于無(wú)刷新顯示就要看腳本語(yǔ)言運(yùn)用的熟練程度了。
    斷點(diǎn)續(xù)傳,HTTP方式是實(shí)現(xiàn)不了的,因?yàn)闉g覽器每次上傳文件都是從頭開(kāi)始,沒(méi)有Range標(biāo)簽。實(shí)現(xiàn)的方法只能用ActiveX。

    研究之后決定寫(xiě)個(gè)CGI來(lái)處理文件上傳。 這樣可以不走IIS以免程序出錯(cuò)影響網(wǎng)站訪問(wèn)。小弟比較菜只能用VB6做,完成之后發(fā)現(xiàn)WIN CGI的效率簡(jiǎn)直就是差的不能再差。索性寫(xiě)個(gè)FILE SERVER,專門處理文件的上傳。但是現(xiàn)在遇到一個(gè)2個(gè)問(wèn)題。
    一、用WINSOCK控件接收到的文本有亂碼 不知道是程序轉(zhuǎn)換時(shí)的錯(cuò)誤還是WINSOCK本身垃圾,SO 換了PowerTCP的WINSOCK TOOL,情況有所好轉(zhuǎn) 亂碼沒(méi)那么多了.........準(zhǔn)備換vb.net,直接操作socket,程序還沒(méi)做,不知道用.net接收會(huì)不會(huì)亂碼。再有就哭了。
    二、這個(gè)問(wèn)題就比較初級(jí)了....接收到的文件流不能還原成文件..寒一個(gè),

    最后就是如何高效處理文件流, 我想來(lái)想去也就只有2種方法,一是都放在內(nèi)存里,然后一起處理, 二是一邊接收一邊寫(xiě)文件。 但這2種方法都不盡如人意思
    posted @ 2009-03-26 17:00 張永耀 閱讀(127) | 評(píng)論 (0)編輯 收藏


    http://cydn.8k.com      http://cydn.8m.com     http://cydn.s5.com

    登陸修改地址:http://cydn.8k.com/cgi-bin/login

    http://cydn.8k.com/cgi-bin/login

    http://cydn.s5.com/cgi-bin/login


    1。  個(gè)人空間和Blog   http://zhoubing518.x.27h.org/

    也就是: http://www.27h.com/blog/html/03/143103.html

    支持Ftp上傳,地址:ftp.27h.com  最好用CutFtp工具上傳。用戶名密碼為登陸的用戶名和密碼

    支持Html解析,不能解析jsp,屬于WEB服務(wù)器。

    網(wǎng)站的信件內(nèi)容如下:

         尊敬的 cydn 用戶你好!
        我是醬子家園的管理員!
    感謝您申請(qǐng)我們的免費(fèi)主頁(yè)服務(wù),您已經(jīng)成為我們的用戶。
    ======================================================================
    您的FTP地址為 ftp://ftp.27h.com
    用戶名為 cydn
    目前空間大小為 50M 您的主頁(yè)地址為 http://cydn.27h.com

    您必須安裝FTP軟件,例如LEAPFTP CUTEFTP等

    2.    速度最快,最穩(wěn)定的一個(gè):  http://hi.baidu.com/zbzb  

    不能上傳自己的Html頁(yè)面.但有100M的照片庫(kù)  

    3.   個(gè)人空間   http://zb.s5.com    國(guó)外免費(fèi)空間,支持Html .用戶登陸頁(yè):http://www.s5.comhttp://www.s5.comhttp://www.s5.comhttp://www.s5.com    國(guó)外免費(fèi)空間,支持Html .用戶登陸頁(yè):http://www.s5.com

    登陸修改地址:http://zb.s5.com/cgi-bin/login

    4.   個(gè)人Blog  博客地址:http://zb66.139.com   您的用戶名:zb66  您的密碼:***
    手機(jī)登陸的WAP地址:http://zb66.m.139.com     頁(yè)面不是很好看,模版少。速度快,.net網(wǎng)站。

    5.  http://host.tomore.com   

    主機(jī)名:http://host.tomore.com/cydn/

    FTP:

    主機(jī):host.tomore.com
    用戶名:cydn
    密碼:你的會(huì)員密碼.
    空間大小:50 M .

    Mysql:未開(kāi)通,請(qǐng)升級(jí)為正式會(huì)員!

    5.  我申請(qǐng)的幾個(gè)免費(fèi)域名

    我申請(qǐng)的域名:
    http://cydn.wyou.cn
    http://smys.9126.com
    http://smys.9126.com
    http://cydn.1www.cn/http://xacydn.9126.com
    圣博個(gè)人免費(fèi)空間:
    http://cydn.home.sunbo.net

    6.  免費(fèi)域名申請(qǐng)網(wǎng)址簡(jiǎn)介:

    http://www.wyou.cn/reg/reg.asp   
    免費(fèi)域名服務(wù)由萬(wàn)游網(wǎng)提供

    http://www.xinfree.com/default.htm

    申請(qǐng)地址:http://www.008.net/free/

    申請(qǐng)網(wǎng)址:http://ew88.com/reg.asp

    申請(qǐng)地址:http://www.eee.cc/

    申請(qǐng)網(wǎng)址: http://www.chinese.cn.com/freedomain/
    CHINESE.cn.com 免費(fèi)域名開(kāi)始測(cè)試,域名長(zhǎng)度要求在3至20個(gè)字符之間。 您可以注冊(cè)以下域名:
    yourname.chinese.cn.com
    yourname.163.cn.com
    yourname.263.cn.com
    yourname.sina.cn.com
    yourname.sohu.cn.com
    yourname.tom.cn.com
    快來(lái)?yè)屪⒀剑?/p>

    申請(qǐng)網(wǎng)址: http://reg.900du.com/

    免費(fèi) ***.k6.cn域名!
    申請(qǐng)網(wǎng)址: http://jsyzt.k6.cn/reg/reg.asp

    申請(qǐng)網(wǎng)址:http://mycool.net/

    申請(qǐng)網(wǎng)址:http://my.k6.cn/reg/reg2.asp

    很不錯(cuò)的免費(fèi)域名,共27種后綴,例如:cc.ly/tv.ly/cn.ly/on.ly,快去申請(qǐng)吧!

    申請(qǐng)網(wǎng)址:
    http://tv.ly/

    可選擇的后綴有:   hk.ly   dj.md   ok.mu   n.md   w.md   hk.md   tea.ms   email.ly   cn.ly   jp.ly   kr.pn   cc.ly   tv.ly   co.kr.mw   co.kr.pn   name.md   kr.mw   to.tc   email.dj   blog.vg   on.ly   cc.la   cn.la   tw.la   jp4.jp   na.la   wa.la

    Lycos中國(guó)免費(fèi)聊天室申請(qǐng)! 
    時(shí)間: 2004-07-12 21:08:37 | [<<] [>>]
    --------------------------------------------------------------------------------
        免費(fèi)提供個(gè)人聊天室,申請(qǐng)簡(jiǎn)單,只需在主頁(yè)添加一段html代碼即可,沒(méi)有廣告,速度尚可,但功能較少。

    申請(qǐng)網(wǎng)址: http://chat.lycos.com.cn/hkcn/code.html
    碧聊免費(fèi)聊天室申請(qǐng)!
    --------------------------------------------------------------------------------
    免費(fèi)提供支持10人的語(yǔ)音聊天室,速度快、功能強(qiáng),如果需要更大在線人數(shù)可以購(gòu)買收費(fèi)服務(wù)。

    申請(qǐng)網(wǎng)址: http://www.bliao.com/help/help23.htm

    posted @ 2009-03-26 14:12 張永耀 閱讀(117) | 評(píng)論 (0)編輯 收藏

    閱讀全文
    類別:數(shù)據(jù)庫(kù) 查看評(píng)論
    文章來(lái)源:http://hi.baidu.com/zbzb/blog/item/286f8b5438a4bf183b293556.html
    posted @ 2009-03-26 13:21 張永耀 閱讀(52) | 評(píng)論 (0)編輯 收藏

    閱讀全文
    類別:免費(fèi)資源 查看評(píng)論
    文章來(lái)源:http://hi.baidu.com/zbzb/blog/item/ef6dae7724dae11cb151b9d4.html
    posted @ 2009-03-26 13:21 張永耀 閱讀(65) | 評(píng)論 (0)編輯 收藏

    閱讀全文
    類別:底層軟件 查看評(píng)論
    文章來(lái)源:http://hi.baidu.com/zbzb/blog/item/9013d0ca2ad45241f31fe763.html
    posted @ 2009-03-26 13:21 張永耀 閱讀(90) | 評(píng)論 (0)編輯 收藏

    閱讀全文
    類別:底層軟件 查看評(píng)論
    文章來(lái)源:http://hi.baidu.com/zbzb/blog/item/941a563d67b001e93c6d976b.html
    posted @ 2009-03-26 13:21 張永耀 閱讀(84) | 評(píng)論 (0)編輯 收藏

    閱讀全文
    類別:默認(rèn)分類 查看評(píng)論
    文章來(lái)源:http://hi.baidu.com/zbzb/blog/item/2ba544a98f1296fb1f17a278.html
    posted @ 2009-03-26 13:21 張永耀 閱讀(102) | 評(píng)論 (0)編輯 收藏

    閱讀全文
    類別:底層軟件 查看評(píng)論
    文章來(lái)源:http://hi.baidu.com/zbzb/blog/item/8735aa6e0a4e36dd80cb4a16.html
    posted @ 2009-03-26 13:21 張永耀 閱讀(527) | 評(píng)論 (0)編輯 收藏

    閱讀全文
    類別:數(shù)據(jù)庫(kù) 查看評(píng)論
    文章來(lái)源:http://hi.baidu.com/zbzb/blog/item/4bca675974b8b32d2934f019.html
    posted @ 2009-03-26 13:21 張永耀 閱讀(63) | 評(píng)論 (0)編輯 收藏

    閱讀全文
    類別:java及jsp 查看評(píng)論
    文章來(lái)源:http://hi.baidu.com/zbzb/blog/item/e1fed51bda617cd2ac6e7519.html
    posted @ 2009-03-26 13:21 張永耀 閱讀(99) | 評(píng)論 (0)編輯 收藏

    閱讀全文
    類別:Ajax 查看評(píng)論
    文章來(lái)源:http://hi.baidu.com/zbzb/blog/item/86ac560f976fb02d6159f31a.html
    posted @ 2009-03-26 13:21 張永耀 閱讀(54) | 評(píng)論 (0)編輯 收藏

    閱讀全文
    類別:java及jsp 查看評(píng)論
    文章來(lái)源:http://hi.baidu.com/zbzb/blog/item/ba775eeec7adf4fcb3fb95cd.html
    posted @ 2009-03-26 13:21 張永耀 閱讀(81) | 評(píng)論 (0)編輯 收藏

    閱讀全文
    類別:數(shù)據(jù)庫(kù) 查看評(píng)論
    文章來(lái)源:http://hi.baidu.com/zbzb/blog/item/2cb1ff19dc852f72dbb4bde2.html
    posted @ 2009-03-26 13:21 張永耀 閱讀(63) | 評(píng)論 (0)編輯 收藏

    閱讀全文
    類別:java及jsp 查看評(píng)論
    文章來(lái)源:http://hi.baidu.com/zbzb/blog/item/541cc4ceda5ee50b93457eef.html
    posted @ 2009-03-26 13:21 張永耀 閱讀(58) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲 国产 图片| 精品一区二区三区免费观看| 四虎成人精品一区二区免费网站| 亚洲国产成人91精品| 222www免费视频| 亚洲精品福利网站| 亚洲啪啪免费视频| 亚洲中文字幕久久精品无码2021| 四虎1515hh永久久免费| 亚洲午夜电影在线观看高清| 国产精品久久久久久久久免费| 亚洲国产精品综合久久久| 2020久久精品国产免费| 亚洲一卡2卡4卡5卡6卡残暴在线| 在线观看av永久免费| 亚洲中文字幕一区精品自拍| 女人让男人免费桶爽30分钟 | 污视频网站在线免费看| 啊灬啊灬别停啊灬用力啊免费看| 精品在线免费视频| 亚洲精品一级无码中文字幕| 国产免费内射又粗又爽密桃视频 | 中国一级全黄的免费观看| 亚洲精品国产精品乱码不99| 久久国产乱子伦精品免费看| 亚洲成人网在线播放| 成年大片免费视频| 在线观看亚洲电影| 久久久久一级精品亚洲国产成人综合AV区 | 亚洲熟妇av午夜无码不卡| 国产99视频精品免费视频7| 午夜在线免费视频 | 亚欧人成精品免费观看| 亚洲一区二区三区高清不卡| 四虎影视免费在线| 特a级免费高清黄色片 | 亚洲国产精品成人综合久久久| 夜夜嘿视频免费看| 人人爽人人爽人人片av免费| 亚洲国产精品无码久久一线| 亚洲黄色免费电影|