国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 網(wǎng)站 > 優(yōu)化推廣 > 正文

HTTP Keep Alive分析與優(yōu)化總結(jié)

2024-04-26 13:56:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一、什么是HTTP Keep Alive

HTTP Keep-Alive 很大程序上被誤解了,下面介紹一下它在HTTP/1.0和HTTP/1.1版本下是如何工作的,以及其在JAVA中的運(yùn)行原理及優(yōu)化建議。HTTP是一個(gè)請(qǐng)求<->響應(yīng)模式的典型范例,即客戶端向服務(wù)器發(fā)送一個(gè)請(qǐng)求信息,服務(wù)器來(lái)響應(yīng)這個(gè)信息。在老的HTTP版本中,每個(gè)請(qǐng)求都將被創(chuàng)建一個(gè)新的客戶端->服務(wù)器的連接,在這個(gè)連接上發(fā)送請(qǐng)求,然后接收請(qǐng)求。這樣的模式有一個(gè)很大的優(yōu)點(diǎn)就是,它很簡(jiǎn)單,很容易理解和編程實(shí)現(xiàn);它也有一個(gè)很大的缺點(diǎn)就是,它效率很低,因此Keep-Alive被提出用來(lái)解決效率低的問(wèn)題。

具體說(shuō),HTTP構(gòu)建在TCP之上。在HTTP早期實(shí)現(xiàn)中,每個(gè)HTTP請(qǐng)求都要打開(kāi)一個(gè)socket連接。這種做效率很低,因?yàn)橐粋€(gè)Web 頁(yè)面中的很多HTTP請(qǐng)求都指向同一個(gè)服務(wù)器。例如,很多為Web頁(yè)面中的圖片發(fā)起的請(qǐng)求都指向一個(gè)通用的圖片服務(wù)器。持久連接的引入解決了多對(duì)已請(qǐng)求服務(wù)器導(dǎo)致的socket連接低效性的問(wèn)題。它使瀏覽器可以再一個(gè)單獨(dú)的連接上進(jìn)行多個(gè)請(qǐng)求。瀏覽器和服務(wù)器使用Connection頭ilai指出對(duì)Keep-Alive的支持。HTTP/1.0

在HTTP/1.0版本中,并沒(méi)有官方的標(biāo)準(zhǔn)來(lái)規(guī)定Keep-Alive如何工作,因此實(shí)際上它是被附加到HTTP/1.0協(xié)議上,如果客戶端瀏覽器支持Keep-Alive,那么就在HTTP請(qǐng)求頭中添加一個(gè)字段Connection: Keep-Alive,當(dāng)服務(wù)器收到附帶有Connection: Keep-Alive的請(qǐng)求時(shí),它也會(huì)在響應(yīng)頭中添加一個(gè)同樣的字段來(lái)使用Keep-Alive。這樣一來(lái),客戶端和服務(wù)器之間的HTTP連接就會(huì)被保持,不會(huì)斷開(kāi)(超過(guò)Keep-Alive規(guī)定的時(shí)間,意外斷電等情況除外),當(dāng)客戶端發(fā)送另外一個(gè)請(qǐng)求時(shí),就使用這條已經(jīng)建立的連接HTTP/1.1

在HTTP/1.1版本中,官方規(guī)定的Keep-Alive使用標(biāo)準(zhǔn)和在HTTP/1.0版本中有些不同,默認(rèn)情況下所在HTTP1.1中所有連接都被保持,除非在請(qǐng)求頭或響應(yīng)頭中指明要關(guān)閉:Connection: Close ,這也就是為什么Connection: Keep-Alive字段再?zèng)]有意義的原因。另外,還添加了一個(gè)新的字段Keep-Alive:,因?yàn)檫@個(gè)字段并沒(méi)有詳細(xì)描述用來(lái)做什么,可忽略它

二、HTTP Keep Alive的注意點(diǎn)

Not reliable(不可靠)

HTTP是一個(gè)無(wú)狀態(tài)協(xié)議,這意味著每個(gè)請(qǐng)求都是獨(dú)立的,Keep-Alive沒(méi)能改變這個(gè)結(jié)果。另外,Keep-Alive也不能保證客戶端和服務(wù)器之間的連接一定是活躍的,在HTTP1.1版本中也如此。唯一能保證的就是當(dāng)連接被關(guān)閉時(shí)你能得到一個(gè)通知,所以不應(yīng)該讓程序依賴于Keep-Alive的保持連接特性,否則會(huì)有意想不到的后果

