1. 程式人生 > >各種網路通訊協議的區別 Socket web-socket restful 與 TCP/IP IOS七層協議

各種網路通訊協議的區別 Socket web-socket restful 與 TCP/IP IOS七層協議

轉載自: https://www.jianshu.com/p/9a829ddc05f5 

這裡還有一篇類似的文章: https://www.jianshu.com/p/947a2673102a

這篇文章加了soap的講解: https://segmentfault.com/q/1010000003064904

 

不過上面這些都是遠端呼叫的協議, 想要理解為什麼遠端呼叫需要這麼多複雜的規範協議 我們必須要了解本地呼叫(PID通訊):

這裡有幾篇文章可供參考:

https://akaedu.github.io/book/ch30s04.html

https://zhuanlan.zhihu.com/p/37370601

  深入理解python程序之間如何通訊 圖文版

 

對於TCP,Http,Socket這些名詞,你是否熟悉呢,他們有哪些異同點呢?帶著這些疑問,開始我們的學習之旅

故事還要從七層網路協議開始...

七層網路協議

  • 物理層 建立、維護、斷開物理連線。(由底層網路定義協議)
  • 資料鏈路層 建立邏輯連線、進行硬體地址定址、差錯校驗等功能。(由底層網路定義協議)
  • 網路層 進行邏輯地址定址,實現不同網路之間的路徑選擇。
    常見協議有:ICMP IGMP IP(IPV4 IPV6) ARP RARP
  • 傳輸層 定義傳輸資料的協議埠號,以及流控和差錯校驗。
    常見協議有:TCP UDP,資料包一旦離開網絡卡即進入網路傳輸層
  • 會話層 建立、管理、終止會話。(在五層模型裡面已經合併到了應用層)
    對應主機程序,指本地主機與遠端主機正在進行的會話。
  • 表示層 資料的表示、安全、壓縮。(在五層模型裡面已經合併到了應用層)
    常見格式有,JPEG、ASCll、DECOIC、加密格式等
  • 應用層 網路服務與終端使用者的一個介面。
    常見協議有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP

七層網路協議

IP TCP UDP HTTP

通過對七層網路協議的瞭解,IP協議對應網路層,TCP協議對應於傳輸層,而http協議對應於應用層,從本質上來說,三者是不同層面的東西,如果打個比方的話,IP就像高速公路,TCP就如同卡車,http就如同貨物,貨物要裝載在卡車並通過高速公路才能從一個地點送到另一個地點。

那TCP與UDP的區別又是什麼呢?

  • TCP 傳輸控制協議,Transmission Control Protocol
    TCP是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。

  • UDP 使用者資料報協議,User Datagram Protocol
    UDP是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務。

TCP是面向連線的傳輸控制協議,提供可靠的資料服務(類似於打電話)
UDP是提供無連線的資料報服務,傳輸不可靠,可能丟包(類似於發簡訊)
TCP首部開銷20位元組,UDP首部開銷8位元組
TCP只能是點到點的連線,UDP支援一對一,一對多,多對一,多對多的互動通訊
TCP邏輯通訊通道是全雙工的可靠通道,UDP則是不可靠通道

注:什麼是單工、半雙工、全工通訊?
資訊只能單向傳送為單工;
資訊能雙向傳送但不能同時雙向傳送稱為半雙工;
資訊能夠同時雙向傳送則稱為全雙工。

TCP的三次握手

TCP建立一個連線需要3次握手IP資料包,斷開連線需要4次握手。TCP因為建立連線、釋放連線、IP分組校驗排序等需要額外工作,速度較UDP慢許多。TCP適合傳輸資料,UDP適合流媒體

第一次握手:客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。

 

tcp-ip-handshark.png

Socket

我們知道兩個程序如果需要進行通訊最基本的一個前提能能夠唯一的標示一個程序,在本地程序通訊中我們可以使用PID來唯一標示一個程序,但PID只在本地唯一,網路中的兩個程序PID衝突機率很大,這時候我們需要另闢它徑了,我們知道IP層的ip地址可以唯一標示主機,而TCP層協議和埠號可以唯一標示主機的一個程序,這樣我們可以利用ip地址+協議+埠號唯一標示網路中的一個程序。

能夠唯一標示網路中的程序後,它們就可以利用socket進行通訊了,什麼是socket呢?我們經常把socket翻譯為套接字,socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層複雜的操作抽象為幾個簡單的介面供應用層呼叫已實現程序在網路中通訊。

 

socket.jpg

socket起源於UNIX,在Unix一切皆檔案哲學的思想下,socket是一種"開啟—讀/寫—關閉"模式的實現,伺服器和客戶端各自維護一個"檔案",在建立連線開啟後,可以向自己檔案寫入內容供對方讀取或者讀取對方內容,通訊結束時關閉檔案。

Socket通訊流程
socket是"開啟—讀/寫—關閉"模式的實現,以使用TCP協議通訊的socket為例,其互動流程大概是下圖這樣的:

socket-workflow.png

WebSocket

WebSocket protocol 是HTML5一種新的協議。它實現了瀏覽器與伺服器全雙工通訊,能更好的節省伺服器資源和頻寬並達到實時通訊它建立在TCP之上,同 HTTP一樣通過TCP來傳輸資料。WebSocket同HTTP一樣也是應用層的協議,並且一開始的握手也需要藉助HTTP請求完成。

