- 指標與引用的區別
- 考察margin塌陷
- 考察C++繼承和~符號
- 考察TCP通訊過程
- 考察嚴格模式
- 程式/執行緒同步的方式
- C++
- 計算機網路
- HTTP2的新特性有哪些?
- 狀態碼總結
- 程式/執行緒同步
- 考察JavaScript單執行緒
- 考察IPV6
- 考察協議
- 考察cookie的缺點
- 考察JavaScript單執行緒
- JavaScript題目
- 考察nodejs
- 考察UDP的首部頭
- 考察TCP的首部
- 排序演算法的時間複雜度,是否是穩定的
- sizeof(double)是表示式還是函式?
- 樹
- 網站效能優化的方法有哪些?
- 從輸入URL到頁面載入的過程
- 求任意整數有多少種解法
- 給定有序陣列,求出數字出現的次數
- 宣告
指標與引用的區別
考察margin塌陷
inline-block元素是否會和其他元素在垂直方向上發生margin重疊?
當然是不會的,margin塌陷僅針對於block元素與block元素,也就是說,inline-block元素和其他元素(block元素或inline-block元素)不會發生margin塌陷。
順便複習一下,margin塌陷有三種情況。
- 空標籤,沒有高度和寬度的標籤,但是又設定了自己的margin-top和margin-bottom。
- 如果沒有border, padding, inline content或者bfc的建立和清除將block元素的margin-top和第一個子元素的margin-top分開。或者沒有border, padding, inline content, height, min-height, max-height將block元素單的margin-bottom和最後一個子元素的margin-bottom分開,那麼這些margin就會發生margin collapse。摺疊的邊緣最終在父元素外。來源:mdn
- 垂直方向上的相鄰元素,它們的margin值不會變,但是在頁面上顯現出來的話,會顯示更大的那一個margin。
考察C++繼承和~符號
考察TCP通訊過程
主要就是三次握手,然後中間發包的過程,以及伺服器是否響應,然後如何斷開連線的。以及客戶端和伺服器端有什麼狀態。
位碼
TCP的位碼,有6個,當它們的值為1時它們是:
- SYN,表示建立連線
- FIN,表示關閉連線
- ACK,表示響應
- PSH,表示有DATA傳輸
- RST,表示連線重置
- URG,表示緊急位元
三次握手
seq是自己資料包本身的序號;ack是期望對方繼續傳送的那個資料包的序號。
大寫表示TCP的位碼,小寫表示包。
client傳送SYN=1(表示請求建立連線), 並置傳送序列號seq=x。
server收到後,傳送SYN=1(表示請求建立連線), 並置確認序號ack=x+1, 同時告訴client自己的序列號為seq=y。
client收到後,告訴server端自己收到了server的確認訊息並準備建立連線,於是將seq=x+1傳送出去,ack=y+1傳送出去。ack表示client希望接受到server傳送的序列號為y+1的資料包。
為什麼不是兩次握手
TCP作為一種可靠的傳輸控制協議,它的核心思想在於: 既要保證資料可靠傳輸,又要提高傳輸的效率。
因為通道是不可靠的,為了防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤。
參考:
為什麼不是兩次握手?
為什麼不是四次握手
三次握手:
“喂,你聽得到嗎?”
“我聽得到呀,你聽得到我嗎?”
“我能聽到你,今天balabala……”
兩次握手:
“喂,你聽得到嗎?”
“我聽得到呀”
“今天…………”
“……誰在說話?”
四次握手:
“喂,你聽得到嗎?”
“我聽得到呀,你聽得到我嗎?”
“我能聽到你,你能聽到我嗎?”
“……不想跟傻逼說話”
作者:匿名使用者
連結:https://www.zhihu.com/question/24853633/answer/114872771
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
四次揮手
由於TCP是全雙工的,所以每個方向都要單獨進行關閉。
關閉連線時,client向server傳送FIN報文,server收到client的FIN報文通知時,僅僅代表client已經沒有資料要傳送給server了。但是client仍然可以接受資料。
當server返回ack給client時, 表明server已經知道client沒有資料要傳送了。但是,server仍然可以傳送資料,client仍然可以接送資料。
當server傳送FIN報文給client時,表明自己也沒有資料要傳送了。
client收到server傳送的FIN報文,然後返回ack表明自己知道了,然後就斷開連線了。
為什麼要四次握手
概括來說,為什麼要四次揮手呢?因為TCP有個半關閉狀態,如果僅僅是client傳送FIN給server端,server端收到FIN返回ack確認的話,這僅僅表明client沒有資料要傳送了,但是仍然可以接受資料, 這叫半關閉。然後server端要傳送FIN報文,表示要釋放連線,然後client收到返回ack確認後,就斷開連線了。
參考
TCP的狀態
client--->server, 傳送SYN,seq,然後client進入SYN_SEND狀態。
server--->client, 傳送SYN,seq, ack,然後server進入到SYN_RECV狀態。
client--->server, 傳送seq,ack,此包傳送完畢後,client和server都進入EATABLISHED狀態。
中間傳送資料。
client--->server,傳送FIN表示要申請斷開請求,同時client進入FIN_WAIT_1狀態。
server端收到client端的FIN,返回ack確認已經收到,同時server進入CLOSE_WAIT狀態(因為自己有資料要傳送給client,所以得等到自己想要斷開連線時)。
client端收到server端的ack,然後進入到FIN_WAIT_2狀態。
server端向client端傳送FIN,表示請求斷開連線,並進入到LAST_ACK狀態(等待client的確認)。
client端收到server端的FIN,返回ack確認已經收到,並進入到TIME_WAIT狀態(等待足夠的時間以確保遠端TCP接受到連線中斷請求的確認 )。
server端收到client端的確認,進入到CLOSED狀態(即沒有任何連線狀態)。
考察嚴格模式
var a = 5;
(function() {
var a = b = 3;
})();
console.log(a);
console.log(b);
如果是上面的程式碼,會輸出什麼?
我想很多人都會知道,輸出5和3。因為b前面沒有var宣告,會被當作全域性變數宣告。
"use strict";
var a = 5;
(function() {
var a = b = 3;
})();
console.log(a);
console.log(b);
那麼,如果在嚴格模式下會怎麼辦呢?
會在var a = b = 3;丟擲未捕獲的異常。b is not defined
, 即全域性變數必須顯示宣告。
程式/執行緒同步的方式
C++
short result = 2017;
result = result << 5;
result = result >> 5;
cout<<result;
計算機網路
交換機屬於哪一層?
補充:
物理層:網線,集線器
資料鏈路層:網路卡,交換機
網路層:路由器
運輸層
應用層
HTTP2的新特性有哪些?
基於二進位制的協議
連線的多路複用, 這意味著,一個TCP連線,可以請求多個資源
流的優先順序
伺服器推送(伺服器主動推送)
重置流
參考:
狀態碼總結
來源, 需要FQ。
- 1XX, 表示訊息
- 2XX, 表示成功
- 3XX, 表示重定向
- 4XX,表示客戶端錯誤
- 5XX,表示伺服器錯誤
常見的狀態碼:
- 100, client應該繼續傳送請求,即繼續。
- 101, server通知client修改協議,也就說,client需要採用新的協議版本去訪問server。
- 200, 請求已成功。
- 200 ~ 207
- 300 Multiple Choices 如果請求一個指向多個資源的URL時,會返回這個狀態碼,比如某個伺服器上有某個HTML檔案的中文和英文版本。
- 301永久重定向
- 302臨時重定向,HTTP1.0的狀態碼。
- client向server傳送post請求。
- server返回URL和302。
- 等待使用者確認。
- 使用者確認後,client使用post訪問URL。
- 303臨時重定向,HTTP1.1的狀態碼
- client向server傳送非get、head請求。
- server返回URL和303。
- client使用get訪問URL。
- 307臨時重定向,HTTP1.1的狀態碼
- client向server傳送非get、head請求。
- server返回URL和307。
- 等待使用者確認。
- 使用者確認後,post訪問URL, 並不會重定向為get方法訪問URL。
- 300 ~ 307
- 400 ~ 418
- 421 ~ 426
- 449, 451
- 400, Bad Request, 語法錯誤,伺服器無法理解。
- 401, Unauthorized, 未被授權。登入失敗,此錯誤表明傳輸給伺服器的證照與登入伺服器所需的證照不匹配。
- 402, 預留的
- 403, Forbidden, 伺服器已經能夠理解,但是進位制執行它, 一般來說是,客戶端許可權不夠。
- 404, NOT FOUND
- 405, Method Not Allowed, 請求行中指定的請求方法不能用於請求相應的資源。
- 406, Not Acceptable, 請求的資源的內容特性無法滿足請求頭中的條件,因此無法生成響應實體。
- 500 ~ 510
- 500, Internal Server Error, 伺服器遇到了一個未曾預料的狀況,導致了不能進一步的處理,一般來說,這個錯誤出現在程式程式碼出問題時。
- 501, Not Implemented, 伺服器不支援當前請求所需要的某個功能, 可能是伺服器無法識別請求的方法。
- 502, Bad Gateway, 作為閘道器或代理工作的伺服器嘗試執行請求時,從上游伺服器接受到無效的響應。
- 503, Service Unavailable, 由於臨時的伺服器維護或過載,伺服器無法處理請求。
- 504, Gateway Timeout, 作為閘道器或代理工作的伺服器嘗試請求時,未能及時從上游伺服器或者輔助伺服器收到響應。
- 505, HTTP Version Not Supported, 伺服器不支援,或者拒絕支援在請求中使用的HTTP版本。
200與304的區別
- 第一次請求成功,是200。重新整理後,也是200,表示從瀏覽器快取裡面得到的。不會向伺服器傳送請求。
- 304的話,是強制重新整理請求,要向伺服器傳送請求,如果伺服器發現和本地檔案是一樣時,就會返回304狀態碼,並且不會傳送檔案,依然是從瀏覽器快取裡獲取的。
程式/執行緒同步
- 硬體方式
- 訊號量
- 管程
考察JavaScript單執行緒
window.setTimeout(function() {
console.log(1);
}, 1);
window.setTimeout(function() {
console.log(2);
}, 2);
window.setTimeout(function() {
console.log(3);
}, 3);
window.requestAnimationFrame(function() {
console.log(4);
});
上面程式碼執行情況可能有哪幾種?
先說說答案吧,一共有四種情況,分別是:
- 4123
- 1423
- 1243
- 1234
為什麼是這四種情況呢,setTimeout表示的是隔了多少時間後,就將函式新增到事件處理後面,但是並不代表馬上就要執行。但是為什麼是這樣,我也不清楚,因為。。。
考察IPV6
考察協議
- DNS
- FTP
- TLS
- POP3
- HTTP2
考察cookie的缺點
請問:即使使用HTTPS,那麼cookie是明文還是加密的?
XSS攻擊?
考察JavaScript單執行緒
var a = 1;
setTimeout(function() {
console.log(a);
}, 0);
var date1 = new Date();
while(new Date().getTime() - date1.getTime() <= 10) {
console.log(a);
}
a = 2;
這道題,也是考察JavaScript的單執行緒,setTimeout的引數即使是0,表示0毫秒過後,將這個事件新增到佇列裡去,但是它依然要等待其他JavaScript程式碼處理結束後,才會執行佇列裡的程式碼。因此它的執行結果是:
- n個1
- 2
JavaScript題目
var x = 1;
function a() {
alert(x);
var x = 2;
x++;
alert(x);
}
function b() {
alert(x);
x++;
alert(x);
}
if(0 < 100 < 0) {
a();
} else {
b();
}
if(0 < 100 < (0 + 4)) {
a();
} else {
b();
}
經過測試,發現這道題,考察的是if語句資料型別的轉換。它的實際過程是這麼回事:
- 0小於100返回true,true再次被比較時回被轉為1。
- true 小於 0 返回false,所以第一個if語句將會執行函式b裡的程式碼。
- 會依次彈出1, 2。
- 第二個if 0 小於 100會返回true,true會被轉為1。
- true 小於 4返回true,所以第二個if將會執行函式a裡的程式碼。
- 會依次彈出undefined, 3。
// 即
1 2 undefined 3
考察nodejs
考察UDP的首部頭
UDP的首部由8個位元組組成。
- 源埠:2個位元組。
- 目的埠:2個位元組。
- 長度:2個位元組。
- 檢驗和:2個位元組。
考察TCP的首部
一個TCP報文由TCP首部和資料組成的。TCP報文首部的前20個位元組是固定的,後面有4n個位元組是根據需要而增加的, 因此TCP首部的最小長度是20位元組。
20個位元組由以下部分組成:
- 源埠:2個位元組
- 目的埠:2個位元組
- 序號:4個位元組, 因為TCP是面向位元組流的,在一個TCP連線中傳送的位元組流中的每一個位元組都按順序編號。
- 確認號:4個位元組,是期望收到下一個報文段的第一個資料位元組的序號。
- 資料偏移:佔4位,它指出TCP報文段的資料起始處距離TCP報文段的起始處有多遠。
- 保留:佔6位。
- 6個狀態位:佔6位,URG,ACK,PSH,RST,SYN,FIN。
- 視窗:佔2個位元組,指的是接受視窗的大小。
- 檢驗和:佔2個位元組。
- 緊急指標:佔2個位元組,只有URG=1時才有意義。
- 選項和填充:一共佔4個位元組,選項大小可變。
排序演算法的時間複雜度,是否是穩定的
什麼是穩定的?穩定其實指的是如果兩個數大小一樣,當經過排序後,它們的順序依然沒有改變,那麼排序就是穩定的。
- 氣泡排序,n的平方,穩定
- 插入排序,n的平方,穩定
- 歸併排序,n的log2n,穩定
- 基數排序,d(r+n), 穩定, r代表關鍵字的基數,d代表長度,n代表關鍵字的個數。
- 快速排序,n的log2n, 不穩定
- 希爾排序,n的1.3次方,不穩定
- 選擇排序,n的平方,不穩定
- 堆排序,n的log2n, 不穩定
sizeof(double)是表示式還是函式?
sizeof不是函式,它是編譯時處理的,函式只能在執行時求值。
樹
描述:有一棵樹,它的度是4。度為4的節點個數是1,度為3的節點個數是2,度為2的節點個數是3,度為1的節點個數是4,問總節點的個數和節點為0的個數是多少。
所謂度就是節點子樹的個數,即分支數目,我畫出來是21個節點,度為0的個數是11。
網站效能優化的方法有哪些?
參見雅虎軍規。
從輸入URL到頁面載入的過程
參見google。
求任意整數有多少種解法
2 = 1 + 1
3 = 1 + 2
4 = 1+ 3;4 = 2 + 2;
給定有序陣列,求出數字出現的次數
可以自己設定一個hashTable
宣告
如果您發現文中有錯誤,請進快聯絡我。 如果您覺得本文對您有幫助,請幫忙點一下推薦,謝謝您。