GONE WITH THE WIND

          --tomorrow is another day

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

          2009年3月30日 #

          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; }說明: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ù),沒有內(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)來列的,所以你列出來默認(rèn)的就是黑點(diǎn)啦,還有一個(gè)是<ol>這個(gè)是編號(hào)列表,用數(shù)字來列的,也是用<li>做列表項(xiàng)

           


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

          posted @ 2009-04-13 09:22 張永耀 閱讀(399) | 評(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 張永耀 閱讀(187) | 評(píng)論 (0)編輯 收藏

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

            css font屬性是用來控制文字字體、顏色、大小等。而font的屬性有多種,在通常情況下,我們用縮寫的辦法將多種屬性概括在一句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;

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

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

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

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

          使用PHP編程的人都會(huì)碰到這樣一個(gè)問題:當(dāng)PHP代碼和HTML代碼在一起的時(shí)候,看PHP代碼很費(fèi)勁,整個(gè)文件也無(wú)法用Dreamweaver來編輯,這對(duì)于PHP程序員和美工來講,修改這樣的文件就象一個(gè)噩夢(mèng)。
          PHP中的模板(Template)技術(shù)就是為了解決這個(gè)問題而出現(xiàn)的。PHP模板類有很多,比較常見的是 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 類繼承過來,無(wú)法用到 PEAR 類的 debug 功能。
          以下舉例子說明它們的用法,假設(shè) IntegratedTemplate 類和 IntegratedTemplateExtension 類分別在 C:\php4\pear\HTML\ITX.php 和 C:\php4\pear\HTML\ITX.php 中。我們寫的代碼放在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ú)法通過遠(yuǎ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 = "歡迎來到網(wǎng)頁(yè)天堂";
          $UserName = "皮皮魯";
          $WelcomeMessage = "您的到來讓我們深感榮幸!";

          //一般來說這種全局變量放在單獨(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();
          ?>

          這樣寫好后,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è),可以很輕松寫出論壇之類的軟件。

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

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

          這樣做有很多好處──通常可以壓縮文件容量,有著用一個(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)心,過時(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)的樣式來呈現(xiàn)一個(gè)沒有樣式表(或者有樣式表,但不支援樣式表的文本瀏覽器,比如lynx——譯者注)的頁(yè)面。

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

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


          在XHTML中所有的標(biāo)簽都必須小寫和關(guān)閉。沒有閉合標(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元素。也必須從文檔類型聲明開始。

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

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

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

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

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

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

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

          這個(gè)問題越來越牽涉法律問題了,比如美國(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)作使你的親和力更上一層樓,而且不難。見親和連接和親和表單指南。

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

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

          我們大部分的設(shè)計(jì)師依舊在采用傳統(tǒng)的表格布局、表現(xiàn)與結(jié)構(gòu)混雜在一起的方式來建立網(wǎng)站。學(xué)習(xí)使用XHTML CSS的方法需要一個(gè)過程,使現(xiàn)有網(wǎng)站符合網(wǎng)站標(biāo)準(zhǔn)也不可能一步到位。最好的方法是循序漸進(jìn),分階段來逐步達(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ì)師和開發(fā)者都不知道什么是DOCTYPE,DOCTYPE有什么用。DOCTYPE是document type的簡(jiǎn)寫。主要用來說明你用的XHTML或者HTML是什么版本。瀏覽器根據(jù)你DOCTYPE定義的DTD(文檔類型定義)來解釋頁(yè)面代碼。所以,如果你不注意設(shè)置了錯(cuò)誤的DOCTYPE,結(jié)果會(huì)讓你大吃一驚。XHTML1.0提供了三種DOCTYPE可選擇:

          (1)過渡型(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í)改善來說,只要選用過渡型的聲明就可以了。它依然可以兼容你的表格布局、表現(xiàn)標(biāo)識(shí)等,不至于讓你覺得變化太大,難以掌握。

          Tip:你懶得輸入上面過渡型代碼的話,可以訪問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聲明允許你通過一個(gè)在線地址指向來識(shí)別你的namespace。只要照樣輸入代碼就可以。

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

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

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

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

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

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

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

          正確的寫法是:

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

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

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

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

          正確的寫法:

          <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è)打開的標(biāo)簽都必須關(guān)閉。就象這樣:

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

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

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

          <br />

          <img src="webstandards.gif" />

          經(jīng)過上述七個(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)最后通過了XHTML驗(yàn)證,恭喜你已經(jīng)向網(wǎng)站標(biāo)準(zhǔn)邁出了一大步。不是想象中的那么難吧!

          2.中級(jí)改善

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

          • 用CSS定義元素外觀

          我們?cè)趯憳?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>能變成你想要的任何樣子,通過CSS,<h1>能變成小的字體,<p>文本能夠變成巨大的、粗體的,<li>能夠變成一張圖片等等。我們不能強(qiáng)迫用結(jié)構(gòu)元素實(shí)現(xiàn)表現(xiàn)效果,我們應(yīng)該使用CSS來確定那些元素的外觀。例如,我們可以使原來默認(rèn)的6級(jí)標(biāo)題可以看起來大小一樣:

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

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

          許多人可能從來都不知道HTML和XHTML元素設(shè)計(jì)本意是用來表達(dá)結(jié)構(gòu)的。我們很多人已經(jīng)習(xí)慣用元素來控制表現(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ì)說“但是<li>顯示的是一個(gè)圓點(diǎn),我不想用圓點(diǎn)”。事實(shí)上,CSS沒有設(shè)定元素看起來是什么樣子,你完全可以用CSS關(guān)掉圓點(diǎn)。

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

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

          <table id="menu">

          接下來,在書寫樣式表的時(shí)候,你就可以創(chuàng)建一個(gè)“menu”的選擇器,并且關(guān)聯(lián)一個(gè)CSS規(guī)則,用來告訴表格單元、文本標(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 張永耀 閱讀(135) | 評(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í)訪問數(shù)據(jù)庫(kù)的用戶的數(shù)量不受限制

          2.可以保存超過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的用戶名和密碼來連接服務(wù)器,如果服務(wù)器不是在本機(jī),則還需要一個(gè)主機(jī)名或IP來指定服務(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;


          打開的數(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命令來備份數(shù)據(jù)庫(kù)

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

          執(zhí)行此語(yǔ)句將把mydb 備份到D盤的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盤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就可以了.
              
               安裝完畢后,在“開始”菜單的“運(yùn)行”中輸入:C:\MySQL\bin\mysqld-nt.exe -install ([color=Red]這個(gè)版本建議安裝在C盤[/color]),運(yùn)行成功之后再在“開始”菜單的“運(yùn)行”輸入:net mysql start ,將會(huì)啟動(dòng) MySQL 服務(wù).
              
               默認(rèn)管理員root 密碼空 請(qǐng)使用PHPMYADMIN 修改.

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

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

           


           

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

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

          PHPCMS2008模板教程 默認(rèn)模板解析及模板制作教程
          首先打開后臺(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)簽模板……
          接下來看一下header.html、index.html、footer.html 三個(gè)模板文件。這是首頁(yè)模板的靈魂!不僅是首頁(yè),其它頁(yè)面的頭部文件和頁(yè)腳文件也是header.html,footer.html這個(gè)不用我說了,因?yàn)榭纯茨0逯械?/font>{template 'phpcms','header'}{template 'phpcms','footer'}說一下這三個(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è)模板就可以說結(jié)構(gòu)完整了。
          對(duì)應(yīng)2008的默認(rèn)模板看:(因?yàn)槎加心J(rèn)的,所以就不貼出來了,占地方,也不方便看)
          現(xiàn)在我們開始分析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)亂碼,也就是說,出現(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è)都顯示出來,其它的頁(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è)圖片,你只要寫<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那就說明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)的問題,首先檢查這里的js是否調(diào)用
           

          11、<body   
          頁(yè)面載入的時(shí)候調(diào)用輸出catid或者mod,所以說$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這樣就明白了,所以說看了模板就知道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的說明。這個(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里面分別通過三個(gè)推薦位置來實(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 張永耀 閱讀(1312) | 評(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)開發(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)并通過網(wǎng)絡(luò)發(fā)送之,或者從網(wǎng)絡(luò)上接收物理幀,抽出IP數(shù)據(jù)報(bào),交給IP層。
            二網(wǎng)絡(luò)層
            負(fù)責(zé)相鄰計(jì)算機(jī)之間的通信。其功能包括三方面:
            1、處理來自傳輸層的分組發(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、處理路徑、流控、擁塞等問題。
            三傳輸層
            提供應(yīng)用程序間的通信。其功能包括:
            1、格式化信息流;
            2、提供可靠傳輸。為實(shí)現(xiàn)后者,傳輸層協(xié)議規(guī)定接收端必須發(fā)回確認(rèn),并且假如分組丟失,必須重新發(fā)送。
            四應(yīng)用層
            向用戶提供一組常用的應(yīng)用程序,比如電子郵件、文件傳輸訪問、遠(yuǎn)程登錄等。遠(yuǎn)程登錄TELNET使用TELNET協(xié)議提供在網(wǎng)絡(luò)其它主機(jī)上注冊(cè)的接口。TELNET會(huì)話提供了基于字符的虛擬終端。文件傳輸訪問FTP使用FTP協(xié)議來提供網(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ù)加密 沒有協(xié)議
            會(huì)話層 解除或建立與別的接點(diǎn)的聯(lián)系 沒有協(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 張永耀 閱讀(160) | 評(píng)論 (0)編輯 收藏

          TCP/IP協(xié)議

           

            TCP/IP(Transmission Control Protocol/Internet Protocol)的簡(jiǎn)寫,中文譯名為傳輸控制協(xié)議/互聯(lián)網(wǎng)絡(luò)協(xié)議)協(xié)議是Internet最基本的協(xié)議,簡(jiǎn)單地說,就是由網(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)作之初,通過接口信號(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è)理念:“所有電腦生來都是平等的。”為了讓這些“生來平等”的電腦能夠?qū)崿F(xiàn)“資源共享”就得在這些系統(tǒng)的標(biāo)準(zhǔn)之上,建立一種大家共同都必須遵守的標(biāo)準(zhǔn),這樣才能讓不同的電腦按照一定的規(guī)則進(jìn)行“談判”,并且在談判之后能“握手”。

            在確定今天因特網(wǎng)各個(gè)電腦之間“談判規(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í),就被允許使用加州大學(xué)洛杉磯分校的電腦,他認(rèn)為“為電腦編程序是個(gè)非常激動(dòng)人心的事,…只要把程序編好,就可以讓電腦做任何事情。”1965年,瑟夫從斯坦福大學(xué)畢業(yè)到IBM的一家公司當(dāng)系統(tǒng)工程師,工作沒多久,瑟夫就覺得知識(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)也來到了加州大學(xué)洛杉磯分校。 在那段日子里,往往是卡恩提出需要什么軟件,而瑟夫則通宵達(dá)旦地把符合要求的軟件給編出來,然后他們一起測(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)來打開通信管道,數(shù)據(jù)通過后還要關(guān)閉通道。否則這些IMP不會(huì)知道什么時(shí)候應(yīng)該接收信號(hào),什么時(shí)候該結(jié)束,這就是我們現(xiàn)在所說的通信“協(xié)議”的概念。70年12月制定出來了最初的通信協(xié)議j 由卡恩開發(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)生了目前在開放系統(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ù)膯栴},一有問題就發(fā)出信號(hào),要求重新傳輸,直到所有數(shù)據(jù)安全正確地傳輸?shù)侥康牡亍6鳬P是給因特網(wǎng)的每一臺(tái)電腦規(guī)定一個(gè)地址。1974年12月,卡恩、瑟夫的第一份TCP協(xié)議詳細(xì)說明正式發(fā)表。當(dāng)時(shí)美國(guó)國(guó)防部與三個(gè)科學(xué)家小組簽定了完成TCP/IP的協(xié)議,結(jié)果由瑟夫領(lǐng)銜的小組捷足先登,首先制定出了通過詳細(xì)定義的TCP/IP協(xié)議標(biāo)準(zhǔn)。當(dāng)時(shí)作了一個(gè)試驗(yàn),將信息包通過點(diǎn)對(duì)點(diǎn)的衛(wèi)星網(wǎng)絡(luò),再通過陸地電纜,再通過衛(wèi)星網(wǎng)絡(luò),再由地面?zhèn)鬏敚灤畾W洲和美國(guó),經(jīng)過各種電腦系統(tǒng),全程9.4萬(wàn)公里竟然沒有丟失一個(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)的安全問題打下基礎(chǔ)。TCP/IP協(xié)議組之所以流行,部分原因是因?yàn)樗梢杂迷诟鞣N各樣的信道和底層協(xié)議(例如T1和X.25、以太網(wǎng)以及RS-232串行接口)之上。確切地說,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)的開放式系統(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ò)來完成自己的需求。這4層分別為:

            應(yīng)用層:應(yīng)用程序間溝通的層,如簡(jiǎn)單電子郵件傳輸(SMTP)、文件傳輸協(xié)議(FTP)、網(wǎng)絡(luò)遠(yuǎ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等)來傳送數(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ā)來的數(shù)據(jù)包,并把該數(shù)據(jù)包發(fā)送到更高層---TCP或UDP層;相反,IP層也把從TCP或UDP層接收來的數(shù)據(jù)包傳送到更低層。IP數(shù)據(jù)包是不可靠的,因?yàn)镮P并沒有做任何事情來確認(rèn)數(shù)據(jù)包是按順序發(fā)送的或者沒有被破壞。IP數(shù)據(jù)包中含有發(fā)送它的主機(jī)的地址(源地址)和接收它的主機(jī)的地址(目的地址)。

            高層的TCP和UDP服務(wù)在接收數(shù)據(jù)包時(shí),通常假設(shè)包中的源地址是有效的。也可以這樣說,IP地址形成了許多服務(wù)的認(rèn)證基礎(chǔ),這些服務(wù)相信數(shù)據(jù)包是從一個(gè)有效的主機(jī)發(fā)送來的。IP確認(rèn)包含一個(gè)選項(xiàng),叫作IP source routing,可以用來指定一條源地址和目的地址之間的直接路徑。對(duì)于一些TCP和UDP的服務(wù)來說,使用了該選項(xiàng)的IP包好像是從路徑上的最后一個(gè)系統(tǒng)傳遞過來的,而不是來自于它的真實(shí)地點(diǎn)。這個(gè)選項(xiàng)是為了測(cè)試而存在的,說明了它可以被用來欺騙系統(tǒng)來進(jìn)行平常是被禁止的連接。那么,許多依靠IP源地址做確認(rèn)的服務(wù)將產(chǎ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沒有建立初始化連接(也可以稱為握手)(因?yàn)樵趦蓚€(gè)系統(tǒng)間沒有虛電路),也就是說,與UDP相關(guān)的服務(wù)面臨著更大的危險(xiǎn)。

            4.ICMP

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

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

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

            兩個(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)程用來發(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ò)世界中各種信息也是通過類似的方式進(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)沒有,在IP協(xié)議中定義的傳輸是單向的,也就是說發(fā)出去的貨物對(duì)方有沒有收到我們是不知道的。就好像8毛錢一份的平信一樣。那對(duì)于重要的信件我們要寄掛號(hào)信怎么辦呢?TCP協(xié)議就是幫我們寄“掛號(hào)信”的。TCP協(xié)議提供了可靠的面向?qū)ο蟮臄?shù)據(jù)流傳輸服務(wù)的規(guī)則和約定。簡(jiǎn)單的說在TCP模式中,對(duì)方發(fā)一個(gè)數(shù)據(jù)包給你,你要發(fā)一個(gè)確認(rèn)數(shù)據(jù)包給對(duì)方。通過這種確認(rèn)來提供可靠性。

            

          1.1 TCP/IP參考模型



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

            應(yīng)用層:應(yīng)用程序間溝通的層,如簡(jiǎn)單電子郵件傳輸(SMTP)、文件傳輸協(xié)議(FTP)、網(wǎng)絡(luò)遠(yuǎ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等)來傳送數(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ī)在彼此通信過程的所有細(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ò)硬件幾乎沒有任何要求,任何一個(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ī)通過安裝IP軟件,使許許多多的局域網(wǎng)絡(luò)構(gòu)成了一個(gè)龐大而又嚴(yán)密的通信系統(tǒng)。從而使 Internet 看起來好像是真實(shí)存在的,但實(shí)際上它是一種并不存在的虛擬網(wǎng)絡(luò),只不過是利用IP協(xié)議把全世界上所有愿意接入 Internet 的計(jì)算機(jī)局域網(wǎng)絡(luò)連接起來,使得它們彼此之間都能夠通信。

            

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



            盡管計(jì)算機(jī)通過安裝IP軟件,從而保證了計(jì)算機(jī)之間可以發(fā)送和接收資料,但I(xiàn)P協(xié)議還不能解決資料分組在傳輸過程中可能出現(xiàn)的問題。因此,若要解決可能出現(xiàn)的問題,連上 Internet 的計(jì)算機(jī)還需要安裝TCP協(xié)議來提供可靠的并且無(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é)議的功能不盡相同,也可以分開單獨(dú)使用,但它們是在同一時(shí)期作為一個(gè)協(xié)議來設(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)寫)地址,即用Internet協(xié)議語(yǔ)言表示的地址。

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

            IP地址可確認(rèn)網(wǎng)絡(luò)中的任何一個(gè)網(wǎng)絡(luò)和計(jì)算機(jī),而要識(shí)別其它網(wǎng)絡(luò)或其中的計(jì)算機(jī),則是根據(jù)這些IP地址的分類來確定的。一般將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)換過程稱為網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation,NAT),通常使用路由器來執(zhí)行NAT轉(zhuǎn)換。

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

            連接到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地址的問題,因?yàn)榭梢匀我馐褂盟械腎P地址,不管是A類或是B類,這個(gè)時(shí)候不會(huì)想到要用子網(wǎng),但若是上Internet那IP地址便彌足珍貴了,目前全球一陣Internet熱,IP地址已經(jīng)愈來愈少了,而所申請(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ò)編碼,也就是說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,這是怎么來的,由以上知道網(wǎng)絡(luò)編碼是由IP地址和子網(wǎng)掩碼作AND而來的,而且將子網(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ò)編碼可自行以上述方法自行推演出來。

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

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

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

            若要使兩個(gè)完全不同的網(wǎng)絡(luò)(異構(gòu)網(wǎng))連接在一起,一般使用網(wǎng)關(guān),在Internet中兩個(gè)網(wǎng)絡(luò)也要通過一臺(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ī)的信息接收過來,它是一個(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、 單擊“開始”/“運(yùn)行”,輸入CMD按回車,打開命令提示符窗口。

            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ò)有問題。

            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ī)通過了全部測(cè)試,則說明網(wǎng)絡(luò)正常,否則網(wǎng)絡(luò)可能有不同程度的問題。在此不展開詳述。不過,要注意,在使用 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的最低層是接口層,常見的接口層協(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ò)層的核心,通過路由選擇將下一跳IP封裝后交給接口層。IP數(shù)據(jù)報(bào)是無(wú)連接服務(wù)

            。

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

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

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

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

            3、傳輸層

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

            議UDP(User Datagram rotocol)。

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

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

            TCP提供的是一種可靠的數(shù)據(jù)流服務(wù),采用“帶重傳的肯定確認(rèn)”技術(shù)來實(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é)議,用來控制信件的發(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 張永耀 閱讀(192) | 評(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ù)包的分割和組裝,但是通過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)沒有收到確認(rèn),那么TCP將重新發(fā)送數(shù)據(jù)包。另外,在傳輸?shù)倪^程中,如果接收到無(wú)序、丟失以及被破壞的數(shù)據(jù)包,TCP還可以負(fù)責(zé)恢復(fù)。

            傳輸控制協(xié)議(Transmission Control Protocol,TCP)是一種面向連接的、可靠的、基于字節(jié)流的運(yùn)輸層通信協(xié)議,通常由IETF的RFC 793說明。在簡(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ā)展起來的。

            有時(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)奇怪,但沒有必要去爭(zhēng)論這個(gè)習(xí)慣。例如,有時(shí)我們討論NFS 是基于TCP/IP時(shí),盡管它根本沒用到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組織開發(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)與其說由委員會(huì)指定,倒不如說由\"輿論\"來開發(fā)的。 任何人都可以提供一個(gè)文檔,以RFC(Request for Comment需求注釋) 方式公布。

            TCP/IP的標(biāo)準(zhǔn)在一系列稱為RFC的文檔中公布。文檔由技術(shù)專家、特別工作組、或RFC編輯修訂。公布一個(gè)文檔時(shí),該文檔被賦予一個(gè)RFC量,如RFC959說明FTP、RFC793說明TCP、RFC791說明IP等。 最初的RFC一直保留而從來不會(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é)議。一旦你要訪問另一臺(tái) 系統(tǒng)中的文件,任何時(shí)刻都要運(yùn)行FTP。而且你只能拷貝文件到自己的機(jī)器中去來使用它。(RFC 959中關(guān)于FTP的說明)

            * 遠(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è)過程中不見了,所敲的每一個(gè)字符直接送到所登錄的計(jì)算機(jī)系統(tǒng)。一般的說,這種遠(yuǎn)程連接是通過類式撥號(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)生問題,使用的微電腦的環(huán)境不同,還有重要的是宏(MICRO)不適合于接受計(jì)算機(jī)郵件。為了發(fā)送電子郵件,郵件軟件希望連接到目的計(jì)算機(jī),如果是微電腦,也許它已關(guān)機(jī),或者正在運(yùn)行另一個(gè)應(yīng)用程序呢?出于這種原因,通常由一個(gè)較大的系統(tǒng)來處理這些郵件,也就是一個(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í)看來像是只用到某個(gè)指定 的計(jì)算機(jī),但它是通過網(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)

            這種訪問另一計(jì)算機(jī)的文件的方法非常接近于流行的FTP。網(wǎng)絡(luò)文件系統(tǒng)提供磁盤或設(shè)備服務(wù),而無(wú)需特定的網(wǎng)絡(luò)實(shí)用程序來訪問另一系統(tǒng)的文件。可以簡(jiǎn)單地認(rèn)為它是一個(gè)外加的磁盤驅(qū)動(dòng)器。這種額外\"虛擬\"磁盤驅(qū)動(dòng)器就是其它計(jì)算機(jī)系統(tǒng)的磁盤。這非常有用。你只需加大幾臺(tái)計(jì)算機(jī)的磁盤容量,就可使網(wǎng)絡(luò)上其他用戶訪問它,且不說所帶來的經(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)安裝過程中,需要用到大量的各種名字,包括用戶名、口令,姓名、網(wǎng)絡(luò)地址、帳號(hào)等,管理這些是非常令人乏味的。因此將這些數(shù)據(jù)形成數(shù)據(jù)庫(kù),放到一個(gè)小系統(tǒng)中去,其它系統(tǒng)通過網(wǎng)絡(luò)來訪問這些數(shù)據(jù)。

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

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

            上述所描述的一些協(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è)過程。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連接。這一過程與打電話很相似,先撥號(hào)振鈴,等待對(duì)方摘機(jī)說“喂”,然后才說明是誰(shuí)。

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

            TCP通過下列方式來提供可靠性:

            •應(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ù)在傳輸過程中的任何變化。如果收到段的檢驗(yàn)和有差錯(cuò),TCP將丟棄這個(gè)報(bào)文段和不確認(rèn)收到此報(bào)文段(希望發(fā)端超時(shí)并重發(fā))。

            •既然TCP報(bào)文段作為IP數(shù)據(jù)報(bào)來傳輸,而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)用程序通過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)核來說,它無(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 張永耀 閱讀(172) | 評(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í)用來判斷是否進(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é):書上說了inverse 一對(duì)多的時(shí)候最好把多的一方設(shè)置成false由一的一方來控制;cascade盡量別使,進(jìn)行顯示的添加刪除。

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

          構(gòu)造這樣一個(gè)例子,在測(cè)試過程中來說明一些Hibernate的高級(jí)配置及其相關(guān)機(jī)制:
          有三個(gè)類:Category.java,Prodcuct.java,ConfigurationTest.java,其中第三個(gè)類是用來測(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編程書籍2");    
                  category.setDescription("編程經(jīng)典書籍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ù)的訪問方面更有優(yōu)勢(shì)。這一點(diǎn)留在后面講inverse時(shí)講
          。雙向關(guān)聯(lián)比單向關(guān)聯(lián)唯一的”劣勢(shì)“,就在于雙向關(guān)聯(lián)需要比單向關(guān)聯(lián)多寫一個(gè)映射文件,這不問題。使用雙向關(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í)一一展開:
          一.inverse
              該詞的譯意是“反轉(zhuǎn)”,反轉(zhuǎn)什么——反轉(zhuǎn)控制端,這項(xiàng)配置決定了由關(guān)聯(lián)雙方中的哪一方來維持關(guān)聯(lián)關(guān)系(在數(shù)據(jù)庫(kù)中表現(xiàn)為外鍵約束)。上述配置中,在Category.hbm.xml中將inverse設(shè)置為true,意思是說“我需要反轉(zhuǎn)(控制端)”,反轉(zhuǎn)的結(jié)果是由對(duì)方即Product來維持關(guān)聯(lián)關(guān)系。用單向關(guān)聯(lián)更容易說明”維持關(guān)聯(lián)關(guān)系“是什么意思:考慮用單向關(guān)系來實(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的外鍵)。上面,我們說由Category端控制關(guān)聯(lián),因此p.setCategory(c)這樣一句話是沒用的,它并不會(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)系還未建立起來,因此p的外鍵為空。回到雙向關(guān)聯(lián)上來,為了更清楚地明白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ǔ)句?這是由控制端的不同造成的。前者說"我要反轉(zhuǎn)控制,由Product來控制關(guān)聯(lián)",因此在將p對(duì)象insert時(shí),p已經(jīng)設(shè)置了其category字段,從而建立了關(guān)聯(lián)關(guān)系,而后者說"我不反轉(zhuǎn)控制,由我自己來控制關(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í),"多"方即使沒有顯式地進(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
              是否延遲加載。一般來說,應(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)你在程序中并沒有顯式的使用save或者update一個(gè)持久對(duì)象,那么Hibernate需要判斷被操作的對(duì)象究竟是一個(gè)已經(jīng)持久化過的持久對(duì)象,是一個(gè)尚未被持久化過的內(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();  
               在上例中,程序并沒有顯式的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)持久過的對(duì)象,發(fā)送update。unsaved-value="null" (默認(rèn)情況,適用于大多數(shù)對(duì)象類型主鍵 Integer/Long/String/...)
          當(dāng)Hibernate取一下child的Id,取出來的是null(在上例中肯定取出來的是null),和unsaved-value設(shè)定值相等,發(fā)送save(child)
          當(dāng)Hibernate取一下child的id,取出來的不是null,那么和unsaved-value設(shè)定值不相等,發(fā)送update(child)
             unsaved-value的可選配置有:
          none,any,null
          unsaved-value="none"和unsaved-value="any"主要用在主鍵屬性不是通過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ù)你自己的需要來定。
                關(guān)于為什么不要使主鍵帶有義務(wù)意義,robbin的解釋很清楚:還是以上面的例子打比方,如果我們將Category的某一個(gè)性質(zhì)(比如產(chǎn)品序號(hào)或者名稱)作為主鍵,如果后來由于業(yè)務(wù)需要,我們把這個(gè)性質(zhì)改了,那將不可僻免地要去修改與這個(gè)對(duì)象相關(guān)聯(lián)的所有數(shù)據(jù)的外鍵,而如果我們只要代理主鍵,這個(gè)問題就可完全僻免。


          主站蜘蛛池模板: 南木林县| 临潭县| 广饶县| 逊克县| 霍州市| 南城县| 景宁| 富锦市| 新邵县| 通山县| 利川市| 临沭县| 保定市| 柯坪县| 华容县| 石河子市| 始兴县| 泰兴市| 高陵县| 石首市| 汪清县| 华池县| 高安市| 边坝县| 青浦区| 曲靖市| 左权县| 龙州县| 城市| 右玉县| 阿拉善盟| 咸丰县| 弋阳县| 济宁市| 广东省| 莱州市| 阳高县| 胶州市| 凌源市| 探索| 芷江|