計算機網絡
基礎
Q:五層協議的體系結構分別是什麼?每一層都有哪些協議?
https://blog.csdn.net/cainv89/article/details/46885197
-
應用層,應用層確定進程之間通信的性質以滿足用戶的需要。應用層不僅要提供應用進程所需要的信息交換和遠地操作,還要作爲互相作用的應用進程的用戶代理(user agent);
-
運輸層任務是負責主機中兩個進程間的通信;
-
物理層物理層的任務:透明地傳輸比特流。
Q:爲何有MAC地址還要IP地址?
http://blog.sciencenet.cn/blog-411071-1037673.html
基本上一個觀點就是一個是物理地址,一個是邏輯地址。
假設兩點在一個網絡內。在這種情況下,只需要MAC地址就可以了。例如通過交換機將多臺電腦組成一個網絡。
然而,如果兩點不在一個網絡內。這時就需要IP地址了。因爲IP地址含有兩個部分,一個是網絡地址,一個是主機地址。因此,通過對方的IP地址,是可以判斷出對方是否和本機在一個網絡內。如果在一個網絡內,如上所述,只需要知道對方的MAC地址即可通信。
如果不在一個網絡內,本機的網絡層就認爲數據應該發送給網關。道理是顯然的,如果不在一個網絡內,首先得把數據發送出網絡纔可以。如何發出網絡,當然是發給網關,因爲網關就相當於網絡的門衛。要想把數據發給網關,同樣需要知道網關的MAC地址,如何知道網關的MAC地址呢?這就涉及到ARP協議。
電腦緩存裏有一張ARP表,該表主要有兩列:一列是IP地址,另外一列是MAC地址。這張表不是天生就有的,是隨着網卡收到網絡中的各種通信數據,不斷學習增加的。
話說回來,如果ARP表中有網關IP地址對應的MAC地址,則問題就轉化爲網內數據發送,上面已經講的很清楚了。如果ARP表中沒有網關IP地址對應的MAC地址,則啓動ARP協議,即向網內廣播,詢問該IP地址的MAC地址。廣播詢問的結果是網關收到廣播後,發現是問自己的MAC地址,所以就回復詢問方自己的MAC地址。然後數據發給網關的問題,也轉化爲網內數據發送。
TCP
Q:TCP和UDP的區別?
https://blog.csdn.net/xiaobangkuaipao/article/details/76793702
1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接
2、TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付
Tcp通過校驗和,重傳控制,序號標識,滑動窗口、確認應答實現可靠傳輸。如丟包時的重發控制,還可以對次序亂掉的分包進行順序控制。
3、UDP具有較好的實時性,工作效率比TCP高,適用於對高速傳輸和實時性有較高的通信或廣播通信。
4.每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
5、TCP對系統資源要求較多,UDP對系統資源要求較少。
Q:擁塞控制和流量控制都是什麼,兩者的區別?
https://blog.csdn.net/ailunlee/article/details/53716367
流量控制是端到端的控制,例如A通過網絡給B發數據,A發送的太快導致B沒法接收(B緩衝窗口過小或者處理過慢),這時候的控制就是流量控制,原理是通過滑動窗口的大小改變來實現。
擁塞控制是A與B之間的網絡發生堵塞導致傳輸過慢或者丟包,來不及傳輸。防止過多的數據注入到網絡中,這樣可以使網絡中的路由器或鏈路不至於過載。擁塞控制是一個全局性的過程,涉及到所有的主機、路由器,以及與降低網絡性能有關的所有因素。
Q:談談TCP爲什麼要三次握手?爲什麼要四次揮手?
https://blog.csdn.net/zhaobudaofangxia/article/details/55260259
https://blog.csdn.net/qq_33982721/article/details/78493967
三次握手:
- 第一次。A跟B說,我要建立連接了。
- 第二次。B跟A說,OK,那我也建立連接。
- 第三次。A跟B說,嗯,我知道了。
四次揮手:
- 第一次。A跟B說,我要斷開連接了。
- 第二次。B跟A說,好的,我知道了,我不再接收你的信息了。
- 第三次。B跟A說,我傳給你的信息傳完了,你可以關閉連接了。
- 第四次。A跟B說,好的,我關閉連接了。
Q:播放視頻用TCP還是UDP?爲什麼?
TCP 和 UDP 是質量和實時性的權衡。
拿視頻網站來說,你完全可以緩衝 20s 再播放,不會帶來什麼影響,但如果畫面有馬賽克之類的東西出現肯定是不好的,所以用 TCP。
而對於視頻聊天,如果緩衝 5s,相信整個聊天已經沒法愉快的進行了,而這時出現一些畫面質量的損失也可以被接受,所以用 UDP。
HTTP
Q:瞭解哪些響應狀態碼?
https://blog.csdn.net/oops_qu/article/details/75675702
http狀態返回代碼 1xx(臨時響應):表示臨時響應並需要請求者繼續執行操作的狀態代碼。
http狀態返回代碼 2xx (成功):表示成功處理了請求的狀態代碼。
http狀態返回代碼 3xx (重定向):表示要完成請求,需要進一步操作。 通常,這些狀態代碼用來重定向。
http狀態返回代碼 4xx(請求錯誤):這些狀態代碼表示請求可能出錯,妨礙了服務器的處理。
http狀態返回代碼 5xx(服務器錯誤):這些狀態代碼表示服務器在嘗試處理請求時發生內部錯誤。 這些錯誤可能是服務器本身的錯誤,而不是請求出錯。
Q:get和post的區別?
https://www.cnblogs.com/huaxingtianxia/p/5895236.html
- GET在瀏覽器回退時是無害的,而POST會再次提交請求。
- GET產生的URL地址可以被Bookmark,而POST不可以。
- GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。
- GET請求只能進行url編碼,而POST支持多種編碼方式。
- GET請求參數會被完整保留在瀏覽器歷史記錄裏,而POST中的參數不會被保留。
- GET請求在URL中傳送的參數是有長度限制的,而POST麼有。
- 對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。
- GET比POST更不安全,因爲參數直接暴露在URL上,所以不能用來傳遞敏感信息。
- GET參數通過URL傳遞,POST放在Request body中。
GET和POST還有一個重大區別
簡單的說:
GET產生一個TCP數據包;POST產生兩個TCP數據包。
長的說:
對於GET方式的請求,瀏覽器會把http header和data一併發送出去,服務器響應200(返回數據);
而對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。
也就是說,GET只需要汽車跑一趟就把貨送到了,而POST得跑兩趟,第一趟,先去和服務器打個招呼“嗨,我等下要送一批貨來,你們打開門迎接我”,然後再回頭把貨送過去。
因爲POST需要兩步,時間上消耗的要多一點,看起來GET比POST更有效。因此Yahoo團隊有推薦用GET替換POST來優化網站性能。但這是一個坑!跳入需謹慎。爲什麼?
1. GET與POST都有自己的語義,不能隨便混用。
2. 據研究,在網絡環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網絡環境差的情況下,兩次包的TCP在驗證數據包完整性上,有非常大的優點。
3. 並不是所有瀏覽器都會在POST中發送兩次包,Firefox就只發送一次。
Q:Http1.0、Http1.1、Http2.0的區別?
https://blog.csdn.net/linsongbin1/article/details/54980801/
Q:HTTP和TCP的區別?
實際上,傳輸層的TCP是基於網絡層的IP協議的,而應用層的HTTP協議又是基於傳輸層的TCP協議的,而Socket本身不算是協議,它只是提供了一個針對TCP或者UDP編程的接口。
Q:HTTP和HTTPS的區別?
https://www.cnblogs.com/wqhwe/p/5407468.html
HTTP:是互聯網上應用最爲廣泛的一種網絡協議,是一個客戶端和服務器端請求和應答的標準(TCP),用於從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網絡傳輸減少。
HTTPS:是以安全爲目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。
HTTPS協議的主要作用可以分爲兩種:一種是建立一個信息安全通道,來保證數據傳輸的安全;另一種就是確認網站的真實性。
Q:HTTP和Socket的區別?
https://blog.csdn.net/w369033345/article/details/72779553
https://blog.csdn.net/w369033345/article/details/72779553
http 爲短連接:客戶端發送請求都需要服務器端回送響應.請求結束後,主動釋放鏈接,因此爲短連接。通常的做法是,不需要任何數據,也要保持每隔一段時間向服務器發送"保持連接"的請求。這樣可以保證客戶端在服務器端是"上線"狀態。
Socket爲長連接:通常情況下Socket 連接就是 TCP 連接,因此 Socket 連接一旦建立,通訊雙方開始互發數據內容,直到雙方斷開連接。在實際應用中,由於網絡節點過多,在傳輸過程中,會被節點斷開連接,因此要通過輪詢高速網絡,該節點處於活躍狀態。
Q:在地址欄打入http://www.baidu.com會發生什麼?
當輸入www.baidu.com時,計算機會請求DNS服務器,進行域名轉換,得到服務器IP地址,同時對服務器發出請求,服務器響應請求,客戶端瀏覽器發起一個HTTP會話到IP地址,然後通過tcp進行封裝數據包,輸入到網絡層
操作系統
Q:操作系統中進程和線程的區別?
進程是程序執行的一個實體,線程是CPU調度的最小單位
Q:死鎖的產生和避免?
https://www.cnblogs.com/fangrong/p/5271724.html
死鎖的四個必要條件:
(1)互斥條件(Mutual exclusion):資源不能被共享,只能由一個進程使用。
(2)請求與保持條件(Hold and wait):已經得到資源的進程可以再次申請新的資源。
(3)非剝奪條件(No pre-emption):已經分配的資源不能從相應的進程中被強制地剝奪。
(4)循環等待條件(Circular wait):系統中若干進程組成環路,該環路中每個進程都在等待相鄰進程正佔用的資源。
死鎖避免(deadlock avoidence)是在系統運行過程中注意避免死鎖的發生。這就要求每當申請一個資源時,系統都應根據一定的算法判斷是否認可這次申請,使得在今後一段時間內系統不會出現死鎖。這面方最著名的算法首推Dijkstra[1965]提出的銀行家(banker)算法。
數據庫
Q:數據庫中的事務瞭解嗎?事務的四大特性?
數據庫事務是數據庫運行中的邏輯工作單位,單個邏輯工作單元所執行的一系列操作,要麼都執行,要麼都不執行。例如銀行取款事務分爲2個步驟(1)存摺減款(2)提取現金,2個步驟必須同時完成或者都不完成。
數據庫事務的四大特性(ACID):
(1) 原子性(Atomicity):
事務的原子性指的是,事務中包含的程序作爲數據庫的邏輯工作單位,它所做的對數據修改操作要麼全部執行,要麼完全不執行。這種特性稱爲原子性。
(2)一致性(Consistency) :
事務的一致性指的是在一個事務執行之前和執行之後數據庫都必須處於一致性狀態。這種特性稱爲事務的一致性。假如數據庫的狀態滿足所有的完整性約束,就說該數據庫是一致的。
(3)分離性(Isolation):
分離性指併發的事務是相互隔離的。即一個事務內部的操作及正在操作的數據必須封鎖起來,不被其它企圖進行修改的事務看到。假如併發交叉執行的事務沒有任何控制,操縱相同的共享對象的多個併發事務的執行可能引起異常情況。
(4)持久性(Durability):
持久性意味着當系統或介質發生故障時,確保已提交事務的更新不能丟失。即一旦一個事務提交,DBMS保證它對數據庫中數據的改變應該是永久性的,即對已提交事務的更新能恢復。持久性通過數據庫備份和恢復來保證。
Q:如何理解數據庫的範式?
https://blog.csdn.net/zymx14/article/details/69789326
第一範式(1NF):確保每一列的原子性
如果每一列都是不可再分的最小數據單元,則滿足第一範式。
第二範式:非鍵字段必須依賴於鍵字段
如果一個關係滿足1NF,並且除了主鍵以外的其它列,都依賴與該主鍵,則滿足二範式(2NF),第二範式要求每個表只描述一件事。
第三範式:在1NF基礎上,除了主鍵以外的其它列都不傳遞依賴於主鍵列,或者說: 任何非主屬性不依賴於其它非主屬性
(在2NF基礎上消除傳遞依賴)
數據結構與算法
Q:怎麼理解數據結構?
帶有機構的數據元素的集合
Q:什麼是斐波那契數列?
斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖爲例子而引入,故又稱爲“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
Q:迭代和遞歸的特點,並比較優缺點
https://blog.csdn.net/laoyang360/article/details/7855860
|
定義 |
優點 |
缺點 |
遞歸 |
程序調用自身的編程技巧稱爲遞歸 |
1)大問題化爲小問題,可以極大的減少代碼量; 2)用有限的語句來定義對象的無限集合.; 3)代碼更簡潔清晰,可讀性更好 |
1)遞歸調用函數,浪費空間; 2)遞歸太深容易造成堆棧的溢出;
|
迭代 |
利用變量的原值推算出變量的一個新值,迭代就是A不停的調用B. |
1)迭代效率高,運行時間只因循環次數增加而增加; 2)沒什麼額外開銷,空間上也沒有什麼增加, |
1) 不容易理解; 2) 代碼不如遞歸簡潔; 3) 編寫複雜問題時困難。 |
二者關係 |
1) 遞歸中一定有迭代,但是迭代中不一定有遞歸,大部分可以相互轉換。 2) 能用迭代的不用遞歸,遞歸調用函數,浪費空間,並且遞歸太深容易造成堆棧的溢出./*相對*/ |
Q:瞭解哪些查找算法,時間複雜度都是多少?
https://blog.csdn.net/qq_23217629/article/details/52517741
查找 |
平均時間複雜度 |
查找條件 |
算法描述 |
順序查找 |
O(n) |
無序或有序隊列 |
按順序比較每個元素,直到找到關鍵字爲止 |
二分查找(折半查找) |
O(logn) |
有序數組 |
查找過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜素過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。 如果在某一步驟數組爲空,則代表找不到。 |
二叉排序樹查找 |
O(logn) |
二叉排序樹 |
在二叉查找樹b中查找x的過程爲: 1. 若b是空樹,則搜索失敗 2. 若x等於b的根節點的數據域之值,則查找成功; 3. 若x小於b的根節點的數據域之值,則搜索左子樹 4. 查找右子樹。 |
哈希表法(散列表) |
O(1) |
先創建哈希表(散列表) |
根據鍵值方式(Key value)進行查找,通過散列函數,定位數據元素。 |
分塊查找 |
O(logn) |
無序或有序隊列 |
將n個數據元素"按塊有序"劃分爲m塊(m ≤ n)。 每一塊中的結點不必有序,但塊與塊之間必須"按塊有序";即第1塊中任一元素的關鍵字都必須小於第2塊中任一元素的關鍵字;而第2塊中任一元素又都必須小於第3塊中的任一元素,……。然後使用二分查找及順序查找。 |
Q:瞭解哪些排序算法,並比較一下,以及適用場景
https://blog.csdn.net/mountain_hua/article/details/81107024
排序法 |
最差時間分析 |
平均時間複雜度 |
穩定度 |
空間複雜度 |
冒泡排序 |
O(n2) |
O(n2) |
穩定 |
O(1) |
插入排序 |
O(n2) |
O(n2) |
穩定 |
O(1) |
選擇排序 |
O(n2) |
O(n2) |
穩定 |
O(1) |
二叉樹排序 |
O(n2) |
O(n*log2n) |
不一頂 |
O(n) |
快速排序 |
O(n2) |
O(n*log2n) |
不穩定 |
O(log2n)~O(n) |
堆排序 |
O(n*log2n) |
O(n*log2n) |
不穩定 |
O(1) |
希爾排序 |
O |
O |
不穩定 |
O(1) |
Q:快排的基本思路是什麼?最差的時間複雜度是多少?如何優化?
(升序)以某個記錄的關鍵字爲劃分元,將整個數據分爲兩組,左邊的數據小於等於劃分元,右邊的數據大於等於劃分元。對左右兩組數據,再各自選擇一個劃分元,將兩組數據劃分爲更小的序列,這樣一直進行下去,直到整個序列有序。
public static void quickSort(int[] array, int left, int right) {
if (left < right) {
int pivot = array[left];
int low = left;
int high = right;
while (low < high) {
while (low < high && array[high] >= pivot) {
high--;
}
array[low] = array[high];
while (low < high && array[low] <= pivot) {
low++;
}
array[high] = array[low];
}
array[low] = pivot;
quickSort(array, left, low - 1);
quickSort(array, low + 1, right);
}
}
最差時間複雜度即是但數據有序的時候,這時候退化爲冒泡排序,時間複雜度爲O(n2)
優化:https://blog.csdn.net/sinat_28676875/article/details/69053449
Q:冒泡排序如何優化?
public static void bubbleSort(int[] array) {
int len = array.length;
boolean flag = true;
while (flag) {
flag = false;
for (int i = 0; i < len - 1; i++) {
if (array[i] > array[i + 1]) {
int temp = array[i + 1];
array[i + 1] = array[j];
array[i] = temp;
flag = true;
}
}
len--;
}
}
存在這樣一一種情況,冒泡過程中,後面的若干記錄沒有發生交換,這時候再繼續進行冒泡就顯得多此一舉了,那麼我們只需要記錄沒有發生交換的位置,對這個位置之後的數據不進行冒泡處理,只對這個位置之前的數據進行冒泡處理,提升算法的效率。
優化後的冒泡排序:
void Bubble_Modified_Sort(int R[],int n){
int i=n;
int j;
int LastExchangeIndex;
while(i>1){
LastExchangeIndex=1;
for(j=0,j<i,j++){
if(R[j]>R[j+1]){
int temp=R[j+1];
R[j+1]=R[j];
R[j]=temp;
LastExchangeIndex=j;
} //end if
} //end for
i=LastExchangeIndex;
} //end while
}
Q:AVL樹插入或刪除一個節點的過程是怎樣的?
https://blog.csdn.net/Ivan_zgj/article/details/51495926
https://blog.csdn.net/friendbkf/article/details/50160141
Q:什麼是紅黑樹?
紅黑樹(Red Black Tree) 是一種自平衡二叉查找樹,是在計算機科學中用到的一種數據結構,典型的用途是實現關聯數組。
它是在1972年由Rudolf Bayer發明的,當時被稱爲平衡二叉B樹(symmetric binary B-trees)。後來,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改爲如今的“紅黑樹”。
紅黑樹和AVL樹類似,都是在進行插入和刪除操作時通過特定操作保持二叉查找樹的平衡,從而獲得較高的查找性能。
它雖然是複雜的,但它的最壞情況運行時間也是非常良好的,並且在實踐中是高效的: 它可以在O(log n)時間內做查找,插入和刪除,這裏的n 是樹中元素的數目。
https://blog.csdn.net/eric491179912/article/details/6179908
Q:100盞燈問題
Q:老鼠和毒藥問題,加個條件,必須要求第二天出結果
Q:海量數據問題
Q:(手寫算法)二分查找
Q:(手寫算法)反轉鏈表
Q:(手寫算法)用兩個棧實現隊列
Q:(手寫算法)多線程輪流打印問題
Q:(手寫算法)如何判斷一個鏈有環/兩條鏈交叉
Q:(手寫算法)快速從一組無序數中找到第k大的數/前k個大的數
Q:(手寫算法)最長(不)重複子串