一赤拒、HTTP長(zhǎng)連接與短連接
1. HTTP協(xié)議與TCP/IP協(xié)議的關(guān)系
HTTP的長(zhǎng)連接和短連接本質(zhì)上是TCP長(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)鹏往。TCP三次握手連接,四次握手關(guān)閉骇塘。
2. 如何理解HTTP協(xié)議是無(wú)狀態(tài)的
HTTP協(xié)議是無(wú)狀態(tài)的伊履,指的是協(xié)議對(duì)于事務(wù)處理沒(méi)有記憶能力,服務(wù)器不知道客戶端是什么狀態(tài)款违。也就是說(shuō)唐瀑,打開一個(gè)服務(wù)器上的網(wǎng)頁(yè)和你之前打開這個(gè)服務(wù)器上的網(wǎng)頁(yè)之間沒(méi)有任何聯(lián)系。HTTP是一個(gè)無(wú)狀態(tài)的面向連接的協(xié)議插爹,無(wú)狀態(tài)不代表HTTP不能保持TCP連接哄辣,更不能代表HTTP使用的是UDP協(xié)議(無(wú)連接)。
3.什么是長(zhǎng)連接赠尾、短連接力穗?
在HTTP/1.0中,默認(rèn)使用的是短連接气嫁。也就是說(shuō)睛廊,瀏覽器和服務(wù)器每進(jìn)行一次HTTP操作,就建立一次連接杉编,但任務(wù)結(jié)束就中斷連接超全。如果客戶端瀏覽器訪問(wèn)的某個(gè)HTML或其他類型的 Web頁(yè)中包含有其他的Web資源,如JavaScript文件邓馒、圖像文件嘶朱、CSS文件等;當(dāng)瀏覽器每遇到這樣一個(gè)Web資源光酣,就會(huì)建立一個(gè)HTTP會(huì)話疏遏。
但從HTTP/1.1起,默認(rèn)使用長(zhǎng)連接,用以保持連接特性财异。使用長(zhǎng)連接的HTTP協(xié)議倘零,會(huì)在響應(yīng)頭有加入這行代碼:
Connection:keep-alive
在使用長(zhǎng)連接的情況下,當(dāng)一個(gè)網(wǎng)頁(yè)打開完成后戳寸,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的 TCP連接不會(huì)關(guān)閉呈驶,如果客戶端再次訪問(wèn)這個(gè)服務(wù)器上的網(wǎng)頁(yè),會(huì)繼續(xù)使用這一條已經(jīng)建立的連接疫鹊。Keep-Alive不會(huì)永久保持連接袖瞻,它有一個(gè)保持時(shí)間,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個(gè)時(shí)間拆吆。實(shí)現(xiàn)長(zhǎng)連接要客戶端和服務(wù)端都支持長(zhǎng)連接聋迎。
HTTP協(xié)議的長(zhǎng)連接和短連接,實(shí)質(zhì)上是TCP協(xié)議的長(zhǎng)連接和短連接枣耀。
4. 什么時(shí)候用長(zhǎng)連接霉晕,短連接?
長(zhǎng)連接多用于操作頻繁捞奕,點(diǎn)對(duì)點(diǎn)的通訊娄昆,而且連接數(shù)不能太多情況,缝彬。每個(gè)TCP連接都需要三步握手,這需要時(shí)間哺眯,如果每個(gè)操作都是先連接谷浅,再操作的話那么處理速度會(huì)降低很多,所以每個(gè)操作完后都不斷開奶卓,次處理時(shí)直接發(fā)送數(shù)據(jù)包就OK了一疯,不用建立TCP連接。例如:數(shù)據(jù)庫(kù)的連接用長(zhǎng)連接夺姑, 如果用短連接頻繁的通信會(huì)造成socket錯(cuò)誤墩邀,而且頻繁的socket 創(chuàng)建也是對(duì)資源的浪費(fèi)。
而像WEB網(wǎng)站的http服務(wù)一般都用短鏈接盏浙,因?yàn)殚L(zhǎng)連接對(duì)于服務(wù)端來(lái)說(shuō)會(huì)耗費(fèi)一定的資源眉睹,而像WEB網(wǎng)站這么頻繁的成千上萬(wàn)甚至上億客戶端的連接用短連接會(huì)更省一些資源,如果用長(zhǎng)連接废膘,而且同時(shí)有成千上萬(wàn)的用戶竹海,如果每個(gè)用戶都占用一個(gè)連接的話,那可想而知吧丐黄。所以并發(fā)量大斋配,但每個(gè)用戶無(wú)需頻繁操作情況下需用短連好。
二、WebSocket和HTTP協(xié)議的區(qū)別
HTTP:
1艰争,無(wú)狀態(tài)協(xié)議坏瞄。
2,短連接甩卓。(Ajax輪詢方式或Long? poll方式實(shí)現(xiàn)“持久連接”狀態(tài))
3鸠匀,被動(dòng)型。? 客戶端請(qǐng)求->服務(wù)器端響應(yīng)猛频。服務(wù)端不能主動(dòng)聯(lián)系客戶端狮崩,只能有客戶端發(fā)起。
WebSocket:
它解決了HTTP的這幾個(gè)難題鹿寻。
如被動(dòng)性睦柴,當(dāng)服務(wù)器完成協(xié)議升級(jí)后(HTTP->Websocket),服務(wù)端就可以主動(dòng)推送信息給客戶端啦毡熏。
相同點(diǎn):
都是一樣基于TCP的坦敌,都是可靠性傳輸協(xié)議。
都是應(yīng)用層協(xié)議痢法。
不同點(diǎn):
WebSocket是雙向通信協(xié)議狱窘,模擬Socket協(xié)議,可以雙向發(fā)送或接受信息财搁。HTTP是單向的蘸炸。
WebSocket是需要握手進(jìn)行建立連接的。
聯(lián)系:
WebSocket在建立握手時(shí)尖奔,數(shù)據(jù)是通過(guò)HTTP傳輸?shù)?/b>搭儒。但是建立之后,在真正傳輸時(shí)候是不需要HTTP協(xié)議的提茁。
WebSocket是雙向通信協(xié)議淹禾,模擬Socket協(xié)議,可以雙向發(fā)送或接受信息茴扁,HTTP是單向的铃岔。(即Socket協(xié)議是雙向的)
Socket其實(shí)并不是一個(gè)協(xié)議,而是為了方便使用TCP或UDP而抽象出來(lái)的一層峭火,是位于應(yīng)用層和傳輸控制層之間的一組接口毁习。
Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口卖丸。在設(shè)計(jì)模式中蜓洪,Socket其實(shí)就是一個(gè)門面模式,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面坯苹,對(duì)用戶來(lái)說(shuō)隆檀,一組簡(jiǎn)單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議恐仑。當(dāng)兩臺(tái)主機(jī)通信時(shí)泉坐,必須通過(guò)Socket連接,Socket則利用TCP/IP協(xié)議建立TCP連接裳仆。
TCP連接則更依靠于底層的IP協(xié)議腕让,IP協(xié)議的連接則依賴于鏈路層等更低層次。WebSocket則是一個(gè)典型的應(yīng)用層協(xié)議歧斟。Socket是傳輸控制層協(xié)議纯丸,WebSocket是應(yīng)用層協(xié)議。
三静袖、其他
Swoole 使 PHP 開發(fā)人員可以編寫高性能高并發(fā)的 TCP觉鼻、UDP、Unix Socket队橙、HTTP坠陈、 WebSocket 等服務(wù),讓 PHP 不再局限于 Web 領(lǐng)域捐康。
HTTP/2 協(xié)議-服務(wù)端主動(dòng)推送消息(推送資源JS仇矾、CSS)。
基于HTTP協(xié)議之WEB消息實(shí)時(shí)推送技術(shù)原理及實(shí)現(xiàn)(借助http長(zhǎng)連接 + socket server)解总。
一個(gè) TCP 連接可以發(fā)多少個(gè) HTTP 請(qǐng)求贮匕?
WS遍歷后只對(duì)同房間名廣播(也是遍歷找出當(dāng)前房間名的url連接,然后進(jìn)行廣播)