啥都沒說之網絡篇-網站如何定位自己的位置的

孤城子復 發佈 2022-05-26T03:20:46.520340+00:00

其實我們日常接觸最多的就是網站了,了解了協議以後,自然要了解網站用到的是什麼協議了,其實在瀏覽器訪問網站的時候已經給出了提示,沒錯就是HTTP協議。

@人人能科普,處處有新知

您閱讀本文如果覺得符合大人您的口味,請關注一下本君,避免下次想回顧的時候找不到我。創作不易,還請多多支持!點個關注和評論,說一下您的觀點。

4.3 網站需要它

其實我們日常接觸最多的就是網站了,了解了協議以後,自然要了解網站用到的是什麼協議了,其實在瀏覽器訪問網站的時候已經給出了提示,沒錯就是HTTP協議。

超文本傳輸協議HTTP,因為為HyperText Transfer Protocol。是網際網路上應用最為廣泛的一種網絡協議。所有的WWW文件,或者說所有網站都必須遵守這個標準。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法,是用於從WWW伺服器傳輸超文本到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示,正常情況下文本先於圖形等顯示。

HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端/伺服器模型,更嚴格的說,它的客戶端得是一個瀏覽器。HTTP協議通常承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了我們常說的HTTPS。默認HTTP的埠號為80,HTTPS的埠號為443。HTTP協議永遠都是客戶端發起請求,伺服器回送響應。以上的這些就限制了使用HTTP協議,無法實現在客戶端沒有發起請求的時候,伺服器將消息推送給客戶端。HTTP協議還是一個無狀態的協議,同一個客戶端的這次請求和上次請求是沒有對應關係。

一次HTTP操作稱為一個事務,其工作過程可分為四步:

  1. 首先客戶機與伺服器需要建立連接。只要單擊某個超級連結,HTTP的工作開始。
  2. 建立連接後,客戶機發送一個請求給伺服器,請求方式的格式為:統一資源標識符(URL)、協議版本號,後邊是MIME信息包括請求修飾符、客戶機信息和可能的內容。
  3. 伺服器接到請求後,給予相應的響應信息,其格式為一個狀態行,包括信息的協議版本號、一個成功或錯誤的代碼,後邊是MIME信息包括伺服器信息、實體信息和可能的內容。
  4. 客戶端接收伺服器所返回的信息通過瀏覽器顯示在用戶的顯示屏上,然後客戶機與伺服器斷開連接。

如果在以上過程中的某一步出現錯誤,那麼產生錯誤的信息將返回到客戶端,有顯示屏輸出。對於用戶來說,這些過程是由HTTP自己完成的,用戶只要用滑鼠點擊,等待信息顯示就可以了。

這裡出現一個新東西:URL。



  • URI:A Uniform Resource Identifier,URI,是一個緊湊的字符串用來標示抽象或物理資源。
  • URL:Uniform Resource Locator,URL,是URI的子集, 標識資源的地址
  • URN:URN作用就好像一個人的名字,URL就像一個人的地址。換句話說:URN確定了東西的身份,URL提供了找到它的方式。

絕對URI格式:



URL格式 大多數URL協的語法都建立在下面9個部分構成的通用格式上: \<scheme>://\<user>:\<password>@\<host>:\<port>/\<path>;<params>?\<query>#\<frag>

其中最重要的3個部分是:方案(scheme)、主機(host)和路徑(path)

|組件|描述|默認值| |:-:|:-|:-| |方案|訪問伺服器以獲取資源時要使用哪種協議|無| |用戶|某些方案訪問資源時需要的用戶名|匿名| |密碼|用戶名後面可能要包含的密碼,中間由冒號分隔|E-mail地址| |主機|資源宿主伺服器的主機名或點分IP位址|無| |埠|資源宿主伺服器正在監聽的埠號。很多方案都有默認埠號|每個方案特有| |路徑|伺服器上資源的本定名,由斜槓將其與前面的URL組件分隔開來。路徑組件的語法是與伺服器和方案有關。|無| |參數|某些方案會用這個組件來指定輸入參數。參數為名/值對。URL中可以包含多個參數欄位,它們相互之間以與路徑的其餘部分之間用分號;隔。|無| |查詢|某些方案會用這個組件傳遞參數以激活因公程序。查詢組件的內容沒有通用格式。用字符?將其與URL的其餘部分分隔開來。|無| |片段|一小片或者一部分資源的名字。引用對象時,不會將frag欄位傳送給伺服器。這個欄位是在客戶端內部使用的。通過字符#將其與URL的其餘部分分隔開來。|無|

