C語言中文網 目錄
首頁 > socket 閱讀:3,677

套接字有哪些類型?socket有哪些類型?

這個世界上有很多種套接字(socket),比如 DARPA Internet 地址(Internet 套接字)、本地節點的路徑名(Unix套接字)、CCITT X.25地址(X.25 套接字)等。但本教程只講第一種套接字——Internet 套接字,它是最具代表性的,也是最經典最常用的。以后我們提及套接字,指的都是 Internet 套接字。

根據數據的傳輸方式,可以將 Internet 套接字分成兩種類型。通過 socket() 函數創建連接時,必須告訴它使用哪種數據傳輸方式。
Internet 套接字其實還有很多其它數據傳輸方式,但是我可不想嚇到你,本教程只講常用的兩種。

流格式套接字(SOCK_STREAM)

流格式套接字(Stream Sockets)也叫“面向連接的套接字”,在代碼中使用 SOCK_STREAM 表示。

SOCK_STREAM 是一種可靠的、雙向的通信數據流,數據可以準確無誤地到達另一臺計算機,如果損壞或丟失,可以重新發送。
流格式套接字有自己的糾錯機制,在此我們就不討論了。
SOCK_STREAM 有以下幾個特征:
  • 數據在傳輸過程中不會消失;
  • 數據是按照順序傳輸的;
  • 數據的發送和接收不是同步的(有的教程也稱“不存在數據邊界”)。

可以將 SOCK_STREAM 比喻成一條傳送帶,只要傳送帶本身沒有問題(不會斷網),就能保證數據不丟失;同時,較晚傳送的數據不會先到達,較早傳送的數據不會晚到達,這就保證了數據是按照順序傳遞的。

將面向連接的套接字比喻成傳送帶

為什么流格式套接字可以達到高質量的數據傳輸呢?這是因為它使用了 TCP 協議(The Transmission Control Protocol,傳輸控制協議),TCP 協議會控制你的數據按照順序到達并且沒有錯誤。

你也許見過 TCP,是因為你經常聽說“TCP/IP”。TCP 用來確保數據的正確性,IP(Internet Protocol,網絡協議)用來控制數據如何從源頭到達目的地,也就是常說的“路由”。

那么,“數據的發送和接收不同步”該如何理解呢?

假設傳送帶傳送的是水果,接收者需要湊齊 100 個后才能裝袋,但是傳送帶可能把這 100 個水果分批傳送,比如第一批傳送 20 個,第二批傳送 50 個,第三批傳送 30 個。接收者不需要和傳送帶保持同步,只要根據自己的節奏來裝袋即可,不用管傳送帶傳送了幾批,也不用每到一批就裝袋一次,可以等到湊夠了 100 個水果再裝袋。

流格式套接字的內部有一個緩沖區(也就是字符數組),通過 socket 傳輸的數據將保存到這個緩沖區。接收端在收到數據后并不一定立即讀取,只要數據不超過緩沖區的容量,接收端有可能在緩沖區被填滿以后一次性地讀取,也可能分成好幾次讀取。

也就是說,不管數據分幾次傳送過來,接收端只需要根據自己的要求讀取,不用非得在數據到達時立即讀取。傳送端有自己的節奏,接收端也有自己的節奏,它們是不一致的。

流格式套接字有什么實際的應用場景嗎?瀏覽器所使用的 http 協議就基于面向連接的套接字,因為必須要確保數據準確無誤,否則加載的 HTML 將無法解析。

數據報格式套接字(SOCK_DGRAM)

數據報格式套接字(Datagram Sockets)也叫“無連接的套接字”,在代碼中使用 SOCK_DGRAM 表示。

計算機只管傳輸數據,不作數據校驗,如果數據在傳輸中損壞,或者沒有到達另一臺計算機,是沒有辦法補救的。也就是說,數據錯了就錯了,無法重傳。

因為數據報套接字所做的校驗工作少,所以在傳輸效率方面比流格式套接字要高。

可以將 SOCK_DGRAM 比喻成高速移動的摩托車快遞,它有以下特征:
  • 強調快速傳輸而非傳輸順序;
  • 傳輸的數據可能丟失也可能損毀;
  • 限制每次傳輸的數據大小;
  • 數據的發送和接收是同步的(有的教程也稱“存在數據邊界”)。

眾所周知,速度是快遞行業的生命。用摩托車發往同一地點的兩件包裹無需保證順序,只要以最快的速度交給客戶就行。這種方式存在損壞或丟失的風險,而且包裹大小有一定限制。因此,想要傳遞大量包裹,就得分配發送。

將無連接套接字比喻成摩托車快遞

另外,用兩輛摩托車分別發送兩件包裹,那么接收者也需要分兩次接收,所以“數據的發送和接收是同步的”;換句話說,接收次數應該和發送次數相同。

總之,數據報套接字是一種不可靠的、不按順序傳遞的、以追求速度為目的的套接字。

數據報套接字也使用 IP 協議作路由,但是它不使用 TCP 協議,而是使用 UDP 協議(User Datagram Protocol,用戶數據報協議)。

QQ 視頻聊天和語音聊天就使用 SOCK_DGRAM 來傳輸數據,因為首先要保證通信的效率,盡量減小延遲,而數據的正確性是次要的,即使丟失很小的一部分數據,視頻和音頻也可以正常解析,最多出現噪點或雜音,不會對通信質量有實質的影響。
注意:SOCK_DGRAM 沒有想象中的糟糕,不會頻繁的丟失數據,數據錯誤只是小概率事件。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo