2、網絡和安全機制html
1.網絡框架對比和源碼分析
2.本身去設計網絡請求框架,怎麼作?
3.網絡請求緩存處理,okhttp如何處理網絡緩存的
4.從網絡加載一個10M的圖片,說下注意事項
5.TCP的3次握手和四次揮手
6.TCP與UDP的區別
7.TCP與UDP的應用
8.HTTP協議
9.HTTP1.0與2.0的區別
10.HTTP報文結構
11.HTTP與HTTPS的區別以及如何實現安全性
12.如何驗證證書的合法性?
13.https中哪裏用了對稱加密,哪裏用了非對稱加密,對加密算法(如RSA)等是否有了解?
14.client如何肯定本身發送的消息被server收到?
15.談談你對WebSocket的理解
16.WebSocket與socket的區別
17.談談你對安卓簽名的理解。
18.請解釋安卓爲啥要加簽名機制?
19.視頻加密傳輸
20.App 是如何沙箱化,爲何要這麼作?
21.權限管理系統(底層的權限是如何進行 grant 的)?
複製代碼
參考答案:java
blog.csdn.net/github_3713…android
Volleygit
特色:github
場景:web
OkHttp算法
特色:數據庫
IO 面向流 Steam,NIO 面向緩衝區 Buffer IO 阻塞,NIO 非阻塞segmentfault
NIO狀況下,一個線程能夠處理多個通道的讀取和寫入,更充分的利用線程資源。windows
適用場景
IO適合於連接數量不大,可是每一個連接須要發送/接收的數據量很大,須要長時間連續處理;
NIO更適合於同時存在海量連接,可是每一個連接單次發送/接收的數據量較小的情形.好比聊天服務器.海量連接可是單個連接單次數據較小
"Accept-Encoding","gzip" "Content-Encoding","gzip"
Content-Encoding: gzip:代表body是gzip過的數據
Content-Length:117:表示body gzip壓縮後的數據大小,便於客戶端使用。
Transfer-Encoding: chunked:分塊傳輸編碼
複製代碼
Retrofit
特色:
場景:
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.build();
Request request = new Request.Builder()
.url(url)
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
複製代碼
Dispatcher是一個任務調度器,它內部維護了三個雙端隊列:
readyAsyncCalls:準備運行的異步請求
runningAsyncCalls:正在運行的異步請求
runningSyncCalls:正在運行的同步請求
複製代碼
Interceptor將網絡請求、緩存、透明壓縮等功能統一了起來,它的實現採用責任鏈模式,各司其職, 每一個功能都是一個Interceptor,上一級處理完成之後傳遞給下一級,它們最後鏈接成了一個Interceptor.Chain。它們的功能以下:
RetryAndFollowUpInterceptor:負責重定向。
BridgeInterceptor:負責把用戶構造的請求轉換爲發送給服務器的請求,把服務器返回的響應轉換爲對用戶友好的響應。
CacheInterceptor:負責讀取緩存以及更新緩存。
ConnectInterceptor:負責與服務器創建鏈接。
CallServerInterceptor:負責從服務器讀取響應的數據。
複製代碼
BridgeInterceptor方法主要是針對Header作了一些處理,這裏主要提一下"Accept-Encoding", "gzip",關於它有如下幾點須要注意:
開發者沒有添加Accept-Encoding時,自動添加Accept-Encoding: gzip
自動添加Accept-Encoding,會對request,response進行自動解壓
手動添加Accept-Encoding,不負責解壓縮
自動解壓時移除Content-Length,因此上層Java代碼想要contentLength時爲-1
自動解壓時移除Content-Encoding
自動解壓時,若是是分塊傳輸編碼,Transfer-Encoding: chunked不受影響。
複製代碼
CacheInterceptor
讀取候選緩存,具體如何讀取的咱們下面會講。
建立緩存策略,強制緩存、對比緩存等,關於緩存策略咱們下面也會講。
根據策略,不使用網絡,又沒有緩存的直接報錯,並返回錯誤碼504。
根據策略,不使用網絡,有緩存的直接返回。
前面兩個都沒有返回,繼續執行下一個Interceptor,即ConnectInterceptor。
接收到網絡結果,若是響應code式304,則使用緩存,返回緩存結果。
讀取網絡結果。
對數據進行緩存。
返回網絡讀取的結果。
複製代碼
ConnectInterceptor用來完成鏈接。而真正的鏈接在RealConnect中實現,鏈接由鏈接池ConnectPool來管理,鏈接池最多保 持5個地址的鏈接keep-alive,每一個keep-alive時長爲5分鐘,並有異步線程清理無效的鏈接。
整個流程以下:
查找是否有完整的鏈接可用:
Socket沒有關閉
輸入流沒有關閉
輸出流沒有關閉
Http2鏈接沒有關閉
鏈接池中是否有可用的鏈接,若是有則可用。
若是沒有可用鏈接,則本身建立一個。
開始TCP鏈接以及TLS握手操做。
將新建立的鏈接加入鏈接池。
複製代碼
cleanup()整個方法的流程以下所示:
查詢此鏈接內部的StreanAllocation的引用數量。
標記空閒鏈接。
若是空閒鏈接超過5個或者keepalive時間大於5分鐘,則將該鏈接清理掉。
返回此鏈接的到期時間,供下次進行清理。
所有都是活躍鏈接,5分鐘時候再進行清理。
沒有任何鏈接,跳出循環。
關閉鏈接,返回時間0,當即再次進行清理。
複製代碼
Expires Http 1.0 絕對過時時間
Cache-Control Http 1.1 相對過時時間
If-Modified-Since 請求 header
Last-Modified 響應 header 做爲下次的 If-Modified-Since
If-None-Match 請求 header
ETag 響應 header 做爲下次的 If-None-Match
CacheInterceptor
OKHttp3(支持Retrofit)的網絡數據緩存Interceptor攔截器
讀取候選緩存,具體如何讀取的咱們下面會講。
建立緩存策略,強制緩存、對比緩存等,關於緩存策略咱們下面也會講。
根據策略,不使用網絡,又沒有緩存的直接報錯,並返回錯誤碼504。
根據策略,不使用網絡,有緩存的直接返回。
前面兩個都沒有返回,繼續執行下一個Interceptor,即ConnectInterceptor。
接收到網絡結果,若是響應code式304,則使用緩存,返回緩存結果。
讀取網絡結果。
對數據進行緩存。
返回網絡讀取的結果。
複製代碼
Bitmap.Options inJustDecodeBounds inSampleSize
ARGB_4444 RGB_565
補圖
分塊加載
使用LruCache
sizeOf()、entryRemoved()
手勢處理
ScaleGestureDetector GestureDetector
前者用於處理縮放手勢,後者用於處理其他手勢,如移動,快速滑動,點擊,雙擊,長按等。
ScaleGestureDetector專門處理縮放手勢,其比較重要的方法是onScale(ScaleGestureDetector detector),當縮放時會不停地回調這個方法,須要注意的一點是detector.getScaleFactor()獲取到的縮放比例是相對上一次的
SYN--SYN ACK-ACK
SYN=1 seq=client_isn
SYN=1 seq=server_isn ack=client_isn+1
SYN=0 seq=client_isn+1 ack=server_isn+1
seq 爲自身序列 ack 爲對方序列+1
複製代碼
FIN--ACK--FIN-ACK
【問題1】爲何鏈接的時候是三次握手,關閉的時候倒是四次握手? 答:由於當Server端收到Client端的SYN鏈接請求報文後,能夠直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。可是關閉鏈接時,當Server端收到FIN報文時,極可能並不會當即關閉SOCKET,因此只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端全部的報文都發送完了,我才能發送FIN報文,所以不能一塊兒發送。故須要四步握手。
【問題2】爲何TIME_WAIT狀態須要通過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?
答:雖然按道理,四個報文都發送完畢,咱們能夠直接進入CLOSE狀態了,可是咱們必須假象網絡是不可靠的,有能夠最後一個ACK丟失。因此TIME_WAIT狀態就是用來重發可能丟失的ACK報文。
blog.fundebug.com/2019/03/22/…
UDP | TCP | |
---|---|---|
是否鏈接 | 無鏈接 | 面向鏈接 |
是否可靠 | 不可靠傳輸,不使用流量控制和擁塞控制 | 可靠傳輸,使用流量控制和擁塞控制 |
鏈接對象個數 | 支持一對一,一對多,多對一和多對多交互通訊 | 只能是一對一通訊 |
傳輸方式 | 面向報文 | 面向字節流 |
首部開銷 | 首部開銷小,僅8字節 | 首部最小20字節,最大60字節 |
適用場景 | 適用於實時應用(IP電話、視頻會議、直播等) | 適用於要求可靠傳輸的應用,例如文件傳輸 |
blog.csdn.net/leewccc/art… www.cnblogs.com/liangyc/p/1…
TCP Transmission Contral Protocol UDP User Datagram Protocol
區別
面向鏈接VS無鏈接
TCP創建一個鏈接須要3次握手IP數據包,斷開鏈接須要4次握手。 另外斷開鏈接時發起方可能進入TIME_WAIT狀態長達數分鐘(視系統設置,windows通常爲120秒),在此狀態下鏈接(端口)沒法被釋放。 UDP不須要創建鏈接,能夠直接發起。
可靠VS不可靠
TCP利用握手、ACK和重傳機制,udp沒有。
1,校驗和(校驗數據是否損壞);
2,定時器(分組丟失則重傳);
3,序列號(用於檢測丟失的分組和重複的分組);
4,確認應答ACK(接收方告知發送方正確接收分組以及指望的下一個分組);
5,否認確認(接收方通知發送方未被正確接收的分組);
6,窗口和流水線(用於增長信道的吞吐量)。(窗口大小:無需等待確認應答而能夠繼續發送數據的最大值)
複製代碼
有序性
TCP利用seq序列號對包進行排序,udp沒有。
複製代碼
面向字節流vs面向報文
面向報文
面向報文的傳輸方式是應用層交給UDP多長的報文,UDP就照樣發送,即一次發送一個報文。
所以,應用程序必須選擇合適大小的報文。若報文太長,則IP層須要分片。
UDP對應用層交下來的報文,既不合並,也不拆分,而是保留這些報文的邊界。
這也就是說,應用層交給UDP多長的報文,UDP就照樣發送,即一次發送一個報文。(一個upd的最大報文長度2^16-1-20-8,20是ip報文頭,8是udp報文頭)
面向字節流
面向字節流的話,雖然應用程序和TCP的交互是一次一個數據塊(大小不等),但TCP把應用程序當作是一連串的無結構的字節流。
TCP有一個緩衝,當應用程序傳送的數據塊太長,TCP就能夠把它劃分短一些再傳送。
若是應用程序一次只發送一個字節,TCP也能夠等待積累有足夠多的字節後再構成報文段發送出去。
tcp有流量控制,udp沒有
tcp的頭部比20bytes,udp8byres
複製代碼
TCP應用場景:
效率要求相對低,但對準確性要求相對高的場景。由於傳輸中須要對數據確認、重發、排序等操做,相比之下效率沒有UDP高。
舉幾個例子:文件傳輸(準確高要求高、可是速度能夠相對慢)、接受郵件、遠程登陸。
複製代碼
UDP應用場景:
效率要求相對高,對準確性要求相對低的場景。
舉幾個例子:QQ聊天、在線視頻、網絡語音電話(即時通信,速度要求高,可是出現偶爾斷續不是太大問題,而且此處徹底不可使用重發機制)、廣播通訊(廣播、多播)。
複製代碼
hit-alibaba.github.io/interview/b…
http 0.9 1991
http 1.0 1996
http 1.1 1999
http 2.0 2015
複製代碼
帶寬:出視頻應用之外,帶寬基本不是問題
延遲: 瀏覽器阻塞 HOL Blocking DNS查詢 DNS Lookup 創建鏈接 Initial Connection
Http1.0 & 1.1
緩存處理
HTTP1.0中主要使用header裏的If-Modified-Since,Expires來作爲緩存判斷的標準
HTTP1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match
帶寬優化及網絡鏈接的使用
1.1 支持 range 206 Partial Content
錯誤通知的管理
1.1 新增 24 個錯誤碼,409 Conflict 410 Gone
Host頭處理
長鏈接
長鏈接 PersistentConnection
流水線 Pipelining
複製代碼
2012 google SPDY
下降延遲 多路複用 multiplexing 經過多個請求stream共享一個tcp連接
請求優先級 request prioritization
header壓縮
基於https的加密傳輸
服務端推送 server push
複製代碼
HTTP 2.0 性能驚人
大約 4 倍
HTTP2.0和SPDY的區別:
HTTP2.0 支持明文 HTTP 傳輸,而 SPDY 強制使用 HTTPS
HTTP2.0 消息頭的壓縮算法採用 HPACK http://http2.github.io/http2-spec/compression.html,
而非 SPDY 採用的 DEFLATE http://zh.wikipedia.org/wiki/DEFLATE
複製代碼
blog.fundebug.com/2019/04/26/…
方法1. 對稱加密
沒有密鑰就沒法對密碼解密,反過來講,任何人只要持有密鑰就能解密了。
複製代碼
方法2. 非對稱加密
私有密鑰不能讓其餘任何人知道,而公開密鑰則能夠隨意發佈,任何人均可以得到。
複製代碼
方法3. 對稱加密+非對稱加密(HTTPS採用這種方式)
在交換密鑰環節使用非對稱加密方式,以後的創建通訊交換報文階段則使用對稱加密方式。
發送密文的一方使用對方的公鑰進行加密處理「對稱的密鑰」,而後對方用本身的私鑰解密拿到「對稱的密鑰」,
這樣能夠確保交換的密鑰是安全的前提下,使用對稱加密方式進行通訊。
複製代碼
yiqingfeng.github.io/2019/04/01/…
證書的安全性
證書的校驗
校驗證書是否已被吊銷須要和 CA 關聯,其餘都可由瀏覽器完成。驗證證書是否吊銷能夠採用CRL黑名單方式或者OCSP方式。
CRL黑名單就是按期從CA下載一個名單列表,裏面有吊銷的證書序列號,本身在本地比對一下就行。
優勢是效率高。缺點是不實時。
OCSP是實時鏈接CA去驗證,優勢是實時,缺點是效率不高。
複製代碼
以 www.google.com 爲例:
檢查流程:
DES Data Encryption Standard
3DES Triple DES
AES Advanced Encryption Standard
複製代碼
我國國密局也制定了本身的對稱加密算法,叫國密算法,SM1(至關於AES),和SM4(至關於3DES)。
RSA RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一塊兒提出的。
DSA Digital Signture Algorithm
ECC Elliptic Curves Cryptography
MD5 Message-Digest 5 1992
SHA1 NISTNSA 設計,SHA-1是由美國標準技術局(NIST)頒佈的國家標準,是一種應用最爲普遍的Hash函數算法
HMAC Hash-based Message Authentication Code
複製代碼
AES的基本結構
AES爲分組密碼,每組長度相等,每次加密一組數據,直到加密完整個明文。在AES標準規範中,分組長度只能是128位,每一個分組爲16個字節(每一個字節8位)。密鑰的長度可使用128位、192位或256位。密鑰的長度不一樣,推薦加密輪數也不一樣,以下表所示:
AES | 密鑰長度(32位比特字) | 分組長度(32位比特字) | 加密輪數 |
---|---|---|---|
AES-128 | 4 | 4 | 10 |
AES-192 | 6 | 4 | 12 |
AES-256 | 8 | 4 | 14 |
AES的加密公式爲C = E(K,P)
1、字節代換
AES定義了一個S盒和一個逆S盒。
1.字節代換操做
2.字節代換逆操做
複製代碼
2、行移位
1.行移位操做 2.行移位的逆變換
3、列混合 1.列混合操做 2.列混合逆運算
4、輪密鑰加
第一步:生成密鑰對,即公鑰和私鑰
好比 P = 67 ,Q = 71。計算他們的乘積 n = P * Q = 4757 ,轉化爲二進爲 1001010010101,該加密算法即爲 13 位,
實際算法是 1024 位 或 2048 位,位數越長,算法越難被破解。
複製代碼
φ(n) 表示在小於等於 n 的正整數之中,與 n 構成互質關係的數的個數。
例如:在 1 到 8 之中,與 8 造成互質關係的是一、三、五、7,因此 φ(n) = 4。
若是 n = P * Q,P 與 Q 均爲質數,則 φ(n) = φ(P * Q) = φ(P - 1)φ(Q - 1) = (P - 1)(Q - 1) 。
本例中 φ(n) = 66 * 70 = 4620,這裏記爲 m, m = φ(n) = 4620
複製代碼
公約數只有 1 的兩個整數,叫作互質整數,這裏咱們隨機選擇 e = 101
請注意不要選擇 4619,若是選這個,則公鑰和私鑰將變得相同。
複製代碼
即找一個整數 d,使得 (e * d ) % m = 1。 等價於 e * d + 1 = y * m ( y 爲整數) 找到 d ,實質就是對下面二元一次方程求解。
e * x - m * y = 1 ,其中 e = 101,m = 4620,101x - 4620y = 1 這個方程能夠用"擴展歐幾里得算法"求解,此處省略具體過程。
總之算出一組整數解(x,y) = (1601,35),即 d = 1601。 到此密鑰對生成完畢。
不一樣的 e 生成不一樣的 d,所以能夠生成多個密鑰對。
本例中公鑰爲 (n,e) = (4757 , 101),私鑰爲 (n,d) = (4757 ,1601) ,僅 (n,e) = (4757 , 101) 是公開的,其他數字均不公開。
能夠想像若是隻有 n 和 e,如何推導出 d,目前只能靠暴力破解,位數越長,暴力破解的時間越長。
複製代碼
第二步:加密生成密文
好比甲向乙發送漢字「中」,就要使用乙的公鑰加密漢字 "中", 以 utf-8 方式編碼爲 [e4 b8 ad],轉爲 10 進製爲 [228,184,173]。
要想使用公鑰(n,e) = (4757 , 101)加密,要求被加密的數字必須小於 n,被加密的數字必須是整數,字符串能夠取 ascii 值或unicode值,
所以將「中」字折爲三個字節 [228,184,173],分別對三個字節加密。
假設 a 爲明文,b 爲密文,則按下列公式計算出 b
複製代碼
a ^ e % n = b
計算 [228,184,173]的密文:
228^101 % 4757 = 4296
184^101 % 4757 = 2458
173^101 % 4757 = 3263
即 [228,184,173]加密後獲得密文 [4296,2458,3263] ,若是沒有私鑰 d ,神仙也沒法從 [4296,2458,3263]中恢復 [228,184,173]。
解密生成明文。
乙收到密文 [4296,2458,3263],並用本身的私鑰 (n,d) = (4757 ,1601) 解密。解密公式以下: 假設 a 爲明文,b 爲密文,則按下列公式計算出 a
複製代碼
a ^ d % n = b
密文 [4296,2458,3263]的明文以下:
4296^1601% 4757 = 228
2458^1601% 4757 = 184
3263^1601% 4757 = 173
即密文 [4296,2458,3263] 解密後獲得 [228,184,173] 將[228,184,173] 再按 utf-8 解碼爲漢字 "中",至此解密完畢。
目前已經破解的最大整數:
1230186684530117755130494958384962720772853569595334792197322452151726400507263657518745202199786469389956474942774063845925192557326303453731548268507917026122142913461670429214311602221240479274737794080665351419597459856902143413
=
33478071698956898786044169848212690817704794983713768568912431388982883793878002287614711652531743087737814467999489
x
36746043666799590428244633799627952632279158164343087642676032283815739666511279233373417143396810270092798736308917
複製代碼
即(232個十進制位,768個二進制位),目前被破解的最長RSA密鑰就是768位。實際應用中 RSA 的密鑰長度爲 1024 位,重要場合 2048 位,將來半個世紀不可能破解。 (完)
MD5算法底層原理
處理原文,
原文長度(bit)對512求餘的結果,若是不等於448,就須要填充原文到等於448。
填充的方法是第一位填充1,其他位填充0。
用剩餘的位置(512-448=64位)記錄原文的真正長度,把長度的二進制值補在最後。
這樣處理後的信息長度就是512*(N+1)。
複製代碼
設置初始值,
MD5的哈希結果長度爲128位,按每32位分紅一組共4組。
這4組結果是由4個初始值A、B、C、D通過不斷演變獲得。
MD5的官方實現中,A、B、C、D的初始值以下(16進制):
複製代碼
A=0x01234567
B=0x89ABCDEF
C=0xFEDCBA98
D=0x76543210
循環加工,每一次循環都會讓舊的ABCD產生新的ABCD,原文長度是M
主循環次數 = M / 512
每一個主循環中包含 512 / 32 * 4 = 64 次 子循環。
這張圖所表達的就是單次子循環的流程:
1.綠色F
圖中的綠色F,表明非線性函數。官方MD5所用到的函數有四種:
F(X, Y, Z) =(X&Y) | ((~X) & Z)
G(X, Y, Z) =(X&Z) | (Y & (~Z))
H(X, Y, Z) =X^Y^Z
I(X, Y, Z)=Y^(X|(~Z))
在主循環下面64次子循環中,F、G、H、I 交替使用,第一個16次使用F,第二個16次使用G,第三個16次使用H,第四個16次使用I。
複製代碼
2.紅色「田」字
很簡單,紅色的田字表明相加的意思。
4.Ki
一個常量,在64次子循環中,每一次用到的常量都是不一樣的。
拼接結果。
最終產生的A,B,C,D四個值拼接在一塊兒,轉換成字符串便可。
複製代碼
5.黃色的<<<S
左移S位,S的值也是常量。
「流水線」的最後,讓計算的結果和B相加,取代原先的B。新ABCD的產生能夠概括爲:
新A = 原d
新B = b+((a+F(b,c,d)+Mj+Ki)<<<'s)
新C = 原b
新D = 原c
複製代碼
增長 ack QoS
WebSocket 是相似 Socket 的 TCP 長鏈接的通信模式,一旦 WebSocket 鏈接創建後,後續數據都以幀序列的形式傳輸。在客戶端斷開 WebSocket 鏈接或 Server 端斷掉鏈接前,不須要客戶端和服務端從新發起鏈接請求。
WebSocket是雙向通訊協議,模擬Socket協議,能夠雙向發送或接受信息。HTTP是單向的。
WebSocket是須要握手進行創建鏈接的。
爲了解決 Web 端即時通信的需求就出現了 WebSocket
WebSocket 與 Socket 的區別
Socket 是傳輸控制層的接口。用戶能夠經過 Socket 來操做底層 TCP/IP 協議族通訊。
WebSocket 是一個完整應用層協議。
Socket 更靈活,WebSocket 更易用。
二者都能作即時通信
複製代碼
ARPANET(Advanced Research Projects Agency)
最先的時候一個Socket指的是一個40位的數字(RFC33中說明了此用法,但在RFC36中並無明確地說使用40位數字來標識一個地址),其中前32爲指向的地址(socket number,大體至關於IP),後8位爲發送數據的源(link,大體至關於端口號)
後來(RFC433,Socket Number List)socket number被明確地定義爲一個40位的數字,其中後8位被用來制定某個特定的應用使用(好比1是Telnet)。
複製代碼
Hixie(Ian Hickson),他是WHATWG組織的發言人,曾供職於Netscape、Opera、Google。Hixie說了一句「我看WebSocket這個名字就很適合嘛」。 mcarter(Michael Carter )在Comet Daily中發表了文章Independence Day: HTML5 WebSocket Liberates Comet From Hacks,後來隨着各大瀏覽器對WebSocket的支持,它變成了實際的標準,IETF也沿用了這個名字
Meteor
HTTP和WebSocket協議的RFC文檔(RFC2616 和 RFC6455)
HTTP1.1的鏈接默認使用持續鏈接(persistent connection),持續鏈接指的是,有時是客戶端會須要在短期內向服務端請求大量的相關的資源,若是不是持續鏈接,那麼每一個資源都要創建一個新的鏈接,HTTP底層使用的是TCP,那麼每次都要使用三次握手創建TCP鏈接,將形成極大的資源浪費。
持續鏈接能夠帶來不少的好處:
使用更少的TCP鏈接,對通訊各方的壓力更小。 可使用管道(pipeline)來傳輸信息,這樣請求方不須要等待結果就能夠發送下一條信息,對於單個的TCP的使用更充分。 流量更小 順序請求的延時更小。 不須要從新創建TCP鏈接就能夠傳送error,關閉鏈接等信息。
GET /chat HTTP/1.1 //1
Host: server.example.com //2
Upgrade: websocket //3
Connection: Upgrade //4
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== //5
Origin: http://example.com //6
Sec-WebSocket-Protocol: chat, superchat //7
Sec-WebSocket-Version: 13 //8
複製代碼
幀類型 幀類型是由一個4位長的叫Opcode的值表示,任何WebSocket的通訊方收到一個位置的幀類型,都要以鏈接失敗的方式斷開此鏈接。 RFC6455中定義的幀類型以下所示:
Opcode == 0 繼續
表示此幀是一個繼續幀,須要拼接在上一個收到的幀以後,來組成一個完整的消息。因爲這種解析特性,非控制幀的發送和接收必須是相同的順序。
Opcode == 1 文本幀
Opcode == 2 二進制幀
Opcode == 3 - 7 將來使用(非控制幀)
Opcode == 8 關閉鏈接(控制幀) 此幀可能會包含內容,以表示關閉鏈接的緣由。 通訊的某一方發送此幀來關閉WebSocket鏈接,收到此幀的一方若是以前沒有發送此幀,則須要發送一個一樣的關閉幀以確認關閉。若是雙方同時發送此幀,則雙方都須要發送迴應的關閉幀。 理想狀況服務端在確認WebSocket鏈接關閉後,關閉相應的TCP鏈接,而客戶端須要等待服務端關閉此TCP鏈接,但客戶端在某些狀況下也能夠關閉TCP鏈接。
Opcode == 9 Ping 相似於心跳,一方收到Ping,應當當即發送Pong做爲響應。
Opcode == 10 Pong 若是通訊一方並無發送Ping,可是收到了Pong,並不要求它返回任何信息。Pong幀的內容應當和收到的Ping相同。可能會出現一方收到不少的Ping,可是隻須要響應最近的那一次就能夠了。
Opcode == 11 - 15 將來使用(控制幀)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
複製代碼
調試模式 debug.keystore 發佈模式 release.keystore
1)經過命令來對APK簽名。 2)使用ADT Export Wizard進行簽名
18.請解釋安卓爲啥要加簽名機制?
爲何要簽名
給apk簽名能夠帶來如下好處
簽名的說明
19.視頻加密傳輸