套接字學習教程之一

2021-05-06 09:44:09 字數 4033 閱讀 9752

1、概述

bsd 套接字(socket)將程序間通訊推到乙個新的水平。彼此通訊的程序可不再必須執行在同一計算機上。它們仍然還能夠執行在同一計算機上,但不再必須那樣。

不僅這些程序不必執行在同一計算機上, 它們也不必執行在同一種作業系統上。 有了 bsd 套接字,你的 freebsd 軟體能夠與執行在 macintosh ®中的程式順利的協同工作,也可以與另乙個在sun ™ 工作站上的,或是另乙個執行在 windows ® 2000中的, 只要這些系統用乙太網型的區域網相連。

你的軟體還可以很好的與執行在另一幢大樓,或是在另乙個大陸、在一艘潛艇中的,或是一架太空梭中的程序協同工作。

它也能夠與並非屬於計算機一部分(至少從術語的嚴格意義上說不是) 的元件協同工作,這種裝置像印表機、數位相機、醫療裝置,大致只要是任何能夠進行數字通訊的東西。 

2、聯網和多樣性

我們已經暗示了聯網的多樣性問題。許多不同的系統要彼此對話。它們必須說同一種語言。與此同時, 它們也必須理解同一種語言。

待續…………

人們常常認為肢體語言是通用的。事實並非如此。回想在我剛剛十幾歲時,我的父親帶我去保加利亞。一次我們正坐在索非亞一座公園裡的桌子旁,乙個小販上來向我們 推銷烤杏仁。

那時我還沒有學習多少保加利亞語,我沒有說「不」,而是搖了搖頭,那是「通用的」說的肢體語言。小販很快開始裝給我們一些杏仁。

然後我想起我曾被告知在保加利亞搖頭表示。很快,我又開始上下點頭。小販注意到了,就拿起他的杏仁走開了。對於乙個統一的觀察者,我沒有改變肢體語言:我繼續使用搖頭和點頭的語言。被改變的是肢體語言的意義。最初,小販和我將同一種語言理解為完全不同的意義。我必須校正我自己對那種語言的了解,這樣小販才會明白。

對於計算機也是同樣的:同樣的符號可能會有不同的,乃至截然相反的意義。所以,為了讓兩台計算機明白彼此,它們不僅要 對於相同的語言有默契,還必須對這種語言的理解有默契。

3、協議

當各種各樣的程式語言動輒有著複雜的語法,並且使用了許多多字母保留字(這使用它們易於被人類程式設計師明白);資料通訊的語言則傾向於簡潔。它們經常使用乙個個二進位制位,而不是多位元組單詞。 這有乙個很令人信服的理由:資料在你的計算機內部可以以光速高速行進, 而在計算機之間傳遞資料時, 速度卻會慢得多。

因為資料通訊中使用的語言很簡潔,我們通常把它們稱為協議,而不是語言。

當資料從一台計算機行進到另一台時,它一般使用超過一種協議。 這些協議是分層次的。資料可以與一頭洋蔥的芯模擬:只有你剝開幾層「表皮」 後才可取得資料。這最好用一張圖說明:

在這個例子中,我們嘗試從用乙太網連著的網頁上獲取一幅影象。

影象由原始資料組成,那是乙個我們的軟體能夠處理的(轉換為一幅並顯示在我們的顯示器上)紅綠藍 值序列。

唉,我們的軟體無法知道原始資料是如何組織的:那是乙個 紅綠藍 值序列,還是乙個灰度序列,或者可能是 cmyk 編碼的色彩?資料是表現為8位離散值,還是16位大小,或是4位?影象由多少行和列組織?有的畫素應當是透明的嗎?

我想你得到了……

為了統一我們的軟體處理原始資料的方式,資料被編碼為 png 檔案。那也可以是 gif ,或jpeg 檔案,不一定只是png 檔案。

於是png 就是一種協議。

對於這一點,我可以聽見你的喊聲:「不,那不是!那是一種檔案格式! 」

好,那當然是一種檔案格式。但從資料通訊的方面說, 一種檔案格式也是一種協議:檔案結構是一種語言,而且還是一種簡潔的語言, 與我們的程序通訊,確定資料如何被組織。因此,那是一種協議

唉,假如我們接收到的只有png 檔案,我們的軟體將要面對乙個嚴峻的問題:將如何知道資料代表一幅影象,而不是一些文字、或可能是一段聲音,或者這些都不是?其次,將如何 知道影象是png 格式的,而不是 gif ,或是jpeg ,或是其它影象格式?

要取得那些資訊,我們使用另一種協議: http 。這種協議能告訴我們資料確實代表一幅影象,並且影象使用png 協議。它也能告訴我們其它一些東西,不過還是讓我們把注意力停留在協議層次這裡吧。

