TCP/IP協(xié)議棧主要分為四層:應(yīng)用層、傳輸層磨隘、網(wǎng)絡(luò)層缤底、數(shù)據(jù)鏈路層,每層都有相應(yīng)的協(xié)議番捂,如下圖
IP:
網(wǎng)絡(luò)層協(xié)議个唧;(高速公路)
TCP和UDP:
傳輸層協(xié)議;(卡車)
HTTP:
應(yīng)用層協(xié)議设预;(貨物)徙歼。HTTP(超文本傳輸協(xié)議)是利用TCP在兩臺電腦(通常是Web服務(wù)器和客戶端)之間傳輸信息的協(xié)議”钫恚客戶端使用Web瀏覽器發(fā)起HTTP請求給Web服務(wù)器鲁沥,Web服務(wù)器發(fā)送被請求的信息給客戶端。
SOCKET:
套接字耕魄,TCP/IP網(wǎng)絡(luò)的API画恰。(港口碼頭/車站)Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口吸奴。socket是在應(yīng)用層和傳輸層之間的一個抽象層允扇,它把TCP/IP層復(fù)雜的操作抽象為幾個簡單的接口供應(yīng)用層調(diào)用已實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。
TCP/IP:
代表傳輸控制協(xié)議/網(wǎng)際協(xié)議则奥,指的是一系列協(xié)議考润,TCP/IP 模型在 OSI 模型的基礎(chǔ)上進(jìn)行了簡化,變成了四層读处,從下到上分別為:網(wǎng)絡(luò)接口層糊治、網(wǎng)絡(luò)層、傳輸層罚舱、應(yīng)用層井辜。
TCP/UDP區(qū)別:
TCP
(傳輸控制協(xié)議,Transmission Control Protocol):(類似打電話)
面向連接管闷、傳輸可靠(保證數(shù)據(jù)正確性)粥脚、有序(保證數(shù)據(jù)順序)、傳輸大量數(shù)據(jù)(流模式)包个、速度慢刷允、對系統(tǒng)資源的要求多,程序結(jié)構(gòu)較復(fù)雜碧囊,
每一條TCP連接只能是點(diǎn)到點(diǎn)的树灶,
TCP首部開銷20字節(jié)。
UDP
(用戶數(shù)據(jù)報協(xié)議糯而,User Data Protocol):(類似發(fā)短信)
面向非連接 天通、傳輸不可靠(可能丟包)、無序歧蒋、傳輸少量數(shù)據(jù)(數(shù)據(jù)報模式)土砂、速度快,對系統(tǒng)資源的要求少谜洽,程序結(jié)構(gòu)較簡單 萝映,
UDP支持一對一,一對多阐虚,多對一和多對多的交互通信序臂,
UDP的首部開銷小,只有8個字節(jié)实束。
WebSocket protocol 是HTML5一種新的協(xié)議奥秆。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信(full-duplex)。一開始的握手需要借助HTTP請求完成咸灿」苟————百度百科
目的:即時通訊,替代輪詢
Websocket協(xié)議解決了服務(wù)器與客戶端全雙工通信的問題避矢。
注:什么是單工悼瘾、半雙工、全工通信审胸?
信息只能單向傳送為單工亥宿;
信息能雙向傳送但不能同時雙向傳送稱為半雙工;
信息能夠同時雙向傳送則稱為全雙工砂沛。
websocket協(xié)議解析
websocket協(xié)議包含兩部分:一部分是“握手”烫扼,一部分是“數(shù)據(jù)傳輸”。
應(yīng)用場景:網(wǎng)站上的即時通訊是很常見的碍庵,比如網(wǎng)頁的QQ映企,聊天系統(tǒng)等。按照以往的技術(shù)能力通常是采用輪詢静浴、Comet技術(shù)解決卑吭。
HTTP協(xié)議是非持久化的,單向的網(wǎng)絡(luò)協(xié)議马绝,在建立連接后只允許瀏覽器向服務(wù)器發(fā)出請求后豆赏,服務(wù)器才能返回相應(yīng)的數(shù)據(jù)。當(dāng)需要即時通訊時富稻,通過輪詢在特定的時間間隔(如1秒)掷邦,由瀏覽器向服務(wù)器發(fā)送Request請求,然后將最新的數(shù)據(jù)返回給瀏覽器椭赋。這樣的方法最明顯的缺點(diǎn)就是需要不斷的發(fā)送請求抚岗,而且通常HTTP request的Header是非常長的,為了傳輸一個很小的數(shù)據(jù) 需要付出巨大的代價哪怔,是很不合算的宣蔚,占用了很多的寬帶向抢。
缺點(diǎn):會導(dǎo)致過多不必要的請求,浪費(fèi)流量和服務(wù)器資源胚委,每一次請求挟鸠、應(yīng)答,都浪費(fèi)了一定流量在相同的頭部信息上
然而WebSocket的出現(xiàn)可以彌補(bǔ)這一缺點(diǎn)亩冬。在WebSocket中艘希,只需要服務(wù)器和瀏覽器通過HTTP協(xié)議進(jìn)行一個握手的動作,然后單獨(dú)建立一條TCP的通信通道進(jìn)行數(shù)據(jù)的傳送硅急。
原理:WebSocket同HTTP一樣也是應(yīng)用層的協(xié)議覆享,但是它是一種雙向通信協(xié)議,是建立在TCP之上的营袜。
連接過程 —— 握手過程
1. 瀏覽器撒顿、服務(wù)器建立TCP連接,三次握手荚板。這是通信的基礎(chǔ)核蘸,傳輸控制層,若失敗后續(xù)都不執(zhí)行啸驯。
2. TCP連接成功后客扎,瀏覽器通過HTTP協(xié)議向服務(wù)器傳送WebSocket支持的版本號等信息。(開始前的HTTP握手)
3. 服務(wù)器收到客戶端的握手請求后罚斗,同樣采用HTTP協(xié)議回饋數(shù)據(jù)徙鱼。
4. 當(dāng)收到了連接成功的消息后,通過TCP通道進(jìn)行傳輸通信针姿。
WebSocket與HTTP的關(guān)系
相同點(diǎn)
都是一樣基于TCP的袱吆,都是可靠性傳輸協(xié)議。
都是應(yīng)用層協(xié)議距淫。
不同點(diǎn)
WebSocket是雙向通信協(xié)議绞绒,模擬Socket協(xié)議,可以雙向發(fā)送或接受信息榕暇。HTTP是單向的蓬衡。
WebSocket是需要握手進(jìn)行建立連接的。
HTTP 協(xié)議有一個缺陷:通信只能由客戶端發(fā)起彤枢,做不到服務(wù)器主動向客戶端推送信息狰晚。
WebSocket 協(xié)議在2008年誕生,2011年成為國際標(biāo)準(zhǔn)缴啡。所有瀏覽器都已經(jīng)支持了壁晒。
它的最大特點(diǎn)就是,服務(wù)器可以主動向客戶端推送信息业栅,客戶端也可以主動向服務(wù)器發(fā)送信息秒咐,是真正的雙向平等對話谬晕,屬于服務(wù)器推送技術(shù)的一種。
相對于傳統(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ā)起尸昧,實(shí)時性優(yōu)勢明顯。
聯(lián)系
WebSocket在建立握手時旷偿,數(shù)據(jù)是通過HTTP傳輸?shù)呐胨住5墙⒅螅谡嬲齻鬏敃r候是不需要HTTP協(xié)議的萍程。
WebSocket與Socket的關(guān)系
Socket其實(shí)并不是一個協(xié)議幢妄,而是為了方便使用TCP或UDP而抽象出來的一層,是位于應(yīng)用層和傳輸控制層之間的一組接口茫负。Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層蕉鸳,它是一組接口。在設(shè)計(jì)模式中忍法,Socket其實(shí)就是一個門面模式潮尝,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對用戶來說饿序,一組簡單的接口就是全部勉失,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議原探。當(dāng)兩臺主機(jī)通信時乱凿,必須通過Socket連接,Socket則利用TCP/IP協(xié)議建立TCP連接咽弦。TCP連接則更依靠于底層的IP協(xié)議告匠,IP協(xié)議的連接則依賴于鏈路層等更低層次。WebSocket則是一個典型的應(yīng)用層協(xié)議离唬。Socket是傳輸控制層協(xié)議后专,WebSocket是應(yīng)用層協(xié)議。
HTML5與WebSocket的關(guān)系
WebSocket API 是 HTML5 標(biāo)準(zhǔn)的一部分输莺, 但這并不代表 WebSocket 一定要用在 HTML 中戚哎,或者只能在基于瀏覽器的應(yīng)用程序中使用裸诽。實(shí)際上,許多語言型凳、框架和服務(wù)器都提供了 WebSocket 支持丈冬,例如:
* 基于 C 的 libwebsocket.org
* 基于 Node.js 的 Socket.io
* 基于 Python 的 ws4py
* 基于 C++ 的 WebSocket++
* Apache 對 WebSocket 的支持: Apache Module mod_proxy_wstunnel
* Nginx 對 WebSockets 的支持: NGINX as a WebSockets Proxy 、 NGINX Announces Support for WebSocket Protocol 甘畅、WebSocket proxying
* lighttpd 對 WebSocket 的支持:mod_websocket
WebSocket 機(jī)制
WebSocket 是 HTML5 一種新的協(xié)議埂蕊。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信,能更好的節(jié)省服務(wù)器資源和帶寬并達(dá)到實(shí)時通訊疏唾,它建立在 TCP 之上蓄氧,同 HTTP 一樣通過 TCP 來傳輸數(shù)據(jù),但是它和 HTTP 最大不同是:
WebSocket 是一種雙向通信協(xié)議槐脏,在建立連接后喉童,WebSocket 服務(wù)器和 Browser/Client Agent 都能主動的向?qū)Ψ桨l(fā)送或接收數(shù)據(jù),就像 Socket 一樣顿天;WebSocket 需要類似 TCP 的客戶端和服務(wù)器端通過握手連接堂氯,連接成功后才能相互通信。