Socket 的功能 和 通訊端的三種類型

來源:互聯網
上載者:User

 轉載自  http://blog.chinaunix.net/uid-22240661-id-1781638.html

6.2.2  Socket的功能
    Socket的英文原意就是“孔”或“插座”,現在,作為BSD UNIX的進程通訊機制,取其後一種意義。日常生活中常見的插座,有的是訊號插座,有的是電源插座,有的可以接受訊號(或能量),有的可以發送訊號(或能量)。假如電話線與電話機之間安放一個插座(相當於二者之間的介面,這一部分裝置物理上是存在的)則Socket非常相似於電話插座。

    將電話系統與連線導向的Socket機制相比,有著驚人相似的地方。以一個國家級的電話網為例。電話的通話雙方相當於相互連信的兩個進程;通話雙方所在的地區(享有一個全域唯一的區號)相當於一個網路,區號是它的網路地址;區內的一個單位的交換器相當於一台主機,主機分配給每個使用者的局內號碼相當於Socket號(下面將談到)。

    任何使用者在通話之前,首先要佔有一部電話機,相當於申請一個Socket號;同時要知道對方的電話號碼,相當於對方有一個 Socket。然後向對方撥號呼叫,相當於發出串連請求(假如對方不在同一區內,還要撥對方區號,相當於給出網路地址)。對方假如在場並空閑(相當於通訊的另一主機開機且可以接受串連請求),拿起電話話筒,雙方就可以正式通話,相當於串連成功。雙方通話的過程,是向電話機發出訊號和從電話機接受訊號的過程,相當於向Socket發送資料和從Socket接受資料。通話結束後,一方掛起電話機,相當於關閉Socket,撤消串連。

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

    至此,我們對Socket進行了直觀的描述。抽象出來,Socket實質上提供了進程通訊的端點。進程通訊之前,雙方首先必須各自建立一個端點,否則是沒有辦法建立聯絡並相互連信的。正如打電話之前,雙方必須各自擁有一台電話機一樣。

    每一個Socket都用一個半相關描述:
         {協議,本地地址,本地連接埠}
    一個完整的Socket則用一個相關描述:
         {協議,本地地址,本地連接埠,遠程地址,遠程連接埠}
    每一個Socket有一個本地的唯一Socket號,由作業系統分配。

    最重要的是,Socket是面向客戶-伺服器模型而設計的,針對客戶和伺服器程式提供不同的Socket系統調用。客戶隨機申請一個 Socket號(相當於一個想打電話的人可以在任何一台入網的電話上撥叫呼叫);伺服器擁有全域公認的Socket,任何客戶都可以向它發出串連請求和資訊請求(相當於一個被呼叫的電話擁有一個來電者知道的電話號碼)                          。
    Socket 利用客戶-伺服器模式巧妙的解決了進程之間建立通訊串連的問題。伺服器Socket為全域所公認非常重要。兩個完全隨機的使用者進程之間,因為沒有任何一方的Socket是固定的,就像打電話卻不知道別人的電話號碼,要通話是不可能的。
        

6.2.3  通訊端的三種類型
    通訊端有三種類型:流式通訊端(SOCK_STREAM),資料通訊端(SOCK_DGRAM)及原始通訊端。
    1.流式通訊端(SOCK_STREAM)
    流式的通訊端可以提供可靠的、連線導向的通訊流。如果你通過流式通訊端發送了順序的資料:“1”“2”,那麼資料到達遠程時候的順序也是“1”“2”。
    流式通訊端可以做什麼呢?你聽說過Telnet應用程式嗎?聽過?哦,最常用的BBS服務,以及系統的遠程登陸都是通過Telnet協議串連的。Telnet就是一個流式串連。你是否希望你在Telnet應用程式上輸入的字元(或漢字)在到達遠程應用程式的時候是以你輸入的順序到達的?答案應該是肯定的吧。還有WWW瀏覽器,它使用的HTTP協議也是通過流式通訊端來擷取網頁的。事實上,如果你Telnet到一個Web Site的80連接埠上,然後輸入“GET網頁路徑名”然後按兩下斷行符號(或者是兩下 Ctrl+斷行符號)然後你就得到了“網頁路徑名”所代表的網頁!
    流式通訊端是怎樣保證這種應用程式層次上的資料轉送品質呢?它使用了TCP(The Transmission Control Protocol)協議(可以參考RFC-793來得到TCP的細節)。TCP保證了你的資料轉送是正確的,並且是順序的。TCP是經常出現的TCP/IP中的前半部分。IP代表Internet Protocol(網際網路協議,參考RFC-791)IP只處理網路路由。

    2.資料通訊端(SOCK_DGRAM)
    資料通訊端定義了一種不需連線的服務,資料通過相互獨立的報文進行傳輸,是無序的,並且不保證可靠,無差錯。原始通訊端允許對低層協議如IP或ICMP直接存取,主要用於新的網路通訊協定實現的測試等。
    資料通訊端(Datagram Sockets)怎樣呢?為什麼它叫做“無串連”?應該怎樣處理它們呢?為什麼它們是不可靠的?好的,這裡有一些事實:
    ·如果你發送了一個資料報,它可能不會到達。
    ·它可能會以不同的順序到達。
    ·如果它到達了,它包含的資料中可能存在錯誤。
    資料通訊端也使用IP,但是它不使用TCP,它使用使用者資料報協議UDP(User Datagram Protocol可以參考RFC 768)
    為什麼說它們是“無串連”的呢?因為它(UDP)不像流式通訊端那樣維護一個開啟的串連,你只需要把資料打成一個包,把遠端IP貼上去,然後把這個包發送出去。這個過程是不需要建立串連的。UDP的應用例子有:tftp, bootp等。
     那麼,資料包既然會丟失,怎樣能保證程式能夠正常工作呢?事實上,每個使用UDP的程式都要有自己的對資料進行確認的協議。比如,TFTP協議定義了對於每一個發送出去的資料包,遠程在接受到之後都要回送一個資料包告訴本地程式:“我已經拿到了!(一個“ACK”包)。如果資料包發的送者在5秒內沒有的得到回應,它就會重新發送這個資料包直到資料包接受者回送了“ACK”訊號。這些知識對編寫一個使用UDP協議的程式員來說是非常必要的。
    無串連伺服器一般都是面向交易處理的,一個請求一個應答就完成了客戶程式與服務程式之間的相互作用。連線導向伺服器處理的請求往往比較複雜,不是一來一去的請求應答所能解決的,而且往往是並發伺服器。

    通訊端工作過程如下:伺服器首先啟動,通過調用socket()建立一個通訊端,然後調用bind()將該通訊端和本網地址聯絡在一起,再調用listen()使通訊端做好偵聽的準備,並規定它的請求隊列的長度,之後就調用accept()來接收串連。客戶在建立通訊端後就可調用connect()和伺服器建立串連。串連一旦建立,客戶機和伺服器之間就可以通過調用read()和write()來發送和接收資料。最後,待資料傳送結束後,雙方調用close()關閉通訊端。
    3.原始通訊端
    原始通訊端主要用於一些協議的開發,可以進行比較底層的操作。它功能強大,但是沒有上面介紹的兩種通訊端使用方便,一般的程式也涉及不到原始通訊端。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.