OSI模型
- 應(yīng)用層:各種應(yīng)用層協(xié)議,Http诽里、WebSocket袒餐、FTP、SMTP等
- 表示層:信息的語法語義以及他們的關(guān)聯(lián)谤狡,如加密解密灸眼、轉(zhuǎn)換翻譯、壓縮解壓縮
- 會話層:不同機(jī)器上的用戶之間建立及管理會話
- 傳輸層:接受上一層的數(shù)據(jù)墓懂,在必要的時候把數(shù)據(jù)進(jìn)行分割焰宣,并將這些數(shù)據(jù)提交給網(wǎng)絡(luò)層,且保證這些數(shù)據(jù)段有效到達(dá)對端捕仔。TCP匕积、UDP協(xié)議。
- 網(wǎng)絡(luò)層:控制子網(wǎng)的運(yùn)行榜跌,如邏輯編址闪唆、分組傳輸、路由選擇钓葫。IP
協(xié)議悄蕾。 - 數(shù)據(jù)鏈路層:物理尋址,同時將原始比特流轉(zhuǎn)變?yōu)檫壿媯鬏斁€路。
- 物理層:機(jī)械帆调、電子奠骄、定時接口通信信道上的原始比特流傳輸。
Http協(xié)議
Http協(xié)議番刊,超文本傳輸協(xié)議含鳞,web上一問一答的兩臺計算機(jī)之間遵循的通信規(guī)則。
- 請求組成:請求行芹务、請求頭蝉绷、請求空行、請求主體
- 響應(yīng)組成:響應(yīng)狀態(tài)行枣抱、響應(yīng)頭潜必、響應(yīng)空行、響應(yīng)正文
Socket協(xié)議
Socket是為了方便開發(fā)者直接使用更底層協(xié)議(一般是TCP或UDP)而存在的一個抽象層沃但。Socket實際上是對TCP/IP協(xié)議的封裝磁滚,本身并不是協(xié)議,而是一個調(diào)用接口(API)宵晚。
Socket的出現(xiàn)只是使得程序員更方便地使用TCP/IP協(xié)議棧而已垂攘,是對TCP/IP協(xié)議的抽象,從而形成了我們知道的一些最基本的函數(shù)接口淤刃,比如create晒他、listen、connect逸贾、accept陨仅、send、read和write铝侵。
主機(jī)A的應(yīng)用程序要能和主機(jī)B的應(yīng)用程序通信灼伤,必須通過Socket建立連接,而建立Socket連接必須需要底層TCP/IP協(xié)議來建立TCP連接咪鲜。建立TCP連接需要底層IP協(xié)議來尋找網(wǎng)絡(luò)中的主機(jī)狐赡。我們知道網(wǎng)絡(luò)層使用IP協(xié)議可以幫助我們根據(jù)IP地址來找到目標(biāo)主機(jī),但是一臺主機(jī)上可能運(yùn)行著多個應(yīng)用程序疟丙,如何才能與指定的應(yīng)用程序通信就要通過TCP或UDP的地址也就是端口號來指定颖侄。這樣就可以通過一個Socket實例唯一代表一個主機(jī)上的一個應(yīng)用程序的通信鏈路了。
WebSocket協(xié)議
基于Http協(xié)議的擴(kuò)展享郊,支持長連接览祖,用于建立客戶端和服務(wù)器的雙向通道。
而傳統(tǒng)的輪詢方式(即采用http協(xié)議不斷發(fā)送請求)的缺點:浪費(fèi)流量(http請求頭比較大)炊琉、浪費(fèi)資源(沒有更新也要請求)展蒂、消耗服務(wù)器
CPU占用(沒有信息也要接收請求)。
WebSocket是保證只要在服務(wù)端和客戶端建立連接后任何一端發(fā)起消息,相互推送消息玄货,效率也是極大的提高了,并且服務(wù)端和客戶端之間的標(biāo)頭信息很小悼泌,可以降低服務(wù)端的資源浪費(fèi)松捉。
Http、Socket與TCP
TCP協(xié)議對應(yīng)與傳輸層馆里,而HTTP協(xié)議對應(yīng)于應(yīng)用層隘世,從本質(zhì)上來說,二者沒有可比性鸠踪。Http協(xié)議是建立在TCP協(xié)議基礎(chǔ)之上的丙者,當(dāng)瀏覽器需要從服務(wù)器獲取網(wǎng)頁數(shù)據(jù)的時候,會發(fā)出一次Http請求营密。
Http會通過TCP建立起一個到服務(wù)器的連接通道械媒,當(dāng)本次請求需要的數(shù)據(jù)完畢后,Http會立即將TCP連接斷開评汰,這個過程是很短的纷捞。所以Http連接是一種短連接,是一種無狀態(tài)的連接被去。所謂的無狀態(tài)主儡,是指瀏覽器每次向服務(wù)器發(fā)起請求的時候,不是通過一個連接惨缆,而是每次都建立起一個新的連接糜值。如果是一個連接的話,服務(wù)器進(jìn)程中就能保持住這個連接并且在內(nèi)存中記住一些信息狀態(tài)坯墨。而每次請求結(jié)束后寂汇,連接就關(guān)閉,相關(guān)的內(nèi)容就釋放了捣染,所以記不住任何狀態(tài)健无,成為無狀態(tài)連接。
那么為什么Http是無狀態(tài)的短連接液斜,而TCP是有狀態(tài)的長連接累贤?Http不是建立在TCP的基礎(chǔ)上嗎,為什么還能是短連接少漆?原來臼膏,Http就是在每次請求完成后就把TCP連接關(guān)了,所以是短連接示损。而我們通過Socket編程使用TCP協(xié)議的時候渗磅,我們自己可以通過代碼去控制什么時候打開連接,什么時候關(guān)閉連接,只要我們不通過代碼把連接關(guān)閉始鱼,這個連接就會在客戶端和服務(wù)端的進(jìn)程中一直存在仔掸,相關(guān)狀態(tài)數(shù)據(jù)會一直保存著。
Socket實際上是對TCP/IP協(xié)議的封裝医清,本身并不是協(xié)議起暮,而是一個調(diào)用接口(API)。Socket的出現(xiàn)只是使得程序員更方便地使用TCP/IP協(xié)議棧而已会烙,是對TCP/IP協(xié)議的抽象负懦,從而形成了我們知道的一些最基本的函數(shù)接口,比如create柏腻、listen纸厉、connect、accept五嫂、send颗品、read和write。
比較形象的比喻:Http協(xié)議是轎車沃缘,提供了封裝或者顯示數(shù)據(jù)的具體形式抛猫;Socket是發(fā)動機(jī),提供了網(wǎng)絡(luò)通信的能力孩灯。從編程的角度來講闺金,為了方便,你可以直接選擇已經(jīng)制造好的轎車Http來與服務(wù)器交互峰档。但是有時候往往因為環(huán)境因素或者其它的一些定制的請求败匹,必須要使用TCP協(xié)議,這時就需要使用Socket編程讥巡,然后自己去處理獲取的數(shù)據(jù)掀亩。就像是你用已有的發(fā)動機(jī),自己造了一輛卡車欢顷,去與服務(wù)器交互槽棍。
WebSocket、HTTP與TCP
Http抬驴、WebSocket等協(xié)議屬于應(yīng)用層協(xié)議炼七,IP協(xié)議工作在網(wǎng)絡(luò)層,TCP協(xié)議工作在傳輸層布持。HTTP豌拙、WebSocket等應(yīng)用層協(xié)議,都是基于TCP協(xié)議來傳輸數(shù)據(jù)的题暖。
對于WebSocket來說按傅,它必須依賴Http協(xié)議進(jìn)行一次握手捉超,握手成功后,數(shù)據(jù)就直接從TCP通道傳輸唯绍,與Http無關(guān)了拼岳。
Socket與WebSocket
Socket其實并不是一個協(xié)議,它工作在OSI模型會話層况芒,是為了方便大家直接使用更底層協(xié)議(一般是TCP或UDP)而存在的一個抽象層惜纸。
而WebSocket是一個完整的應(yīng)用層協(xié)議,包含一套完整的api牛柒。
所以WebSocket更方便,而Socket更靈活痊乾。