URL字符集

URL是可移植的:因為URL要統一地命名網際網路上的所有資源,而不同的協議在傳輸數據時都會使用不同的機制,因此URL可以通過任意網際網路協議安全地傳輸是很重要的。URL是可讀的:因此,即使不可見、不可列印的字符能夠穿越郵件程序,從而成為可移植的,也不能在URL中使用。URL是完整的:有時候人們會希望URL中包含除通用的安全字母表之外的二進位數據或字符。因此需要一種轉移機制,能夠將不安全的字符編碼為安全字符,再進行傳輸。

為了避開安全字符集帶來的限制,人們設計了「轉義」表示法來表示不安全字符,其中包含一個百分號「%」,後面跟2個表示字符ASCII碼的十六進位數。例如,~符號轉義成%7E,%符號轉義成%25,=符號轉義成%3D。然而在URL中,有幾個字符被保留下來,有特殊意義,不建議使用。如果要用於保留用途以外的場景時,要在URL中對其進行編碼。

|字符|保留/受限| |:-|:-| |%|保留作為編碼字符的轉義標誌| |/|保留作為路徑組件中分隔路徑段的定界符| |.|保留在路徑組件中使用| |..|保留在路徑組件中使用| |#|保留作為分段定界符使用| |?|保留作為查詢字符串定界符使用| |;保留作為參數定界符使用| |:|保留作為方案、用戶/口令,以及主機/埠組件的定界符使用| |$,+|保留| |@&=|在某些方案的上下文中有特殊的含義,保留| |{}|\^~[]』 <>」|由於各種傳輸Agent代理,比如各種網關的不安全處理,使用受限不安全;這些字符在URL範圍之外通常是有意義的,所以應該對其進行編碼。| |0x00-0x1F,0x7F|受限,這些十六進位範圍內的字符都在US-ASCII字符集的不可列印區間內。|

下面我們來看看一次完整的HTTP請求所經歷的7個步驟:

  1. 建立TCP連接
  2. Web瀏覽器向Web伺服器發送請求行
  3. Web瀏覽器發送請求頭
  4. Web伺服器應答
  5. Web伺服器發送應答頭
  6. Web伺服器向瀏覽器發送數據
  7. Web伺服器關閉TCP連接

現在就可以看看所謂的請求頭和應答頭長什麼模樣了。



請求報文包含四部分:

  • [x] 請求行:包含請求方法、URI、HTTP版本信息
  • [x] 請求首部欄位
  • [x] 請求內容實體
  • [x] 空行



響應報文包含四部分:

  • [x] 狀態行:包含HTTP版本、狀態碼、狀態碼的原因短語
  • [x] 響應首部欄位
  • [x] 響應內容實體
  • [x] 空行

常見的首部:

通用首部欄位(請求報文與響應報文都會使用的首部欄位)

Date:創建報文時間 Connection:連接的管理 Cache-Control:緩存的控制 Transfer-Encoding:報文主體的傳輸編碼方式

請求首部欄位(請求報文會使用的首部欄位)

Host:請求資源所在伺服器 Accept:可處理的媒體類型 Accept-Charset:可接收的字符集 Accept-Encoding:可接受的內容編碼 Accept-Language:可接受的自然語言

響應首部欄位(響應報文會使用的首部欄位)

Accept-Ranges:可接受的字節範圍 Location:令客戶端重新定向到的URI Server:HTTP伺服器的安裝信息

實體首部欄位(請求報文與響應報文的的實體部分使用的首部欄位)

Allow:資源可支持的HTTP方法 Content-Type:實體主類的類型 Content-Encoding:實體主體適用的編碼方式 Content-Language:實體主體的自然語言 Content-Length:實體主體的的字節數 Content-Range:實體主體的位置範圍,一般用於發出部分請求時使用

TCP連接在發送後將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了為每個請求建立新連接所需的時間,還節約了網絡帶寬。

HTTP請求方法:

|方法|描述| |:-:|:-| |GET|從指定的資源請求數據| |POST|向指定的資源提交要被處理的數據| |HEAD|與GET相同,但只返回HTTP報頭,不返回文檔主體。| |PUT|上傳指定的URI表示。| |DELETE|刪除指定資源。| |OPTIONS|返回伺服器支持的HTTP方法。| |CONNECT|把請求連接轉換到透明的TCP/IP通道。|

