OSI模型
- 應(yīng)用層:各種應(yīng)用層協(xié)議,Http、WebSocket、FTP、SMTP等
- 表示層:信息的語(yǔ)法語(yǔ)義以及他們的關(guān)聯(lián),如加密解密、轉(zhuǎn)換翻譯、壓縮解壓縮
- 會(huì)話層:不同機(jī)器上的用戶之間建立及管理會(huì)話
- 傳輸層:接受上一層的數(shù)據(jù),在必要的時(shí)候把數(shù)據(jù)進(jìn)行分割,并將這些數(shù)據(jù)提交給網(wǎng)絡(luò)層,且保證這些數(shù)據(jù)段有效到達(dá)對(duì)端。TCP、UDP協(xié)議。
- 網(wǎng)絡(luò)層:控制子網(wǎng)的運(yùn)行,如邏輯編址、分組傳輸、路由選擇。IP
協(xié)議。 - 數(shù)據(jù)鏈路層:物理尋址,同時(shí)將原始比特流轉(zhuǎn)變?yōu)檫壿媯鬏斁€路。
- 物理層:機(jī)械、電子、定時(shí)接口通信信道上的原始比特流傳輸。
Http協(xié)議
Http協(xié)議,超文本傳輸協(xié)議,web上一問(wèn)一答的兩臺(tái)計(jì)算機(jī)之間遵循的通信規(guī)則。
- 請(qǐng)求組成:請(qǐng)求行、請(qǐng)求頭、請(qǐng)求空行、請(qǐng)求主體
- 響應(yīng)組成:響應(yīng)狀態(tài)行、響應(yīng)頭、響應(yīng)空行、響應(yīng)正文
Socket協(xié)議
Socket是為了方便開發(fā)者直接使用更底層協(xié)議(一般是TCP或UDP)而存在的一個(gè)抽象層。Socket實(shí)際上是對(duì)TCP/IP協(xié)議的封裝,本身并不是協(xié)議,而是一個(gè)調(diào)用接口(API)。
Socket的出現(xiàn)只是使得程序員更方便地使用TCP/IP協(xié)議棧而已,是對(duì)TCP/IP協(xié)議的抽象,從而形成了我們知道的一些最基本的函數(shù)接口,比如create、listen、connect、accept、send、read和write。
主機(jī)A的應(yīng)用程序要能和主機(jī)B的應(yīng)用程序通信,必須通過(guò)Socket建立連接,而建立Socket連接必須需要底層TCP/IP協(xié)議來(lái)建立TCP連接。建立TCP連接需要底層IP協(xié)議來(lái)尋找網(wǎng)絡(luò)中的主機(jī)。我們知道網(wǎng)絡(luò)層使用IP協(xié)議可以幫助我們根據(jù)IP地址來(lái)找到目標(biāo)主機(jī),但是一臺(tái)主機(jī)上可能運(yùn)行著多個(gè)應(yīng)用程序,如何才能與指定的應(yīng)用程序通信就要通過(guò)TCP或UDP的地址也就是端口號(hào)來(lái)指定。這樣就可以通過(guò)一個(gè)Socket實(shí)例唯一代表一個(gè)主機(jī)上的一個(gè)應(yīng)用程序的通信鏈路了。
WebSocket協(xié)議
基于Http協(xié)議的擴(kuò)展,支持長(zhǎng)連接,用于建立客戶端和服務(wù)器的雙向通道。
而傳統(tǒng)的輪詢方式(即采用http協(xié)議不斷發(fā)送請(qǐng)求)的缺點(diǎn):浪費(fèi)流量(http請(qǐng)求頭比較大)、浪費(fèi)資源(沒(méi)有更新也要請(qǐng)求)、消耗服務(wù)器
CPU占用(沒(méi)有信息也要接收請(qǐng)求)。
WebSocket是保證只要在服務(wù)端和客戶端建立連接后任何一端發(fā)起消息,相互推送消息,效率也是極大的提高了,并且服務(wù)端和客戶端之間的標(biāo)頭信息很小,可以降低服務(wù)端的資源浪費(fèi)。
Http、Socket與TCP
TCP協(xié)議對(duì)應(yīng)與傳輸層,而HTTP協(xié)議對(duì)應(yīng)于應(yīng)用層,從本質(zhì)上來(lái)說(shuō),二者沒(méi)有可比性。Http協(xié)議是建立在TCP協(xié)議基礎(chǔ)之上的,當(dāng)瀏覽器需要從服務(wù)器獲取網(wǎng)頁(yè)數(shù)據(jù)的時(shí)候,會(huì)發(fā)出一次Http請(qǐng)求。
Http會(huì)通過(guò)TCP建立起一個(gè)到服務(wù)器的連接通道,當(dāng)本次請(qǐng)求需要的數(shù)據(jù)完畢后,Http會(huì)立即將TCP連接斷開,這個(gè)過(guò)程是很短的。所以Http連接是一種短連接,是一種無(wú)狀態(tài)的連接。所謂的無(wú)狀態(tài),是指瀏覽器每次向服務(wù)器發(fā)起請(qǐng)求的時(shí)候,不是通過(guò)一個(gè)連接,而是每次都建立起一個(gè)新的連接。如果是一個(gè)連接的話,服務(wù)器進(jìn)程中就能保持住這個(gè)連接并且在內(nèi)存中記住一些信息狀態(tài)。而每次請(qǐng)求結(jié)束后,連接就關(guān)閉,相關(guān)的內(nèi)容就釋放了,所以記不住任何狀態(tài),成為無(wú)狀態(tài)連接。
那么為什么Http是無(wú)狀態(tài)的短連接,而TCP是有狀態(tài)的長(zhǎng)連接?Http不是建立在TCP的基礎(chǔ)上嗎,為什么還能是短連接?原來(lái),Http就是在每次請(qǐng)求完成后就把TCP連接關(guān)了,所以是短連接。而我們通過(guò)Socket編程使用TCP協(xié)議的時(shí)候,我們自己可以通過(guò)代碼去控制什么時(shí)候打開連接,什么時(shí)候關(guān)閉連接,只要我們不通過(guò)代碼把連接關(guān)閉,這個(gè)連接就會(huì)在客戶端和服務(wù)端的進(jìn)程中一直存在,相關(guān)狀態(tài)數(shù)據(jù)會(huì)一直保存著。
Socket實(shí)際上是對(duì)TCP/IP協(xié)議的封裝,本身并不是協(xié)議,而是一個(gè)調(diào)用接口(API)。Socket的出現(xiàn)只是使得程序員更方便地使用TCP/IP協(xié)議棧而已,是對(duì)TCP/IP協(xié)議的抽象,從而形成了我們知道的一些最基本的函數(shù)接口,比如create、listen、connect、accept、send、read和write。
比較形象的比喻:Http協(xié)議是轎車,提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動(dòng)機(jī),提供了網(wǎng)絡(luò)通信的能力。從編程的角度來(lái)講,為了方便,你可以直接選擇已經(jīng)制造好的轎車Http來(lái)與服務(wù)器交互。但是有時(shí)候往往因?yàn)榄h(huán)境因素或者其它的一些定制的請(qǐng)求,必須要使用TCP協(xié)議,這時(shí)就需要使用Socket編程,然后自己去處理獲取的數(shù)據(jù)。就像是你用已有的發(fā)動(dòng)機(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é)議來(lái)傳輸數(shù)據(jù)的。
對(duì)于WebSocket來(lái)說(shuō),它必須依賴Http協(xié)議進(jìn)行一次握手,握手成功后,數(shù)據(jù)就直接從TCP通道傳輸,與Http無(wú)關(guān)了。
Socket與WebSocket
Socket其實(shí)并不是一個(gè)協(xié)議,它工作在OSI模型會(huì)話層,是為了方便大家直接使用更底層協(xié)議(一般是TCP或UDP)而存在的一個(gè)抽象層。
而WebSocket是一個(gè)完整的應(yīng)用層協(xié)議,包含一套完整的api。
所以WebSocket更方便,而Socket更靈活。