1. 程式人生 > >Socket 的功能 和 套接字的三種類型

Socket 的功能 和 套接字的三種類型

 轉載自  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.原始套接字
    原始套接字主要用於一些協議的開發,可以進行比較底層的操作。它功能強大,但是沒有上面介紹的兩種套接字使用方便,一般的程式也涉及不到原始套接字。

相關推薦

Socket功能 種類

 轉載自  http://blog.chinaunix.net/uid-22240661-id-1781638.html 6.2.2  Socket的功能    Socket的英文原意就是“孔”或“插座”,現在,作為BSD UNIX的程序通訊機制,取其後一種意義。日常生

sanic官方文檔解析之Custom Protocols(自定義協議)Socket(網絡)

t對象 class back main times bin num urn 錯誤處理 1,Custom Protocol:自定義協議 溫馨提示:自定義協議是一個高級用法,大多數的讀者不需要用到此功能 通過特殊的自定義協議,你可以改變sanic的協議,自定義協議需要繼承子

Socket程式設計】【第一節】【Socket基本原理

參考http://c.biancheng.net/view/2351.html 一、scoket套接字(告訴你使用哪種資料傳輸方式) 這個世界上有很多種套接字(socket),比如 DARPA Internet 地址(Internet 套接字)、本地節點的路徑名(Unix套接字)、CCITT X.25地址(X

網絡編程-socket實現簡單通信

分享 系統 phone ddr image 實現 nec 技術分享 ron Service import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#給予網絡,機於TCP協議的通信 #端口0-

【Java TCP/IP Socket程式設計】--------UDP Socket

目錄   簡介 UDP通訊 UDP通訊案例 UDP套接字注意點 簡介 UDP是面向無連線的協議,在資料傳輸時,資料的傳送端和接收端不建立邏輯上的連線。當一臺計算機向另外一臺計算機發送資料時,傳送端不會確認接收端是否存在,同樣接收端接收到資料時,也不會發送反饋

【Java TCP/IP Socket程式設計】--------TCP Socket

簡介     TCP通訊嚴格區分客戶端和伺服器端,通訊時客戶端發起請求連線伺服器端才能實現通訊,伺服器端不能主動連線客戶端。Java為TCP協議提供了兩個類:Socket類和ServerSocket類,一個Socket例項代表了TCP連線的客戶端,而ServerSocket例

淺談長連keepalive重用reuse對高並發的影響

細節 並不會 rift 兩個 千萬 也會 keepalive 是否 sdk 做采集系統有兩年了,第一年主要的設計和代碼邏輯是別人寫的。但是問題很多。 第二年真正由我接手後,修復了大量的業務邏輯。 遇到的一個核心問題就是數據丟失。最近客戶也在問我采集上報的機制,是否使用長

網路程式設計中time_wait的作用選項SO_REUSEADDR

這兩天看APUE為一個簡單的問題特別惱火,該問題起源於兩個套接字選項就是SO_REUSEADDR和SO_REUSEPORT其實在看的過程中問學長了,學長解釋的也比較清楚,就是自己悟性不好,一時半會沒理解。自己在網上找了幾篇優秀的部落格看了,受益頗多! 先從套接字選項SO_REUSEADD

TCP協議、IP層之間的介面

1、TCP和套接字層之間的介面 TCP和套接字之間的介面資料結構是struct proto,這個結構體的元素是一系列的函式指標,從tcp_close到tcp_shutdown函式是tcp連線管理處理函式。TCP資料接受函式是tcp_recvmsg和tcp_v4_do_rcv函式實現。struct

網路程式設計——1. 理解網路程式設計

1.1 理解網路程式設計和套接字 網路程式設計和套接字概要 1)首先需要物理連線,如今大部分計算機都已經連線到網際網路,因此不用擔心這一點 2)資料傳輸軟體。作業系統會提供名為“套接字”的部件,套接字是網路資料傳輸用的軟體裝置。 構建接電話套接字 1)安裝電

socket:通常每個地址(協議/網路地址/埠)只允許使用一次

今天在自己寫的C/S的Server端重啟監聽時遇到的問題,原因應該是正在Accept狀態的listenSocket未能關閉,二次分配相同的埠時引發了異常。網上查看了多人的觀點,隨手記一下。 大致的處理辦法有兩類: 一是想辦法把埠關掉;二是使用埠複用忽略掉這種異常。 第一類辦

Linux下的raw Socket(原始)程式設計

前言 簡介 最近專案需要用到rawSocket來進行自定義IP報文的源地址。 windows從winxp sp2開始便對raw socket進行了限制。 【1】只能傳送UDP包 【2】只能傳送正確的UDP包 【3】不能冒充源地址,即,源地址只能填本機地址。

多程序程式設計之程序間通訊-共享記憶體,訊號量

1. 背景 本文將介紹程序通訊中的訊號量,共享記憶體和套接字方法。 2. 訊號量 2.1 訊號量的定義 為了防止出現因多個程式同時訪問一個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有一個執行執行緒

《TCP/IP網路程式設計》第一章:理解網路程式設計 筆記

第一章:理解網路程式設計和套接字 本章程式碼,在TCP-IP-NetworkNote中可以找到。 1.1 理解網路程式設計和套接字 1.1.1構建打電話套接字 以電話機打電話的方式來理解套接字。 呼叫 socket 函式(安裝電話機)時進行的對話: 問:接

Linux Socket學習 -- 無名 AF_UNIX

來源: http://mylxiaoyi.iteye.com/blog/313863 無名套介面 套介面並不總是需要有一個地址。例如, socketpair函式建立了兩個彼此相連的兩個套介面,但是卻沒有地址。實際上,他們是無名套介面。想像一下冷戰期間美國總統與蘇聯之間的紅

使用DatagramSocket傳送、接收資料(Socket之UDP)

17.4.2 使用DatagramSocket傳送、接收資料(1) Java使用DatagramSocket代表UDP協議的Socket,DatagramSocket本身只是碼頭,不維護狀態,不能產生IO流,它的唯一作用就是接收和傳送資料報,Java使用DatagramP

走入計算機的第十四天(基於tcpudp的

recv 設置 內存 tcp list dup lis 不知道 狀態 一 TCP套接字 1 low版TCP套接字 服務器端                              客戶端        2、改進版tcp套接字           服務端   

Socket()在服務器端客戶端之間的基本工作原理

SocketSocket之間的連接過程主要可以概括為以下三步: 服務器建立監聽:客戶端初始化Socket動態庫後創建套接字,然後指定客戶端Socket的地址,循環綁定Socket直至成功,然後開始建立監聽,此時客戶端處於等待狀態,實時監控網絡狀態; 客戶端提出請求:客戶端的Socket向服務器端提出

socket--概念例項

套接字 socket   套接字概念 套接字是一種程序間通訊的方法,不同於以往介紹的的程序通訊方法的是,它並不侷限於同一臺計算機的資源,例如共享內容或者訊息佇列。 一臺機器上的程序可以使用套接字與另一臺機器上的程序通訊。因此客戶與伺服器可以分散到網路中。 同一臺機器的程

Windows Socket)-MFC程式設計

同步:指傳送方發出資料後,等收到接收方發回的響應,才發下一個數據包的通訊方式 非同步:指的是傳送方不等接收方響應,便接著發下個數據包的通訊方式; 阻塞:指呼叫某函式時,直到該函式完成操作,才返回;否則一直阻塞在該呼叫上 非阻塞:指呼叫某操作時,不管操作是否成功都立即返回,而不