理解幾個經典協議——HTTP章3
返回結果的HTTP狀態碼
? 我們知道,ICMP可以傳遞IP通信時候的狀態如何。HTTP雖然沒有輔助的解析,但是它可以使用狀態碼來表達我們的HTTP請求的結果,標記服務器端的處理是否正常、通知出現的錯誤等工作。這就是狀態碼的職責。
? 比如說,當我們的狀態碼是2xx的時候,就說明我們的請求不光到達了服務器,而且還得到了正確的處理。如果出現了4XX,則是說明我們的服務器無法請求處理(這個請求是你的請求出現的問題),如果出現了5XX,說明是服務器內部的錯誤,這是服務器的問題。所以,我們對狀態碼的第一位做一個分類,可以得到:
種類 | 類別 | 原因短語 |
---|---|---|
1XX | 信息性狀態碼 | 接收的請求正在處理 |
2XX | 成功狀態碼 | 請求正常處理完畢 |
3XX | 重定向狀態碼 | 需要進行附加操作以完成請求 |
4XX | 客戶端錯誤碼 | 服務器無法處理請求,這是客戶端的請求非法導致的 |
5XX | 服務端錯誤碼 | 服務端請求處理出錯了,這是服務器內部的錯誤 |
? 具體每一個號碼的請求請參考附錄。
與 HTTP 協作的 Web 服務器
? 我們的HTTP/1.1 規范允許一臺 HTTP 服務器搭建多個 Web 站點。這就是使用物理單臺主機的虛擬多主機(也就是說,我們虛擬化了我們的主機,看起來有很多臺主機在運作,但是實際上只有一臺)
? 客戶端使用 HTTP 協議訪問服務器時,會經常采用類似這樣的主機名和域名。在互聯網上,域名通過 DNS 服務映射到 IP 地址(域名解析)之后訪問目標網站。可見,當請求發送到服務器時,已經是以 IP 地址形式訪問了。
通信數據轉發程序 :代理、網關、隧道
? HTTP通信除了圍繞我們的客戶端和服務器之外,還會有一部分用來進行通信數據轉發。比如說,我們的代理,網關和隧道,他們配合我們的服務器進行工作。
代理
? 代理是一種有轉發功能的應用程序,它扮演了位于服務器和客戶端“中間人”的角色,接收由客戶端發送的請求并轉發給服務器,同時也接收服務器返回的響應并轉發給客戶端。這個時候,我們授權讓我們的代理跟我們的服務器進行通話,而不是我們本人
網關
? 網關是轉發其他服務器通信數據的服務器,接收從客戶端發送來的請求時,它就像自己擁有資源的源服務器一樣對請求進行處理。有時客戶端可能都不會察覺,自己的通信目標是一個網關。
隧道
? 隧道是在相隔甚遠的客戶端和服務器兩者之間進行中轉,并保持雙方通信連接的應用程序。我們一般會用來進行安全加密,保證一個安全的HTTP通信
資源的緩存
? 緩存是指代理服務器或客戶端本地磁盤內保存的資源副本。利用緩存可減少對源服務器的訪問,因此也就節省了通信流量和通信時間。
? 緩存服務器是代理服務器的一種,并歸類在緩存代理類型中。換句話說,當代理轉發從服務器返回的響應時,代理服務器將會保存一份資源的副本。
? 這個場景,是我們用在請求一部分資源的時候,我們的緩存服務器會咨詢我們的源服務器對應的資源是否有效,如果有效,緩存服務器直接將緩存的副本傳遞回來,而不是再請求一次資源。畢竟,傳遞“這個資源有效,就用你原來的”的消耗遠比直接不管不顧再發送資源來的快。
? 當然,資源本身也是有期限的,不管是不是過期了,失能的資源需要再向服務器發起請求刷新。
附錄
狀態碼大全
狀態碼 | 含義 | 出現狀態碼的原因 |
---|---|---|
100 | Continue | 客戶端應繼續其請求,服務器已接收到請求的初始部分 |
101 | Switching Protocols | 服務器已理解請求,并將切換協議 |
102 | Processing | 服務器已收到并正在處理請求,但尚未完成 |
200 | OK | 請求成功 |
201 | Created | 請求成功并創建了新資源 |
202 | Accepted | 請求已被接受,但尚未處理 |
203 | Non-Authoritative Info | 返回的信息來自第三方而非原始服務器 |
204 | No Content | 請求成功,但無返回內容 |
205 | Reset Content | 請求成功,請重置文檔視圖 |
206 | Partial Content | 服務器成功處理了部分請求 |
207 | Multi-Status | 響應包含多個獨立操作結果(WebDAV) |
300 | Multiple Choices | 請求有多種可用響應 |
301 | Moved Permanently | 請求的資源已永久移動到新位置 |
302 | Found | 請求的資源臨時從不同 URI 響應 |
303 | See Other | 請求應通過另一個 URI 獲取資源 |
304 | Not Modified | 資源未修改,可使用緩存 |
305 | Use Proxy | 請求應使用代理訪問 |
307 | Temporary Redirect | 請求的資源臨時從不同 URI 響應(方法不變) |
308 | Permanent Redirect | 請求的資源永久從不同 URI 響應(方法不變) |
400 | Bad Request | 請求格式錯誤,服務器無法理解 |
401 | Unauthorized | 請求未經授權,需身份驗證 |
402 | Payment Required | 保留狀態碼,預留用于將來支付機制 |
403 | Forbidden | 服務器理解請求但拒絕執行 |
404 | Not Found | 請求的資源不存在 |
405 | Method Not Allowed | 請求方法被禁止 |
406 | Not Acceptable | 請求的資源不滿足客戶端的 Accept 頭要求 |
407 | Proxy Authentication Req | 需要代理身份驗證 |
408 | Request Timeout | 請求超時 |
409 | Conflict | 請求沖突(例如資源狀態沖突) |
410 | Gone | 請求的資源已被永久刪除 |
411 | Length Required | 請求未定義 Content-Length 頭 |
412 | Precondition Failed | 請求頭中指定的前提條件失敗 |
413 | Payload Too Large | 請求實體過大 |
414 | URI Too Long | 請求的 URI 過長 |
415 | Unsupported Media Type | 請求格式不受支持 |
416 | Range Not Satisfiable | 請求的范圍無效 |
417 | Expectation Failed | 請求頭中的 Expect 無法滿足 |
418 | I’m a teapot | 玩笑用的狀態碼,不支持沖泡咖啡 |
421 | Misdirected Request | 請求被發送到不能生產響應的服務器 |
422 | Unprocessable Entity | 請求格式正確但語義錯誤(WebDAV) |
423 | Locked | 資源被鎖定(WebDAV) |
424 | Failed Dependency | 由于之前的請求失敗,當前請求失敗(WebDAV) |
425 | Too Early | 服務器不愿意處理過早的請求 |
426 | Upgrade Required | 客戶端需升級協議 |
428 | Precondition Required | 需指定請求條件以防止沖突 |
429 | Too Many Requests | 客戶端發送請求過多,已被限流 |
431 | Request Header Fields Too Large | 請求頭字段過大 |
451 | Unavailable For Legal Reasons | 請求內容因法律原因不可用 |
500 | Internal Server Error | 服務器內部錯誤 |
501 | Not Implemented | 服務器不支持請求方法 |
502 | Bad Gateway | 網關服務器收到無效響應 |
503 | Service Unavailable | 服務器暫時超載或維護中 |
504 | Gateway Timeout | 網關服務器請求超時 |
505 | HTTP Version Not Supported | 不支持的 HTTP 版本 |
506 | Variant Also Negotiates | 內容協商出現循環引用 |
507 | Insufficient Storage | 服務器無法存儲請求所需內容(WebDAV) |
508 | Loop Detected | 服務器檢測到無限循環(WebDAV) |
510 | Not Extended | 請求需進一步擴展 |
511 | Network Authentication Required | 需要進行網絡認證 |