程式設計師面試常問計算機網路問題
GET 和 POST 的區別
GET請注意,查詢字串(名稱/值對)是在 GET 請求的 URL 中傳送的:/test/demo_form.asp?name1=value1&name2=value2
- GET 請求可被快取
- GET 請求保留在瀏覽器歷史記錄中
- GET 請求可被收藏為書籤
- GET 請求不應在處理敏感資料時使用
- GET 請求有長度限制
- GET 請求只應當用於取回資料POST 方法(POST)請注意,查詢字串(名稱/值對)是在 POST 請求的 HTTP 訊息主體中傳送的:POST /test/demo_form.asp HTTP/1.1Host: w3schools.comname1=value1&name2=value2
- POST 請求不會被快取
- POST 請求不會保留在瀏覽器歷史記錄中
- POST 不能被收藏為書籤
- POST 請求對資料長度沒有要求
dns使用的協議
既使用TCP又使用UDP
首先了解一下TCP與UDP傳送位元組的長度限制:
UDP報文的最大長度為512位元組,而TCP則允許報文長度超過512位元組。當DNS查詢超過512位元組時,協議的TC標誌出現刪除標誌,這時則使用TCP傳送。通常傳統的UDP報文一般不會大於512位元組。
區域傳送時使用TCP,主要有一下兩點考慮:
- 輔域名伺服器會定時(一般時3小時)向主域名伺服器進行查詢以便了解資料是否有變動。如有變動,則會執行一次區域傳送,進行資料同步。區域傳送將使用TCP而不是UDP,因為資料同步傳送的資料量比一個請求和應答的資料量要多得多。
- TCP是一種可靠的連線,保證了資料的準確性。
域名解析時使用UDP協議:
客戶端向DNS伺服器查詢域名,一般返回的內容都不超過512位元組,用UDP傳輸即可。不用經過TCP三次握手,這樣DNS伺服器負載更低,響應更快。雖然從理論上說,客戶端也可以指定向DNS伺服器查詢的時候使用TCP,但事實上,很多DNS伺服器進行配置的時候,僅支援UDP查詢包。
冪等
一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函式,或冪等方法,是指可以使用相同引數重複執行,並能獲得相同結果的函式。這些函式不會影響系統狀態,也不用擔心重複執行會對系統造成改變。例如,“getUsername()和setTrue()”函式就是一個冪等函式.
Cookies和session區別
- Cookies是一種能夠讓網站伺服器把少量資料儲存到客戶端的硬碟或記憶體,或是從客戶端的硬碟讀取資料的一種技術。Cookies是當你瀏覽某網站時,由Web伺服器置於你硬碟上的一個非常小的文字檔案,它可以記錄你的使用者ID、密碼、瀏覽過的網頁、停留的時間等資訊。session: 當使用者請求來自應用程式的 Web 頁時,如果該使用者還沒有會話,則 Web 伺服器將自動建立一個 Session 物件。當會話過期或被放棄後,伺服器將終止該會話。cookie機制:採用的是在客戶端保持狀態的方案,而session機制採用的是在服務端保持狀態的方案。同時我們看到由於伺服器端保持狀態的方案在客戶端也需要儲存一個標識,所以session機制可能需要藉助cookie機制來達到儲存標識的目的。
- Session是伺服器用來跟蹤使用者的一種手段,每個Session都有一個唯一標識:session ID。當伺服器建立了Session時,給客戶端傳送的響應報文包含了Set-cookie欄位,其中有一個名為sid的鍵值對,這個鍵值Session ID。客戶端收到後就把Cookie儲存瀏覽器,並且之後傳送的請求報表都包含SessionID。HTTP就是通過Session和Cookie這兩個傳送一起合作來實現跟蹤使用者狀態,Session用於服務端,Cookie用於客戶端
TCP粘包和拆包產生的原因
- 應用程式寫入資料的位元組大小大於套接字傳送緩衝區的大小
- 進行MSS大小的TCP分段。MSS是最大報文段長度的縮寫。MSS是TCP報文段中的資料欄位的最大長度。資料欄位加上TCP首部才等於整個的TCP報文段。所以MSS並不是TCP報文段的最大長度,而是:MSS=TCP報文段長度-TCP首部長度
- 乙太網的payload大於MTU進行IP分片。MTU指:一種通訊協議的某一層上面所能通過的最大資料包大小。如果IP層有一個資料包要傳,而且資料的長度比鏈路層的MTU大,那麼IP層就會進行分片,把資料包分成託乾片,讓每一片都不超過MTU。注意,IP分片可以發生在原始傳送端主機上,也可以發生在中間路由器上。
TCP粘包和拆包的解決策略
- 訊息定長。例如100位元組。
- 在包尾部增加回車或者空格符等特殊字元進行分割,典型的如FTP協議
- 將訊息分為訊息頭和訊息尾。
- 其它複雜的協議,如RTMP協議等。
三次握手
第一次握手:建立連線時,客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
完成三次握手,客戶端與伺服器開始傳送資料
四次揮手
- 客戶端先傳送FIN,進入FIN_WAIT1狀態
- 服務端收到FIN,傳送ACK,進入CLOSE_WAIT狀態,客戶端收到這個ACK,進入FIN_WAIT2狀態
- 服務端傳送FIN,進入LAST_ACK狀態
- 客戶端收到FIN,傳送ACK,進入TIME_WAIT狀態,服務端收到ACK,進入CLOSE狀態
TIME_WAIT的狀態就是主動斷開的一方(這裡是客戶端),傳送完最後一次ACK之後進入的狀態。並且持續時間還挺長的。客戶端TIME_WAIT持續2倍MSL時長,在linux體系中大概是60s,轉換成CLOSE狀態
TIME_WAIT
TIME_WAIT 是主動關閉連結時形成的,等待2MSL時間,約4分鐘。主要是防止最後一個ACK丟失。 由於TIME_WAIT 的時間會非常長,因此server端應儘量減少主動關閉連線
CLOSE_WAIT
CLOSE_WAIT是被動關閉連線是形成的。根據TCP狀態機,伺服器端收到客戶端傳送的FIN,則按照TCP實現傳送ACK,因此進入CLOSE_WAIT狀態。但如果伺服器端不執行close(),就不能由CLOSE_WAIT遷移到LAST_ACK,則系統中會存在很多CLOSE_WAIT狀態的連線。此時,可能是系統忙於處理讀、寫操作,而未將已收到FIN的連線,進行close。此時,recv/read已收到FIN的連線socket,會返回0。
為什麼需要 TIME_WAIT 狀態?
假設最終的ACK丟失,server將重發FIN,client必須維護TCP狀態資訊以便可以重發最終的ACK,否則會傳送RST,結果server認為發生錯誤。TCP實現必須可靠地終止連線的兩個方向(全雙工關閉),client必須進入 TIME_WAIT 狀態,因為client可能面 臨重發最終ACK的情形。
為什麼 TIME_WAIT 狀態需要保持 2MSL 這麼長的時間?
如果 TIME_WAIT 狀態保持時間不足夠長(比如小於2MSL),第一個連線就正常終止了。第二個擁有相同相關五元組的連線出現,而第一個連線的重複報文到達,干擾了第二個連線。TCP實現必須防止某個連線的重複報文在連線終止後出現,所以讓TIME_WAIT狀態保持時間足夠長(2MSL),連線相應方向上的TCP報文要麼完全響應完畢,要麼被 丟棄。建立第二個連線的時候,不會混淆。
TIME_WAIT 和CLOSE_WAIT狀態socket過多
如果伺服器出了異常,百分之八九十都是下面兩種情況:
1.伺服器保持了大量TIME_WAIT狀態
2.伺服器保持了大量CLOSE_WAIT狀態,簡單來說CLOSE_WAIT數目過大是由於被動關閉連線處理不當導致的。
一次完整的HTTP請求過程
域名解析 --> 發起TCP的3次握手 --> 建立TCP連線後發起http請求 --> 伺服器響應http請求,瀏覽器得到html程式碼 --> 瀏覽器解析html程式碼,並請求html程式碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給使用者
講一下長連線
一、基於http協議的長連線
在HTTP1.0和HTTP1.1協議中都有對長連線的支援。其中HTTP1.0需要在request中增加”Connection: keep-alive“ header才能夠支援,而HTTP1.1預設支援.
http1.0請求與服務端的互動過程:
- 客戶端發出帶有包含一個header:”Connection: keep-alive“的請求
- 服務端接收到這個請求後,根據http1.0和”Connection: keep-alive“判斷出這是一個長連線,就會在response的header中也增加”Connection: keep-alive“,同是不會關閉已建立的tcp連線.
- 客戶端收到服務端的response後,發現其中包含”Connection: keep-alive“,就認為是一個長連線,不關閉這個連線。並用該連線再傳送request.轉到a),點選這裡瞭解 http 1.0 vs 2.0 區別。
二、發心跳包。每隔幾秒就發一個資料包過去
TCP如何保證可靠傳輸?
- 三次握手。
- 將資料截斷為合理的長度。應用資料被分割成 TCP 認為最適合傳送的資料塊(按位元組編號,合理分片)
- 超時重發。當 TCP 發出一個段後,它啟動一個定時器,如果不能及時收到一個確認就重發
- 對於收到的請求,給出確認響應
- 校驗出包有錯,丟棄報文段,不給出響應
- 對失序資料進行重新排序,然後才交給應用層
- 對於重複資料 , 能夠丟棄重複資料
- 流量控制。TCP 連線的每一方都有固定大小的緩衝空間。TCP 的接收端只允許另一端傳送接收端緩衝區所能接納的資料。這將防止較快主機致使較慢主機的緩衝區溢位。
- 擁塞控制。當網路擁塞時,減少資料的傳送。
詳細介紹http
HTTP協議是Hyper Text Transfer Protocol(超文字傳輸協議)的縮寫,是用於從全球資訊網(WWW:World Wide Web )伺服器傳輸超文字到本地瀏覽器的傳送協議。點選這裡瞭解 http 1.0 vs 2.0 區別。
特點
- 簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與伺服器聯絡的型別不同。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度很快。
- 靈活:HTTP允許傳輸任意型別的資料物件。正在傳輸的型別由Content-Type加以標記。
- 無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。
- 無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。
- 支援B/S及C/S模式。
請求訊息Request
- 請求行,用來說明請求型別,要訪問的資源以及所使用的HTTP版本.
- 請求頭部,緊接著請求行(即第一行)之後的部分,用來說明伺服器要使用的附加資訊從第二行起為請求頭部,HOST將指出請求的目的地.User-Agent,伺服器端和客戶端指令碼都能訪問它,它是瀏覽器型別檢測邏輯的重要基礎.該資訊由你的瀏覽器來定義,並且在每個請求中自動傳送等等
- 空行,請求頭部後面的空行是必須的
- 請求資料也叫主體,可以新增任意的其他資料。
響應訊息Response
- 狀態行,由HTTP協議版本號, 狀態碼, 狀態訊息 三部分組成。
- 訊息報頭,用來說明客戶端要使用的一些附加資訊
- 空行,訊息報頭後面的空行是必須的
- 響應正文,伺服器返回給客戶端的文字資訊。
狀態碼
- 200 OK //客戶端請求成功
- 301 Moved Permanently //永久重定向,使用域名跳轉
- 302 Found // 臨時重定向,未登陸的使用者訪問使用者中心重定向到登入頁面
- 400 Bad Request //客戶端請求有語法錯誤,不能被伺服器所理解
- 401 Unauthorized //請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用
- 403 Forbidden //伺服器收到請求,但是拒絕提供服務
- 404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
- 500 Internal Server Error //伺服器發生不可預期的錯誤
- 503 Server Unavailable //伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常
http的方法
- get:客戶端向服務端發起請求,獲得資源。請求獲得URL處所在的資源。
- post:向服務端提交新的請求欄位。請求URL的資源後新增新的資料。
- head:請求獲取URL資源的響應報告,即獲得URL資源的頭部
- patch:請求區域性修改URL所在資源的資料項
- put:請求修改URL所在資源的資料元素。
- delete:請求刪除url資源的資料
URI和URL的區別
URI,是uniform resource identifier,統一資源識別符號,用來唯一的標識一個資源。Web上可用的每種資源如HTML文件、影象、視訊片段、程式等都是一個來URI來定位的
URI一般由三部組成:
- 訪問資源的命名機制
- 存放資源的主機名
- 資源自身的名稱,由路徑表示,著重強調於資源。
URL是uniform resource locator,統一資源定位器,它是一種具體的URI,即URL可以用來標識一個資源,而且還指明瞭如何locate這個資源。URL是Internet上用來描述資訊資源的字串,主要用在各種WWW客戶程式和伺服器程式上,特別是著名的Mosaic。採用URL可以用一種統一的格式來描述各種資訊資源,包括檔案、伺服器的地址和目錄等。
URL一般由三部組成:
- 協議(或稱為服務方式)
- 存有該資源的主機IP地址(有時也包括埠號)
- 主機資源的具體地址。如目錄和檔名等
HTTPS和HTTP的區別
- https協議需要到CA申請證照,一般免費證照很少,需要交費。
- http是超文字傳輸協議,資訊是明文傳輸;https 則是具有安全性的ssl加密傳輸協 議。
- http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
- http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。
- http預設使用80埠,https預設使用443埠
https是如何保證資料傳輸的安全
https實際就是在TCP層與http層之間加入了SSL/TLS來為上層的安全保駕護航,主要用到對稱加密、非對稱加密、證照,等技術進行客戶端與伺服器的資料加密傳輸,最終達到保證整個通訊的安全性。點選這裡弄懂 https 的 9 個問題。
SSL/TLS協議作用:
- 認證使用者和伺服器,確保資料傳送到正確的客戶機和伺服器;
- 加密資料以防止資料中途被竊取;
- 維護資料的完整性,確保資料在傳輸過程中不被改變。
PS:如果覺得不錯,歡迎點贊、轉發。
原文出自:微信公眾號【Java技術棧】
相關文章
- Java程式設計師面試常見問題Java程式設計師面試
- 5年程式設計師面試,常見面試問題解析程式設計師面試
- 好程式設計師分享:Java面試題常見問題程式設計師Java面試題
- 好程式設計師雲端計算教程分享Linux雲端計算面試常見問題一程式設計師Linux面試
- 好程式設計師雲端計算教程分享Linux雲端計算面試常見問題二程式設計師Linux面試
- 好程式設計師雲端計算教程分享Linux雲端計算面試常見問題三程式設計師Linux面試
- 好程式設計師Python教程分享Python常見面試問題程式設計師Python面試
- OpenStack及雲端計算(面試)常見問題面試
- 基礎面試題 — 計算機網路面試題計算機網路
- 計算機網路面試問題總結計算機網路面試
- java面試--計算機網路Java面試計算機網路
- Linux網路程式設計常見面試題Linux程式設計面試題
- 軟體設計師:計算機網路計算機網路
- 好程式設計師Java培訓分享Java多執行緒常見面試問題程式設計師Java執行緒面試
- 雲端計算面試常見問題,怎麼理解shell?面試
- 網頁設計常見問題網頁
- 好程式設計師web前端分享常見面試題程式設計師Web前端面試題
- 計算機面試重難點之計算機網路面試計算機網路
- 好程式設計師Java學習路線分享Spring常見面試題程式設計師JavaSpring面試題
- 一文輕鬆回顧計算機考研複試常問問題 (本科生期末複習也適用) 計算機網路篇計算機網路
- 雲端計算工程師面試題集錦,常見雲端計算面試題及答案工程師面試題
- 【200人面試經驗】,程式設計師面試,常見面試題解析程式設計師面試題
- 雲端計算面試常見問題:Linux目錄結構面試Linux
- 計算機網路經典20問!計算機網路
- 程式設計面試問題真的越難越好嗎?No!程式設計面試
- 好程式設計師Java教程分享XML常見面試題程式設計師JavaXML面試題
- 程式設計師面試乾貨:漫談計算機網路:物理層 ----- 雙絞線&光纖?,從最底層開始瞭解計算機網路程式設計師面試計算機網路
- 好程式設計師Java教程分享:Java工程師常見面試題程式設計師Java工程師面試題
- 一線網際網路常見的14個Java面試題,你顫抖了嗎程式設計師Java面試題程式設計師
- linux c網路網路程式設計面試題收集Linux程式設計面試題
- 高階前端程式設計師面試問題與答案【精選9道】前端程式設計師面試
- 好程式設計師Java教程分享面試中Spring的技術問題程式設計師Java面試Spring
- Java程式設計師面試時應注意的三個經典問題!Java程式設計師面試
- 面試準備——計算機網路(https)面試計算機網路HTTP
- 面試必考:網路問題面試
- 好程式設計師Python教程分享常見的Python面試題程式設計師Python面試題
- 好程式設計師Java教程分享JavaScript常見面試題一程式設計師JavaScript面試題
- 好程式設計師web前端教程分享Jquery常見面試題程式設計師Web前端jQuery面試題