HTTP你可能還不知道的事。

HTTP是一個基於TCP/IP通訊協議來傳遞數據的無狀態協議,且其是一個屬於應用層的面向對象的協議。說到應用層,引一下《計算機網絡》裏邊的內容,在家沒有翻到這本書纔想起來給忘帶了過來,真是後悔大學裏沒有把這些基礎掌握紮實啊。(掌握一些基礎知識有百益而無一害,並且計算機方面知識都是互通的,不分到具體某個領域,就像是《計算機基礎》這本書,雖然說沒有重要的知識要領掌握,但這是一本決定你層次高低的標杆,就是由於其內容不少涉及到計算機底層原理的知識)TCP/IP網絡通訊模型總共分爲四層以下所示:html

TCP/IP網絡通訊模型
應用層-Application layer(HTTP,FTP,DNS...)
傳輸層-Transport layer (TCP,UDP,RTP...)
網絡層-Internet layer (IP,ICMP,AKP...)
網絡接入層-Link layer(IEEE 802.1A,FDDI,Ethernet...)

而HTTP就是基於其中應用層的一套協議,該層包括全部和應用程序協同工做,利用基礎網絡交換應用程序專用的數據的協議(來自維基百科),例如表格中列舉的同樣,感興趣的同窗能夠本身研究下,本篇主要討論一下http協議。言歸正傳,HTTP協議工做在客戶端-服務端之間,瀏覽器做爲HTTP客戶端經過URL向WEB服務器發送請求,服務器接收到來自客戶端(瀏覽器)的請求後會返回響應信息,就是簡單的「請求-應答」模式可是爲何說http協議是無狀態的?找了些資料大概是這樣解釋的:web

  • 協議對於事務處理沒有記憶能力
  • 對同一個url請求沒有上下文關係
  • 每次的請求都是獨立的,它的執行狀況和結果與前面的請求和以後的請求是無直接關係的,它不會受前面的請求應答狀況直接影響,也不會直接影響後面的請求應答狀況
  • 服務器中沒有保存客戶端的狀態,客戶端必須每次帶上本身的狀態去請求服務器瀏覽器

    以上幾點中的關鍵詞已經加粗,作重點理解,這時能夠拋出一個最恰當的問題:既然HTTP是無狀態的,那keep-alive的值意義何在?其實keep-alive就是爲了讓客戶端和服務端保持一種持久的鏈接聯繫,這樣也是爲了減小請求/響應的開銷,提升性能,但這並不意味着請求頭中有了這個參數,HTTP就不是無狀態的協議了,其自己還是無狀態的協議,並且無狀態指的是在應用層這個層次上服務器沒有保存客戶端的狀態信息,ok說到這裏也是時候搞一搞cookiesession了,二者都是客戶端和服務端通訊的介質,簡而言之,cookie是客戶端的存儲空間,由瀏覽器來維持,其採用的是在客戶端保持狀態的方案,而session機制採用的是在服務器端保持狀態的方案。有些時候因爲服務器端保持狀態的方案在客戶端也須要保存一個標識,因此session機制可能須要藉助於cookie機制來達到保存標識的目的。(近期作的一個項目讓我意識到了本身的知識窄區例如session/http相關知識,之前只是知道並無深刻了解,我的以爲在某些專業領域仍是要拋棄不求甚解的思想,有時候鑽個牛角尖也會有額外的收穫)重點來了,雖然cookie和session均可以保存狀態,還有keep-alive持久鏈接,可是,可是,可是它們並無改變HTTP自己無狀態這一點,由於這些辦法只是在幫助客戶端和服務端創建一套更好的協做通訊關係,以提升通訊和開發效率。安全

    HTTP主要經過URI來傳輸數據和創建來創建鏈接,這裏的URI(Uniform Resource Identifier)指的是統一資源標識符,不一樣於URL(Uniform Resource Locator),其指的是統一資源定位符,二者的關係能夠理解爲URL是一個特殊類型且具體的URI,一個URL裏包含了用於查找某個資源的足夠信息。就隨便拿一個地址舉例子來講:服務器

    http://www.google.com:7001/signContract?apptoken=jksldjflkdjslkfjds&contractId=110&orderId=911#usercookie

從這個URL咱們能夠看出裏邊的參數包含一下幾項:網絡

  1. 協議部分:‘http:’這表明網頁使用的是http協議,在‘http’後面的‘//’爲分割符,此外還有HTTPS、FTP協議,BTW,一個域名下不建議同時摻雜http和https的連接,這樣會致使出現混合內容,對網站安全形成威脅,例如以前神策埋點的連接就形成相似問題。具體關於混合內容涉及到we端安全方面的知識,感興趣的同窗能夠去了解下,我也是無心中一個朋友問到這個問題纔去瞭解的,多瞭解下有害無益嘛。
  2. 域名部分:該地址的域名爲「www.google.com」,一個URL中也可使用IP地址做爲域名使用,好比使用這個IP也能夠打開百度首頁(渣渣): 202.108.22.5,至於爲何,感興趣的同窗能夠去了解下DNS(Domain Name System)。
  3. 端口:「7001」域名後面冒號(:)緊跟着的是端口,能夠省略,若是省略的話會採用瀏覽器的默認端口即80。
  4. 目錄路徑:從端口號開始的第一個「/」開始到最後一個「/」,這之間是目錄部分,例如「signContract」。
  5. 參數部分:從「?」開始到「#」爲止之間的部分是參數,多個參數用「&」鏈接,此例中的參數是
    apptoken=jksldjflkdjslkfjds&contractId=110&orderId=911
  6. 錨:從「#」開始到最後是錨部分,小融租項目裏沒有使用到錨點部分,這裏示例只作講解。參數可省略。session

至於http狀態碼、請求及響應相關的東西就不作詳解了,這裏我的以爲有必要再梳理一下http的工做原理。首先客戶端向服務器發送一個請求報文,請求報文中包含請求的方法、url、協議版本、請求頭部、請求數據,服務器以一個狀態行做爲響應,響應的內容包括協議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數據。如下是http請求響應的步驟:app

  • 客戶端鏈接到web服務器:一般是從瀏覽器地址欄進入,創建一個TCP套接字鏈接,例如:「https://www.google.com/
  • 發送HTTP請求:經過TCP套接字,客戶端向web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據4部分組成。
  • 服務器接受請求並返回http響應:web服務器解析請求,定位請求資源。返回給客戶端讀取。
  • 釋放鏈接:若connectionclose,則服務器主動關閉TCP鏈接,客戶端被動關閉鏈接,釋放TCP鏈接;若connectionkeep-alive,則該鏈接會保持一段時間。
  • 客戶端瀏覽器解析HTML內容:客戶端瀏覽器首先解析狀態行,查看代表請求是否成功的狀態代碼。而後解析響應頭,響應頭告知一下爲若干字節的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數據HTML,並在瀏覽器渲染。性能

    以上所述能夠理解成一個完整的請求及響應過程,其中還涉及到DNS解析域名、TCP三次握手等細節,由於本篇文章主要介紹HTTP就不作詳細講解(感興趣的同窗能夠去研究下)。關於HTTP相關知識點是我最近接觸到的,因此總結一下加深本身的印象,文中如有歧義或是不正確的地方還望不吝指正,不過要想把HTTP整個吃透還相差甚遠,畢竟上週在公交車上看到我的拿了一本《圖解HTTP》,想一想真的是學海無涯,就如那句hello-world所說,打開了新世界的大門,並且這個新world還有不少東西須要探索,這時就要告訴本身:Keep going and never stop !

相關文章
相關標籤/搜索