<ul id="g60s4"><pre id="g60s4"></pre></ul>
<strong id="g60s4"><nav id="g60s4"></nav></strong>
<ul id="g60s4"></ul>
  • <tr id="g60s4"></tr>
  • 
    
  • 或者

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

    作者:月光邊境 瀏覽:169 發(fā)布時間:2017-08-29
    分享 評論 0

    一、什么是HTTP Keep Alive

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

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

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

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

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

      Not reliable(不可靠)

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

      Keep-Alive和POST

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

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

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

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

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

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


    少妇人妻无码精品视频app| 国产精品久久久久久久久久免费 | 亚洲国产欧美日韩精品一区二区三区 | 久久亚洲精品国产精品黑人| 国产在线精品一区二区| 999精品视频在线观看热6| 第四色播日韩第一页| 国产精品视频a播放| 伊人久久精品无码二区麻豆| 国产精品二区高清在线| 99re6热视频精品免费观看| 亚洲午夜精品久久久久久浪潮| 欧美精品久久天天躁| 久久99国产亚洲精品观看| 一区二区精品视频| 精品免费久久久久久成人影院| 久久久亚洲精品国产| 一色屋精品视频任你曰| 精品国产自在钱自| 91精品一区二区三区在线观看| 91麻豆精品国产| 国产日韩视频在线观看| 九九99久久精品国产| 91精品久久久久久久久中文字幕 | 热99RE久久精品这里都是精品免费| 国产成人麻豆精品午夜福利在线| 91久久精品国产91性色也| 奇米影视7777久久精品人人爽| 日韩成av人片在线观看| 精品国产日韩亚洲一区91| 精品国产一区二区三区无码 | 久久亚洲美女精品国产精品| 精品无码一级毛片免费视频观看| 亚洲日韩国产一区二区三区| 亚洲国产成人久久精品大牛影视 | 精品国产日韩亚洲一区91| 国产夫妇精品自在线| 久久精品国产亚洲av水果派| 亚洲国产精品无码专区影院| 国产在vr视频精品观看| 久久国产精品视频|