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