其中最常見的是GET和POST。

有關GET請求的其他一些注釋:

  • GET請求可被緩存
  • GET請求保留在瀏覽器歷史記錄中
  • GET請求可被收藏為書籤
  • GET請求不應在處理敏感數據時使用
  • GET請求有長度限制
  • GET請求只應當用於取回數據

有關POST請求的其他一些注釋:

  • POST請求不會被緩存
  • POST請求不會保留在瀏覽器歷史記錄中
  • POST不能被收藏為書籤
  • POST請求對數據長度沒有要求

如果比較一下GET和POST兩種HTTP方法: ||GET|POST| |:-|:-|:-| |後退按鈕/刷新|無害|數據會被重新提交(瀏覽器應該告知用戶數據會被重新提交)| |書籤|可收藏為書籤|不可收藏為書籤| |緩存|能被緩存|不能緩存| |編碼類型|
application/x-www-form-urlencoded|application/x-www-form-urlencoded或multipart/form-data。為二進位數據使用多重編碼。| |歷史|參數保留在瀏覽器歷史中。|參數不會保存在瀏覽器歷史中。| |對數據長度的限制|當發送數據時,GET方法向URL添加數據;URL的長度是受限制的(URL的最大長度是2048個字符)。|無限制。| |對數據類型的限制|只允許ASCII字符。|沒有限制。也允許二進位數據。| |安全性|與POST相比,GET的安全性較差,因為所發送的數據是URL的一部分。在發送密碼或其他敏感信息時絕不要使用GET。|POST比GET更安全,因為參數不會被保存在瀏覽器歷史或web伺服器日誌中。| |可見性|數據在URL中對所有人都是可見的。|數據不會顯示在URL中。|

還有一個需要羅列一下的就是HTTP狀態碼

常見的HTTP相應狀態碼

200:請求被正常處理204:請求被受理但沒有資源可以返回206:客戶端只是請求資源的一部分,伺服器只對請求的部分資源執行GET方法,相應報文中通過Content-Range指定範圍的資源301:永久性重定向302:臨時重定向303:與302狀態碼有相似功能,只是它希望客戶端在請求一個URI的時候,能通過GET方法重定向到另一個URI上304:發送附帶條件的請求時,條件不滿足時返回,與重定向無關307:臨時重定向,與302類似,只是強制要求使用POST方法400:請求報文語法有誤,伺服器無法識別401:請求需要認證403:請求的對應資源禁止被訪問404:伺服器無法找到對應資源500:伺服器內部錯誤503:伺服器正忙

其實這麼說下去,根本不知道都是什麼意思,不如用兩個圖來表示,當然,這兩張圖是HTTP請求的頭部。

第一張是HTTP請求消息:



第二張是HTTP應答消息,也就是HTTP狀態響應信息:



這其中有一些頭域稍微解釋一下,每個頭域由一個域名,冒號(:)和域值三部分組成。域名是大小寫無關的,域值前可以添加任何數量的空格符,頭域可以被擴展為多行,在每行開始處,使用至少一個空格或制表符

  • host頭域:Host頭域指定請求資源的Intenet主機和埠號,必須表示請求URL的原始伺服器或網關的位置。HTTP/1.1請求必須包含主機頭域,否則系統會以400狀態碼返回。
  • Referer頭域:Referer頭域允許客戶端指定請求URI的源資源地址,這可以允許伺服器生成回退鍊表,可用來登陸、優化Cache等。他也允許廢除的或錯誤的連接由於維護的目的被追蹤。如果請求的URI沒有自己的URI地址,Referer不能被發送。如果指定的是部分URI地址,則此地址應該是一個相對地址。
  • User-Agent頭域:User-Agent頭域的內容包含發出請求的用戶信息,一般情況下是瀏覽器和作業系統信息。
  • Cache-Control頭域:Cache-Control指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置Cache-Control並不會修改另一個消息處理過程中的緩存處理過程。請求時的緩存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,響應消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。
  • Date頭域:Date頭域表示消息發送的時間,時間的描述格式由rfc822定義。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時間表示世界標準時,換算成本地時間,需要知道用戶所在的時區。

行了,亂七八糟的HTTP知識就到這裡吧,有點缺乏邏輯,越寫越亂,不過要是參考請求和相應頭部,似乎還能明白要說什麼。

關鍵字: