對于TCP,Http,Socket這些名詞,你是否熟悉呢,他們有哪些異同點呢?帶著這些疑問,開始我們的學(xué)習(xí)之旅
故事還要從七層網(wǎng)絡(luò)協(xié)議開始...
七層網(wǎng)絡(luò)協(xié)議
- 物理層 建立、維護、斷開物理連接。(由底層網(wǎng)絡(luò)定義協(xié)議)
- 數(shù)據(jù)鏈路層 建立邏輯連接、進行硬件地址尋址、差錯校驗等功能。(由底層網(wǎng)絡(luò)定義協(xié)議)
-
網(wǎng)絡(luò)層 進行邏輯地址尋址,實現(xiàn)不同網(wǎng)絡(luò)之間的路徑選擇。
??常見協(xié)議有:ICMP IGMP IP(IPV4 IPV6) ARP RARP -
傳輸層 定義傳輸數(shù)據(jù)的協(xié)議端口號,以及流控和差錯校驗。
??常見協(xié)議有:TCP UDP,數(shù)據(jù)包一旦離開網(wǎng)卡即進入網(wǎng)絡(luò)傳輸層 -
會話層 建立、管理、終止會話。(在五層模型里面已經(jīng)合并到了應(yīng)用層)
??對應(yīng)主機進程,指本地主機與遠程主機正在進行的會話。 -
表示層 數(shù)據(jù)的表示、安全、壓縮。(在五層模型里面已經(jīng)合并到了應(yīng)用層)
??常見格式有,JPEG、ASCll、DECOIC、加密格式等 -
應(yīng)用層 網(wǎng)絡(luò)服務(wù)與最終用戶的一個接口。
??常見協(xié)議有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP

IP TCP UDP HTTP
通過對七層網(wǎng)絡(luò)協(xié)議的了解,IP協(xié)議對應(yīng)網(wǎng)絡(luò)層,TCP協(xié)議對應(yīng)于傳輸層,而http協(xié)議對應(yīng)于應(yīng)用層,從本質(zhì)上來說,三者是不同層面的東西,如果打個比方的話,IP就像高速公路,TCP就如同卡車,http就如同貨物,貨物要裝載在卡車并通過高速公路才能從一個地點送到另一個地點。
那TCP與UDP的區(qū)別又是什么呢?
TCP 傳輸控制協(xié)議,Transmission Control Protocol
TCP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。UDP 用戶數(shù)據(jù)報協(xié)議,User Datagram Protocol
UDP是OSI(Open System Interconnection,開放式系統(tǒng)互聯(lián)) 參考模型中一種無連接的傳輸層協(xié)議,提供面向事務(wù)的簡單不可靠信息傳送服務(wù)。
TCP是面向連接的傳輸控制協(xié)議,提供可靠的數(shù)據(jù)服務(wù)(類似于打電話)
UDP是提供無連接的數(shù)據(jù)報服務(wù),傳輸不可靠,可能丟包(類似于發(fā)短信)
TCP首部開銷20字節(jié),UDP首部開銷8字節(jié)
TCP只能是點到點的連接,UDP支持一對一,一對多,多對一,多對多的交互通信
TCP邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
注:什么是單工、半雙工、全工通信?
信息只能單向傳送為單工;
信息能雙向傳送但不能同時雙向傳送稱為半雙工;
信息能夠同時雙向傳送則稱為全雙工。
TCP的三次握手
TCP建立一個連接需要3次握手IP數(shù)據(jù)包,斷開連接需要4次握手。TCP因為建立連接、釋放連接、IP分組校驗排序等需要額外工作,速度較UDP慢許多。TCP適合傳輸數(shù)據(jù),UDP適合流媒體
第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包(syn=k),即SYN+ACK包,此時服務(wù)器進入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進入ESTABLISHED狀態(tài),完成三次握手。

