關閉連線的奧秘 HTTP權威指南讀書心得(六)

2022-03-22 14:53:39 字數 2378 閱讀 5703

我又來記筆記了,雖然部落格只寫到了第五章,但是這本書基本上算是快讀完了吧......讀這種書比一般的程式設計演算法書籍更需要耐心,它主要說的是原理,沒有辦法讓你立刻實踐,所以很容易浮在上面。一天頂多讀個兩三章就有點看不下去了....之前忘了在**好像有位知名前輩評價這本書說理解透徹了就可以去找乙份網際網路工作了,讀到這裡,我倒是覺得這麼說有些不對。這本書感覺給我的感覺是它在幫我補地基,有些經驗的開發者讀這本書是很好的補充,而如果單單來看這本書來說,它可能並不能直接用在我們平時的工作上,而且這本書對於相關知識也只是處於介紹之上一點的狀態,它能幫讀者構建乙個完整的知識體系,但是每個元素的深化它是做不到的,還要靠人們自己慢慢摸索啊,要學的東西還是好多,加油吧。

關閉

連線的種種

隨意的連線關閉

「戀人的誓言是傳不到上帝的耳邊的」,同樣客戶端與伺服器的關係也是這麼不靠譜,伺服器和客戶端都可以隨時關閉連線,所以就有可能造成報文傳送一半連線就被關閉的悲劇。對於持久連線來說更是如此,普通的連線還有連線隨著報文傳輸完成而關閉的默契,而持久連線只要一端覺得好長時間沒有使用就可能關閉連線,甚至在任意時刻都可能會關閉連線,而這時如果另一端正在傳送報文就會出現錯誤。雖然持久連線會交換保持時間和希望傳輸報文次數等首部,但是這是非承諾值,也就是說我大概會這麼做,但是如果我沒有這麼做,也沒有問題。

content-length的重要性:

對於普通的連線來說,判斷報文結束的條件是連線的關閉。也就是說在如果連線關閉了,那就是告訴接收端這個報文結束了。如果是持久連線的話,就無法使用這種方法了,這個時候content-length就派上用場了。在持久連線上傳輸時,content-length說明了實體的長度,接收端通過是長度判斷**是報文**結束,從而對報文進行截斷。如果content-length出現錯誤或者content-length沒有提供,那麼客戶端就無法判斷報文的結束在**,傳輸便出現錯誤。所以說在使用持久連線進行報文傳輸時,一定要提供正確的content-length。

連線關閉導致的重試,以及方法的冪等性:

因為連線是這麼的不靠譜,所以傳送端要隨時做好在傳輸過程中遇到連線突然關閉情況的準備,也就是傳送失敗的話需要進行重新傳送。而重新傳送的話就可能遇到問題:有些事務即使重新傳送也不會有問題,例如get,head,put,delete,options,trace等正常情況下方法重複多次傳送的話也不會出現問題,我們稱之為是冪等,而post等方法傳送多次的話就可能出問題,這些事務我們就稱之為非冪等,舉個我們經常遇到的例子,當我們在逛**的時候,有時重新整理頁面的時候會彈出提示,說該頁面不可以重複提交,這個就是因為有些資料如果重複提交的話就會遇到問題。比如你買了一件衣服,然後重複提交了一次,可能伺服器最後收到的就是你要買兩件衣服。

正常的關閉

應用程式可以選擇關閉tcp輸入和輸出通道的任意乙個,或者兩個都關閉,如果只關閉乙個通道就稱之為「半關閉」。簡單的http程式可以只使用完全關閉,而有些複雜的對話且使用了持久連線的話,用半關閉來防止對等端遇到錯誤就十分重要了。

首先關閉連線的輸出通道是很安全的。當連線另一端的對等實體從其緩衝區讀出所有的資料之後會收到一條通知,告訴它流結束了。關閉連線的輸入通道則比較危險,除非你知道另一端不會再傳送資訊了。讓我們看看如果先關閉輸入通道會有什麼嚴重後果:

客戶端已經在持久連線上傳送了 10條請求了,而且這十條請求的響應也已經收到,並在緩衝區儲存。

這時客戶端傳送了第11條請求,而伺服器突然覺得你已經用的夠多了吧,就把伺服器的輸入通道關閉了,當你的請求在已經關閉的傳送時,那麼伺服器就會回送一條重置資訊,這條資訊會重置客戶端的緩衝區,而這時候的緩衝區還緩衝著你前十條請求的響應呢!!!

當最後客戶端去緩衝區讀取資料的時候,會得到乙個連線被重置的錯誤,同時已經快取的相應資料都丟了,儘管之前客戶端已經接到了這些響應。

那麼怎麼正確的關閉連線呢?

http規範建議當要突然關閉連線時,應該「正常的關閉連線」,但是它也沒說怎麼關閉是正確的...

總而言之,要關閉乙個連線,想要關閉的一端應先關閉自己的輸出通道,等待另一端關閉它的輸出通道,當兩遍都告訴對方不會傳送任何資訊之後,再關閉輸入通道,這樣連線就完全關閉了,而且也不會出現問題。

但是可控的只能是自己的這端,我們沒有辦法控制另一端也會這麼做,因此如果想要關閉一條連線的話,應該先關閉己端的輸出通道,然後週期性的對己端的輸入通道進行檢查,如果在一段時間之內沒有資料傳輸,那麼就可以關閉連線。

今天就到這裡,得加快進度了,希望假期結束前能把這本書的讀書筆記弄完。

HTTP權威指南

web 伺服器會為所有 http 物件資料附加乙個 mime 型別,content type image jpeg,content length 12984 伺服器資源名被稱為統一資源識別符號 uniform resource identifier,uri uri 就像網際網路上的郵政位址一樣,在世...

HTTP權威指南 連線管理(2)

知識點 特點 連線時延的重疊 並行連線讓使用者感覺 更快 了 因為多個元件物件同時出現在螢幕上時,使用者能夠看到載入的進展 http 1.1 以及 http 1.0 的各種增強版本 允許 http 裝置在事務處理結束 之後將 tcp 連線保持在開啟狀態,以便為未來的 http 請求重用現存的連線。在...

HTTP權威指南之連線管理

tcp連線 世界上幾乎所有的 http 通訊都是由 tcp ip 承載的,tcp ip 是全球計算機及網路 裝置都在使用的一種常用的分組交換網路分層協議集。客戶端應用程式可以開啟一 條 tcp ip 連線,連線到可能執行在世界任何地方的伺服器應用程式。一旦連線建 立起來了,在客戶 端和伺服器的計算機...