面試常見問題整理

一 網(wǎng)絡(luò)

  1. TCP三次握手
    第一次握手:起初兩端都處于CLOSED關(guān)閉狀態(tài),Client將標(biāo)志位SYN置為1,隨機(jī)產(chǎn)生一個(gè)值seq=x,并將該數(shù)據(jù)包發(fā)送給Server,Client進(jìn)入SYN-SENT狀態(tài),等待Server確認(rèn);
    第二次握手:Server收到數(shù)據(jù)包后由標(biāo)志位SYN=1得知Client請求建立連接,Server將標(biāo)志位SYN和ACK都置為1,ack=x+1,隨機(jī)產(chǎn)生一個(gè)值seq=y,并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請求,Server進(jìn)入SYN-RCVD狀態(tài),此時(shí)操作系統(tǒng)為該TCP連接分配TCP緩存和變量;
    第三次握手:Client收到確認(rèn)后,檢查ack是否為x+1,ACK是否為1,如果正確則將標(biāo)志位ACK置為1,ack=y+1,并且此時(shí)操作系統(tǒng)為該TCP連接分配TCP緩存和變量,并將該數(shù)據(jù)包發(fā)送給Server,Server檢查ack是否為y+1,ACK是否為1,如果正確則連接建立成功,Client和Server進(jìn)入ESTABLISHED狀態(tài),完成三次握手,隨后Client和Server就可以開始傳輸數(shù)據(jù)


    圖源參考資料1

    上述過程中,只要發(fā)送端有一個(gè)包傳輸,接收端沒有回應(yīng)確認(rèn)包(ACK包),都會(huì)重發(fā)。或者接收端的應(yīng)答包,發(fā)送端沒有收到也會(huì)重發(fā)數(shù)據(jù)。這就可以保證數(shù)據(jù)的完整性

  2. TCP如何保證可靠傳輸
    TCP主要提供了檢驗(yàn)和、序列號(hào)/確認(rèn)應(yīng)答、超時(shí)重傳、最大消息長度、滑動(dòng)窗口控制等方法實(shí)現(xiàn)了可靠性傳輸。(具體見參考資料1)
  3. TCP如何保證包按序接收
  4. 用戶從輸入url到顯示頁面這個(gè)過程發(fā)生了什么
    DNS解析
    TCP連接
    發(fā)送HTTP請求
    服務(wù)器處理請求并返回HTTP報(bào)文
    瀏覽器解析渲染頁面
    連接結(jié)束
  5. DNS用的是TCP協(xié)議還是UDP協(xié)議
    DNS占用53號(hào)端口,同時(shí)使用TCP和UDP協(xié)議。那么DNS在什么情況下使用這兩種協(xié)議?
    DNS在區(qū)域傳輸?shù)臅r(shí)候使用TCP協(xié)議,其他時(shí)候使用UDP協(xié)議。
    DNS區(qū)域傳輸?shù)臅r(shí)候使用TCP協(xié)議:
    (1)輔域名服務(wù)器會(huì)定時(shí)(一般3小時(shí))向主域名服務(wù)器進(jìn)行查詢以便了解數(shù)據(jù)是否有變動(dòng)。如有變動(dòng),會(huì)執(zhí)行一次區(qū)域傳送,進(jìn)行數(shù)據(jù)同步。區(qū)域傳送使用TCP而不是UDP,因?yàn)閿?shù)據(jù)同步傳送的數(shù)據(jù)量比一個(gè)請求應(yīng)答的數(shù)據(jù)量要多得多。
    (2)TCP是一種可靠連接,保證了數(shù)據(jù)的準(zhǔn)確性。
    域名解析時(shí)使用UDP協(xié)議:
    客戶端向DNS服務(wù)器查詢域名,一般返回的內(nèi)容都不超過512字節(jié),用UDP傳輸即可。不用經(jīng)過三次握手,這樣DNS服務(wù)器負(fù)載更低,響應(yīng)更快。理論上說,客戶端也可以指定向DNS服務(wù)器查詢時(shí)用TCP,但事實(shí)上,很多DNS服務(wù)器進(jìn)行配置的時(shí)候,僅支持UDP查詢包。
  6. OSI(Open System Interconnection)七層模型
    從上到下
    應(yīng)用層:文件傳輸,常用協(xié)議HTTP,snmp,FTP ,
    表示層:數(shù)據(jù)格式化,代碼轉(zhuǎn)換,數(shù)據(jù)加密,
    會(huì)話層:建立,解除會(huì)話
    傳輸層:提供端對端的接口,tcp,udp
    網(wǎng)絡(luò)層:為數(shù)據(jù)包選擇路由,IP,icmp
    數(shù)據(jù)鏈路層:傳輸有地址的幀
    物理層:二進(jìn)制的數(shù)據(jù)形式在物理媒體上傳輸數(shù)據(jù)
  7. TCP和UDP的區(qū)別
    TCP和UDP之間的區(qū)別 OSI 和TCP/IP 模型在傳輸層定義兩種傳輸協(xié)議:TCP(或傳輸控制協(xié)議)和UDP(或用戶數(shù)據(jù)報(bào)協(xié)議)。 UDP 與TCP 的主要區(qū)別在于UDP 不一定提供可靠的數(shù)據(jù)傳輸。 事實(shí)上,該協(xié)議不能保證數(shù)據(jù)準(zhǔn)確無誤地到達(dá)目的地。
  8. 四次揮手
    由于TCP連接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。這原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來終止這個(gè)方向的連接。收到一個(gè) FIN只意味著這一方向上沒有數(shù)據(jù)流動(dòng),一個(gè)TCP連接在收到一個(gè)FIN后仍能發(fā)送數(shù)據(jù)。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方執(zhí)行被動(dòng)關(guān)閉。
    A向B發(fā)出一個(gè)釋放連接請求,他要釋放鏈接表明不再向B發(fā)送數(shù)據(jù)了,此時(shí)B收到了A發(fā)送的釋放鏈接請求之后,給A發(fā)送一個(gè)確認(rèn),A不能再向B發(fā)送數(shù)據(jù)了,它處于FIN-WAIT-2的狀態(tài),但是此時(shí)B還可以向A進(jìn)行數(shù)據(jù)的傳送。此時(shí)B向A 發(fā)送一個(gè)斷開連接的請求,A收到之后給B發(fā)送一個(gè)確認(rèn)。此時(shí)B關(guān)閉連接。A也關(guān)閉連接。
    為什么要有TIME-WAIT這個(gè)狀態(tài)呢,這是因?yàn)橛锌赡茏詈笠淮未_認(rèn)丟失,如果B此時(shí)繼續(xù)向A發(fā)送一個(gè)我要斷開連接的請求等待A發(fā)送確認(rèn),但此時(shí)A已經(jīng)關(guān)閉連接了,那么B永遠(yuǎn)也關(guān)不掉了,所以我們要有TIME-WAIT這個(gè)狀態(tài)。
    當(dāng)然TCP也并不是100%可靠的。
  9. HTTP報(bào)文
    HTTP有兩種報(bào)文:請求報(bào)文和響應(yīng)報(bào)文
    https://www.cnblogs.com/kageome/p/10859996.html
    前端工程師應(yīng)該對 HTTP 了解到什么程度?從哪些途徑去熟悉更好? - Java3y的回答 - 知乎
    https://www.zhihu.com/question/20391668/answer/915889286

