長(zhǎng)輪詢是對(duì)輪詢的改進(jìn)版,客戶端發(fā)送HTTP給服務(wù)器之后走搁,有沒有新消息独柑,如果沒有新消息,就一直等待私植。當(dāng)有新消息的時(shí)候忌栅,才會(huì)返回給客戶端。在某種程度上減小了網(wǎng)絡(luò)帶寬和CPU利用率等問題曲稼。但是這種方式還是有一種弊端:例如假設(shè)服務(wù)器端的數(shù)據(jù)更新速度很快狂秘,服務(wù)器在傳送一個(gè)數(shù)據(jù)包給客戶端后必須等待客戶端的下一個(gè)Get請(qǐng)求到來,才能傳遞第二個(gè)更新的數(shù)據(jù)包給客戶端躯肌,那么這樣的話者春,客戶端顯示實(shí)時(shí)數(shù)據(jù)最快的時(shí)間為2×RTT(往返時(shí)間),而且如果在網(wǎng)絡(luò)擁塞的情況下清女,這個(gè)時(shí)間用戶是不能接受的钱烟,比如在股市的的報(bào)價(jià)上。另外嫡丙,由于http數(shù)據(jù)包的頭部數(shù)據(jù)量往往很大(通常有400多個(gè)字節(jié))拴袭,但是真正被服務(wù)器需要的數(shù)據(jù)卻很少(有時(shí)只有10個(gè)字節(jié)左右),這樣的數(shù)據(jù)包在網(wǎng)絡(luò)上周期性的傳輸曙博,難免對(duì)網(wǎng)絡(luò)帶寬是一種浪費(fèi)拥刻。
Websocket是應(yīng)用層第七層上的一個(gè)應(yīng)用層協(xié)議,它必須依賴HTTP 協(xié)議進(jìn)行一次握手父泳,握手成功后般哼,數(shù)據(jù)就直接從 TCP 通道傳輸吴汪,與 HTTP 無關(guān)了。
Websocket的數(shù)據(jù)傳輸是frame形式傳輸?shù)恼裘撸热鐣?huì)將一條消息分為幾個(gè)frame漾橙,按照先后順序傳輸出去。這樣做會(huì)有幾個(gè)好處:
1)大數(shù)據(jù)的傳輸可以分片傳輸楞卡,不用考慮到數(shù)據(jù)大小導(dǎo)致的長(zhǎng)度標(biāo)志位不足夠的情況霜运。
2)和http的chunk一樣,可以邊生成數(shù)據(jù)邊傳遞消息蒋腮,即提高傳輸效率淘捡。
首先,Socket 其實(shí)并不是一個(gè)協(xié)議池摧。它工作在 OSI 模型會(huì)話層(第5層)焦除,是為了方便大家直接使用更底層協(xié)議(一般是 TCP 或 UDP )而存在的一個(gè)抽象層。Socket是對(duì)TCP/IP協(xié)議的封裝险绘,Socket本身并不是協(xié)議踢京,而是一個(gè)調(diào)用接口(API)誉碴。
Socket通常也稱作”套接字”宦棺,用于描述IP地址和端口,是一個(gè)通信鏈的句柄黔帕。網(wǎng)絡(luò)上的兩個(gè)程序通過一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換代咸,這個(gè)雙向鏈路的一端稱為一個(gè)Socket,一個(gè)Socket由一個(gè)IP地址和一個(gè)端口號(hào)唯一確定成黄。應(yīng)用程序通常通過”套接字”向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求呐芥。
Socket在通訊過程中,服務(wù)端監(jiān)聽某個(gè)端口是否有連接請(qǐng)求奋岁,客戶端向服務(wù)端發(fā)送連接請(qǐng)求思瘟,服務(wù)端收到連接請(qǐng)求向客戶端發(fā)出接收消息,這樣一個(gè)連接就建立起來了闻伶”豕ィ客戶端和服務(wù)端也都可以相互發(fā)送消息與對(duì)方進(jìn)行通訊,直到雙方連接斷開蓝翰。