轉(zhuǎn)貼于:
http://hi.baidu.com/vip099/blog/item/45529638763b47c0d562258e.html

socket的英文原義是“孔”或“插座”。在這里作為4BDS UNIX的進(jìn)程通信機(jī)制,取后一種意義。socket非常類似于電話插座。以一個(gè)國(guó)家級(jí)電話網(wǎng)為例。電話的通話雙方相當(dāng)于相互通信的2個(gè)進(jìn)程,區(qū)號(hào)是它的 網(wǎng)絡(luò)地址;區(qū)內(nèi)一個(gè)單位的交換機(jī)相當(dāng)于一臺(tái)主機(jī),主機(jī)分配給每個(gè)用戶的局內(nèi)號(hào)碼相當(dāng)于socket號(hào)。任何用戶在通話之前,首先要占有一部電話機(jī),相當(dāng)于 申請(qǐng)一個(gè)socket;同時(shí)要知道對(duì)方的號(hào)碼,相當(dāng)于對(duì)方有一個(gè)固定的socket。然后向?qū)Ψ綋芴?hào)呼叫,相當(dāng)于發(fā)出連接請(qǐng)求(假如對(duì)方不在同一區(qū)內(nèi),還 要撥對(duì)方區(qū)號(hào),相當(dāng)于給出網(wǎng)絡(luò)地址)。對(duì)方假如在場(chǎng)并空閑(相當(dāng)于通信的另一主機(jī)開機(jī)且可以接受連接請(qǐng)求),拿起電話話筒,雙方就可以正式通話,相當(dāng)于連 接成功。雙方通話的過(guò)程,是一方向電話機(jī)發(fā)出信號(hào)和對(duì)方從電話機(jī)接收信號(hào)的過(guò)程,相當(dāng)于向socket發(fā)送數(shù)據(jù)和從socket接收數(shù)據(jù)。通話結(jié)束后,一 方掛起電話機(jī)相當(dāng)于關(guān)閉socket,撤消連接。

    在電話系統(tǒng)中,一般用戶只能感受到本地電話機(jī)和對(duì)方電話號(hào)碼的存在,建立通話的過(guò)程,話音傳輸?shù)倪^(guò)程以及整個(gè)電話系統(tǒng)的技術(shù)細(xì)節(jié)對(duì)他都是透明的,這也與 socket機(jī)制非常相似。socket利用網(wǎng)間網(wǎng)通信設(shè)施實(shí)現(xiàn)進(jìn)程通信,但它對(duì)通信設(shè)施的細(xì)節(jié)毫不關(guān)心,只要通信設(shè)施能提供足夠的通信能力,它就滿足 了。

    至此,我們對(duì)socket進(jìn)行了直觀的描述。抽象出來(lái),socket實(shí)質(zhì)上提供了進(jìn)程通信的端點(diǎn)。進(jìn)程通信之前,雙方首先必須各自創(chuàng)建一個(gè)端點(diǎn),否則是沒(méi) 有辦法建立聯(lián)系并相互通信的。正如打電話之前,雙方必須各自擁有一臺(tái)電話機(jī)一樣。在網(wǎng)間網(wǎng)內(nèi)部,每一個(gè)socket用一個(gè)半相關(guān)描述:

(協(xié)議,本地地址,本地端口)

      一個(gè)完整的socket有一個(gè)本地唯一的socket號(hào),由操作系統(tǒng)分配。

   最重要的是,socket 是面向客戶/服務(wù)器模型而設(shè)計(jì)的,針對(duì)客戶和服務(wù)器程序提供不同的socket 系統(tǒng)調(diào)用。客戶隨機(jī)申請(qǐng)一個(gè)socket (相當(dāng)于一個(gè)想打電話的人可以在任何一臺(tái)入網(wǎng)電話上撥號(hào)呼叫),系統(tǒng)為之分配一個(gè)socket號(hào);服務(wù)器擁有全局公認(rèn)的 socket ,任何客戶都可以向它發(fā)出連接請(qǐng)求和信息請(qǐng)求(相當(dāng)于一個(gè)被呼叫的電話擁有一個(gè)呼叫方知道的電話號(hào)碼)。

   socket利用客戶/服務(wù)器模式巧妙地解決了進(jìn)程之間建立通信連接的問(wèn)題。服務(wù)器socket 半相關(guān)為全局所公認(rèn)非常重要。讀者不妨考慮一下,兩個(gè)完全隨機(jī)的用戶進(jìn)程之間如何建立通信?假如通信雙方?jīng)]有任何一方的socket 固定,就好比打電話的雙方彼此不知道對(duì)方的電話號(hào)碼,要通話是不可能的。

   -----

Socket 接口是訪問(wèn) Internet 使用得最廣泛的方法。 如果你有一臺(tái)剛配好TCP/IP協(xié)議的主機(jī),其IP地址是202.120.127.201, 此時(shí)在另一臺(tái)主機(jī)或同一臺(tái)主機(jī)上執(zhí)行ftp 202.120.127.201,顯然無(wú)法建立連接。因"202.120.127.201" 這臺(tái)主機(jī)沒(méi)有運(yùn)行FTP服務(wù)軟件。同樣, 在另一臺(tái)或同一臺(tái)主機(jī)上運(yùn)行瀏覽軟件 如Netscape,輸入"http://202.120.127.201",也無(wú)法建立連接。現(xiàn)在,如果在這臺(tái)主機(jī)上運(yùn)行一個(gè)FTP服務(wù)軟件(該軟件將 打開一個(gè)Socket, 并將其綁定到21端口),再在這臺(tái)主機(jī)上運(yùn)行一個(gè)Web 服務(wù)軟件(該軟件將打開另一個(gè)Socket,并將其綁定到80端口)。這樣,在另一臺(tái)主機(jī)或同一臺(tái)主機(jī)上執(zhí)行ftp 202.120.127.201,F(xiàn)TP客戶軟件將通過(guò)21端口來(lái)呼叫主機(jī)上由FTP 服務(wù)軟件提供的Socket,與其建立連接并對(duì)話。而在netscape中輸入"http://202.120.127.201"時(shí),將通過(guò)80端口來(lái)呼 叫主機(jī)上由Web服務(wù)軟件提供的Socket,與其建 立連接并對(duì)話。

在Internet上有很多這樣的主機(jī),這些主機(jī)一般運(yùn)行了多個(gè)服務(wù)軟件,同時(shí)提供幾種服 務(wù)。每種服務(wù)都打開一個(gè)Socket,并綁定到一個(gè)端口上,不同的端口對(duì)應(yīng)于不同的服務(wù)。Socket正如其英文原意那樣,象一個(gè)多孔插座。一臺(tái)主機(jī)猶如 布滿各種插座的房間,每個(gè)插座有一個(gè)編號(hào),有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節(jié)目。 客戶軟件將插頭插到不同編號(hào)的插座,就可以得到不同的服務(wù)。