它和 HTTP 最大不同是:

  • WebSocket 是一種雙向通訊協議,在建立連線後,WebSocket 伺服器和 Browser/Client Agent 都能主動的向對方傳送或接收資料,就像 Socket 一樣;
  • WebSocket 需要類似 TCP 的客戶端和伺服器端通過握手連線,連線成功後才能相互通訊。

HTTP請求客戶端伺服器互動圖

http-client-server.jpg

 

WebSocket客戶端伺服器互動圖

websocket-client-server.jpg

 

上圖對比可以看出,相對於傳統 HTTP 每次請求-應答都需要客戶端與服務端建立連線的模式,WebSocket 是類似 Socket 的 TCP 長連線的通訊模式,一旦 WebSocket 連線建立後,後續資料都以幀序列的形式傳輸。在客戶端斷開 WebSocket 連線或 Server 端斷掉連線前,不需要客戶端和服務端重新發起連線請求。在海量併發及客戶端與伺服器互動負載流量大的情況下,極大的節省了網路頻寬資源的消耗,有明顯的效能優勢,且客戶端傳送和接受訊息是在同一個持久連線上發起,實時性優勢明顯。

WebSocket連線過程(握手)

從WebSocket客戶端伺服器互動圖可以看出,在WebSocket中,只需要伺服器和瀏覽器通過HTTP協議進行一個握手的動作,然後單獨建立一條TCP的通訊通道進行資料的傳送。

  1. 瀏覽器,伺服器建立TCP連線,三次握手。這是通訊的基礎,傳輸控制層,若失敗後續都不執行。
  2. TCP連線成功後,瀏覽器通過HTTP協議向伺服器傳送WebSocket支援的版本號等資訊。(開始前的HTTP握手)
  3. 伺服器收到客戶端的握手請求後,同樣採用HTTP協議回饋資料。
  4. 當收到了連線成功的訊息後,通過TCP通道進行傳輸通訊。

RPC

Remote Procedure Call 遠端過程呼叫
它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通訊程式之間攜帶資訊資料。在OSI網路通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網路分散式多程式在內的應用程式更加容易。

先說說RPC服務的基本架構吧。一個完整的RPC架構裡面包含了四個核心的元件,分別是Client ,Server,Client Stub以及Server Stub,這個Stub大家可以理解為存根。

 

rpc-architecture.jpg

  • 客戶端(Client),服務的呼叫方。
  • 服務端(Server),真正的服務提供者。
  • 客戶端存根,存放服務端的地址訊息,再將客戶端的請求引數打包成網路訊息,然後通過網路遠端傳送給服務方。
  • 服務端存根,接收客戶端傳送過來的訊息,將訊息解包,並呼叫本地的方法。

RPC採用客戶機/伺服器模式,通訊是建立在Socket之上的,出於一種類比的願望,在一臺機器上執行的主程式,可以呼叫另一臺機器上準備好的子程式,就像LPC(本地過程呼叫)。請求程式就是一個客戶機,而服務提供程式就是一個伺服器。首先,呼叫程序傳送一個有程序引數的呼叫資訊到服務程序,然後等待應答資訊。在伺服器端,程序保持睡眠狀態直到呼叫資訊的到達為止。當一個呼叫資訊到達,伺服器獲得程序引數,計算結果,傳送答覆資訊,然後等待下一個呼叫資訊,最後,客戶端呼叫過程接收答覆資訊,獲得程序結果,然後呼叫執行繼續進行。

RPC vs HTTP

  • 論複雜度,RPC框架肯定是高於簡單的HTTP介面的。但毋庸置疑,HTTP介面由於受限於HTTP協議,需要帶HTTP請求頭,還有三次握手,導致傳輸起來效率或者說安全性不如RPC。
  • HTTP是一種協議,RPC可以通過HTTP來實現,也可以通過Socket自己實現一套協議來實現.
  • RPC更是一個軟體結構概念,是構建分散式應用的理論基礎。就好比為啥你家可以用到發電廠發出來的電?是因為電是可以傳輸的。至於用銅線還是用鐵絲還是其他 種類的導線,也就是用http還是用其他協議的問題了。

Rest & Restful

Rest全稱是Representational State Transfer,中文意思是表述性狀態轉移。Rest指的是一組架構約束條件和原則。如果一個架構符合Rest的約束條件和原則,我們就稱它為Restful架構。

然而Rest本身並沒有創造新的技術、元件或服務,而隱藏在Restful背後的理念就是使用Web的現有特徵和能力, 更好地使用現有Web標準中的一些準則和約束。我們現在所說的Rest是基於HTTP協議之上來講的,但Rest架構風格並不是繫結在HTTP上,只不過目前HTTP是唯一與Rest相關的例項。

Rest架構的主要原則

  • 在Rest中的一切都被認為是一種資源。
  • 每個資源由URI標識。
  • 使用統一的介面。處理資源使用POST,GET,PUT,DELETE操作類似建立,讀取,更新和刪除(CRUD)操作。
  • 無狀態:每個請求是一個獨立的請求。從客戶端到伺服器的每個請求* * 都必須包含所有必要的資訊,以便於理解。
  • 同一個資源具有多種表現形式,例如XML,JSON

Restful API 簡單例子

[POST]     http://localhost/users   // 新增
[GET]      http://localhost/users/1 // 查詢
[PATCH]    http://localhost/users/1 // 更新
[PUT]      http://localhost/users/1 // 覆蓋,全部更新
[DELETE]   http://localhost/users/1 // 刪除



作者:陽光的記憶
連結:https://www.jianshu.com/p/9a829ddc05f5
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。