HTTP 傳輸協定

HTTP傳輸協定是網路中最廣泛被應用到的協定,設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法,通過HTTP或者HTTPS協定請求的資源由統一資源識別元(Uniform Resource Identifiers,URI)來標識。

協定版本

版本 說明
0.9 已經過時的版本,只接受GET一種請求方法,沒有在通訊協定中指定版本號,且不支援請求標頭。由於該本版不支援POST因此用戶端無法像伺服器傳遞太多訊息。
1.0 這是第一個在通訊中指定版本號的版本,目前仍然被廣泛應用,特別在代理伺服器上。
1.1 持久連線被預設採用,並能很好的配合代理伺服器的工作,之支援以管道方式同時傳送多個請求,以便降低線路負載,提高傳輸速度。
2.0 目前版本,於2015年5月作為網際網路標準正式發布

協定例子

使用者請求

最簡單的請求就是如瀏覽器中請求網頁的方式,通常都為

GET / HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) 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, br
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4

第一行要符合規則,後續的看請求如何設定,瀏覽器請求一般網頁中的Header都會是如此。

伺服器回應

HTTP/1.1 200 OK
Content-Length: 3059
Server: GWS/2.0
Date: Sat, 11 Jan 2003 02:44:04 GMT
Content-Type: text/html
Cache-control: private
Set-Cookie: PREF=ID=73d4aef52e57bae9:TM=1042253044:LM=1042253044:S=SMCc_HRPCQiqy
X9j; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Connection: keep-alive

(緊跟著一個空行,並且由HTML格式的文字組成的首頁)

在HTTP1.0,單一TCP連線內僅執行一個「用戶端傳送請求—伺服器傳送應答」周期,之後釋放TCP連線。在HTTP1.1最佳化支援持續活躍連線:用戶端連續多次傳送請求、接收應答;批次多請求時,同一TCP連線在活躍(Keep-Live)間期內復用,避免重複TCP初始握手活動,減少網路負荷和回應周期。此外支援應答到達前繼續傳送請求(通常是兩個),稱為「流線化」(stream)。

伺服器未必要回應這麼多資訊,除了標頭要符合規定外,其實其餘有些東西是可以去除掉的,全權看回應的目的與想法去做設定。

GET

在上面我們有看到一般請求都是使用GET,簡單的話就是GET /index HTTP/1.1,請求路徑就改為localhost:8080/index,我們可以解析這一段GET並且導向index的網頁,一般路徑是這樣的,那麼傳送資料的GET又是如何呢?

在這邊我有寫一段AJAX請求我們的SocketWebServer:

$.ajax({
            type: "GET",
                  url : "http://127.0.0.1:8080",
            data: {
              "data": "Andy",
              "name": "Kuo"
            },
                  success : function(res) {
                      console.log("成功..." + res);
                  },
                  error : function(xhr) {
                      console.log("失敗..." + xhr);
                  }
              });
        });

當我們發送這個請求,我們可以得到以下協定:

GET /?data=Andy&name=Kuo HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Accept: */*
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4

由上述我們可以了解,協定一般都是/index、/xxxx之類的,在這邊我們可以看到有?(問號)的出現,通常這就代表我們的請求帶著d資料。

既然我們有請求,若請求正確,想當然要回傳送資料給AJAX,回傳的內容依照content-type去運作,但我們這邊依舊回傳html於前端,回傳結果如下:

HTTP/1.1 200
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-length:60
Content-Type:text/html; charset=UTF-8
Date:Thu Feb 23 16:10:27 CST 2017
Status:200
<html><head></head><body><h1>Hello World!</h1></body></html>

我們回傳了上述的協定,依照慣例,我們依舊要將資料放置最後面,AJAX將會取得這筆資料,但也不要忘記使用GET傳送資訊是公開,也是一種極度不安全的資料傳輸。

POST

POST大家也是相當熟悉的,使用POST方法就不用擔心資料大小的限制,可以防止使用者操作瀏覽器網址,POST資料將會放置後面(message-body)的位置,因此使用者是無法從瀏覽器中查看並且操作,但是,若真要Hack,也是可以使用一些軟體擷取封包,解析後並且做些手腳即可,但各位還是不要亂來才好。

我們將上面的AJAX TYPE改成POST即可使用POST傳遞資料,格式如下:

POST / HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Content-Length: 18
Accept: */*
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4

data=Andy&name=Kuo

就如同上面所說明的,使用POST傳遞資料,資料將會在message-body內。,POST可以因為使用message-body,所以允許大量傳輸,安全性較高,但速度較慢,不過依目前大家的網路速度,應該是不會太過於擔心XD

results matching ""

    No results matching ""