1. 程式人生 > >HTTP網路通訊小結

HTTP網路通訊小結

1.頁面從輸入 URL 到頁面載入顯示完成的過程

分為4個步驟:

(1)當傳送一個URL請求時,不管這個URL是Web頁面的URL還是Web頁面上每個資源的URL,瀏覽器都會開啟一個執行緒來處理這個請求,同時在遠端DNS伺服器上啟動一個DNS查詢。這能使瀏覽器獲得請求對應的IP地址。

(2)瀏覽器與遠端Web伺服器通過TCP三次握手協商來建立一個TCP/IP連線。該握手包括一個同步報文,一個同步-應答報文和一個應答報文,這三個報文在 瀏覽器和伺服器之間傳遞。該握手首先由客戶端嘗試建立起通訊,而後伺服器應答並接受客戶端的請求,最後由客戶端發出該請求已經被接受的報文。

(3)一旦TCP/IP連線建立,瀏覽器會通過該連線向遠端伺服器傳送HTTP的GET請求。遠端伺服器找到資源並使用HTTP響應返回該資源,值為200的HTTP響應狀態表示一個正確的響應。

(4)此時,Web伺服器提供資源服務,客戶端開始下載資源。

2.Http狀態碼

Http狀態碼主要分為以下5類

100~199————資訊性狀態碼

200~299————成功狀態碼

300~399————重定向狀態碼

400~499————客戶端錯誤狀態碼

500~599————伺服器錯誤狀態碼

3. 304狀態碼

如果客戶端傳送了一個帶條件的GET 請求且該請求已被允許,而文件的內容(自上次訪問以來或者根據請求的條件)並沒有改變,則伺服器應當返回這個304狀態碼。簡單的表達就是:客戶端已經執行了GET,但檔案未變化。

4.TCP/IP協議

傳輸控制協議/因特網互聯協議,又名網路通訊協議,是Internet最基本的協議、Internet國際網際網路絡的基礎,由網路層的IP協議和傳輸層的TCP協議組成。TCP/IP 定義了電子裝置如何連入因特網,以及資料如何在它們之間傳輸的標準。協議採用了4層的層級結構,每一層都呼叫它的下一層所提供的協議來完成自己的需求。通俗而言:TCP負責發現傳輸的問題,一有問題就發出訊號,要求重新傳輸,直到所有資料安全正確地傳輸到目的地。而IP是給因特網的每一臺聯網裝置規定一個地址。


5.處理404錯誤頁面

(1)什麼是404錯誤

HTTP 404 錯誤意味著連結指向的網頁不存在,即原始網頁的URL失效,這種情況經常會發生,很難避免,比如說:網頁URL生成規則改變、網頁檔案更名或移動位置、匯入連結拼寫錯誤等,導致原來的URL地址無法訪問;當Web 伺服器接到類似請求時,會返回一個404 狀態碼,告訴瀏覽器要請求的資源並不存在。但是,Web伺服器預設的404錯誤頁面,無論Apache還是IIS,均十分簡陋、呆板且對使用者不友好,無法給使用者提供必要的資訊以獲取更多線索,無疑這會造成使用者的流失。

(2)404頁面的作用

搜尋引擎通過HTTP狀態碼來識別網頁的狀態。當搜尋引擎獲得了一個錯誤連結時,網站應該返回404狀態碼,告訴搜尋引擎放棄對該連結的索引。而如果返回200或302狀態碼,搜尋引擎就會為該連結建立索引,這導致大量不同的連結指向了相同的網頁內容。結果是,搜尋引擎對該網站的信任度大幅降低。

(3)如何檢查自定義404頁面能夠返回”404”狀態碼

在自定義404錯誤頁面設定完畢後,一定要檢查一下其是不是能夠正確地返回“404”狀態碼。檢查的方法也相當簡單,輸入一個網站內不存在網頁的url,檢視一下HTTP Header的返回情況,確信其返回的是“404”狀態碼。

(4)正確處理404錯誤頁面,保證返回”404狀態碼”

web.config裡面有一個customErrors,我們通常設定的程式碼為:

<customErrors defaultRedirect="error.aspx" mode="RemoteOnly">

    <error statusCode="404" redirect="404.aspx" />

</customErrors>

它的工作是這樣的,當訪問到一個不存在的地址後,返回的是一個302狀態碼重定向到404.aspx頁面。這樣就可能導致爬蟲認為這個頁面仍然是有效的,只是連結錯了,然後收錄這個自定義的404頁面。

正確的處理方法是在global.asax中將捕獲的http錯誤的程式碼,貼在Application_Error事件中:

// 在出現未處理的錯誤時執行的程式碼

Exception error = Server.GetLastError();

if (error != null && error is HttpException)

{

    HttpException httpError = (HttpException)error;

    // 如果是Http錯誤,則設定響應的HttpCode

int httpCode = httpError.GetHttpCode();

    Response.StatusCode = httpCode;

    //這樣就能返回原始錯誤的狀態碼,然後用判斷狀態碼來跳轉到我指定的頁面

    Server.Transfer(Response.StatusCode == 404 ? "/404.aspx" : "/error.aspx");

}