轉貼于:
http://hi.baidu.com/vip099/blog/item/45529638763b47c0d562258e.html

socket的英文原義是“孔”或“插座”。在這里作為4BDS UNIX的進程通信機制,取后一種意義。socket非常類似于電話插座。以一個國家級電話網為例。電話的通話雙方相當于相互通信的2個進程,區號是它的 網絡地址;區內一個單位的交換機相當于一臺主機,主機分配給每個用戶的局內號碼相當于socket號。任何用戶在通話之前,首先要占有一部電話機,相當于 申請一個socket;同時要知道對方的號碼,相當于對方有一個固定的socket。然后向對方撥號呼叫,相當于發出連接請求(假如對方不在同一區內,還 要撥對方區號,相當于給出網絡地址)。對方假如在場并空閑(相當于通信的另一主機開機且可以接受連接請求),拿起電話話筒,雙方就可以正式通話,相當于連 接成功。雙方通話的過程,是一方向電話機發出信號和對方從電話機接收信號的過程,相當于向socket發送數據和從socket接收數據。通話結束后,一 方掛起電話機相當于關閉socket,撤消連接。

    在電話系統中,一般用戶只能感受到本地電話機和對方電話號碼的存在,建立通話的過程,話音傳輸的過程以及整個電話系統的技術細節對他都是透明的,這也與 socket機制非常相似。socket利用網間網通信設施實現進程通信,但它對通信設施的細節毫不關心,只要通信設施能提供足夠的通信能力,它就滿足 了。

    至此,我們對socket進行了直觀的描述。抽象出來,socket實質上提供了進程通信的端點。進程通信之前,雙方首先必須各自創建一個端點,否則是沒 有辦法建立聯系并相互通信的。正如打電話之前,雙方必須各自擁有一臺電話機一樣。在網間網內部,每一個socket用一個半相關描述:

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

      一個完整的socket有一個本地唯一的socket號,由操作系統分配。

   最重要的是,socket 是面向客戶/服務器模型而設計的,針對客戶和服務器程序提供不同的socket 系統調用。客戶隨機申請一個socket (相當于一個想打電話的人可以在任何一臺入網電話上撥號呼叫),系統為之分配一個socket號;服務器擁有全局公認的 socket ,任何客戶都可以向它發出連接請求和信息請求(相當于一個被呼叫的電話擁有一個呼叫方知道的電話號碼)。

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

   -----

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

在Internet上有很多這樣的主機,這些主機一般運行了多個服務軟件,同時提供幾種服 務。每種服務都打開一個Socket,并綁定到一個端口上,不同的端口對應于不同的服務。Socket正如其英文原意那樣,象一個多孔插座。一臺主機猶如 布滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟件將插頭插到不同編號的插座,就可以得到不同的服務。