Socket
我們知道兩個進程如果需要進行通訊最基本的一個前提能能夠唯一的標(biāo)示一個進程,在本地進程通訊中我們可以使用PID來唯一標(biāo)示一個進程,但PID只在本地唯一,網(wǎng)絡(luò)中的兩個進程PID沖突幾率很大,這時候我們需要另辟它徑了,我們知道IP層的ip地址可以唯一標(biāo)示主機,而TCP層協(xié)議和端口號可以唯一標(biāo)示主機的一個進程,這樣我們可以利用ip地址+協(xié)議+端口號唯一標(biāo)示網(wǎng)絡(luò)中的一個進程。
能夠唯一標(biāo)示網(wǎng)絡(luò)中的進程后,它們就可以利用socket進行通信了,什么是socket呢?我們經(jīng)常把socket翻譯為套接字,socket是在應(yīng)用層和傳輸層之間的一個抽象層,它把TCP/IP層復(fù)雜的操作抽象為幾個簡單的接口供應(yīng)用層調(diào)用已實現(xiàn)進程在網(wǎng)絡(luò)中通信。

socket起源于UNIX,在Unix一切皆文件哲學(xué)的思想下,socket是一種"打開—讀/寫—關(guān)閉"模式的實現(xiàn),服務(wù)器和客戶端各自維護一個"文件",在建立連接打開后,可以向自己文件寫入內(nèi)容供對方讀取或者讀取對方內(nèi)容,通訊結(jié)束時關(guān)閉文件。
Socket通信流程
socket是"打開—讀/寫—關(guān)閉"模式的實現(xiàn),以使用TCP協(xié)議通訊的socket為例,其交互流程大概是下圖這樣的:

WebSocket
WebSocket protocol 是HTML5一種新的協(xié)議。它實現(xiàn)了瀏覽器與服務(wù)器全雙工通信,能更好的節(jié)省服務(wù)器資源和帶寬并達到實時通訊它建立在TCP之上,同 HTTP一樣通過TCP來傳輸數(shù)據(jù)。WebSocket同HTTP一樣也是應(yīng)用層的協(xié)議,并且一開始的握手也需要借助HTTP請求完成。
它和 HTTP 最大不同是:
- WebSocket 是一種雙向通信協(xié)議,在建立連接后,WebSocket 服務(wù)器和 Browser/Client Agent 都能主動的向?qū)Ψ桨l(fā)送或接收數(shù)據(jù),就像 Socket 一樣;
- WebSocket 需要類似 TCP 的客戶端和服務(wù)器端通過握手連接,連接成功后才能相互通信。
HTTP請求客戶端服務(wù)器交互圖

WebSocket客戶端服務(wù)器交互圖

上圖對比可以看出,相對于傳統(tǒng) HTTP 每次請求-應(yīng)答都需要客戶端與服務(wù)端建立連接的模式,WebSocket 是類似 Socket 的 TCP 長連接的通訊模式,一旦 WebSocket 連接建立后,后續(xù)數(shù)據(jù)都以幀序列的形式傳輸。在客戶端斷開 WebSocket 連接或 Server 端斷掉連接前,不需要客戶端和服務(wù)端重新發(fā)起連接請求。在海量并發(fā)及客戶端與服務(wù)器交互負(fù)載流量大的情況下,極大的節(jié)省了網(wǎng)絡(luò)帶寬資源的消耗,有明顯的性能優(yōu)勢,且客戶端發(fā)送和接受消息是在同一個持久連接上發(fā)起,實時性優(yōu)勢明顯。
WebSocket連接過程(握手)
從WebSocket客戶端服務(wù)器交互圖可以看出,在WebSocket中,只需要服務(wù)器和瀏覽器通過HTTP協(xié)議進行一個握手的動作,然后單獨建立一條TCP的通信通道進行數(shù)據(jù)的傳送。
- 瀏覽器,服務(wù)器建立TCP連接,三次握手。這是通信的基礎(chǔ),傳輸控制層,若失敗后續(xù)都不執(zhí)行。
- TCP連接成功后,瀏覽器通過HTTP協(xié)議向服務(wù)器傳送WebSocket支持的版本號等信息。(開始前的HTTP握手)
- 服務(wù)器收到客戶端的握手請求后,同樣采用HTTP協(xié)議回饋數(shù)據(jù)。
- 當(dāng)收到了連接成功的消息后,通過TCP通道進行傳輸通信。
RPC
Remote Procedure Call 遠程過程調(diào)用
它是一種通過網(wǎng)絡(luò)從遠程計算機程序上請求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層。RPC使得開發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易。
先說說RPC服務(wù)的基本架構(gòu)吧。一個完整的RPC架構(gòu)里面包含了四個核心的組件,分別是Client ,Server,Client Stub以及Server Stub,這個Stub大家可以理解為存根。

