HTTP協議的主要特點:1.支持客戶/伺服器模式。2.簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。3.靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。4.限制每次連接只處理一個請求。伺服器處理完客戶 ...
HTTP協議的主要特點:
1.支持客戶/伺服器模式。
2.簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。
3.靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
4.限制每次連接只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。
5.HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在伺服器不需要先前信息時它的應答就較快。
HTTP協議之URL
HTTP URL (URL是一種特殊類型的URI,包含了用於查找某個資源的足夠的信息)的格式如下:
http://host[":"port][abs_path]
http表示要通過HTTP協議來定位網路資源;host表示合法的Internet主機功能變數名稱或者IP地址;port指定一個埠號,為空則使用預設埠80;abs_path指定請求資源的URI;如果URL中沒有給出abs_path,那麼當它作為請求URI時,必須以“/”的形式給出,通常瀏覽器會自動幫我們完成。
例如:
輸入:www.cnblogs.com/undefined-w
瀏覽器自動轉換成:http://www.cnblogs.com/undefined-w/
因此在nodejs中構建路由時,一般主頁對應的是 “/”
nodejs中的核心模塊URL有url.parse()方法可以解析url,有三個參數,第一個參數為url,為必須參數,第二個參數預設為false,為true時會將querystring解析成對象的形式,第三個參數是沒有http時的配置,用法如下:
const url = require("url");
const urlObject = url.parse("http://www.cnblogs.com/undefined-w/",true);
console.log(urlObject);
HTTP請求由三部分組成,分別是:請求行、消息報頭、請求正文
HTTP響應也是由三個部分組成,分別是:狀態行、消息報頭、響應正文
具體介紹下nodejs可能用到的狀態行和消息報頭
狀態行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示伺服器HTTP協議的版本;Status-Code表示伺服器發回的響應狀態代碼(常用的有200,304,404,500;200表示請求成功,304表示從緩存中載入,404表示路徑錯誤未找到,500內部伺服器錯誤);Reason-Phrase表示狀態
HTTP消息報頭包括普通報頭、請求報頭、響應報頭、實體報頭。
每一個報頭域格式 : 名字+“:”+空格+值,名字是不區分大小的。
實體報頭
請求和響應消息都可以傳送一個實體。一個實體由 實體報頭域和實體正文 組成,實體報頭定義了關於實體正文和請求所標識的資源的元信息。
常用的實體報頭
1、Content-Encoding實體報頭域被用作媒體類型的修飾符,它的值指示了已經被應用到實體正文的附加內容的編碼,因而要獲得Content-Type報頭域中所引用的媒體類型,必須採用相應的解碼機制。
Content-Encoding這樣用於記錄文檔的壓縮方法,eg:Content-Encoding:gzip
2、Content-Language實體報頭域描述了資源所用的自然語言。沒有設置該域則認為實體內容將提供給所有的語言閱讀者
3、Content-Length實體報頭域用於指明實體正文的長度,以位元組方式存儲的十進位數字來表示。
4、Content-Type實體報頭域用語指明發送給接收者的實體正文的媒體類型。
Content-Type:text/html;charset=ISO-8859-1
Content-Type:text/html;charset=GB2312
Content-Type:image/jpg (圖片格式)
5、Last-Modified實體報頭域用於指示資源的最後修改日期和時間。
6、Expires實體報頭域給出響應過期的日期和時間。為了讓代理伺服器或瀏覽器在一段時間以後更新緩存中的頁面,我們可以使用Expires實體報頭域指定頁面過期的時間。
一個簡單的示例:
1 const http = require('http');//引入http模塊
2 const host = '127.0.0.1';//ip地址(迴環地址)
3 const port = '1234';//埠
4 //創建服務
5 const server = http.createServer((req,res)=>{
6
7 // res.statusCode = 200;
8 // res.setHeader("Content-Type","text/plain")//輸出為純文本格式
9 // res.setHeader("Content-Type","text/html;charset=utf8")//charset表示字元,不然漢字會輸出亂碼
10 res.writeHead(200,{//以上的簡寫
11 "Content-Type":"text/html;charset=utf8"
12 })
13 res.end('示例');
14 }).listen(port)
HTTP 協議的主要不足:
1、通信使用明文( 不加密) , 內容可能會被竊聽
2、不驗證通信方的身份, 因此有可能遭遇偽裝
3、無法證明報文的完整性, 所以有可能已遭篡改
通過使用HTTPS協議可以解決前兩個不足:
HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議
SSL 不僅提供加密處理,而且還使用了一種被稱為證書的手段,可用於確定方。證書由值得信任的第三方機構頒發,用以證明伺服器和客戶端是實際存在的。
HTTPS和HTTP的區別:
1、https協議需要到ca申請證書,一般免費證書很少,需要交費。
2、http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
3、http和https使用的是完全不同的連接方式用的預設埠也不一樣,前者是80,後者是443。
4、http的連接很簡單,是無狀態的,
https協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議 要比http協議安全。