2017騰訊Web前端實習生招聘筆試題總結


指針與引用的區別

考察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三次握手信號量的含義

三次握手的圖

三次握手與四次揮手抓包圖

大寫表示TCP的位碼,小寫表示包。

  1. client發送SYN=1(表示請求建立連接), 並置發送序列號seq=x。

  2. server收到后,發送SYN=1(表示請求建立連接), 並置確認序號ack=x+1, 同時告訴client自己的序列號為seq=y。

  3. 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是全雙工的,所以每個方向都要單獨進行關閉。

  1. 關閉連接時,client向server發送FIN報文,server收到client的FIN報文通知時,僅僅代表client已經沒有數據要發送給server了。但是client仍然可以接受數據。

  2. 當server返回ack給client時, 表明server已經知道client沒有數據要發送了。但是,server仍然可以發送數據,client仍然可以接送數據。

  3. 當server發送FIN報文給client時,表明自己也沒有數據要發送了。

  4. client收到server發送的FIN報文,然后返回ack表明自己知道了,然后就斷開連接了。

為什么要四次握手

概括來說,為什么要四次揮手呢?因為TCP有個半關閉狀態,如果僅僅是client發送FIN給server端,server端收到FIN返回ack確認的話,這僅僅表明client沒有數據要發送了,但是仍然可以接受數據, 這叫半關閉。然后server端要發送FIN報文,表示要釋放連接,然后client收到返回ack確認后,就斷開連接了。

參考

為什么要四次揮手

為什么要四次揮手2

三次握手與四次揮手

TCP的狀態

TCP的狀態轉換圖
TCP狀態知識的總結

  1. client--->server, 發送SYN,seq,然后client進入SYN_SEND狀態。

  2. server--->client, 發送SYN,seq, ack,然后server進入到SYN_RECV狀態。

  3. client--->server, 發送seq,ack,此包發送完畢后,client和server都進入EATABLISHED狀態。

  4. 中間發送數據。

  5. client--->server,發送FIN表示要申請斷開請求,同時client進入FIN_WAIT_1狀態。

  6. server端收到client端的FIN,返回ack確認已經收到,同時server進入CLOSE_WAIT狀態(因為自己有數據要發送給client,所以得等到自己想要斷開連接時)。

  7. client端收到server端的ack,然后進入到FIN_WAIT_2狀態。

  8. server端向client端發送FIN,表示請求斷開連接,並進入到LAST_ACK狀態(等待client的確認)。

  9. client端收到server端的FIN,返回ack確認已經收到,並進入到TIME_WAIT狀態(等待足夠的時間以確保遠程TCP接受到連接中斷請求的確認 )。

  10. 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;

計算機網絡

交換機屬於哪一層?

補充:

  1. 物理層:網線,集線器

  2. 數據鏈路層:網卡,交換機

  3. 網絡層:路由器

  4. 運輸層

  5. 應用層

HTTP2的新特性有哪些?

  1. 基於二進制的協議

  2. 連接的多路復用, 這意味着,一個TCP連接,可以請求多個資源

  3. 流的優先級

  4. 服務器推送(服務器主動推送)

  5. 重置流

參考:

來源知乎

狀態碼總結

來源, 需要翻牆。

  1. 1XX, 表示消息
  2. 2XX, 表示成功
  3. 3XX, 表示重定向
  4. 4XX,表示客戶端錯誤
  5. 5XX,表示服務器錯誤

常見的狀態碼:

  • 100, client應該繼續發送請求,即繼續。
  • 101, server通知client修改協議,也就說,client需要采用新的協議版本去訪問server。
  • 200, 請求已成功。
  • 200 ~ 207
  • 300 Multiple Choices 如果請求一個指向多個資源的URL時,會返回這個狀態碼,比如某個服務器上有某個HTML文件的中文和英文版本。
  • 301永久重定向
  • 302臨時重定向,HTTP1.0的狀態碼。
    1. client向server發送post請求。
    2. server返回URL和302。
    3. 等待用戶確認。
    4. 用戶確認后,client使用post訪問URL。
  • 303臨時重定向,HTTP1.1的狀態碼
    1. client向server發送非get、head請求。
    2. server返回URL和303。
    3. client使用get訪問URL。
  • 307臨時重定向,HTTP1.1的狀態碼
    1. client向server發送非get、head請求。
    2. server返回URL和307。
    3. 等待用戶確認。
    4. 用戶確認后,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語句數據類型的轉換。它的實際過程是這么回事:

  1. 0小於100返回true,true再次被比較時回被轉為1。
  2. true 小於 0 返回false,所以第一個if語句將會執行函數b里的代碼。
  3. 會依次彈出1, 2。
  4. 第二個if 0 小於 100會返回true,true會被轉為1。
  5. true 小於 4返回true,所以第二個if將會執行函數a里的代碼。
  6. 會依次彈出undefined, 3。
// 即
1 2 undefined 3

考察nodejs

考察UDP的首部頭

UDP首部與偽首部

UDP的首部由8個字節組成。

  • 源端口:2個字節。
  • 目的端口:2個字節。
  • 長度:2個字節。
  • 檢驗和:2個字節。

考察TCP的首部

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

聲明

如果您發現文中有錯誤,請進快聯系我。 如果您覺得本文對您有幫助,請幫忙點一下推薦,謝謝您。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM