天天看點

計算機網絡詳解之應用層自定制協定序列化與反序列化URLHTTP協定(超文本傳輸協定)

文章目錄

  • 自定制協定
  • 序列化與反序列化
  • URL
  • HTTP協定(超文本傳輸協定)
    • HTTP協定版本
    • HTTP協定格式

應用層:用于應用程式之間的資料交流—HTTP(超文本傳輸協定)

自定制協定

應用層的協定由程式員自己制定(自定制協定)

自定制協定:使用結構體進行資料對象的二進制資料在記憶體中結構化組織

序列化與反序列化

序列化:将多個資料對象按照協定組織轉換成持久化存儲或者資料傳輸的二進制資料串的過程

反序列化:将二進制資料串按照指定協定轉換成資料對象的過程

網絡通信雙方需要采用約定的協定,序列化與反序列化屬于通信協定的一部分。比如在OSI七層模型中表示層的功能就是将應用層的對象轉換成一段連續的二進制串,或者反過來,把二進制串轉換成應用層的對象–這兩個功能就是序列化和反序列化

常見的資料序列化方式有很多:json序列化,protobuf序列化,XML序列化。。。

URL

什麼是URL?

在WWW上,每一資訊資源都有統一的且在網上唯一的位址,該位址就叫URL(Uniform Resource Locator,統一資源定位器),它是WWW的統一資源定位标志,就是指網絡位址

URL格式

構成:協定、主機、端口、路徑

計算機網絡詳解之應用層自定制協定序列化與反序列化URLHTTP協定(超文本傳輸協定)

http://使用者名:密碼@域名(伺服器)IP:端口/資源路徑?查詢字元串#片段辨別符

域名:伺服器的别名,通常是容易記憶的字元串,但是最終仍舊需要解析為伺服器IP位址才能通路服

務器

端口:HTTP:80 / HTTPS:443

資源路徑:伺服器上的相對根目錄,表示了資源在伺服器上的路徑

查詢字元串:以key=val形式的鍵值對組成,鍵值對之間以&符号間隔—key=val&key=val

urlencode: url的資源路徑以及查詢字元串中若存在特殊字元,此時就需要進行轉義,将特殊字元每個位元組轉換為16進制數字字元,并且字首%用于表示轉義

urdecode:在url中遇到%,将其後面的兩個字元轉換為數字,第一個數字乘以16,再加上第二個數字

urldecode就是urlencode的逆過程

HTTP協定(超文本傳輸協定)

一種最基本的用戶端-伺服器的通路協定,早期專門傳輸超文本資料html,随着協定發展多元化,不限制資料格式

HTTP協定是一個 請求-響應(發送請求,等待響應)的協定,浏覽器向伺服器發送請求,伺服器則回複給本地浏覽器相應的網頁

HTTP協定版本

版本
0.9 不完善的版本,僅支援文字的超文本資料傳輸
1.0 規範了協定格式,支援不同檔案格式的資料流,增加了請求方法
1.1 考慮了傳輸性能問題,增加了請求方法,頭部描述資訊,實作了管線化傳輸和長連接配接傳輸
2.0 改進了之前的協定版本的備援問題,使用二進制流傳輸,進行多路複用,允許伺服器主動推送資料

短連接配接:http基于在傳輸層tcp實作通信,短連接配接指的是建立連接配接,發送一個請求,得到響應之後則斷開連接配接

長連接配接:一次連接配接可以發送多個請求

(1.1版本) 管線化傳輸:一次連接配接中,連續發送多個請求,按照順序響應(之前的版本是發送一個請求響應一個)

(2.0版本)多路複用:響應順序可以不用按照請求順序響應,在頭部中辨別了屬于的請求資訊

HTTP協定格式

1.首行

請求首行:三個元素(請求方法,URL,協定版本)空格間隔三個元素 并且最後以\r\n結尾

請求方法:

  • GET:請求實體資源,主要用于擷取實體資源,也可以送出資源,送出的資料存放在URL的查詢字元串中,但是安全性不高,并且沒有正文資料
  • HEAD:相較于GET,主要用于擷取響應頭部,沒有實體正文
  • POST:主要用來送出表單資料,資料存放在正文中,安全度較高,無長度限制

    響應首行:協定版本,影響狀态碼,狀态碼描述,三個元素 ,以空格進行間隔,\r\n作為結尾

    響應狀态碼:表示本次請求服務端做出的響應結果

1xx 一些描述資訊
2xx 表示本次請求服務端正确響應
3xx 重定向 - 請求的資源已經遷移到另一個位置(原有連結依舊可用) 要求用戶端重新請求新的位置:301 - 永久/302 - 臨時
4xx 表示用戶端請求錯誤; 400 – 請求錯誤 / 404 – 表示請求的資源不存在
5xx 表示服務端錯誤; 500 - 伺服器内部錯誤 / 502 - 代理請求失敗/無效響應/504 -代理請求逾時

2.頭部

請求或者響應的關鍵描述資訊,由key:val鍵值對組成,每一個鍵值對以/r/n結尾

典型的頭部資訊:

Content-Type 正文類型,表示正文該如何處理
Content-Length 表示正文長度,解決http資料粘包的問題
Location 重定向新的資源位置
Cookie 連續傳輸,用于持久保持用戶端的通信狀态,cookie使用不安全,是以通常搭配Session使用
Set-Cookie 服務端通過這個描述符向用戶端傳遞資訊,并且儲存在用戶端浏覽器的cookie檔案中
Session 不是頭部字段,是服務端為每個建立的會話資訊,因為Cookie傳輸資訊不安全,是以伺服器建立會話,儲存用戶端狀态資訊,将session通過Cookie傳回

cookie和session差別

cookie持續用戶端狀态資訊的字段,儲存在用戶端上的資料,用于持續與服務端進行資訊傳遞的一種手段

session是一種會話的控制,服務端儲存的會話資訊包含用戶端的身份狀态資訊,通過cookie/set-cookie傳遞的sessionid進行用戶端的身份狀态識别

3.空行

\r\n 間隔頭部或者正文;接收http資料的時候,當連續接收兩個 \r\n 的時候,則認為頭部到此結束

先擷取完整頭部,通過頭部中的Content-Length擷取正文長度,然後擷取指定長度正文,通過這種方式每次擷取完整的一條http請求資料

4.正文

就是用戶端送出資料或者服務端響應的實體資源

繼續閱讀