互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
來自:juejin.cn/post/6942358900171603975
Socket是什么?
- TPC/IP協(xié)議是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸;
- Socket是對(duì)TCP/IP協(xié)議的封裝和應(yīng)用(程序員層面上);
- 而HTTP是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)。
TCP/IP和HTTP協(xié)議的關(guān)系是:?“我們?cè)趥鬏敂?shù)據(jù)時(shí),可以只使用(傳輸層)TCP/IP協(xié)議,但是那樣的話,如果沒有應(yīng)用層,便無法識(shí)別數(shù)據(jù)內(nèi)容。如果想要使傳輸?shù)臄?shù)據(jù)有意義,則必須使用到應(yīng)用層協(xié)議。應(yīng)用層協(xié)議有很多,比如HTTP、FTP、TELNET等,也可以自己定義應(yīng)用層協(xié)議。WEB使用HTTP協(xié)議作應(yīng)用層協(xié)議,以封裝HTTP文本信息,然后使用TCP/IP做傳輸層協(xié)議將它發(fā)到網(wǎng)絡(luò)上。”Socket是什么呢,實(shí)際上socket是對(duì)TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個(gè)調(diào)用接口(API)。通過Socket,我們才能使用TCP/IP協(xié)議。Socket跟TCP/IP協(xié)議關(guān)系是:?“TCP/IP只是一個(gè)協(xié)議棧,就像操作系統(tǒng)的運(yùn)行機(jī)制一樣,必須要具體實(shí)現(xiàn),同時(shí)還要提供對(duì)外的操作接口。這個(gè)就像操作系統(tǒng)會(huì)提供標(biāo)準(zhǔn)的編程接口,比如win32編程接口一樣,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口,這就是Socket編程接口。”從上圖中可以看到,HTTP是基于傳輸層的TCP協(xié)議的,而Socket API也是,所以只是從使用上說,可以認(rèn)為Socket和HTTP類似(但一個(gè)是成文的互聯(lián)網(wǎng)協(xié)議,一個(gè)是一直沿用的一種編程概念),是對(duì)于傳輸層協(xié)議的另一種直接使用,因?yàn)榘凑赵O(shè)計(jì),網(wǎng)絡(luò)對(duì)用戶的接口都應(yīng)該在應(yīng)用層。WebSocket屬于WHATWG發(fā)布的Web Application的一部分(即HTML5)的產(chǎn)物。大約在08年的時(shí)候,WG的工程師在討論網(wǎng)絡(luò)環(huán)境中需要一種全雙工的連接形式,剛開始一直叫做「TCPConnection」,并討論了這種協(xié)議需要支持的功能,大致已經(jīng)和我們今天看到的WebSocket差不多了。他們認(rèn)為基于現(xiàn)有的HTTP之上的一些技術(shù)(如長輪詢、Comet)并滿足不了這種需求,有必要定義一個(gè)全新的協(xié)議。
WebSocket協(xié)議的開篇就說,本協(xié)議的目的是為了解決基于瀏覽器的程序需要拉取資源時(shí)必須發(fā)起多個(gè)HTTP請(qǐng)求和長時(shí)間的輪訓(xùn)的問題……而創(chuàng)建的。WebSocket和Socket的區(qū)別?
兩者沒什么關(guān)系,就像雷鋒跟雷鋒塔一樣。為什么要使用Websocket?
WebSocket的目的就是解決網(wǎng)絡(luò)傳輸中的雙向通信的問題,HTTP1.1默認(rèn)使用持久連接(persistent connection),在一個(gè)TCP連接上也可以傳輸多個(gè)Request/Response消息對(duì),但是HTTP的基本模型還是一個(gè)Request對(duì)應(yīng)一個(gè)Response。這在雙向通信(客戶端要向服務(wù)器傳送數(shù)據(jù),同時(shí)服務(wù)器也需要實(shí)時(shí)的向客戶端傳送信息,一個(gè)聊天系統(tǒng)就是典型的雙向通信)時(shí)一般會(huì)使用這樣幾種解決方案:- 輪詢(polling),輪詢就會(huì)造成對(duì)網(wǎng)絡(luò)和通信雙方的資源的浪費(fèi),且非實(shí)時(shí)。
- 長輪詢,客戶端發(fā)送一個(gè)超時(shí)時(shí)間很長的Request,服務(wù)器hold住這個(gè)連接,在有新數(shù)據(jù)到達(dá)時(shí)返回Response,相比#1,占用的網(wǎng)絡(luò)帶寬少了,其他類似。
- 長連接,其實(shí)有些人對(duì)長連接的概念是模糊不清的,我這里講的其實(shí)是HTTP的長連接(1)。如果你使用Socket來建立TCP的長連接(2),那么,這個(gè)長連接(2)跟我們這里要討論的WebSocket是一樣的,實(shí)際上TCP長連接就是WebSocket的基礎(chǔ),但是如果是HTTP的長連接,本質(zhì)上還是Request/Response消息對(duì),仍然會(huì)造成資源的浪費(fèi)、實(shí)時(shí)性不強(qiáng)等問題。
Websocket協(xié)議內(nèi)容
WebSocket的目的是取代HTTP在雙向通信場景下的使用,而且它的實(shí)現(xiàn)方式有些也是基于HTTP的(WS的默認(rèn)端口是80和443)。現(xiàn)有的網(wǎng)絡(luò)環(huán)境(客戶端、服務(wù)器、網(wǎng)絡(luò)中間人、代理等)對(duì)HTTP都有很好的支持,所以這樣做可以充分利用現(xiàn)有的HTTP的基礎(chǔ)設(shè)施,有點(diǎn)向下兼容的意味。WS協(xié)議有兩部分組成:握手和數(shù)據(jù)傳輸。握手
使用Http進(jìn)行實(shí)現(xiàn)。由客戶端使用http的方式發(fā)起握手請(qǐng)求,服務(wù)端接請(qǐng)求后,將當(dāng)前正在使用的連接(TCP)的協(xié)議,由http協(xié)議切換為websocket協(xié)議。握手請(qǐng)求頭會(huì)帶有Upgrade參數(shù)用于升級(jí)協(xié)議類型:Upgrade:?upgrade是HTTP1.1中用于定義轉(zhuǎn)換協(xié)議的header域。它表示,如果服務(wù)器支持的話,客戶端希望使用現(xiàn)有的「網(wǎng)絡(luò)層」已經(jīng)建立好的這個(gè)「連接(此處是TCP連接)」,切換到另外一個(gè)「應(yīng)用層」(此處是WebSocket)協(xié)議。Upgrade擴(kuò)展:Upgrade是HTTP中用來進(jìn)行協(xié)議升級(jí)的頭域,在擴(kuò)展的協(xié)議內(nèi)容中,客戶端發(fā)起的協(xié)議轉(zhuǎn)換的方式更多,同時(shí)服務(wù)器也可以選擇不接受客戶端的協(xié)議升級(jí)請(qǐng)求;服務(wù)端也可以發(fā)起協(xié)議升級(jí)。
??ws-URI?=?"ws:"?"http://"?host?[?":"?port?]?path?[?"?"?query?]
??wss-URI?=?"wss:"?"http://"?host?[?":"?port?]?path?[?"?"?query?]
??host?=?
??port?=?
??path?=?
??query?=?
數(shù)據(jù)傳輸
服務(wù)端接收握手請(qǐng)求后,回復(fù)response消息,一旦這個(gè)握手回復(fù)發(fā)出去,服務(wù)端就認(rèn)為此WebSocket連接已經(jīng)建立成功,處于OPEN狀態(tài)。它就可以開始發(fā)送數(shù)據(jù)了。WebSocket中所有發(fā)送的數(shù)據(jù)使用幀的形式發(fā)送。客戶端發(fā)送的數(shù)據(jù)幀都要經(jīng)過掩碼處理,服務(wù)端發(fā)送的所有數(shù)據(jù)幀都不能經(jīng)過掩碼處理。否則對(duì)方需要發(fā)送關(guān)閉幀。一個(gè)幀包含一個(gè)幀類型的標(biāo)識(shí)碼,一個(gè)負(fù)載長度,和負(fù)載。負(fù)載包括擴(kuò)展內(nèi)容和應(yīng)用內(nèi)容。WebSocket和HTTP的對(duì)比
相同點(diǎn)
- 都是基于TCP的應(yīng)用層協(xié)議。
- 都使用Request/Response模型進(jìn)行連接的建立。
- 在連接的建立過程中對(duì)錯(cuò)誤的處理方式相同,在這個(gè)階段WS可能返回和HTTP相同的返回碼。
- 都可以在網(wǎng)絡(luò)中傳輸數(shù)據(jù)。
不同點(diǎn)
- WS使用HTTP來建立連接,但是定義了一系列新的header域,這些域在HTTP中并不會(huì)使用。
- WS的連接不能通過中間人來轉(zhuǎn)發(fā),它必須是一個(gè)直接連接。
- WS連接建立之后,通信雙方都可以在任何時(shí)刻向另一方發(fā)送數(shù)據(jù)。
- WS連接建立之后,數(shù)據(jù)的傳輸使用幀來傳遞,不再需要Request消息。
推薦閱讀:
真相,為什么大廠們一邊裁員,一邊招人?!
Java常用類,這一次幫你總結(jié)好!
互聯(lián)網(wǎng)初中高級(jí)大廠面試題(9個(gè)G)內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!
?戳閱讀原文領(lǐng)取!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??朕已閱?