看完讓你有一種恍然大悟醍醐灌頂的感覺 http服務器是什么?( 四 )


HTTP 請求響應過程你是不是很好奇,當你在瀏覽器中輸入網址后,到底發生了什么事情?你想要的內容是如何展現出來的?讓我們通過一個例子來探討一下,我們假設訪問的 URL 地址為 http://www.someSchool.edu/someDepartment/home.index,當我們輸入網址并點擊回車時,瀏覽器內部會進行如下操作

  • DNS服務器會首先進行域名的映射,找到訪問www.someSchool.edu所在的地址,然后HTTP 客戶端進程在 80 端口發起一個到服務器 www.someSchool.edu 的 TCP 連接(80 端口是 HTTP 的默認端口) 。 在客戶和服務器進程中都會有一個套接字與其相連 。
  • HTTP 客戶端通過它的套接字向服務器發送一個 HTTP 請求報文 。 該報文中包含了路徑 someDepartment/home.index 的資源,我們后面會詳細討論 HTTP 請求報文 。
  • HTTP 服務器通過它的套接字接受該報文,進行請求的解析工作,并從其存儲器(RAM 或磁盤)中檢索出對象 www.someSchool.edu/someDepartment/home.index,然后把檢索出來的對象進行封裝,封裝到 HTTP 響應報文中,并通過套接字向客戶進行發送 。
  • HTTP 服務器隨即通知 TCP 斷開 TCP 連接,實際上是需要等到客戶接受完響應報文后才會斷開 TCP 連接 。
  • HTTP 客戶端接受完響應報文后,TCP 連接會關閉 。 HTTP 客戶端從響應中提取出報文中是一個 HTML 響應文件,并檢查該 HTML 文件,然后循環檢查報文中其他內部對象 。
  • 檢查完成后,HTTP 客戶端會把對應的資源通過顯示器呈現給用戶 。
至此,鍵入網址再按下回車的全過程就結束了 。 上述過程描述的是一種簡單的請求-響應全過程,真實的請求-響應情況可能要比上面描述的過程復雜很多 。
HTTP 請求特征從上面整個過程中我們可以總結出 HTTP 進行分組傳輸是具有以下特征
  • 支持客戶-服務器模式
  • 簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑 。 請求方法常用的有 GET、HEAD、POST 。 每種方法規定了客戶與服務器聯系的類型不同 。 由于 HTTP 協議簡單,使得 HTTP 服務器的程序規模小,因而通信速度很快 。
  • 靈活:HTTP 允許傳輸任意類型的數據對象 。 正在傳輸的類型由 Content-Type 加以標記 。
  • 無連接:無連接的含義是限制每次連接只處理一個請求 。 服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接 。 采用這種方式可以節省傳輸時間 。
  • 無狀態:HTTP 協議是無狀態協議 。 無狀態是指協議對于事務處理沒有記憶能力 。 缺少狀態意味著如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大 。 另一方面,在服務器不需要先前信息時它的應答就較快 。
詳解 HTTP 報文我們上面描述了一下 HTTP 的請求響應過程,流程比較簡單,但是凡事就怕認真,你這一認真,就能拓展出很多東西,比如 HTTP 報文是什么樣的,它的組成格式是什么? 下面就來探討一下
HTTP 協議主要由三大部分組成:
  • 起始行(start line):描述請求或響應的基本信息;
  • 頭部字段(header):使用 key-value 形式更詳細地說明報文;
  • 消息正文(entity):實際傳輸的數據,它不一定是純文本,可以是圖片、視頻等二進制數據 。
其中起始行和頭部字段并成為 請求頭 或者 響應頭,統稱為 Header;消息正文也叫做實體,稱為 body 。 HTTP 協議規定每次發送的報文必須要有 Header,但是可以沒有 body,也就是說頭信息是必須的,實體信息可以沒有 。 而且在 header 和 body 之間必須要有一個空行(CRLF),如果用一幅圖來表示一下的話,我覺得應該是下面這樣

看完讓你有一種恍然大悟醍醐灌頂的感覺 http服務器是什么?

文章插圖
我們使用上面的那個例子來看一下 http 的請求報文
如圖,這是 http://www.someSchool.edu/someDepartment/home.index 請求的請求頭,通過觀察這個 HTTP 報文我們就能夠學到很多東西,首先,我們看到報文是用普通 ASCII 文本書寫的,這樣保證人能夠可以看懂 。 然后,我們可以看到每一行和下一行之間都會有換行,而且最后一行(請求頭部后)再加上一個回車換行符 。
每個報文的起始行都是由三個字段組成:方法、URL 字段和 HTTP 版本字段 。
HTTP 請求方法HTTP 請求方法一般分為 8 種,它們分別是