- 指針與引用的區別
- 考察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連接,可以請求多個資源
-
流的優先級
-
服務器推送(服務器主動推送)
-
重置流
參考:
狀態碼總結
來源, 需要翻牆。
- 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
聲明
如果您發現文中有錯誤,請進快聯系我。 如果您覺得本文對您有幫助,請幫忙點一下推薦,謝謝您。