前端面試題 | 計算機網絡基礎篇(4月15日更新)

1. 從輸入URL到頁面加載發生了什麼?

  1. 地址欄輸入URL並按下回車
  2. 瀏覽器會在緩存中查找URL是否存在,並比較緩存是否過時
  3. DNS解析url,找到對應的ip地址
  4. 獲取IP地址以後開始創建第一次🔗,這裏是由tcp協議完成的,主要經過3次握手完成:
  • 第一次握手: 創建鏈接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SENT狀態,等待服務器確認;
  • 第二次握手: 服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
  • 第三次握手: 客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP鏈接成功)狀態,完成三次握手。
  1. 完成握手後,瀏覽器向服務器發送http請求,
  2. 瀏覽器接收服務器返回的Response對象,主要包括狀態碼、響應頭和響應報文3個部分
  3. 瀏覽器收到後就會對dom結構進行渲染
  4. 四次揮手:

(1)客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送(報文段4)。html

(2)服務器B收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1(報文段5)。和SYN同樣,一個FIN將佔用一個序號。程序員

(3)服務器B關閉與客戶端A的鏈接,發送一個FIN給客戶端A(報文段6)。算法

(4)客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1(報文段7)。瀏覽器

http和https有什麼區別?

  1. https協議更加安全,由於它是基於ssl加密傳輸的,而http是超文本傳輸協議,數據經過明文傳輸
  2. http速度更快,由於https傳輸須要驗證證書
  3. 端口不一樣,http端口是80,https端口是443
  4. http鏈接是無狀態的

2. get和post有什麼區別?

其實,GET和POST本質上二者沒有任何區別。他們都是HTTP協議中的請求方法。底層實現都是基於TCP/IP協議。所謂區別,只是瀏覽器廠家根據約定,作得限制而已。緩存

  • get是經過明文發送數據請求,而post是經過密文;
  • get傳輸的數據量有限,由於url的長度有限,post則不受限;
  • GET請求的參數只能是ASCII碼,因此中文須要URL編碼,而POST請求傳參沒有這個限制
  • GET產生一個TCP數據包;POST產生兩個TCP數據包。對於GET方式的請求,瀏覽器會把http header和data一併發送出去,服務器響應200(返回數據);而對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。
  • 參考:www.cnblogs.com/logsharing/…

3. OSI七層協議

blog.csdn.net/tracy_frog/…安全

4. 棧和堆的區別

  1. 堆棧空間分配

棧(操做系統):由操做系統自動分配釋放 ,存放函數的參數值,局部變量的值等。其操做方式相似於數據結構中的棧。服務器

堆(操做系統): 通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式卻是相似於鏈表。cookie

  1. 堆棧緩存方式

棧使用的是一級緩存, 他們一般都是被調用時處於存儲空間中,調用完畢當即釋放。session

堆則是存放在二級緩存中,生命週期由虛擬機的垃圾回收算法來決定(並非一旦成爲孤兒對象就能被回收)。因此調用這些對象的速度要相對來得低一些。數據結構

  1. 效率比較

棧由系統自動分配,速度較快。但程序員是沒法控制的。

堆是由new分配的內存,通常速度比較慢,並且容易產生內存碎片,不過用起來最方便。

  1. 存儲內容

棧: 在函數調用時,在大多數的C編譯器中,參數是由右往左入棧的,而後是函數中的局部變量。注意靜態變量是不入棧的。

當本次函數調用結束後,局部變量先出棧,而後是參數,最後棧頂指針指向函數的返回地址,也就是主函數中的下一條指令的地址,程序由該點繼續運行。

堆:通常是在堆的頭部用一個字節存放堆的大小。堆中的具體內容由程序員安排。

其餘知識點參考:juejin.im/post/5bb2d1…

5. session和cookie有什麼區別?

  1. 存儲位置不一樣:cookie存儲在客戶端,是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息。每次HTTP請求時,客戶端都會發送相應的Cookie信息到服務端。session存儲在服務端,瀏覽器第一次訪問服務器會在服務器端生成一個session,有一個sessionid和它對應,這個id會被傳遞給客戶端放置於cookie中,從而識別用戶。

  2. 刪除權限不一樣:cookie能夠由用戶在瀏覽器設置中清除,session則只能由服務端經過validate或者是過時後自動刪除。

  3. cookie相對而言不夠安全

  4. 單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie;session保存的數據大小不受限制,但太多了也會損耗服務器性能,因此仍是根據須要適當分配cookie和session。

參考:www.cnblogs.com/Lzf127/p/89…

6. 請求頭包括哪些內容?

Accept瀏覽器能夠接受的媒體類型 Accept-Encoding瀏覽器能夠接受的編碼方法 Accept-Language申明本身能夠接受的語言 Host也就是域名 Connectionkeep-alive或者close cache-control好比no-cache Referer告訴服務器我是從哪一個頁面連接過來的 User-Agent告訴HTTP服務器, 客戶端使用的操做系統和瀏覽器的名稱和版本

7. tcp爲何是三次握手而不是兩次握手?

採用兩次握手,那麼若Client向Server發起的包A1若是在傳輸鏈路上遇到的故障,致使傳輸到Server的時間至關滯後,在這個時間段因爲Client沒有收到Server的對於包A1的確認,那麼就會重傳一個包A2,假設服務器正常收到了A2的包,而後返回確認B2包。因爲沒有第三次握手,這個時候Client和Server已經創建鏈接了。再假設A1包隨後在鏈路中傳到了Server,這個時候Server又會返回B1包確認,可是因爲Client已經清除了A1包,因此Client會丟棄掉這個確認包,可是Server會保持這個至關於「殭屍」的鏈接。

8.http有哪些請求?

GET:對服務器資源的簡單請求

POST:用於發送包含用戶提交數據的請求

HEAD:相似於GET請求,不過返回的響應中沒有具體內容,用於獲取報頭

PUT:傳說中請求文檔的一個版本

DELETE:發出一個刪除指定文檔的請求

TRACE:發送一個請求副本,以跟蹤其處理進程

OPTIONS:返回全部可用的方法,檢查服務器支持哪些方法

CONNECT:用於ssl隧道的基於代理的請求

9.tcp爲何須要4次揮手?

由於TCP有個半關閉狀態,假設A.B要釋放鏈接,那麼A發送一個釋放鏈接報文給B,B收到後發送確認,這個時候A不發數據,可是B若是發數據A仍是要接受,這叫半關閉。而後B還要發給A鏈接釋放報文,而後A發確認,因此是4次。

在tcp鏈接握手時爲什麼ACK是和SYN一塊兒發送,這裏ACK卻沒有和FIN一塊兒發送呢。緣由是由於tcp是全雙工模式,接收到FIN時意味將沒有數據再發來,可是仍是能夠繼續發送數據。

10.IP地址和Mac地址有什麼區別?

IP地址是邏輯上的,用戶能夠修改本身設備的IP地址,Mac地址是物理上的,直接燒入物理設備,好比路由器,用戶不能輕易修改。

IP地址負責標記發送方和接收方,而MAC地址負責傳輸過程當中的分段傳送,兩者缺一不可。

相關文章
相關標籤/搜索