posts - 34,  comments - 5,  trackbacks - 0

什么是http協議

超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標準。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。1960年美國人Ted Nelson構思了一種通過計算機處理文本信息的方法,并稱之為超文本(hypertext),這成為了HTTP超文本傳輸協議標準架構的發展根基。Ted Nelson組織協調萬維網協會(World Wide Web Consortium)和互聯網工程工作小組(Internet Engineering Task Force )共同合作研究,最終發布了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。(百度百科)

http 特性

  • HTTP 協議構建于 TCP/IP 協議之上,是一個應用層協議,默認端口號是 80
  • HTTP 是無連接無狀態的

既然http是基于tcp協議的那么簡單說一下Tcp協議

  • TCP 提供一種面向連接的、字節流服務,也就是說長連接,具體可以參考一下聊天室
  • TCP 使用校驗和,確認和重傳機制來保證可靠傳輸
同時tcp并不能百分百的保證數據一定會被接收,tcp會把對方能接收的數據發送給接收方,不能接收的數據會被放棄傳輸,并且通知發送方

三次握手與四次揮手

這個標題相比都不陌生,經常見到,but我之前并不太懂,寫之前補了一下基礎,如有解釋不到位的,希望能指出來

三次握手指的是在建立一個tcp連接的時候,客戶端和服務端之間一共要發送三個包,其目的就是連接服務器指定的端口建立tcp連接,同步雙方的序列號和確認號,交換tcp窗口大小信息。

說的通俗一點,舉個栗子

你正在專心直至的打游戲,然后又朋友叫了你一聲,并引起了你的注意,這說明你們建立了溝通,也就是第一次握手成功,如果說你沒有聽到朋友喊你,那么溝通失敗,你朋友沒有繼續屌你

在引起你的注意之后,你發現朋友給了你一個蘋果,但是你并不想要這個蘋果,繼續打游戲,那么第二次溝通失敗,如果你的朋友跟你說 他玩游戲技術很厲害,要和你一起打游戲,你欣然地接收了他,做出了回應,那么這就等于是第二次握手成功

那么最后,你興致勃勃的掏出手機要和朋友pk的時候發現手機沒電了,朋友見狀沒有辦法繼續下去了就走了,那么第三次溝通失敗,如果一切順利,你可以和朋友一起打游戲,那么就是說第三次握手成功,
那么接下來你們就可以愉快的玩耍了

具體如圖

四次揮手指的是在關閉一個tcp連接的時候發送的四個包

大概流程請繼續上邊這個故事,就是說你朋友有事不想和你玩了,然后她跟你說了他要撤了,這是第一次揮手

然后你瞅了她一眼,表示你已經知道了,但是沒打完游戲想等會,這是第二次揮手。

然后等游戲打完了,你跟他說你可以撤了,這是第三次揮手。

然后你朋友得到你的示意之后,她告訴你他走了,并且把門給你關上了,這是第四次揮手

直觀的看一下什么叫做長連接,放一個node的demo,具體代碼如下

const net = require('net');
const server = net.createServer((c) => {
  // 'connection' 監聽器。
  console.log('客戶端已連接');
  c.on('end', () => {
    console.log('客戶端已斷開連接');
  });
  c.setEncoding('ascii')
  c.write('你好\r\n');
  c.on('data', buf => console.log(buf.toString()))
  c.pipe(c);
});
server.on('error', (err) => {
  throw err;
});
server.listen(8124, () => {
  console.log('服務器已啟動');
});

具體如圖

當然你朋友也是耐心有限的,假如超過了規定時間,兩個最大段生命周期,你朋友也會自己走的

那么這個生命周期又是什么呢, 那么咱們言歸正傳,說一說http的報文

http 報文

請求報文

HTTP 協議是以 ASCII 碼傳輸 , 常見的一些參數如下

Remote Address:最終請求服務器地址

Request URL:請求完整的路徑

Request Method:請求類型,常用的(get,post等)

Status Code:請求狀態碼

Referrer Policy: 通常是表示這個請求時從那個頁面跳轉頁過來的,常被用于分析用戶來源信息等

具體如圖