二 操作系統(tǒng)

  1. 進(jìn)程和線程的區(qū)別
    進(jìn)程是程序的實(shí)體。進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對其它進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大,效率要差一些。但對于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。
    簡而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程.
    線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高。
    另外,進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。
    線程在執(zhí)行過程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。
    從邏輯角度來看,多線程的意義在于一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。但操作系統(tǒng)并沒有將多個(gè)線程看做多個(gè)獨(dú)立的應(yīng)用,來實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線程的重要區(qū)別
  2. 進(jìn)程間通信的方式(面試中列出幾個(gè)并詳細(xì)介紹)
  3. 什么情況下會(huì)發(fā)生死鎖?解決死鎖的策略有哪些?
    (一)互斥條件:一個(gè)資源一次只能被一個(gè)進(jìn)程訪問。即某個(gè)資源在一段時(shí)間內(nèi)只能由一個(gè)進(jìn)程占有,不能同時(shí)被兩個(gè)或兩個(gè)以上的進(jìn)程占 有。這種獨(dú)占資源如CD-ROM驅(qū)動(dòng)器,打印機(jī)等等,必須在占有該資源的進(jìn)程主動(dòng)釋放它之后,其它進(jìn)程才能占有該資源。這是由資源本身的屬性所決定的。
    (二)請求與保持條件:一個(gè)進(jìn)程因請求資源而阻塞時(shí),對已獲得的資源保持不放。進(jìn)程至少已經(jīng)占有一個(gè)資源,但又申請新的資源;由于該資源已被另外進(jìn)程占有,此時(shí)該進(jìn)程阻塞;但是,它在等待新資源之時(shí),仍繼續(xù)占用已占有的資源。
    (三)不剝奪條件:進(jìn)程已經(jīng)獲得的資源,在未使用完之前不能強(qiáng)行剝奪,而只能由該資源的占有者進(jìn)程自行釋放。
    (四)循環(huán)等待條件:若干資源形成一種頭尾相接的循環(huán)等待資源關(guān)系。
    解決方法:銀行家算法
  4. 頁式存儲(chǔ)
    主存被等分成大小相等的片,稱為主存塊,又稱為實(shí)頁。
    當(dāng)一個(gè)用戶程序裝入內(nèi)存時(shí),以頁面為單位進(jìn)行分配。頁面的大小是為2n ,通常為1KB、2KB、2n KB等