- 客戶端(Client),服務(wù)的調(diào)用方。
- 服務(wù)端(Server),真正的服務(wù)提供者。
- 客戶端存根,存放服務(wù)端的地址消息,再將客戶端的請求參數(shù)打包成網(wǎng)絡(luò)消息,然后通過網(wǎng)絡(luò)遠程發(fā)送給服務(wù)方。
- 服務(wù)端存根,接收客戶端發(fā)送過來的消息,將消息解包,并調(diào)用本地的方法。
RPC采用客戶機/服務(wù)器模式,通信是建立在Socket之上的,出于一種類比的愿望,在一臺機器上運行的主程序,可以調(diào)用另一臺機器上準(zhǔn)備好的子程序,就像LPC(本地過程調(diào)用)。請求程序就是一個客戶機,而服務(wù)提供程序就是一個服務(wù)器。首先,調(diào)用進程發(fā)送一個有進程參數(shù)的調(diào)用信息到服務(wù)進程,然后等待應(yīng)答信息。在服務(wù)器端,進程保持睡眠狀態(tài)直到調(diào)用信息的到達為止。當(dāng)一個調(diào)用信息到達,服務(wù)器獲得進程參數(shù),計算結(jié)果,發(fā)送答復(fù)信息,然后等待下一個調(diào)用信息,最后,客戶端調(diào)用過程接收答復(fù)信息,獲得進程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進行。
RPC vs HTTP
- 論復(fù)雜度,RPC框架肯定是高于簡單的HTTP接口的。但毋庸置疑,HTTP接口由于受限于HTTP協(xié)議,需要帶HTTP請求頭,還有三次握手,導(dǎo)致傳輸起來效率或者說安全性不如RPC。
- HTTP是一種協(xié)議,RPC可以通過HTTP來實現(xiàn),也可以通過Socket自己實現(xiàn)一套協(xié)議來實現(xiàn).
- RPC更是一個軟件結(jié)構(gòu)概念,是構(gòu)建分布式應(yīng)用的理論基礎(chǔ)。就好比為啥你家可以用到發(fā)電廠發(fā)出來的電?是因為電是可以傳輸?shù)?。至于用銅線還是用鐵絲還是其他 種類的導(dǎo)線,也就是用http還是用其他協(xié)議的問題了。
Rest & Restful
Rest全稱是Representational State Transfer,中文意思是表述性狀態(tài)轉(zhuǎn)移。Rest指的是一組架構(gòu)約束條件和原則。如果一個架構(gòu)符合Rest的約束條件和原則,我們就稱它為Restful架構(gòu)。
然而Rest本身并沒有創(chuàng)造新的技術(shù)、組件或服務(wù),而隱藏在Restful背后的理念就是使用Web的現(xiàn)有特征和能力, 更好地使用現(xiàn)有Web標(biāo)準(zhǔn)中的一些準(zhǔn)則和約束。我們現(xiàn)在所說的Rest是基于HTTP協(xié)議之上來講的,但Rest架構(gòu)風(fēng)格并不是綁定在HTTP上,只不過目前HTTP是唯一與Rest相關(guān)的實例。
Rest架構(gòu)的主要原則
- 在Rest中的一切都被認(rèn)為是一種資源。
- 每個資源由URI標(biāo)識。
- 使用統(tǒng)一的接口。處理資源使用POST,GET,PUT,DELETE操作類似創(chuàng)建,讀取,更新和刪除(CRUD)操作。
- 無狀態(tài):每個請求是一個獨立的請求。從客戶端到服務(wù)器的每個請求* * 都必須包含所有必要的信息,以便于理解。
- 同一個資源具有多種表現(xiàn)形式,例如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 // 刪除