套接字有哪些类型?socket有哪些类型?
這個世界上有很多種套接字(socket),比如 DARPA Internet 地址(Internet 套接字)、本地節點的路徑名(Unix套接字)、CCITT X.25地址(X.25 套接字)等。但本教程只講第一種套接字——Internet 套接字,它是最具代表性的,也是最經典最常用的。以后我們提及套接字,指的都是 Internet 套接字。
根據數據的傳輸方式,可以將 Internet 套接字分成兩種類型。通過 socket() 函數創建連接時,必須告訴它使用哪種數據傳輸方式。
流格式套接字(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 來傳輸數據,因為首先要保證通信的效率,盡量減小延遲,而數據的正確性是次要的,即使丟失很小的一部分數據,視頻和音頻也可以正常解析,最多出現噪點或雜音,不會對通信質量有實質的影響。
總結
以上是生活随笔為你收集整理的套接字有哪些类型?socket有哪些类型?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HBase 简介
- 下一篇: 面向连接和无连接的套接字到底有什么区别?