最近開始學習AJAX相關知識,因此正好仔細複習一下HTTP的相關基礎知識。html
1 IP和MAC
:瀏覽器
S1 網絡 分紅不少個子網, 就像一個國家分紅不少個省份 S2 寄送物品的時候,只要按省份分類 下發到各省級物流中心便可 (由子網內部解決) S3 IP地址 是和地域相關的: 同一個子網上的設備,分配的 IP地址前綴 都是同樣的(相似於各省市的郵政編碼) 路由器只需記住每一個子網的位置便可,大大減小了路由器所須要的內存 S4 MAC地址 是和設備相關的: 咱們須要用 MAC地址來區分不一樣的設備;
總之安全
MAC地址: 相似於 一我的的體貌特徵; IP地址: 相似於 電話號碼/郵編地址(聯繫地點)
2 網關
:服務器
聯繫外網的設備, 具備其餘網關地址的 路由表 具備內網內 IP和MAC對應的 ARP表
3 DHCP服務器
: 隨機獲得IPcookie
4 路由
: 網關之間的查詢和鏈接的 一系列過程網絡
5 DNS
: 域名和IP的對照表post
6 客戶端
: 能發送(資源)請求 + 接受響應資源的設備,均可以稱爲是客戶端學習
7 協議
: 從發起請求——得到響應資源,這過程當中的 各類約定規則的集合編碼
咱們能夠類比一下平常生活中的例子來形象理解一下:
S1 若是古代人A想獲取一份救濟品,因而他向當地的行政員B寄了一份申請信,這就是發起一個資源請求。
S2 在通過一段路徑傳輸後,行政員B收到了申請(信),因而返回了某些資源(好比 救濟金 /救濟糧 /拒絕信等),這就叫作 處理請求並響應
S3 在這過程當中,A 和 B 之間不少方面都是有規則約束的(好比 A 申請信的格式 / B返回資源的格式 / 返回資源的多少 /傳輸路線的選擇等等)url
全部這些規則的集合,就稱爲`協議`
8 TCP/IP 分層設計
從上面的例子能夠看出,資源的傳輸(發出請求—傳遞請求—接到請求並處理—返回響應—傳輸響應—獲取響應並處理)實際上是一個很複雜的過程,須要考慮到許多不一樣方面因素,咱們能夠大體分爲如下層次:
S1 應用層: 首先要明確 A向B 發起請求的 具體目的是什麼 (多是要獲取救濟品/ 多是要投訴官員C/ ….)
S2 傳輸層: 其次要明確 A和B之間如何高效完整的 傳遞信息/資源;
S3 網絡層: 明確 傳輸路線
最關鍵的是要知道 IP地址和 MAC地址 核心是 `路由選擇機制`
S4 鏈路層: 實際的物理道路/大橋等實體建築
分層的目的其實相似於分工,都是爲了各司其職,互不干擾,從而提升效率,繼續舉例來講:
S1 應用層——寫信人&信件的內容
: 不一樣的目的,信件的內容各不相同。可是隻要負責寫好信件就能夠;
S2 傳輸層——信件/資源 加工處理站
: 包括切分信件/資源爲 小塊,以便並行發送 + 內容完整性驗證;
S3 網絡層——信件/資源 傳輸中轉站
: 明確 A 和 B 之間的傳輸路線;
S4 鏈路層—— 實際派送人員
: 實際派送資源的人員
每過一層都會添上/去除 該層的首部信息(HTTP數據——TCP首部——IP首部——以太網首部)
9 TCP相關
:
TCP的三次握手緣由
:
三次握手便是在最快最省力的狀況下作出的選擇 好比在紅軍時代,A連和B連分在左右翼,約定在幾時幾分一同發起打擊。這個幾時幾分的信息就須要人工經過通信員來走路傳遞。 因此A連指揮官派出通信員。這是第一次。 在TCP裏,就是 `發送端 首先發送一個帶 SYN標誌的數據包 給對方` 假設通信員到達了B連,而且告知了B連指揮官幾時幾分,B連指揮官必定會讓通信員再回去通知A連指揮官, 可憐的通信員只能冒着危險返回A連,由於A連指揮官看不到通信員返回的話,不知道幾時幾分這個信息到底傳達到了B連沒有。 這是第二次。
在TCP裏,就是 接收端收到後, 回傳一個帶有 SYN/ACK標誌的數據包 以示傳達確認信息
在B連指揮官開始擔憂通信員是否回到了A連,若是沒回到,B連指揮官會設身處地的想想A連指揮官見不到返回的通信員,確定是不敢打的, 因此B連指揮官最盼望的是再次看到通信員出如今B連,因此A連指揮官會讓通信員再回B連一次。 這是第三次。
在TCP裏,就是 發送端再 回傳一個帶 ACK標誌的數據包,表明「握手」結束
10 URI 和 URL
URI: 統一資源標識符
由某個協議方案表示的 資源的定位字符串 不一樣的協議方案,其獲取資源的語法等規則有區別
URL: 統一資源定位符,是URI的子集。也就是通常咱們輸入瀏覽器中的 網頁地址
絕對URI的格式:
協議類型(協議方案名):// [登陸驗證信息@]服務器地址:端口號 / 服務器上的文件路徑 ?查詢字符串 #片斷標識符 其中, 服務器地址: 能夠是 IP/域名; 文件路徑: 相似於 服務器上的文件目錄結構 查詢字符串: 用於肯定 文件路徑內的某一資源,形如 xx=yy
1 HTTP協議 規範了 客戶端和服務器端間的通訊流程
:
S1 客戶端發起請求 —— S2 服務器接收+處理請求,返回響應內容 —— S3 客戶端接收+處理響應,展現/使用 響應內容;
可參考 MDN的 典型的HTTP會話
2 HTTP 規定了 通訊報文的內容+格式
:
S1 請求報文: 請求行: 請求方法 + 請求的資源內容(請求URL: 相對URL+host首部字段定位) + HTTP協議版本; 請求首部字段 \空行(CR+LF) 請求內容實體 S2 響應報文: 狀態行:HTTP協議版本 + 狀態碼 + 緣由短語; 響應首部字段 \空行(CR+LF) 響應內容實體
可參考 MDN的 HTTP消息
3 HTTP 規定了 自身是一種無狀態協議 + 持久鏈接
S1 爲了實現保持狀態功能 —— `cookie技術` S2 持久鏈接: HTTP keep-alive, 只要任意一端沒有明確提出斷開鏈接,則保持 TCP鏈接狀態; 持久鏈接的好處是實現了管線化,從而能夠 同時並行發送多個請求
可參考:
MDN的 HTTP cookies
MDN的 HTTP/1.x 的鏈接管理
1 具體類型參見: MDN的 HTTP請求方法
2 GET和POST請求的區別:
1 根本區別是二者語義上的區別,GET的語義是「獲取數據」,POST的語義是「提交數據」; 2 get參數有長度限制(受限於url長度,具體數值取決於瀏覽器和服務器限制),而post理論上沒有限制 3 GET冪等+不改變服務器狀態, POST不冪等+改變服務器狀態 4 GET提交的數據會在URL中顯示出來, 而POST 是把提交的數據放在 HTTP包的包體中
可參考
[get和post區別;](https://www.zhihu.com/question/28586791) [HTTP協議中GET和POST方法的區別](https://sunshinevvv.coding.me/blog/2017/02/09/HttpGETv.s.POST/)
1 狀態碼的分類見圖:
2 常見的狀態碼含義
可參考
《圖解HTTP》第4章 [HTTP常見狀態碼;](https://www.cnblogs.com/starof/p/5035119.html) [MDN的 HTTP響應代碼](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status)
1 做用:
HTTP首部字段 給瀏覽器/服務器 提供了 報文主體大小/所使用的語言/認證信息等額外信息內容
2 語法結構:
首部字段名: 字段值1,字段值2
3 類型:
分類一: 通用首部字段; 請求首部字段; 響應首部字段; 實體首部字段 分類二: 端到端首部; 逐跳首部
4 具體內容及含義
可參考
《圖解HTTP》第5章 [MDN的 HTTP Headers](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers)
這篇文章只是介紹了HTTP的基本知識,不少具體知識只是提供了參考文檔,緣由是那部分知識偏向於真正用到時的隨手速查
全部記憶性而非理解性的內容,我以爲沒有必要做爲具體內容。
其次,關於HTTPS和安全的部分,本文並未說起,之後會再單獨寫一篇博文。
最後,這篇博文雖然按照我本身的思路整理了相關基本知識,可是參考了不少已有資料,我寫在了文末的參考文檔部分裏。若是給您形成不便,
我會第一時間修改或刪除相應內容。
3 如何生動的解釋ip地址、子網掩碼、網關等概念;
4 IP地址和MAC地址的區別和聯繫是什麼;
5 怎樣生動描述 TCP 的「三次握手」;