三 數(shù)據(jù)庫

  1. Redis和 mysql
    (1)類型上
    從類型上來說,mysql是關(guān)系型數(shù)據(jù)庫,redis是緩存數(shù)據(jù)庫
    (2)作用上
    mysql用于持久化的存儲(chǔ)數(shù)據(jù)到硬盤,功能強(qiáng)大,但是速度較慢
    redis用于存儲(chǔ)使用較為頻繁的數(shù)據(jù)到緩存中,讀取速度快
    (3)需求上
    mysql和redis因?yàn)樾枨蟮牟煌话愣际桥浜鲜褂谩?/li>
  2. sql查詢怎么加快查詢速度
  3. 左連接右連接
    左(外)連接例子
    select * from a_table a left join b_table b on a.a_id = b.b_id
    左(外)連接,左表(a_table)的記錄將會(huì)全部表示出來,而右表(b_table)只會(huì)顯示符合搜索條件的記錄。右表記錄不足的地方均為NULL。
    右(外)連接例子
    select * from a_table a right outer join b_table b on a.a_id = b.b_id;
    與左(外)連接相反,右(外)連接,左表(a_table)只會(huì)顯示符合搜索條件的記錄,而右表(b_table)的記錄將會(huì)全部表示出來。左表記錄不足的地方均為NULL。
  4. 數(shù)據(jù)庫事務(wù)的四大特性(ACID)
    (1)原子性(Atomicity)

原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾,因此事務(wù)的操作如果成功就必須要完全應(yīng)用到數(shù)據(jù)庫,如果操作失敗則不能對數(shù)據(jù)庫有任何影響。

(2)一致性(Consistency)

一致性是指事務(wù)必須使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變換到另一個(gè)一致性狀態(tài),也就是說一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。拿轉(zhuǎn)賬來說,假設(shè)用戶A和用戶B兩者的錢加起來一共是5000,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個(gè)用戶的錢相加起來應(yīng)該還得是5000,這就是事務(wù)的一致性。

(3)隔離性(Isolation)

隔離性是當(dāng)多個(gè)用戶并發(fā)訪問數(shù)據(jù)庫時(shí),比如操作同一張表時(shí),數(shù)據(jù)庫為每一個(gè)用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個(gè)并發(fā)事務(wù)之間要相互隔離。即要達(dá)到這么一種效果:對于任意兩個(gè)并發(fā)的事務(wù)T1和T2,在事務(wù)T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束,要么在T1結(jié)束之后才開始,這樣每個(gè)事務(wù)都感覺不到有其他事務(wù)在并發(fā)地執(zhí)行。

(4)持久性(Durability)

持久性是指一個(gè)事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會(huì)丟失提交事務(wù)的操作。例如我們在使用JDBC操作數(shù)據(jù)庫時(shí),在提交事務(wù)方法后,提示用戶事務(wù)操作完成,當(dāng)我們程序執(zhí)行完成直到看到提示后,就可以認(rèn)定事務(wù)以及正確提交,
即使這時(shí)候數(shù)據(jù)庫出現(xiàn)了問題,也必須要將我們的事務(wù)完全執(zhí)行完成,否則就會(huì)造成我們看到提示事務(wù)處理完畢,但是數(shù)據(jù)庫因?yàn)楣收隙鴽]有執(zhí)行事務(wù)的重大錯(cuò)誤。

四 JAVA

  1. 面向?qū)ο蟮娜筇匦裕悍庋b,繼承,多態(tài)
  2. 垃圾回收機(jī)制
  3. JVM

五 算法

  1. 穩(wěn)定的排序算法和不穩(wěn)定的排序算法https://www.cnblogs.com/codingmylife/archive/2012/10/21/2732980.html
    選擇排序、快速排序、希爾排序、堆排序不是穩(wěn)定的排序算法,而冒泡排序、插入排序、歸并排序和基數(shù)排序是穩(wěn)定的排序算法
    https://www.cnblogs.com/codingmylife/archive/2012/10/21/2732980.html
  2. 哈希算法
  3. 哈希沖突時(shí)怎么辦

六 前端

垂直居中https://www.cnblogs.com/yugege/p/5246652.html
七 python
垃圾回收機(jī)制https://blog.csdn.net/xiongchengluo1129/article/details/80462651
參考資料

  1. TCP怎么保證可靠傳輸 https://www.zhihu.com/search?type=content&q=TCP%E6%80%8E%E4%B9%88%E4%BF%9D%E8%AF%81%E5%8F%AF%E9%9D%A0%E4%BC%A0%E8%BE%93
  2. http介紹 https://segmentfault.com/a/1190000013175647
  3. https://blog.csdn.net/plg17/article/details/78758593 MySQL 內(nèi)連接、外連接、左連接、右連接、全連接
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。