HTTP
- HyperText Transfer Portocol 超文本傳輸協(xié)議
- 超文本:在電腦中,顯示的含有可以指向其他文本鏈接的文本
HTTP的工作方式
瀏覽器-->發(fā)送請求-->服務(wù)器
GET/HTTP/1.1
Host:····.com服務(wù)器-->響應(yīng)-->瀏覽器
HTTP/1.1 200 OK
Server:nginx/1.13.1
Date:Sun,0,...
URL--->HTTP報(bào)文
- 示例:http://space.bilibili.comsp/56285643
https: 協(xié)議類型
space.bilibili.com:服務(wù)器地址
56285643: 路徑
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ - GET/56285643 HTTP/1.1
Host:space.bilibili.comsp
- 報(bào)文格式:Request
GET/Users HTTP?1.1 //請求行 Host:api.githu.com //headers Content-Type: text/plain //headers Content-Length:243 //headers ... //body - 報(bào)文格式:Response
HTTP/1.1 200 OK //狀態(tài)行
//請求頭
Content-type:application/json;charset=UTF-8 //headers
Cache-control:public,max-age=60,S-maxage=60
vary:Accept,Accept-Encoding
etag:w/“02eec5b33460”
Content-encoding:g-zip
//Body
[{
.......
}]
Request Methods
-
Get
獲取資源,無Body - Post
增加或者修改資源;Body -
Put
修改資源;有Body -
DELETE
刪除資源;無Body - HEAD
獲取信息;如下載文件的大小;服務(wù)器不返回Body
Get/Put/DELETE具有冪等性
Status Code 狀態(tài)碼
- 1xx: 臨時(shí)性消息
101:支持HTTP2.0
100:未完成 - 2XX:成功
- 3XX:重定向
301:永久遷移
302:臨時(shí)遷移
304:內(nèi)容無改變 - 4XX:客戶端錯(cuò)誤
- 5XX:服務(wù)器錯(cuò)誤
Header 請求頭
-
作用:HTTP消息的元數(shù)據(jù)(metadata)
- Host:服務(wù)器的主機(jī)地址 虛擬主機(jī)
- Content-Type/Content-Length: Body的類型/長度
- Content-Length:內(nèi)容的長度(字節(jié))
- Content-Type:
- text/html:HTML內(nèi)容,用于瀏覽器頁面響應(yīng)
- application/x-www-form-urlencoded:普通表單
- encoded:URL模式
- multipart/form-data:多部分形式;包含二進(jìn)制的多內(nèi)容
- application/json:json形式,用于Web Api的響應(yīng)或者Post/Put請求
- image/jpeg/application/zip...:單文件,用于Web API響應(yīng)或者put/post請求
Chunked Transfer Encoding
- Transfer-Encoding:chunked
表示Body長度無法確定,Content-Length不能使用
Body格式:<length> <data1> <length2> <date2> ...... 0
0加換行
最后傳輸0表示內(nèi)容結(jié)束
- Location:重定向的目標(biāo)URL
- User-Agent:用戶代理
- Range/Accept-Range:指定Body內(nèi)容范圍
- Cookie/Set-Cookie:發(fā)送/設(shè)置 Cookie
- Authorization:授權(quán)信息
- Accept:客戶端可接受的數(shù)據(jù)類型:如text/html
- Accept-charset:客戶端接收的字符集:如 UTF-8
- Accept-Encoding:客戶端接收的壓縮類型編碼。如gzip
- Conetent-Encoding:壓縮類型:如gzip
Cache 緩存
- Cache和Butter的區(qū)別?
- Cache-Control:
- no-cache: 緩存,使用前詢問
- no-store:不緩存
- max-age:指定日期
- Last-Modified:
- If-Modified-since
- ETag: If-None-Match
- Cache-Control:private/public 個(gè)性信息/公共信息
REST
- 什么是REST:
一種架構(gòu)風(fēng)格對HTTP加以限制 - Sever-Client architecture CS架構(gòu)
- StateLessness 無狀態(tài)
- Cacheablility 可緩存
- Layered System 分層的服務(wù)器集群對客戶端透明
- Code on demand 服務(wù)器返回包含可執(zhí)行代碼
- Uniform interface
- Resource identication in requests
- Resource manipulation through representation
- self-descriptive messages
- Hypermedia as engine of application state(HATEOAS)
RESTFUL HTTP
- 正確的使用Http
編碼,加密,Hash
加密
- 對稱加密
- 原理:使用密鑰和加密算法對數(shù)據(jù)進(jìn)行轉(zhuǎn)換,得到的無意義的數(shù)據(jù)即為密文。使用密鑰和解密算法對密文進(jìn)行逆向轉(zhuǎn)換,得到原數(shù)據(jù)。
- 經(jīng)典算法:AES DES
- 非對稱加密
- 原理使用公鑰對數(shù)據(jù)進(jìn)行加密得到密文,使用私鑰對數(shù)據(jù)解密得到原數(shù)據(jù)
- 經(jīng)典算法:RSA DSA
- 衍生用途:數(shù)字簽名
原數(shù)據(jù)---加密算法+加密密鑰===>密文---加密算法+解密密鑰===>原數(shù)據(jù)
- 密鑰(key)
- 場景:用于加密和解密
- 目的:保證數(shù)據(jù)被人截取時(shí)不被人讀懂
- 焦點(diǎn):數(shù)據(jù)
- 密碼(pasword)
- 場景:用戶進(jìn)入網(wǎng)站或者游戲的身份驗(yàn)證
- 目的:數(shù)據(jù)提供方或者應(yīng)用服務(wù)方對賬戶擁有者的數(shù)據(jù)的保護(hù),保證你是你的時(shí)候提供權(quán)限
- 焦點(diǎn):身份
Base64
- 將二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為64個(gè)字符組成的字符串的編碼算法
- 用途:讓原數(shù)據(jù)擁有字符串所擁有的特性,如可以放在URL中傳播,可以保存到文本文件,可以通過普通聊天軟件進(jìn)行文本傳輸。
- 可以將人眼可讀的字符串變?yōu)樽x不懂的字符串,降低窺視危險(xiǎn)
URL Encoding
- 將URL中的保留字符使用百分號”%“進(jìn)行編碼(”+“,”/“,"&"等)
- 消除歧義避免解析錯(cuò)誤
- 例: http://spica.com/user/?name=我&你
??
http://spica.com/user/?name=我&26你
- 例: http://spica.com/user/?name=我&你
壓縮和解壓縮
壓縮:把數(shù)據(jù)換一種方式來存儲,減少存儲空間
解壓縮:把壓縮后的數(shù)據(jù)還原為原先的形式,以便使用
常見壓縮算法:DEFLATE,JPEG,MP3
-
壓縮屬于編碼嗎?
- 編碼五官方定義
- 壓縮屬于編碼
-
媒體數(shù)據(jù)的編碼解碼
- 圖片的編碼:把圖像數(shù)據(jù)寫成JPG,PNG,等文件的編碼格式
- 圖片的解碼:把JPG,PNG等文件的數(shù)據(jù)解析為標(biāo)準(zhǔn)的圖像數(shù)據(jù)
序列化
- 把數(shù)據(jù)對象(一般為內(nèi)存中的,例如JVM對象)轉(zhuǎn)換為字節(jié)序列的過程
- 目的:讓內(nèi)存中的對象可以被存儲和傳輸
Hash
- 把任意數(shù)據(jù)轉(zhuǎn)化為指定大小范圍(通常很小的計(jì)算)
- 作用:摘要,數(shù)字指紋
- 經(jīng)典算法:MD5,SHA1,SH256等等
- 實(shí)際用途:數(shù)據(jù)完整性驗(yàn)證,快速查找:hashCode()和HashMap()
登錄和授權(quán)
- Cookie
- Authorization
Cookie
起源:購物車
-
工作機(jī)制:
- 客戶端----->服務(wù)器
Post/cart HTTP/1.1
Host:shop.com
Cookie:cart="apple=1 " banana=1 - 服務(wù)器---->客戶端
HTTP/1.1 200 ok
set-Cookie:Cart=”apple=1&banana=1“ - 客戶端
shop.com:
cart:"apple=1&banana=1"
- 客戶端----->服務(wù)器
-
Cookie的作用:
- 會話管理:購物車,登錄狀態(tài)等等
- 使用Cookie管理登錄狀態(tài)
- 個(gè)性化
- 分析用戶行為
-
Xss(cross-site scrpting):HTTP only 跨站腳本攻擊
- Set-Cookie:Sessionid=123;Http Only 使Cookie對本地腳本不可見
XSRF(cross-site request forgery ):Referer:跨站請求偽造
利用之前登錄留下的Cookie實(shí)現(xiàn)無登錄轉(zhuǎn)賬
Authorization
- Authorization: Basic
<Username:passwor(base64)> - Authorization: Bearer
<bearer token>- OAuth2
- 微信登錄
TCP/IP協(xié)議簇
- 一系列模型組成的網(wǎng)絡(luò)模型分層
- 為什么要分層:因?yàn)榫W(wǎng)絡(luò)不穩(wěn)定
- 具體分層:
- 應(yīng)用層:HTTP,F(xiàn)TP,DNS
- 傳輸層:TCP,UDP
- 網(wǎng)絡(luò)層:IP
- 數(shù)據(jù)鏈路層:以太網(wǎng),WIFI
- TCP連接
- 三次握手...
- 長連接:
- 實(shí)現(xiàn)方式:心跳
在類小區(qū)網(wǎng)絡(luò)環(huán)境下,防止長時(shí)間不連接端口關(guān)閉
- 實(shí)現(xiàn)方式:心跳
HTTPS
- HTTP OVER SSL
- SSL:Secure Socket Layer====>TLS:Transport Layer Secure
- 定義:在HTTP下增加一個(gè)安全層,用于保障HTTP的加密傳輸
- 本質(zhì):在客戶端和服務(wù)器之間協(xié)商出一套對稱密鑰,每次發(fā)送信息之間將內(nèi)容加密,收到之后在進(jìn)行解密,達(dá)到內(nèi)容加密傳輸
HTTP 連接
- 客戶端請求建立TLS連接
- 服務(wù)器發(fā)回證明
- 客戶端驗(yàn)證服務(wù)器證書
- 客戶端信任服務(wù)器之后,和服務(wù)器協(xié)商對稱密鑰
- 使用對稱密鑰開始通信
在Android中使用
- 正常情況下,直接使用
- 什么時(shí)候不行:
- 用的自簽名證書(例如用于內(nèi)網(wǎng)的Https)
- 證書信息補(bǔ)全,缺乏證書機(jī)構(gòu)信息
- 手機(jī)操作系統(tǒng)較舊,沒有安裝新加入的根證書
- 如何處理:
- 手寫驗(yàn)證過程