<code id="6mcsu"></code>
<li id="6mcsu"></li>
<li id="6mcsu"><dl id="6mcsu"></dl></li>
  • <code id="6mcsu"><tr id="6mcsu"></tr></code>
    或者

    HTTP Keep Alive分析與優化總結

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

    一、什么是HTTP Keep Alive

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

      具體說,HTTP構建在TCP之上。在HTTP早期實現中,每個HTTP請求都要打開一個socket連接。這種做效率很低,因為一個Web 頁面中的很多HTTP請求都指向同一個服務器。例如,很多為Web頁面中的圖片發起的請求都指向一個通用的圖片服務器。持久連接的引入解決了多對已請求服務器導致的socket連接低效性的問題。它使瀏覽器可以再一個單獨的連接上進行多個請求。瀏覽器和服務器使用Connection頭ilai指出對Keep-Alive的支持。HTTP/1.0

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

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

      二、HTTP Keep Alive的注意點

      Not reliable(不可靠)

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

      Keep-Alive和POST

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

      三、閑聊Java實現

      Java實現--客戶端

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

      Java實現--服務器端

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


    日韩精品无码专区免费播放| 中文字幕精品亚洲无线码二区| 亚洲国产精品成人AV无码久久综合影院 | 亚洲成av人片在线观看无码不卡| 中文无码喷潮在线播放| 无码人妻一区二区三区在线| 日本欧美亚洲中文| 精品久久亚洲中文无码| 精品久久久久久无码人妻热 | 日韩精品无码免费专区网站| 五月天中文字幕mv在线| 五月婷婷无码观看| 黄桃AV无码免费一区二区三区| 蜜桃臀AV高潮无码| 日韩免费在线中文字幕| 亚洲精品无码鲁网中文电影| 亚洲成A∨人片天堂网无码| 精品成在人线AV无码免费看| 无码人妻丰满熟妇区免费| 日本中文字幕免费看| 日韩精品久久无码中文字幕| 亚洲人成无码网站久久99热国产| 变态SM天堂无码专区| JLZZJLZZ亚洲乱熟无码| 久久亚洲AV成人无码电影| 亚洲AV日韩AV永久无码免下载| 国产麻豆天美果冻无码视频| 成人麻豆日韩在无码视频| 精品深夜AV无码一区二区老年| 在线免费中文字幕| 日韩国产中文字幕| 中文字幕在线观看| 最近更新中文字幕第一页| 中文字幕成人精品久久不卡| 中文字幕二区三区| 亚洲av中文无码| 久久亚洲精品无码VA大香大香| 久久久久精品国产亚洲AV无码| 久久久久亚洲AV无码观看| 亚洲AV无码一区东京热久久| 无码午夜成人1000部免费视频 |