對(duì)于TCP鲜屏,Http烹看,Socket這些名詞,你是否熟悉呢洛史,他們有哪些異同點(diǎn)呢惯殊?帶著這些疑問,開始我們的學(xué)習(xí)之旅
故事還要從七層網(wǎng)絡(luò)協(xié)議開始...
七層網(wǎng)絡(luò)協(xié)議
- 物理層 建立也殖、維護(hù)、斷開物理連接忆嗜。(由底層網(wǎng)絡(luò)定義協(xié)議)
- 數(shù)據(jù)鏈路層 建立邏輯連接、進(jìn)行硬件地址尋址捆毫、差錯(cuò)校驗(yàn)等功能。(由底層網(wǎng)絡(luò)定義協(xié)議)
-
網(wǎng)絡(luò)層 進(jìn)行邏輯地址尋址冻璃,實(shí)現(xiàn)不同網(wǎng)絡(luò)之間的路徑選擇。
??常見協(xié)議有:ICMP IGMP IP(IPV4 IPV6) ARP RARP -
傳輸層 定義傳輸數(shù)據(jù)的協(xié)議端口號(hào)省艳,以及流控和差錯(cuò)校驗(yàn)。
??常見協(xié)議有:TCP UDP跋炕,數(shù)據(jù)包一旦離開網(wǎng)卡即進(jìn)入網(wǎng)絡(luò)傳輸層 -
會(huì)話層 建立、管理辐烂、終止會(huì)話遏插。(在五層模型里面已經(jīng)合并到了應(yīng)用層)
??對(duì)應(yīng)主機(jī)進(jìn)程,指本地主機(jī)與遠(yuǎn)程主機(jī)正在進(jìn)行的會(huì)話纠修。 -
表示層 數(shù)據(jù)的表示胳嘲、安全、壓縮扣草。(在五層模型里面已經(jīng)合并到了應(yīng)用層)
??常見格式有了牛,JPEG颜屠、ASCll、DECOIC鹰祸、加密格式等 -
應(yīng)用層 網(wǎng)絡(luò)服務(wù)與最終用戶的一個(gè)接口甫窟。
??常見協(xié)議有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
IP TCP UDP HTTP
通過對(duì)七層網(wǎng)絡(luò)協(xié)議的了解,IP協(xié)議對(duì)應(yīng)網(wǎng)絡(luò)層蛙婴,TCP協(xié)議對(duì)應(yīng)于傳輸層粗井,而http協(xié)議對(duì)應(yīng)于應(yīng)用層,從本質(zhì)上來說街图,三者是不同層面的東西浇衬,如果打個(gè)比方的話,IP就像高速公路台夺,TCP就如同卡車径玖,http就如同貨物痴脾,貨物要裝載在卡車并通過高速公路才能從一個(gè)地點(diǎn)送到另一個(gè)地點(diǎn)颤介。
那TCP與UDP的區(qū)別又是什么呢?
TCP 傳輸控制協(xié)議赞赖,Transmission Control Protocol
TCP是一種面向連接的滚朵、可靠的、基于字節(jié)流的傳輸層通信協(xié)議前域。UDP 用戶數(shù)據(jù)報(bào)協(xié)議,User Datagram Protocol
UDP是OSI(Open System Interconnection辕近,開放式系統(tǒng)互聯(lián)) 參考模型中一種無連接的傳輸層協(xié)議,提供面向事務(wù)的簡單不可靠信息傳送服務(wù)匿垄。
TCP是面向連接的傳輸控制協(xié)議移宅,提供可靠的數(shù)據(jù)服務(wù)(類似于打電話)
UDP是提供無連接的數(shù)據(jù)報(bào)服務(wù),傳輸不可靠椿疗,可能丟包(類似于發(fā)短信)
TCP首部開銷20字節(jié),UDP首部開銷8字節(jié)
TCP只能是點(diǎn)到點(diǎn)的連接浅乔,UDP支持一對(duì)一靖苇,一對(duì)多贤壁,多對(duì)一芯砸,多對(duì)多的交互通信
TCP邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
注:什么是單工双揪、半雙工渔期、全工通信疯趟?
信息只能單向傳送為單工谋梭;
信息能雙向傳送但不能同時(shí)雙向傳送稱為半雙工瓮床;
信息能夠同時(shí)雙向傳送則稱為全雙工隘庄。
TCP的三次握手
TCP建立一個(gè)連接需要3次握手IP數(shù)據(jù)包丑掺,斷開連接需要4次握手。TCP因?yàn)榻⑦B接兼丰、釋放連接鳍征、IP分組校驗(yàn)排序等需要額外工作蟆技,速度較UDP慢許多质礼。TCP適合傳輸數(shù)據(jù)眶蕉,UDP適合流媒體
第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器造挽,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn)嵌器;
第二次握手:服務(wù)器收到syn包爽航,必須確認(rèn)客戶的SYN(ack=j+1)讥珍,同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k)窄瘟,即SYN+ACK包蹄葱,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包觅赊,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢饶囚,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài)萝风,完成三次握手。
Socket
我們知道兩個(gè)進(jìn)程如果需要進(jìn)行通訊最基本的一個(gè)前提能能夠唯一的標(biāo)示一個(gè)進(jìn)程睬塌,在本地進(jìn)程通訊中我們可以使用PID來唯一標(biāo)示一個(gè)進(jìn)程揩晴,但PID只在本地唯一硫兰,網(wǎng)絡(luò)中的兩個(gè)進(jìn)程PID沖突幾率很大劫映,這時(shí)候我們需要另辟它徑了,我們知道IP層的ip地址可以唯一標(biāo)示主機(jī)雌桑,而TCP層協(xié)議和端口號(hào)可以唯一標(biāo)示主機(jī)的一個(gè)進(jìn)程祖今,這樣我們可以利用ip地址+協(xié)議+端口號(hào)唯一標(biāo)示網(wǎng)絡(luò)中的一個(gè)進(jìn)程衅鹿。
能夠唯一標(biāo)示網(wǎng)絡(luò)中的進(jìn)程后大渤,它們就可以利用socket進(jìn)行通信了,什么是socket呢耕捞?我們經(jīng)常把socket翻譯為套接字俺抽,socket是在應(yīng)用層和傳輸層之間的一個(gè)抽象層磷斧,它把TCP/IP層復(fù)雜的操作抽象為幾個(gè)簡單的接口供應(yīng)用層調(diào)用已實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信弛饭。
socket起源于UNIX侣颂,在Unix一切皆文件哲學(xué)的思想下憔晒,socket是一種"打開—讀/寫—關(guān)閉"模式的實(shí)現(xiàn)拒担,服務(wù)器和客戶端各自維護(hù)一個(gè)"文件"澎蛛,在建立連接打開后谋逻,可以向自己文件寫入內(nèi)容供對(duì)方讀取或者讀取對(duì)方內(nèi)容,通訊結(jié)束時(shí)關(guān)閉文件毁兆。
Socket通信流程
socket是"打開—讀/寫—關(guān)閉"模式的實(shí)現(xiàn)气堕,以使用TCP協(xié)議通訊的socket為例,其交互流程大概是下圖這樣的:
WebSocket
WebSocket protocol 是HTML5一種新的協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信梅桩,能更好的節(jié)省服務(wù)器資源和帶寬并達(dá)到實(shí)時(shí)通訊它建立在TCP之上宿百,同 HTTP一樣通過TCP來傳輸數(shù)據(jù)。WebSocket同HTTP一樣也是應(yīng)用層的協(xié)議雀费,并且一開始的握手也需要借助HTTP請(qǐng)求完成盏袄。
它和 HTTP 最大不同是:
- WebSocket 是一種雙向通信協(xié)議宋光,在建立連接后罪佳,WebSocket 服務(wù)器和 Browser/Client Agent 都能主動(dòng)的向?qū)Ψ桨l(fā)送或接收數(shù)據(jù)赘艳,就像 Socket 一樣蕾管;
- WebSocket 需要類似 TCP 的客戶端和服務(wù)器端通過握手連接掰曾,連接成功后才能相互通信停团。
HTTP請(qǐng)求客戶端服務(wù)器交互圖
WebSocket客戶端服務(wù)器交互圖
上圖對(duì)比可以看出旗芬,相對(duì)于傳統(tǒng) HTTP 每次請(qǐng)求-應(yīng)答都需要客戶端與服務(wù)端建立連接的模式捆蜀,WebSocket 是類似 Socket 的 TCP 長連接的通訊模式辆它,一旦 WebSocket 連接建立后暇屋,后續(xù)數(shù)據(jù)都以幀序列的形式傳輸咐刨。在客戶端斷開 WebSocket 連接或 Server 端斷掉連接前扬霜,不需要客戶端和服務(wù)端重新發(fā)起連接請(qǐng)求著瓶。在海量并發(fā)及客戶端與服務(wù)器交互負(fù)載流量大的情況下材原,極大的節(jié)省了網(wǎng)絡(luò)帶寬資源的消耗余蟹,有明顯的性能優(yōu)勢(shì),且客戶端發(fā)送和接受消息是在同一個(gè)持久連接上發(fā)起窑睁,實(shí)時(shí)性優(yōu)勢(shì)明顯担钮。
WebSocket連接過程(握手)
從WebSocket客戶端服務(wù)器交互圖可以看出箫津,在WebSocket中苏遥,只需要服務(wù)器和瀏覽器通過HTTP協(xié)議進(jìn)行一個(gè)握手的動(dòng)作暖眼,然后單獨(dú)建立一條TCP的通信通道進(jìn)行數(shù)據(jù)的傳送诫肠。
- 瀏覽器,服務(wù)器建立TCP連接挤安,三次握手蛤铜。這是通信的基礎(chǔ)围肥,傳輸控制層穆刻,若失敗后續(xù)都不執(zhí)行。
- TCP連接成功后杠步,瀏覽器通過HTTP協(xié)議向服務(wù)器傳送WebSocket支持的版本號(hào)等信息氢伟。(開始前的HTTP握手)
- 服務(wù)器收到客戶端的握手請(qǐng)求后,同樣采用HTTP協(xié)議回饋數(shù)據(jù)幽歼。
- 當(dāng)收到了連接成功的消息后朵锣,通過TCP通道進(jìn)行傳輸通信。
RPC
Remote Procedure Call 遠(yuǎn)程過程調(diào)用
它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(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)吧。一個(gè)完整的RPC架構(gòu)里面包含了四個(gè)核心的組件,分別是Client ,Server,Client Stub以及Server Stub辜御,這個(gè)Stub大家可以理解為存根。
- 客戶端(Client),服務(wù)的調(diào)用方贱鄙。
- 服務(wù)端(Server),真正的服務(wù)提供者。
- 客戶端存根,存放服務(wù)端的地址消息,再將客戶端的請(qǐng)求參數(shù)打包成網(wǎng)絡(luò)消息粉怕,然后通過網(wǎng)絡(luò)遠(yuǎn)程發(fā)送給服務(wù)方稚晚。
- 服務(wù)端存根俺驶,接收客戶端發(fā)送過來的消息,將消息解包,并調(diào)用本地的方法昔案。
RPC采用客戶機(jī)/服務(wù)器模式捞稿,通信是建立在Socket之上的,出于一種類比的愿望,在一臺(tái)機(jī)器上運(yùn)行的主程序,可以調(diào)用另一臺(tái)機(jī)器上準(zhǔn)備好的子程序,就像LPC(本地過程調(diào)用)衰齐。請(qǐng)求程序就是一個(gè)客戶機(jī)犬第,而服務(wù)提供程序就是一個(gè)服務(wù)器鉴分。首先伦糯,調(diào)用進(jìn)程發(fā)送一個(gè)有進(jìn)程參數(shù)的調(diào)用信息到服務(wù)進(jìn)程淤翔,然后等待應(yīng)答信息谐檀。在服務(wù)器端课幕,進(jìn)程保持睡眠狀態(tài)直到調(diào)用信息的到達(dá)為止撬碟。當(dāng)一個(gè)調(diào)用信息到達(dá)其障,服務(wù)器獲得進(jìn)程參數(shù),計(jì)算結(jié)果叠纹,發(fā)送答復(fù)信息氨肌,然后等待下一個(gè)調(diào)用信息,最后考杉,客戶端調(diào)用過程接收答復(fù)信息酬蹋,獲得進(jìn)程結(jié)果骄恶,然后調(diào)用執(zhí)行繼續(xù)進(jìn)行斟叼。
RPC vs HTTP
- 論復(fù)雜度朗涩,RPC框架肯定是高于簡單的HTTP接口的识腿。但毋庸置疑成箫,HTTP接口由于受限于HTTP協(xié)議治泥,需要帶HTTP請(qǐng)求頭,還有三次握手添怔,導(dǎo)致傳輸起來效率或者說安全性不如RPC湾戳。
- HTTP是一種協(xié)議,RPC可以通過HTTP來實(shí)現(xiàn),也可以通過Socket自己實(shí)現(xiàn)一套協(xié)議來實(shí)現(xiàn).
- RPC更是一個(gè)軟件結(jié)構(gòu)概念,是構(gòu)建分布式應(yīng)用的理論基礎(chǔ)广料。就好比為啥你家可以用到發(fā)電廠發(fā)出來的電砾脑?是因?yàn)殡娛强梢詡鬏數(shù)摹V劣谟勉~線還是用鐵絲還是其他 種類的導(dǎo)線艾杏,也就是用http還是用其他協(xié)議的問題了韧衣。
Rest & Restful
Rest全稱是Representational State Transfer,中文意思是表述性狀態(tài)轉(zhuǎn)移糜颠。Rest指的是一組架構(gòu)約束條件和原則汹族。如果一個(gè)架構(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)的實(shí)例坑资。
Rest架構(gòu)的主要原則
- 在Rest中的一切都被認(rèn)為是一種資源。
- 每個(gè)資源由URI標(biāo)識(shí)穆端。
- 使用統(tǒng)一的接口袱贮。處理資源使用POST,GET体啰,PUT攒巍,DELETE操作類似創(chuàng)建嗽仪,讀取,更新和刪除(CRUD)操作柒莉。
- 無狀態(tài):每個(gè)請(qǐng)求是一個(gè)獨(dú)立的請(qǐng)求闻坚。從客戶端到服務(wù)器的每個(gè)請(qǐng)求* * 都必須包含所有必要的信息,以便于理解兢孝。
- 同一個(gè)資源具有多種表現(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 // 刪除