Keep-Alive和POST

在HTTP1.1細(xì)則中規(guī)定了在一個(gè)POST消息體后面不能有任何字符,還指出了對(duì)于某一個(gè)特定的瀏覽器可能并不遵循這個(gè)標(biāo)準(zhǔn)(比如在POST消息體的后面放置一個(gè)CRLF符)。而據(jù)我所知,大部分瀏覽器在POST消息體后都會(huì)自動(dòng)跟一個(gè)CRLF符再發(fā)送,如何解決這個(gè)問(wèn)題呢?根據(jù)上面的說(shuō)明在POST請(qǐng)求頭中禁止使用Keep-Alive,或者由服務(wù)器自動(dòng)忽略這個(gè)CRLF,大部分服務(wù)器都會(huì)自動(dòng)忽略,但是在未經(jīng)測(cè)試之前是不可能知道一個(gè)服務(wù)器是否會(huì)這樣做。

三、閑聊Java實(shí)現(xiàn)

Java實(shí)現(xiàn)--客戶端

在客戶端,Java抽象了Keep-Alive,和程序員分享離開(kāi)來(lái),HttpURLConnection類自動(dòng)實(shí)現(xiàn)了Keep-Alive,如果程序員沒(méi)有介入去操作Keep-Alive,Keep-Alive會(huì)通過(guò)客戶端內(nèi)部的一個(gè)HttpURLConnection類的實(shí)例對(duì)象來(lái)自動(dòng)實(shí)現(xiàn)。也就是說(shuō),在java中keep-alive是由一個(gè)Java類庫(kù)來(lái)實(shí)現(xiàn)的,但在其他類庫(kù)中不一定可用。

Java實(shí)現(xiàn)--服務(wù)器端

在服務(wù)器端,Java依然是將Keep-Alive抽象出來(lái),HttpServlet、HttpServletRequest、和HttpServletResponse類自動(dòng)實(shí)現(xiàn) 了Keep-Alive。這種情況下一些由第三方控制的操作是可能的,如在KeepAliveServlet中提到的JavaWebServer,Keep-Alive是否啟用由兩個(gè)因素決定,內(nèi)容長(zhǎng)度和輸出大小,如果內(nèi)容長(zhǎng)度是響應(yīng)的一部分(即這段內(nèi)容長(zhǎng)度輸出后還有內(nèi)容需要輸出),則Keep-Alive被啟用(當(dāng)然需要客戶端支持的情況下);如果內(nèi)容長(zhǎng)度未設(shè)定,則Servlet會(huì)試著計(jì)算響應(yīng)緩沖區(qū)長(zhǎng)度以確定內(nèi)容長(zhǎng)度,在Javasoft實(shí)現(xiàn)中,使用一個(gè)4KB的緩沖區(qū)(相當(dāng)于上面說(shuō)的響應(yīng))。也就是說(shuō)如果內(nèi)容長(zhǎng)度未設(shè)定,并且返回?cái)?shù)據(jù)超過(guò)4KB,此時(shí)相當(dāng)于內(nèi)容長(zhǎng)度大于響應(yīng)長(zhǎng)度,而不是響應(yīng)長(zhǎng)度一部分,Keep-Alive就不會(huì)被啟用。

來(lái)源:seo優(yōu)化網(wǎng) 轉(zhuǎn)載注明出處!

 
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 平阳县| 遵义市| 光泽县| 英吉沙县| 凤阳县| 都兰县| 桓台县| 准格尔旗| 凭祥市| 乌兰浩特市| 禄劝| 抚顺县| 勐海县| 万源市| 石楼县| 吉木乃县| 思茅市| 靖安县| 隆尧县| 贺州市| 临沭县| 石泉县| 桐城市| 千阳县| 苏尼特右旗| 新丰县| 顺义区| 韶山市| 荥经县| 洪雅县| 敦煌市| 玛纳斯县| 丹阳市| 辽源市| 海丰县| 新乡市| 彭水| 高淳县| 枣阳市| 津南区| 靖安县|