HTTP 定義了與服務器交互的不同方法,一個URL地址,它用于描述一個網絡上的資源,而 HTTP 中的GET,POST等方法就是對這個資源的操作。

     GET 請求報文示例:
    
     GET /books/?sex=man&name=Professional HTTP/1.1
     Host: www.example.com
     User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
     Gecko/20050225 Firefox/1.0.1
     Connection: Keep-Alive
     
POST 表示可能修改變服務器上的資源的請求。
    
     POST / HTTP/1.1
     Host: www.example.com
     User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
     Gecko/20050225 Firefox/1.0.1
     Content-Type: application/x-www-form-urlencoded
     Content-Length: 40
     Connection: Keep-Alive
    
     sex=man&name=Professional  
     
  • GET 可提交的數據量受到URL長度的限制,HTTP 協議規范沒有對 URL 長度進行限制。這個限制是特定的瀏覽器及服務器對它的限制
  • 理論上講,POST 是沒有大小限制的,HTTP 協議規范也沒有進行大小限制,出于安全考慮,服務器軟件在實現時會做一定限制
  • 參考上面的報文示例,可以發現 GET 和 POST 數據內容是一模一樣的,只是位置不同,一個在 URL 里,一個在 HTTP 包的包體里

一般來說get請求時比較安全的,他僅僅只是獲取資源信息,不會修改資源的狀態,
就請求報文來講

在http協議里邊規定了post提交的數據必須在body里邊,post 請求頭里邊的Content-Type 用來獲知請求中的消息的編碼是怎么樣的,相應的服務端要正確的對請求頭做出回應才可以

響應報文

響應報文,顧名思義,就是發出一個請求之后,服務端對這個請求做出的回應,和請求報文差不多,大概就是

  • 狀態行

  • 響應頭

  • 響應正文

具體如圖

狀態碼在平日里是用到的比較多的,常見狀態碼如下

  • 200 OK 客戶端請求成功
  • 301 Moved Permanently 請求永久重定向
  • 302 Moved Temporarily 請求臨時重定向
  • 304 Not Modified 文件未修改,可以直接使用緩存的文件。
  • 400 Bad Request 由于客戶端請求有語法錯誤,不能被服務器所理解。
  • 401 Unauthorized 請求未經授權。這個狀態代碼必須和WWW-Authenticate報頭域一起使用
  • 403 Forbidden 服務器收到請求,但是拒絕提供服務。服務器通常會在響應正文中給出不提供服務的原因
  • 404 Not Found 請求的資源不存在,例如,輸入了錯誤的URL
  • 500 Internal Server Error 服務器發生不可預期的錯誤,導致無法完成客戶端的請求。
  • 503 Service Unavailable 服務器當前不能夠處理客戶端的請求,在一段時間之后,服務器可能會恢復正常。

持久連接

在剛開始的時候我們已經說過了 http請求是一個無狀態的無連接的協議,但是他是基于tcp協議的,那么同樣的http請求也能夠實現長連接,避免一些資源浪費

在HTTP請求頭中添加一個字段 Connection: Keep-Alive,當服務器收到附帶有 Connection: Keep-Alive 的請求時,它也會在響應頭中添加一個同樣的字段來使用 Keep-Alive 。這樣一來,客戶端和服務器之間的HTTP連接就會被保持,不會斷開,在客戶端發送另一個請求的時候,就會使用這條已經建立的連接。

HTTP Keep-Alive 簡單說就是保持當前的TCP連接,避免了重新建立連接。
而且keep-alive也不可能一直保持連接,可以通過一些參數來設置,比如說Keep-Alive: timeout=5, max=100

這就表示這個tcp的連接可以保持五秒,最多請求100次 就會斷開

Keep-Alive 并沒有改變http請求的狀態,HTTP始終都是一個無狀態的協議,并且是獨立的,在Keep-Alive里邊,并不能保證http的規定數量,唯一能夠保證的就是在斷開連接的時候會得到一個斷開的通知

以上是我對http的一些認識 ,未完待續,有不對的希望指出

posted on 2019-06-27 14:24 永不言退 閱讀(...) 評論(...) 編輯 收藏

内部期期公开一波中特