一篇文章讀懂TCP/IP UDP HTTP Socket WebSockt RPC Restful

對(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
七層網(wǎng)絡(luò)協(xié)議

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)萝风,完成三次握手。


tcp-ip-handshark.png

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.jpg

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為例,其交互流程大概是下圖這樣的:

socket-workflow.png

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ù)器交互圖

http-client-server.jpg

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

websocket-client-server.jpg

上圖對(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ù)的傳送诫肠。

  1. 瀏覽器,服務(wù)器建立TCP連接挤安,三次握手蛤铜。這是通信的基礎(chǔ)围肥,傳輸控制層穆刻,若失敗后續(xù)都不執(zhí)行。
  2. TCP連接成功后杠步,瀏覽器通過HTTP協(xié)議向服務(wù)器傳送WebSocket支持的版本號(hào)等信息氢伟。(開始前的HTTP握手)
  3. 服務(wù)器收到客戶端的握手請(qǐng)求后,同樣采用HTTP協(xié)議回饋數(shù)據(jù)幽歼。
  4. 當(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大家可以理解為存根。


rpc-architecture.jpg
  • 客戶端(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 // 刪除
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雳殊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子喷市,更是在濱河造成了極大的恐慌相种,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件品姓,死亡現(xiàn)場離奇詭異,居然都是意外死亡箫措,警方通過查閱死者的電腦和手機(jī)腹备,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斤蔓,“玉大人植酥,你說我怎么就攤上這事∠夷担” “怎么了友驮?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驾锰。 經(jīng)常有香客問我卸留,道長,這世上最難降的妖魔是什么椭豫? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任耻瑟,我火速辦了婚禮,結(jié)果婚禮上赏酥,老公的妹妹穿的比我還像新娘喳整。我一直安慰自己,他們只是感情好裸扶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布框都。 她就那樣靜靜地躺著,像睡著了一般呵晨。 火紅的嫁衣襯著肌膚如雪蔗蹋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天猪杭,我揣著相機(jī)與錄音,去河邊找鬼皂吮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛税手,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芦倒,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼兵扬!你這毒婦竟也來了麻裳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤器钟,失蹤者是張志新(化名)和其女友劉穎津坑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體傲霸,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疆瑰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昙啄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片穆役。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖梳凛,靈堂內(nèi)的尸體忽然破棺而出耿币,到底是詐尸還是另有隱情,我是刑警寧澤伶跷,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布掰读,位于F島的核電站,受9級(jí)特大地震影響叭莫,放射性物質(zhì)發(fā)生泄漏蹈集。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一雇初、第九天 我趴在偏房一處隱蔽的房頂上張望拢肆。 院中可真熱鬧,春花似錦、人聲如沸郭怪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鄙才。三九已至颂鸿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間攒庵,已是汗流浹背嘴纺。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浓冒,地道東北人栽渴。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像稳懒,于是被迫代替她去往敵國和親闲擦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 個(gè)人認(rèn)為场梆,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記墅冷,這雖然只是...
    貳零壹柒_fc10閱讀 5,054評(píng)論 0 8
  • OSI七層模型 我們一般使用的網(wǎng)絡(luò)數(shù)據(jù)傳輸由下而上共有七層,分別為物理層凌简、數(shù)據(jù)鏈路層雏搂、網(wǎng)絡(luò)層、傳輸層凸郑、會(huì)話層矛市、表示...
    泥孩兒0107閱讀 806評(píng)論 0 2
  • 網(wǎng)絡(luò)由下往上分為: 物理層-- 數(shù)據(jù)鏈路層-- 網(wǎng)絡(luò)層-- IP協(xié)議 傳輸層-- ...
    翻山越嶺的另一邊閱讀 914評(píng)論 0 15
  • 1.1 TCP/IP協(xié)議組 TCP/IP協(xié)議(傳輸控制協(xié)議)由網(wǎng)絡(luò)層的IP協(xié)議和傳輸層的TCP協(xié)議組成 IP層負(fù)責(zé)...
    F麥子閱讀 2,788評(píng)論 0 25
  • 1.這篇文章不是本人原創(chuàng)的氛魁,只是個(gè)人為了對(duì)這部分知識(shí)做一個(gè)整理和系統(tǒng)的輸出而編輯成的厅篓,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,068評(píng)論 6 174