HTTP協(xié)議
HTTP是單向的,客戶(hù)端發(fā)送請(qǐng)求昔逗,服務(wù)器發(fā)送響應(yīng)。舉例來(lái)說(shuō)篷朵,當(dāng)客戶(hù)端向服務(wù)器發(fā)送請(qǐng)求時(shí)勾怒,該請(qǐng)求以HTTP或HTTPS的形式發(fā)送,在接收到請(qǐng)求后声旺,服務(wù)器會(huì)將響應(yīng)發(fā)送給客戶(hù)端笔链。每個(gè)請(qǐng)求都與一個(gè)對(duì)應(yīng)的響應(yīng)相關(guān)聯(lián),在發(fā)送響應(yīng)后客戶(hù)端與服務(wù)器的連接會(huì)被關(guān)閉腮猖。每個(gè)HTTP或HTTPS請(qǐng)求每次都會(huì)新建與服務(wù)器的連接鉴扫,并且在獲得響應(yīng)后,連接將自行終止缚够。 HTTP是在TCP之上運(yùn)行的無(wú)狀態(tài)協(xié)議幔妨,TCP是一種面向連接的協(xié)議,它使用三向握手方法保證數(shù)據(jù)包傳輸?shù)膫鬟f并重新傳輸丟失的數(shù)據(jù)包谍椅。
HTTP可以運(yùn)行在任何可靠的面向連接的協(xié)議(例如TCP误堡,SCTP)的上層。當(dāng)客戶(hù)端將HTTP請(qǐng)求發(fā)送到服務(wù)器時(shí)雏吭,客戶(hù)端和服務(wù)器之間將打開(kāi)TCP連接锁施,并且在收到響應(yīng)后,TCP連接將終止,每個(gè)HTTP請(qǐng)求都會(huì)建立單獨(dú)的TCP連接到服務(wù)器悉抵,例如如果客戶(hù)端向服務(wù)器發(fā)送10個(gè)請(qǐng)求肩狂,則將打開(kāi)10個(gè)單獨(dú)的HTTP連接。并在獲得響應(yīng)后關(guān)閉姥饰。
HTTP協(xié)議的長(zhǎng)連接和短連接傻谁,實(shí)質(zhì)上是TCP協(xié)議的長(zhǎng)連接和短連接。
每個(gè)HTTP連接完成后列粪,其對(duì)應(yīng)的TCP連接并不是每次都會(huì)關(guān)閉审磁。從 HTTP/1.1起,默認(rèn)使用長(zhǎng)連接岂座,用以保持連接特性态蒂。使用長(zhǎng)連接的HTTP協(xié)議,會(huì)在響應(yīng)頭有加入這個(gè)頭部字段:Connection:keep-alive
在使用長(zhǎng)連接的情況下费什,當(dāng)一個(gè)網(wǎng)頁(yè)打開(kāi)完成后钾恢,客戶(hù)端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會(huì)關(guān)閉,如果客戶(hù)端再次訪(fǎng)問(wèn)這個(gè)服務(wù)器上的網(wǎng)頁(yè)鸳址,會(huì)繼續(xù)使用這一條已經(jīng)建立的連接瘩蚪。Keep-Alive不會(huì)永久保持連接,它有一個(gè)保持時(shí)間氯质,可以在不同的服務(wù)器軟件(如Apache募舟,Nginx,Nginx中這個(gè)默認(rèn)時(shí)間是 75s)中設(shè)定這個(gè)時(shí)間闻察。實(shí)現(xiàn)長(zhǎng)連接要客戶(hù)端和服務(wù)端都支持長(zhǎng)連接。
HTTP屬于應(yīng)用層協(xié)議琢锋,在傳輸層使用TCP協(xié)議辕漂,在網(wǎng)絡(luò)層使用IP協(xié)議。IP協(xié)議主要解決網(wǎng)絡(luò)路由和尋址問(wèn)題吴超,TCP協(xié)議主要解決如何在IP層之上可靠的傳遞數(shù)據(jù)包钉嘹,使在網(wǎng)絡(luò)上的另一端收到發(fā)端發(fā)出的所有包,并且順序與發(fā)出順序一致鲸阻。TCP有可靠跋涣,面向連接的特點(diǎn)。
websocket協(xié)議
WebSocket是雙向的鸟悴,在客戶(hù)端-服務(wù)器通信的場(chǎng)景中使用的全雙工協(xié)議陈辱,與HTTP不同,它以ws://或wss://開(kāi)頭细诸。它是一個(gè)有狀態(tài)協(xié)議沛贪,這意味著客戶(hù)端和服務(wù)器之間的連接將保持活動(dòng)狀態(tài),直到被任何一方(客戶(hù)端或服務(wù)器)終止。在通過(guò)客戶(hù)端和服務(wù)器中的任何一方關(guān)閉連接之后利赋,連接將從兩端終止水评。
讓我們以客戶(hù)端-服務(wù)器通信為例,每當(dāng)我們啟動(dòng)客戶(hù)端和服務(wù)器之間的連接時(shí)媚送,客戶(hù)端-服務(wù)器進(jìn)行握手隨后創(chuàng)建一個(gè)新的連接中燥,該連接將保持活動(dòng)狀態(tài),直到被他們中的任何一方終止塘偎。建立連接并保持活動(dòng)狀態(tài)后褪那,客戶(hù)端和服務(wù)器將使用相同的連接通道進(jìn)行通信,直到連接終止式塌。
新建的連接被稱(chēng)為WebSocket博敬。一旦通信鏈接建立和連接打開(kāi)后,消息交換將以雙向模式進(jìn)行峰尝,客戶(hù)端-服務(wù)器之間的連接會(huì)持續(xù)存在偏窝。如果其中任何一方(客戶(hù)端服務(wù)器)宕掉或主動(dòng)關(guān)閉連接,則雙方均將關(guān)閉連接武学。套接字的工作方式與HTTP的工作方式略有不同祭往,狀態(tài)代碼101表示W(wǎng)ebSocket中的交換協(xié)議。
使用場(chǎng)景
- 即時(shí)Web應(yīng)用程序:即時(shí)Web應(yīng)用程序使用一個(gè)Web套接字在客戶(hù)端顯示數(shù)據(jù)火窒,這些數(shù)據(jù)由后端服務(wù)器連續(xù)發(fā)送硼补。在WebSocket中,數(shù)據(jù)被連續(xù)推送/傳輸?shù)揭呀?jīng)打開(kāi)的同一連接中熏矿,這就是為什么WebSocket更快并提高了應(yīng)用程序性能的原因已骇。 例如在交易網(wǎng)站或比特幣交易中,這是最不穩(wěn)定的事情票编,它用于顯示價(jià)格波動(dòng)褪储,數(shù)據(jù)被后端服務(wù)器使用Web套接字通道連續(xù)推送到客戶(hù)端。
- 游戲應(yīng)用程序:在游戲應(yīng)用程序中慧域,你可能會(huì)注意到鲤竹,服務(wù)器會(huì)持續(xù)接收數(shù)據(jù),而不會(huì)刷新用戶(hù)界面昔榴。屏幕上的用戶(hù)界面會(huì)自動(dòng)刷新辛藻,而且不需要建立新的連接,因此在WebSocket游戲應(yīng)用程序中非常有幫助互订。
- 聊天應(yīng)用程序:聊天應(yīng)用程序僅使用WebSocket建立一次連接吱肌,便能在訂閱戶(hù)之間交換,發(fā)布和廣播消息屁奏。它重復(fù)使用相同的WebSocket連接岩榆,用于發(fā)送和接收消息以及一對(duì)一的消息傳輸。
總結(jié)
Websocket是伴隨著HTML5規(guī)范而出的一種新的協(xié)議,嚴(yán)格意義上來(lái)說(shuō)與HTTP協(xié)議沒(méi)有關(guān)系,但是卻需要依賴(lài)于HTTP協(xié)議建立與服務(wù)器端的連接,一旦建立了連接,便不再與HTTP協(xié)議產(chǎn)生關(guān)系。由于HTTP是不支持全雙工通信的,而Websocket正好彌補(bǔ)了HTTP協(xié)議的不足同時(shí)也能夠更好地兼容目前的瀏覽器和成熟的HTTP通信協(xié)議勇边。Websocket與HTTP有交集,但是并不是全部犹撒。而當(dāng)連接建立過(guò)后的通信過(guò)程,不再與HTTP協(xié)議有任何的關(guān)系。