至此,我們有一些資料被包裹在png 協議中,而後又被包裹在http 協議中。我們如何從伺服器上取得它?

通過在乙太網上使用tcp/ip ,這就是方法。實際上,有比三種更多的協議。我不再繼續深入了,我現在開始說說乙太網,只因為這樣更容易解釋其餘的問題。

乙太網是一種有趣的系統,它將計算機連線在乙個區域網(local area network,lan )中。 每台計算機有乙個網路介面卡(中文簡稱「網絡卡」) (network inte***ce card,nic )。 每個網絡卡有乙個唯一的48位標識 ,稱為它的位址。世界上沒有兩塊 網絡卡 會有相同的位址。

這些網絡卡 彼此相連。一旦一台計算機要與在同一乙太網區域網 中的另一台計算機通訊時,就在網路上傳送一條訊息。每個網絡卡 都會看見這條訊息。但是作為乙太網協議的一部分, 資料報含目的網絡卡 的位址(還有其它內容)。所以,在所有網絡卡中只有乙個會注意那條訊息,其餘的則會忽略。

但並非所有的計算機都被連線在同一網路上。因為我們在我們的乙太網上所接收到的資料並不意味著那一定源自於我們的區域網。可能有來自其它通過internet 與我們自己的網路相連的網路的資料來我們面前。

在internet上傳送的所有資料都使用ip 。 ip 表示網間協議(internet protocol)。它的基本功能是讓我們知道世界上的資料從**到來,應該會到**去。它並不保證我們一定會接收到資料, 只保證假如我們接收到資料時會知道它從**來。

甚至即使我們接收到資料,ip 也不保證我們會按照其它計算機傳送資料段的順序接收到這些資料段。舉個例子,我們接收到影象的中心部分可能在接收到左上角之前, 又可能在接收到右下角之後。

是tcp (transmission control protocol傳輸控制協議) 要求傳送方重發丟失的資料,並且把資料都排成正確的順序。

總結起來,一台計算機與另一台計算機通訊一幅影象的樣子需要五個不同的協議。我們接收到的資料被包裹進 png 協議,這又被包裹進 http 協議,而後又被包裹進 tcp 協議,再後來又被包裹進 ip 協議,最後被包裹進 ethernet 協議。

歐,順便說一下,可能有幾個其它的協議包含在那其中的某個位置。例如,如果我們的區域網 通過**呼叫接入 internet,就會在數據機上使用ppp 協議,而數據機還可能使用乙個(或多個)數據機協議, 等等,等等,等等……

到現在為止作為乙個開發者你應該問:「我應該如何掌握它們全部? 」

你是幸運的,你必掌握它們全部。 你只掌握其中的一部分,而不是全部。尤其你不需要擔心物理連線(在我們的情形中是乙太網和 可能的ppp 等)。你也不需要掌握網間協議, 或是傳輸控制協議。

換句話說,你不必為從其它計算機接收資料做所有的事情。 好,你又要要做什麼,事實上就像開啟乙個檔案一樣簡單。

一旦你收到資料,就需要你指出如何處理。 在我們的情形中,你需要明白http 協議和 png 檔案結構。

以此類推,所有聯網協議變成乙個灰色區域:並非因為我們不明白它們如何工作,而是因為我們不必關心它們。套接字介面為我們照管這些灰色區域:

我們只需要明白告訴我們如何理解資料的協議, 而不是如何從其它程序接收資料, 也不是如何向其它程序傳送資料。

套接字學習教程之一

1 概述 bsd 套接字 socket 將程序間通訊推到乙個新的水平。彼此通訊的程序可不再必須執行在同一計算機上。它們仍然還能夠執行在同一計算機上,但不再必須那樣。不僅這些程序不必執行在同一計算機上,它們也不必執行在同一種作業系統上。有了 bsd 套接字,你的 freebsd 軟體能夠與執行在 ma...

套接字聯網API之一 TCP套接字

最近學習了unix網路程式設計,套接字聯網api,書中的內容狠經典,很所部分的細節較少較多,主要部分的內容自己經常容易忽略。下面介紹自己理解的最基礎的內容 1.所有套接字有關的函式出錯時的返回值都是 1 2.服務端 1 建立乙個套接字 int socket int,int,int 2 與位址和埠繫結...

XML簡易教程之一

在intel的早期,andy grove遇到乙個雇員 他 建議公司在晶元的基礎上開發個人計算機。andy grove疑問道 個人計算機能做什麼呢?這個 雇員舉例說,它可以儲存處方。grove考慮到整個 研究 開發和市場費用要數百萬美圓,最終決定 以為紅綠燈提供晶元作為開始。每個人都是事後諸葛亮。an...