🔥 A awesome android expert interview questions and answers(continuous updating ...)css
從幾十份頂級面試倉庫和300多篇高質量面經中總結出一份全面成體系化的Android高級面試題集。
隨着Android技術發展的成熟,Kotlin、大前端技術Flutter、RN、小程序等一會兒就進入了咱們的視野內,同時,Android自身的技術棧也正在不斷擴展,好比在國外大熱的Jetpack。所以,Android開發者們愈來愈焦慮,愈來愈迷茫,每一個人的時間和精力是有限的,咱們到底應該學什麼纔能有效地提升自身的競爭力呢?其實,首先咱們應該優先深刻學習工做中用到的技術,其次,關注這2年來Android最新的面試題所涉及的知識點,根據自身的實際狀況有選擇地進行鍼對性的學習和提高。只有這樣,自身才不會被所謂的 互聯網寒冬 嚇倒。Awesome-Android-Interview蒐集了國內一線及二線互聯網公司最常出現的面試題,很是全面,但願能讓你們比較系統的反覆學習,以快速提高本身。這篇文章筆者花費了很是大的精力和時間,但願獲得你們的支持。Android面試中常涉及的問題有以下幾方面:html
2020年中高級Android大廠面試祕籍,爲你保駕護航金三銀四,直通大廠(計算機基礎篇)2020年中高級Android大廠面試祕籍,爲你保駕護航金三銀四,直通大廠(Java篇)前端
2020年中高級Android大廠面試祕籍,爲你保駕護航金三銀四,直通大廠(Android基礎篇)node
面試就猶如考試,就像高考衝刺前咱們所作的事,無非就是將每個知識點理解並記憶。要經過面試當然須要必定的技巧,但毫不是靠僞造與吹流弊,經過一段時間沉下心來閉關修煉,等到春暖花開時,即可以出山收割,步入大廠,薪資翻番,豈不美哉?git
注意:每類知識點對應面試題的出現頻率按 ⭐ 的級數共分爲三級,分別爲 ⭐、 ⭐⭐、⭐⭐⭐,若是時間充分,建議至少將 ⭐⭐及以 上的知識點搞懂,若是時間比較緊急,則建議優先將 ⭐⭐⭐ 題目都弄懂。
爲了更好地分類學習,建議跳轉到本項目對應的 Github地址,歡迎Star、Fork、Watch~
最後,借用脈脈上的一副大廠職級薪資對應圖,給你們的機車多加點油,祝開車順利,一帆風順~github
HTTPS是一種經過計算機網絡進行安全通訊的傳輸協議。HTTPS經由HTTP進行通訊,但利用SSL/TLS來加密數據包。HTTPS開發的主要目的,是提供對網站服務器的身份 認證,保護交換數據的隱私與完整性。web
HTPPS和HTTP的概念:面試
HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,所以加密的詳細內容就須要SSL。 它是一個URI scheme(抽象標識符體系),句法類同http:體系。用於安全的HTTP數據傳輸。https:URL代表它使用了HTTP,但HTTPS存在不一樣於HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。這個系統的最初研發由網景公司進行,提供了身份驗證與加密通信方法,如今它被普遍用於萬維網上安全敏感的通信,例如交易支付方面。
超文本傳輸協議 (HTTP-Hypertext transfer protocol) 是一種詳細規定了瀏覽器和萬維網服務器之間互相通訊的規則,經過因特網傳送萬維網文檔的數據傳送協議。
https協議須要到ca申請證書,通常免費證書不多,須要交費。http是超文本傳輸協議,信息是明文傳輸,https 則是具備安全性的ssl加密傳輸協議http和https使用的是徹底不一樣的鏈接方式用的端口也不同,前者是80,後者是443。http的鏈接很簡單,是無狀態的HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議 要比http協議安全HTTPS解決的問題:1 . 信任主機的問題. 採用https 的server 必須從CA 申請一個用於證實服務器用途類型的證書. 改證書只有用於對應的server 的時候,客戶度纔信任次主機2 . 防止通信過程當中的數據的泄密和被竄改
以下圖所示,能夠很明顯的看出兩個的區別:
注:TLS是SSL的升級替代版,具體發展歷史能夠參考傳輸層安全性協議。
HTTP與HTTPS在寫法上的區別也是前綴的不一樣,客戶端處理的方式也不一樣,具體說來:
若是URL的協議是HTTP,則客戶端會打開一條到服務端端口80(默認)的鏈接,並向其發送老的HTTP請求。
若是URL的協議是HTTPS,則客戶端會打開一條到服務端端口443(默認)的鏈接,而後與服務器握手,以二進制格式與服務器交換一些SSL的安全參數,附上加密的 HTTP請求。
因此你能夠看到,HTTPS比HTTP多了一層與SSL的鏈接,這也就是客戶端與服務端SSL握手的過程,整個過程主要完成如下工做:
交換協議版本號
選擇一個兩端都瞭解的密碼
對兩端的身份進行認證
生成臨時的會話密鑰,以便加密信道。
SSL握手是一個相對比較複雜的過程,更多關於SSL握手的過程細節能夠參考TLS/SSL握手過程
SSL/TSL的常見開源實現是OpenSSL,OpenSSL是一個開放源代碼的軟件庫包,應用程序能夠使用這個包來進行安全通訊,避免竊聽,同時確認另外一端鏈接者的身份。這個包普遍被應用在互聯網的網頁服務器上。 更多源於OpenSSL的技術細節能夠參考OpenSSL。
HTTP1.0最先在網頁中使用是在1996年,那個時候只是使用一些較爲簡單的網頁上和網絡請求上,而HTTP1.1則在1999年纔開始普遍應用於如今的各大瀏覽器網絡請求中,同時HTTP1.1也是當前使用最爲普遍的HTTP協議。 主要區別主要體如今:
在講Http1.1和Http2.0的區別以前,還須要說下SPDY,它是HTTP1.x的優化方案:
2012年google如一聲驚雷提出了SPDY的方案,優化了HTTP1.X的請求延遲,解決了HTTP1.X的安全性,具體以下:
SPDY位於HTTP之下,TCP和SSL之上,這樣能夠輕鬆兼容老版本的HTTP協議(將HTTP1.x的內容封裝成一種新的frame格式),同時能夠使用已有的SSL功能。
http/1.0協議頭裏能夠設置Connection:Keep-Alive或者Connection:Close,選擇是否容許在必定時間內複用鏈接(時間可由服務器控制)。可是這對App端的請求成效不大,由於App端的請求比較分散且時間跨度相對較大。
方案1.基於tcp的長鏈接 (主要)
移動端創建一條本身的長連接通道,通道的實現是基於tcp協議。基於tcp的socket編程技術難度相對複雜不少,並且須要本身定製協議。但信息的上報和推送變得更及時,請求量爆發的時間點還能減輕服務器壓力(避免頻繁建立和銷燬鏈接)
方案2.http long-polling
客戶端在初始狀態發送一個polling請求到服務器,服務器並不會立刻返回業務數據,而是等待有新的業務數據產生的時候再返回,因此連接會一直被保持。一但結束當前鏈接,立刻又會發送一個新的polling請求,如此反覆,保證一個鏈接被保持。
存在問題:
1)增長了服務器的壓力
2)網絡環境複雜場景下,須要考慮怎麼重建健康的鏈接通道
3)polling的方式穩定性很差
4)polling的response可能被中間代理cache住
……
方案3.http streaming
和long-polling不一樣的是,streaming方式經過再server response的頭部增長「Transfer Encoding:chuncked」來告訴客戶端後續還有新的數據到來
存在問題:
1)有些代理服務器會等待服務器的response結束以後纔將結果推送給請求客戶端。streaming不會結束response
2)業務數據沒法按照請求分割
……
方案4.web socket
和傳統的tcp socket類似,基於tcp協議,提供雙向的數據通道。它的優點是提供了message的概念,比基於字節流的tcp socket使用更簡單。技術較新,不是全部瀏覽器都提供了支持。
它的緣由是隊列的第一個數據包(隊頭)受阻而致使整列數據包受阻
使用http pipelining,確保幾乎在同一時間把request發向了服務器
客戶端發送一個HTTP請求到服務器的請求消息包括如下格式:
請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成。
請求行以一個方法符號開頭,以空格分開,後面跟着請求的URI和協議的版本。
GET /562f25980001b1b106000338.jpg HTTP/1.1 Host img.mukewang.com User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 Accept image/webp,image/*,*/*;q=0.8 Referer http://www.imooc.com/ Accept-Encoding gzip, deflate, sdch Accept-Language zh-CN,zh;q=0.8
第一部分:請求行,用來講明請求類型,要訪問的資源以及所使用的HTTP版本.
GET說明請求類型爲GET,[/562f25980001b1b106000338.jpg]爲要訪問的資源,該行的最後一部分說明使用的是HTTP1.1版本。
第二部分:請求頭部,緊接着請求行(即第一行)以後的部分,用來講明服務器要使用的附加信息
從第二行起爲請求頭部,HOST將指出請求的目的地.User-Agent,服務器端和客戶端腳本都能訪問它,它是瀏覽器類型檢測邏輯的重要基礎.該信息由你的瀏覽器來定義,而且在每一個請求中自動發送等等
第三部分:空行,請求頭部後面的空行是必須的
即便第四部分的請求數據爲空,也必須有空行。
第四部分:請求數據也叫主體,能夠添加任意的其餘數據。
這個例子的請求數據爲空。
POST / HTTP1.1 Host:www.wrox.com User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022) Content-Type:application/x-www-form-urlencoded Content-Length:40 Connection: Keep-Alive name=Professional%20Ajax&publisher=Wiley
第一部分:請求行,第一行明瞭是post請求,以及http1.1版本。
第二部分:請求頭部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:請求數據,第八行。
通常狀況下,服務器接收並處理客戶端發過來的請求後會返回一個HTTP的響應消息。
HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文。
第一部分:狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。
第一行爲狀態行,(HTTP/1.1)代表HTTP版本爲1.1版本,狀態碼爲200,狀態消息爲(ok)
第二部分:消息報頭,用來講明客戶端要使用的一些附加信息
第二行和第三行爲消息報頭,
Date:生成響應的日期和時間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8
第三部分:空行,消息報頭後面的空行是必須的
第四部分:響應正文,服務器返回給客戶端的文本信息。
空行後面的html部分爲響應正文。
HTTP的緩存機制也是依賴於請求和響應header裏的參數類實現的,最終響應式從緩存中去,仍是從服務端從新拉取,HTTP的緩存機制的流程以下所示:
HTTP的緩存能夠分爲兩種:
強制緩存:須要服務端參與判斷是否繼續使用緩存,當客戶端第一次請求數據是,服務端返回了緩存的過時時間(Expires與Cache-Control),沒有過時就能夠繼續使用緩存,不然則不適用,無需再向服務端詢問。
對比緩存:須要服務端參與判斷是否繼續使用緩存,當客戶端第一次請求數據時,服務端會將緩存標識(Last-Modified/If-Modified-Since與Etag/If-None-Match)與數據一塊兒返回給客戶端,客戶端將二者都備份到緩存中 ,再次請求數據時,客戶端將上次備份的緩存 標識發送給服務端,服務端根據緩存標識進行判斷,若是返回304,則表示通知客戶端能夠繼續使用緩存。
強制緩存優先於對比緩存。
上面提到強制緩存使用的的兩個標識:
Expires:Expires的值爲服務端返回的到期時間,即下一次請求時,請求時間小於服務端返回的到期時間,直接使用緩存數據。到期時間是服務端生成的,客戶端和服務端的時間可能有偏差。
Cache-Control:Expires有個時間校驗的問題,全部HTTP1.1採用Cache-Control替代Expires。
Cache-Control的取值有如下幾種:
private: 客戶端能夠緩存。
public: 客戶端和代理服務器均可緩存。
max-age=xxx: 緩存的內容將在 xxx 秒後失效
no-cache: 須要使用對比緩存來驗證緩存數據。
no-store: 全部內容都不會緩存,強制緩存,對比緩存都不會觸發。
咱們再來看看對比緩存的兩個標識:
Last-Modified/If-Modified-Since
Last-Modified 表示資源上次修改的時間。
當客戶端發送第一次請求時,服務端返回資源上次修改的時間:
Last-Modified: Tue, 12 Jan 2016 09:31:27 GMT
客戶端再次發送,會在header裏攜帶If-Modified-Since。將上次服務端返回的資源時間上傳給服務端。
If-Modified-Since: Tue, 12 Jan 2016 09:31:27 GMT
服務端接收到客戶端發來的資源修改時間,與本身當前的資源修改時間進行對比,若是本身的資源修改時間大於客戶端發來的資源修改時間,則說明資源作過修改, 則返回200表示須要從新請求資源,不然返回304表示資源沒有被修改,能夠繼續使用緩存。
上面是一種時間戳標記資源是否修改的方法,還有一種資源標識碼ETag的方式來標記是否修改,若是標識碼發生改變,則說明資源已經被修改,ETag優先級高於Last-Modified。
Etag/If-None-Match
ETag是資源文件的一種標識碼,當客戶端發送第一次請求時,服務端會返回當前資源的標識碼:
ETag: "5694c7ef-24dc"
客戶端再次發送,會在header裏攜帶上次服務端返回的資源標識碼:
If-None-Match:"5694c7ef-24dc"
服務端接收到客戶端發來的資源標識碼,則會與本身當前的資源嗎進行比較,若是不一樣,則說明資源已經被修改,則返回200,若是相同則說明資源沒有被修改,返回 304,客戶端能夠繼續使用緩存。
Http1.0是短鏈接,HTTP1.1默認是長鏈接,也就是默認Connection的值就是keep-alive。可是長鏈接實質是指的TCP鏈接,而不是HTTP鏈接。TCP鏈接是一個雙向的通道,它是能夠保持一段時間不關閉的,所以TCP鏈接纔有真正的長鏈接和短鏈接這一說。
長鏈接是指的TCP鏈接,也就是說複用的是TCP鏈接。即長鏈接狀況下,多個HTTP請求能夠複用同一個TCP鏈接,這就節省了不少TCP鏈接創建和斷開的消耗。
此外,長鏈接並非永久鏈接的。若是一段時間內(具體的時間長短,是能夠在header當中進行設置的,也就是所謂的超時時間),這個鏈接沒有HTTP請求發出的話,那麼這個長鏈接就會被斷掉。
加密算法的類型基本上分爲了兩種:
此外,還有Hash加密算法
HASH算法:MD5, SHA1, SHA256
相比較對稱加密而言,非對稱加密安全性更高,可是加解密耗費的時間更長,速度慢。
HTTPS = HTTP + SSL,HTTPS 的加密就是在 SSL 中完成的。
這就要從 CA 證書講起了。CA 證書其實就是數字證書,是由 CA 機構頒發的。至於 CA 機構的權威性,那麼是毋庸置疑的,全部人都是信任它的。CA 證書內通常會包含如下內容:
CA 證書中的 Hash 值,實際上是用證書的私鑰進行加密後的值(證書的私鑰不在 CA 證書中)。而後客戶端獲得證書後,利用證書中的公鑰去解密該 Hash 值,獲得 Hash-a ;而後再利用證書內的簽名 Hash 算法去生成一個 Hash-b 。最後比較 Hash-a 和 Hash-b 這兩個的值。若是相等,那麼證實了該證書是對的,服務端是能夠被信任的;若是不相等,那麼就說明該證書是錯誤的,可能被篡改了,瀏覽器會給出相關提示,沒法創建起 HTTPS 鏈接。除此以外,還會校驗 CA 證書的有效時間和域名匹配等。
#### HTTPS 中的 SSL 握手創建過程
假設如今有客戶端 A 和服務器 B :
簡化以下:
能夠發現,在 HTTPS 加密原理的過程當中把對稱加密和非對稱加密都利用了起來。即利用了非對稱加密安全性高的特色,又利用了對稱加密速度快,效率高的好處。
當數據傳輸發生在一個設備(PC/手機)和網絡服務器之間時,攻擊者使用其技能和工具將本身置於兩個端點之間並截獲數據;儘管交談的兩方認爲他們是在與對方交談,可是實際上他們是在與幹壞事的人交流,這即是中間人攻擊。
嗅探或數據包嗅探是一種用於捕獲流進和流出系統/網絡的數據包的技術。網絡中的數據包嗅探就好像電話中的監聽。
在這種技術中,攻擊者會將惡意數據包注入常規數據中。這樣用戶便不會注意到文件/惡意軟件,由於它們是合法通信流的一部分。
在你登陸進你的銀行帳戶和退出登陸這一段期間便稱爲一個會話。這些會話一般都是黑客的攻擊目標,由於它們包含潛在的重要信息。在大多數案例中,黑客會潛伏在會話中,並最終控制它。
在SSL剝離攻擊中,攻擊者使SSL/TLS鏈接剝落,隨之協議便從安全的HTTPS變成了不安全的HTTP。
請見https加密原理。
1** 信息,服務器收到請求,須要請求者繼續執行操做
2** 成功,操做被成功接收並處理
3** 重定向,須要進一步的操做以完成請求
4** 客戶端錯誤,請求包含語法錯誤或沒法完成請求
5** 服務器錯誤,服務器在處理請求的過程當中發生了錯誤
ACK : TCP協議規定,只有ACK=1時有效,也規定鏈接創建後全部發送的報文的ACK必須爲1
SYN(SYNchronization) : 在鏈接創建時用來同步序號。當SYN=1而ACK=0時,代表這是一個鏈接請求報文。對方若贊成創建鏈接,則應在響應報文中使SYN=1和ACK=1. 所以, SYN置1就表示這是一個鏈接請求或鏈接接受報文。
FIN (finis)即完,終結的意思, 用來釋放一個鏈接。當 FIN = 1 時,代表此報文段的發送方的數據已經發送完畢,並要求釋放鏈接。
第一次握手:創建鏈接。客戶端發送鏈接請求報文段,將SYN位置爲1,Sequence Number爲x;而後,客戶端進入SYN_SEND狀態,等待服務器的確認;
第二次握手:服務器收到SYN報文段。服務器收到客戶端的SYN報文段,須要對這個SYN報文段進行確認,設置Acknowledgment Number爲x+1(Sequence Number+1);同時,本身本身還要發送SYN請求信息,將SYN位置爲1,Sequence Number爲y;服務器端將上述全部信息放到一個報文段(即SYN+ACK報文段)中,一併發送給客戶端,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK報文段。而後將Acknowledgment Number設置爲y+1,向服務器發送ACK報文段,這個報文段發送完畢之後,客戶端和服務器端都進入ESTABLISHED狀態,完成TCP三次握手。
第一次分手:主機1(能夠使客戶端,也能夠是服務器端),設置Sequence Number和Acknowledgment Number,向主機2發送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有數據要發送給主機2了;
第二次分手:主機2收到了主機1發送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number爲Sequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機1,我「贊成」你的關閉請求;
第三次分手:主機2向主機1發送FIN報文段,請求關閉鏈接,同時主機2進入LAST_ACK狀態;
第四次分手:主機1收到主機2發送的FIN報文段,向主機2發送ACK報文段,而後主機1進入TIME_WAIT狀態;主機2收到主機1的ACK報文段之後,就關閉鏈接;此時,主機1等待2MSL後依然沒有收到回覆,則證實Server端已正常關閉,那好,主機1也能夠關閉鏈接了。
「三次握手」的目的是「爲了防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤」。主要目的防止server端一直等待,浪費資源。換句話說,便是爲了保證服務端能收接受到客戶端的信息並能作出正確的應答而進行前兩次(第一次和第二次)握手,爲了保證客戶端可以接收到服務端的信息並能作出正確的應答而進行後兩次(第二次和第三次)握手。
「四次揮手」緣由是由於tcp是全雙工模式,接收到FIN時意味將沒有數據再發來,可是仍是能夠繼續發送數據。
確認和重傳:接收方收到報文後就會進行確認,發送方一段時間沒有收到確認就會重傳。
數據校驗。
數據合理分片與排序,TCP會對數據進行分片,接收方會緩存爲按序到達的數據,從新排序後再提交給應用層。
流程控制:當接收方來不及接收發送的數據時,則會提示發送方下降發送的速度,防止包丟失。
擁塞控制:當網絡發生擁塞時,減小數據的發送。
一、基於鏈接與無鏈接;
二、對系統資源的要求(TCP較多,UDP少);
三、UDP程序結構較簡單;
四、流模式與數據報模式 ;
五、TCP保證數據正確性,UDP可能丟包;
六、TCP保證數據順序,UDP不保證。
傳輸層沒法保證數據的可靠傳輸,只能經過應用層來實現了。實現的方式能夠參照tcp可靠性傳輸的方式。如不考慮擁塞處理,可靠UDP的簡單設計以下:
具體過程便是:送端發送數據時,生成一個隨機seq=x,而後每一片按照數據大小分配seq。數據到達接收端後接收端放入緩存,併發送一個ack=x的包,表示對方已經收到了數據。發送端收到了ack包後,刪除緩衝區對應的數據。時間到後,定時任務檢查是否須要重傳數據。
目前有以下開源程序利用udp實現了可靠的數據傳輸。分別爲RUDP、RTP、UDT:
一、RUDP(Reliable User Datagram Protocol)
RUDP 提供一組數據服務質量加強機制,如擁塞控制的改進、重發機制及淡化服務器算法等。
二、RTP(Real Time Protocol)
RTP爲數據提供了具備實時特徵的端對端傳送服務,如在組播或單播網絡服務下的交互式視頻音頻或模擬數據。
三、UDT(UDP-based Data Transfer Protocol)
UDT的主要目的是支持高速廣域網上的海量數據傳輸。
套接字(socket)是通訊的基石,是支持TCP/IP協議的網絡通訊的基本操做單元。它是網絡通訊過程當中端點的抽象表示,包含進行網絡通訊必須的五種信息:鏈接使用的協議,本地主機的IP地址,本地進程的協議端口,遠地主機的IP地址,遠地進程的協議端口。
爲了區別不一樣的應用程序進程和鏈接,許多計算機操做系統爲應用程序與TCP/IP協議交互提供了套接字(Socket)接口。應 用層能夠和傳輸層經過Socket接口,區分來自不一樣應用程序進程或網絡鏈接的通訊,實現數據傳輸的併發服務。
創建Socket鏈接至少須要一對套接字,其中一個運行於客戶端,稱爲ClientSocket ,另外一個運行於服務器端,稱爲ServerSocket 。
套接字之間的鏈接過程分爲三個步驟:服務器監聽,客戶端請求,鏈接確認。
鏈接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的鏈接請求時,就響應客戶端套接字的請求,創建一個新的線程,把服務器端套接字的描述發 給客戶端,一旦客戶端確認了此描述,雙方就正式創建鏈接。而服務器端套接字繼續處於監聽狀態,繼續接收其餘客戶端套接字的鏈接請求。
建立Socket鏈接時,能夠指定使用的傳輸層協議,Socket能夠支持不一樣的傳輸層協議(TCP或UDP),當使用TCP協議進行鏈接時,該Socket鏈接就是一個TCP鏈接。
因爲一般狀況下Socket鏈接就是TCP鏈接,所以Socket鏈接一旦創建,通訊雙方便可開始相互發送數據內容,直到雙方鏈接斷開。但在實際網 絡應用中,客戶端到服務器之間的通訊每每須要穿越多箇中間節點,例如路由器、網關、防火牆等,大部分防火牆默認會關閉長時間處於非活躍狀態的鏈接而致使 Socket 鏈接斷連,所以須要經過輪詢告訴網絡,該鏈接處於活躍狀態。
而HTTP鏈接使用的是「請求—響應」的方式,不只在請求時須要先創建鏈接,並且須要客戶端向服務器發出請求後,服務器端才能回覆數據。
不少狀況下,須要服務器端主動向客戶端推送數據,保持客戶端與服務器數據的實時與同步。此時若雙方創建的是Socket鏈接,服務器就能夠直接將數 據傳送給客戶端;若雙方創建的是HTTP鏈接,則服務器須要等到客戶端發送一次請求後才能將數據傳回給客戶端,所以,客戶端定時向服務器端發送鏈接請求, 不只能夠保持在線,同時也是在「詢問」服務器是否有新的數據,若是有就將數據傳給客戶端。TCP(Transmission Control Protocol) 傳輸控制協議
正常鏈接斷開客戶端會給服務端發送一個fin包,服務端收到fin包後纔會知道鏈接斷開。
而斷網斷電時客戶端沒法發送fin包給服務端,因此服務端沒辦法檢測到客戶端已經短線。
爲了緩解這個問題,服務端須要有個心跳邏輯,就是服務端檢測到某個客戶端多久沒發送任何數據過來就認爲客戶端已經斷開,
這須要客戶端定時向服務端發送心跳數據維持鏈接。
長鏈接的實現:心跳機制,應用層協議大多都有HeartBeat機制,一般是客戶端每隔一小段時間向服務器發送一個數據包,通知服務器本身仍然在線。並傳輸一些可能必要的數據。使用心跳包的典型協議是IM,好比QQ/MSN/飛信等協議
一、在TCP的機制裏面,自己是存在有心跳包的機制的,也就是TCP的選項:SO_KEEPALIVE。
系統默認是設置的2小時的心跳頻率。可是它檢查不到機器斷電、網線拔出、防火牆這些斷線。
並且邏輯層處理斷線可能也不是那麼好處理。通常,若是隻是用於保活仍是能夠的。經過使用TCP的KeepAlive機制(修改那個time參數),可讓鏈接每隔一小段時間就產生一些ack包,以下降被踢掉的風險,固然,這樣的代價是額外的網絡和CPU負擔。
二、應用層心跳機制實現。
因爲HTTP協議是無狀態的協議,因此服務端須要記錄用戶的狀態時,就須要用某種機制來識具體的用戶,這個機制就是Session.典型的場景好比購物車,當你點擊下單按鈕時,因爲HTTP協議無狀態,因此並不知道是哪一個用戶操做的,因此服務端要爲特定的用戶建立了特定的Session,用用於標識這個用戶,而且跟蹤用戶,這樣才知道購物車裏面有幾本書。這個Session是保存在服務端的,有一個惟一標識。在服務端保存Session的方法不少,內存、數據庫、文件都有。集羣的時候也要考慮Session的轉移,在大型的網站,通常會有專門的Session服務器集羣,用來保存用戶會話,這個時候 Session 信息都是放在內存的。
具體到Web中的Session指的就是用戶在瀏覽某個網站時,從進入網站到瀏覽器關閉所通過的這段時間,也就是用戶瀏覽這個網站所花費的時間。所以從上述的定義中咱們能夠看到,Session其實是一個特定的時間概念。
當客戶端訪問服務器時,服務器根據需求設置Session,將會話信息保存在服務器上,同時將標示Session的SessionId傳遞給客戶端瀏覽器,
瀏覽器將這個SessionId保存在內存中,咱們稱之爲無過時時間的Cookie。瀏覽器關閉後,這個Cookie就會被清掉,它不會存在於用戶的Cookie臨時文件。
之後瀏覽器每次請求都會額外加上這個參數值,服務器會根據這個SessionId,就能取得客戶端的數據信息。
若是客戶端瀏覽器意外關閉,服務器保存的Session數據不是當即釋放,此時數據還會存在,只要咱們知道那個SessionId,就能夠繼續經過請求得到此Session的信息,由於此時後臺的Session還存在,固然咱們能夠設置一個Session超時時間,一旦超過規定時間沒有客戶端請求時,服務器就會清除對應SessionId的Session信息。
Cookie是由服務器端生成,發送給User-Agent(通常是web瀏覽器),瀏覽器會將Cookie的key/value保存到某個目錄下的文本文件內,下次請求同一網站時就發送該Cookie給服務器(前提是瀏覽器設置爲啓用Cookie)。Cookie名稱和值能夠由服務器端開發本身定義,對於JSP而言也能夠直接寫入Sessionid,這樣服務器能夠知道該用戶是否合法用戶以及是否須要從新登陸等。
版本:IP協議的版本,目前的IP協議版本號爲4,下一代IP協議版本號爲6。
首部長度:IP報頭的長度。固定部分的長度(20字節)和可變部分的長度之和。共佔4位。最大爲1111,即10進制的15,表明IP報頭的最大長度能夠爲15個32bits(4字節),也就是最長可爲15*4=60字節,除去固定部分的長度20字節,可變部分的長度最大爲40字節。
服務類型:Type Of Service。
總長度:IP報文的總長度。報頭的長度和數據部分的長度之和。
標識:惟一的標識主機發送的每一分數據報。一般每發送一個報文,它的值加一。當IP報文長度超過傳輸網絡的MTU(最大傳輸單元)時必須分片,這個標識字段的值被複制到全部數據分片的標識字段中,使得這些分片在達到最終目的地時能夠依照標識字段的內容從新組成原先的數據。
標誌:共3位。R、DF、MF三位。目前只有後兩位有效,DF位:爲1表示不分片,爲0表示分片。MF:爲1表示「更多的片」,爲0表示這是最後一片。
片位移:本分片在原先數據報文中相對首位的偏移位。(須要再乘以8)
生存時間:IP報文所容許經過的路由器的最大數量。每通過一個路由器,TTL減1,當爲0時,路由器將該數據報丟棄。TTL 字段是由發送端初始設置一個 8 bit字段.推薦的初始值由分配數字 RFC 指定,當前值爲 64。發送 ICMP 回顯應答時常常把 TTL 設爲最大值 255。
協議:指出IP報文攜帶的數據使用的是那種協議,以便目的主機的IP層能知道要將數據報上交到哪一個進程(不一樣的協議有專門不一樣的進程處理)。和端口號相似,此處採用協議號,TCP的協議號爲6,UDP的協議號爲17。ICMP的協議號爲1,IGMP的協議號爲2.
首部校驗和:計算IP頭部的校驗和,檢查IP報頭的完整性。
源IP地址:標識IP數據報的源端設備。
目的IP地址:標識IP數據報的目的地址。
最後就是可變部分和數據部分。
整體來講分爲如下幾個過程:
一、DNS解析,此外還有DNSy優化(DNS緩存、DNS負載均衡)
二、TCP鏈接
三、發送HTTP請求
四、服務器處理請求並返回HTTP報文
五、瀏覽器解析渲染頁面
六、鏈接結束
將信息快速並友好的展現給用戶並可以與用戶進行交互。
答案就是能不從網絡中加載的資源就不從網絡中加載,當咱們合理使用緩存,將資源放在瀏覽器端,這是最快的方式。若是資源必須從網絡中加載,則要考慮縮短鏈接時間,即DNS優化部分;減小響應內容大小,即對內容進行壓縮。另外一方面,若是加載的資源數比較少的話,也能夠快速的響應用戶。
進程和線程的主要差異在於它們是不一樣的操做系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不一樣執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。
1) 簡而言之,一個程序至少有一個進程,一個進程至少有一個線程。
2) 線程的劃分尺度小於進程,使得多線程程序的併發性高。
3) 另外,進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存,從而極大地提升了程序的運行效率。
4) 線程在執行過程當中與進程仍是有區別的。每一個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。可是線程不可以獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
5) 從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分能夠同時執行。但操做系統並無將多個線程看作多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
Linux連接分兩種,一種被稱爲硬連接(Hard Link),另外一種被稱爲符號連接(Symbolic Link)。默認狀況下,ln命令產生硬連接。
硬鏈接指經過索引節點來進行鏈接。在Linux的文件系統中,保存在磁盤分區中的文件無論是什麼類型都給它分配一個編號,稱爲索引節點號(Inode Index)。在Linux中,多個文件名指向同一索引節點是存在的。通常這種鏈接就是硬鏈接。硬鏈接的做用是容許一個文件擁有多個有效路徑名,這樣用戶就能夠創建硬鏈接到重要文件,以防止「誤刪」的功能。其緣由如上所述,由於對應該目錄的索引節點有一個以上的鏈接。只刪除一個鏈接並不影響索引節點自己和其它的鏈接,只有當最後一個鏈接被刪除後,文件的數據塊及目錄的鏈接纔會被釋放。也就是說,文件真正刪除的條件是與之相關的全部硬鏈接文件均被刪除。
另一種鏈接稱之爲符號鏈接(Symbolic Link),也叫軟鏈接。軟連接文件有相似於Windows的快捷方式。它其實是一個特殊的文件。在符號鏈接中,文件其實是一個文本文件,其中包含的有另外一文件的位置信息。
此題考查Android的權限管理在Android的安全架構中的做用。
Android 是一個權限分隔的操做系統,其中每一個應用都有其獨特的系統標識(Linux 用戶 ID 和組 ID)。系統各部分也分隔爲不一樣的標識。Linux 據此將不一樣的應用以及應用與系統分隔開來。
其餘更詳細的安全功能經過「權限」機制提供,此機制會限制特定進程能夠執行的具體操做,而且根據 URI 權限受權臨時訪問特定的數據段。
Android 安全架構的中心設計點是:在默認狀況下任何應用都沒有權限執行對其餘應用、操做系統或用戶有不利影響的任何操做。這包括讀取或寫入用戶的私有數據(例如聯繫人或電子郵件)、讀取或寫入其餘應用程序的文件、執行網絡訪問、使設備保持喚醒狀態等。
因爲每一個 Android 應用都是在進程沙盒中運行,所以應用必須顯式共享資源和數據。它們的方法是聲明須要哪些權限來獲取基本沙盒未提供的額外功能。應用以靜態方式聲明它們須要的權限,而後 Android 系統提示用戶贊成。
事務(Transaction)是併發控制的基本單位。所謂的事務,它是一個操做序列,這些操做要麼都執行,要麼都不執行,它是一個不可分割的工做單位。例如,銀行轉帳工做:從一個帳號扣款並使另外一個帳號增款,這兩個操做要麼都執行,要麼都不執行。因此,應該把它們當作一個事務。事務是數據庫維護數據一致性的單位,在每一個事務結束時,都能保持數據一致性。事務具備如下4個基本特徵:
(1)原子性(Atomicity)
原子性是指事務包含的全部操做要麼所有成功,要麼所有失敗回滾。
(2)一致性(Consistency)
一個事務執行以前和執行以後都必須處於一致性狀態。
(3)隔離性(Isolation)
隔離性是當多個用戶併發訪問數據庫時,好比操做同一張表時,數據庫爲每個用戶開啓的事務,不能被其餘事務的操做所幹擾,多個併發事務之間要相互隔離。
(4)持久性(Durability)
持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的。
1)Serializable(串行化):可避免髒讀、不可重複讀、幻讀的發生。
2)Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。
3)Read committed (讀已提交):可避免髒讀的發生。
4)Read uncommitted (讀未提交):最低級別,任何狀況都沒法保證。
1)第一範式1NF(域的原子性)
若是數據庫表中的全部字段值都是不可分解的原子值,就說明該數據庫表知足了第一範式
2)第二範式2NF(表中除主鍵外的字段都徹底依賴主鍵)
第二範式是在第一範式基礎上創建的。第二範式有兩個重點:(1)表中必須有主鍵;(2)其餘非主屬性必須徹底依賴主鍵,不能只依賴主鍵的一部分(主要針對聯合主鍵而言)。
3)第三範式3NF(表中除主鍵外的字段都徹底直接依賴,不能是傳遞依賴)
不能是傳遞依賴,即不能存在:非主鍵列 A 依賴於非主鍵列 B,非主鍵列 B 依賴於主鍵的狀況。第二範式和第三範式區分的關鍵點:2NF:非主鍵列是否徹底依賴於主鍵,仍是依賴於主鍵的一部分;3NF:非主鍵列是直接依賴於主鍵,仍是直接依賴於非主鍵列。
對於算法面試準備,無疑就是刷《劍指Offer》+ LeetCode 效果最佳。刷《劍指Offer》是爲了創建全面的算法面試思惟,打下堅實的基礎,刷LeetCode則是爲了避免斷強化與開闊咱們本身的算法思想。這兩塊 CS-Notes 中已經實現地很完美了,建議你們將《劍指Offer》刷完,而後再至少刷100道LeetCode題目以上。
若是這個庫對您有很大幫助,您願意支持這個項目的進一步開發和這個項目的持續維護。你能夠掃描下面的二維碼,讓我喝一杯咖啡或啤酒。很是感謝您的捐贈。謝謝!
<div align="center">
<img src="https://user-gold-cdn.xitu.io/2020/3/1/170961575de964f2?w=1080&h=1457&f=jpeg&s=93345" width=20%><img src="https://user-gold-cdn.xitu.io/2020/3/1/1709615761d9b6c5?w=990&h=1540&f=jpeg&s=110691" width=20%>
</div>
歡迎關注個人微信:bcce5360
。因爲微信羣人數太多沒法生成羣邀二維碼,因此麻煩你們想進微信羣的朋友們,加我微信拉你進羣(PS:微信羣的學習氛圍與各項福利將會超乎你的想象)。
2千人QQ羣, Awesome-Android學習交流羣,QQ羣號:959936182, 歡迎你們加入~