HTTP協議總結

正文開始以前,先推薦兩篇我認爲寫的很好的博客:html

HTTP協議格式詳解 https://www.jianshu.com/p/8fe93a14754cnginx

HTTP協議詳解(真的很經典) https://blog.csdn.net/u013219814/article/details/56290792web

本文絕大部分是摘自《HTTP協議格式詳解》,版權歸原做者全部。服務器

1、URI結構

HTTP使用統一資源標識符(URI)來傳輸數據和創建鏈接。URL(統一資源定位符)是一種特殊種類的URI,包含了用於查找的資源的足夠的信息,咱們通常經常使用的就是URL,而一個完整的URL包含下面幾部分:app

http://www.fishbay.cn:80/mix/76.html?name=kelvin&password=123456#first性能

  1. 協議部分 該URL的協議部分爲http:,表示網頁用的是HTTP協議,後面的//爲分隔符測試

  2. 域名部分 域名是www.fishbay.cn,發送請求時,須要向DNS服務器解析IP。若是爲了優化請求,能夠直接用IP做爲域名部分使用優化

  3. 端口部分 域名後面的80表示端口,和域名之間用:分隔,端口不是一個URL的必須的部分。若是端口是80,也能夠省略不寫.net

  4. 虛擬目錄部分 從域名的第一個/開始到最後一個/爲止,是虛擬目錄的部分。其中,虛擬目錄也不是URL必須的部分,本例中的虛擬目錄是/mix/代理

  5. 文件名部分 從域名最後一個/開始到?爲止,是文件名部分;若是沒有?,則是從域名最後一個/開始到#爲止,是文件名部分;若是沒有?和#,那麼就從域名的最後一個/從開始到結束,都是文件名部分。本例中的文件名是76.html,文件名也不是一個URL的必須部分,若是沒有文件名,則使用默認文件名

  6. 錨部分 從#開始到最後,都是錨部分。本部分的錨部分是first,錨也不是一個URL必須的部分

  7. 參數部分 從?開始到#爲止之間的部分是參數部分,又稱爲搜索部分、查詢部分。本例中的參數是name=kelvin&password=123456,若是有多個參數,各個參數之間用&做爲分隔符。

2、 Request

HTTP的請求包括四個部分組成:

  • 請求行(request line)
  • 請求頭部(header)
  • 空行
  • 請求數據

http請求消息結構體

抓包(可使用 wireshark等)的request結構以下:

GET /mix/76.html?name=kelvin&password=123456 HTTP/1.1
Host: www.fishbay.cn
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6

3、Response

通常狀況下,服務器收到客戶端的請求後,就會有一個HTTP的響應消息,HTTP響應也由4部分組成,分別是:

  • 狀態行
  • 響應頭
  • 空行
  • 響應體

http響應消息結構體

抓包的數據以下:

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 20 Feb 2017 09:13:59 GMT
Content-Type: text/plain;charset=UTF-8
Vary: Accept-Encoding
Cache-Control: no-store
Pragrma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: no-cache
Content-Encoding: gzip
Transfer-Encoding: chunked
Proxy-Connection: Keep-alive

{"code":200,"notice":0,"follow":0,"forward":0,"msg":0,"comment":0,"pushMsg":null,"friend":{"snsCount":0,"count":0,"celebrityCount":0},"lastPrivateMsg":null,"event":0,"newProgramCount":0,"createDJRadioCount":0,"newTheme":true}

3、狀態碼

HTTP協議的狀態碼由3位數字組成,第一個數字定義了響應的類別,共有5中類別:

  • 1xx: 指示信息--表示請求已接收,繼續處理
  • 2xx: 成功--表示請求已被成功接收、理解、接受
  • 3xx: 重定向--要完成請求必須進行更進一步的操做
  • 4xx: 客戶端錯誤--請求有語法錯誤或請求沒法實現
  • 5xx: 服務器端錯誤--服務器未能實現合法的請求

其中,經常使用的狀態碼以下:

200 OK                        //客戶端請求成功
400 Bad Request               //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized              //請求未經受權,這個狀態代碼必須和WWW-Authenticate報頭域一塊兒使用 
403 Forbidden                 //服務器收到請求,可是拒絕提供服務
404 Not Found                 //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error     //服務器發生不可預期的錯誤
503 Server Unavailable        //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常

5、請求方法

HTTP定義了多種請求方法,來知足各類需求。HTTP/1.0定義了三種請求方法:GET、POST 和 HEAD,到了HTTP/1.1,新增了五種請求方法:OPTIONS、PUT、DELETE、TRACE 和 CONNECT。各個請求方法的具體功能以下:

GET         請求指定的頁面信息,並返回實體主體。
HEAD        相似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
POST        向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會致使新的資源的創建和/或已有資源的修改。
PUT         從客戶端向服務器傳送的數據取代指定的文檔的內容。
DELETE      請求服務器刪除指定的頁面。
CONNECT     HTTP/1.1協議中預留給可以將鏈接改成管道方式的代理服務器。
OPTIONS     容許客戶端查看服務器的性能。
TRACE       回顯服務器收到的請求,主要用於測試或診斷。
相關文章
相關標籤/搜索