java面試題:網絡協議


網絡分層

Q:OSI網絡七層模型。

Http

Q:http協議的狀態碼有哪些?含義是什么?
200,服務器已成功處理了請求。
302,重定向。
400,錯誤請求。
401,未授權,請求要求身份驗證。
403,禁止,服務器拒絕請求。
404,未找到,服務器找不到請求的網頁。
405,方法禁用,禁用請求中指定的方法。
500,服務器內部錯誤,服務器遇到錯誤,無法完成請求。
504,服務器超時。
Q:http1.0和http1.1的區別是什么?
HTTP/1.0中瀏覽器與服務器只保持短暫的連接,連接無法復用。也就是說每個TCP連接只能發送一個請求。發送數據完畢,連接就關閉,如果還要請求其他資源,就必須再新建一個連接。
HTTP/1.1相比較於HTTP/1.0來說,最主要的改進就是引入了持久連接。所謂的持久連接即TCP連接默認不關閉,可以被多個請求復用。
HTTP/1.1版還引入了管道機制(pipelining),即在同一個TCP連接里面,客戶端可以同時發送多個請求。
Q:http1.x 和http2.0的區別?
HTTP2.0和HTTP1.X相比的新特性
(1)新的二進制格式(Binary Format),HTTP1.x的解析是基於文本。基於文本協議的格式解析存在天然缺陷,文本的表現形式有多樣性,要做到健壯性考慮的場景必然很多,二進制則不同,只認0和1的組合。基於這種考慮HTTP2.0的協議解析決定采用二進制格式,實現方便且健壯。
(2)多路復用(MultiPlexing),即連接共享,即每一個request都是是用作連接共享機制的。一個request對應一個id,這樣一個連接上可以有多個request,每個連接的request可以隨機的混雜在一起,接收方可以根據request的 id將request再歸屬到各自不同的服務端請求里面。
(3)header壓縮,如上文中所言,對前面提到過HTTP1.x的header帶有大量信息,而且每次都要重復發送,HTTP2.0使用encoder來減少需要傳輸的header大小,通訊雙方各自cache一份header fields表,既避免了重復header的傳輸,又減小了需要傳輸的大小。
(4)服務端推送(server push),同SPDY一樣,HTTP2.0也具有server push功能。
Q:Http的請求報文的報文頭,有哪些參數?
請求方法Get/Post/Put/Delete等,請求URL,Http版本,ContentType,Host
Q:Https與Http的一些區別?
HTTPS協議需要到CA申請證書,一般免費證書很少,需要交費。
HTTP協議運行在TCP之上,所有傳輸的內容都是明文,HTTPS運行在SSL/TLS之上,SSL/TLS運行在TCP之上,所有傳輸的內容都經過加密的。
HTTP和HTTPS使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
HTTPS可以有效的防止運營商劫持,解決了防劫持的一個大問題。
Q:Get和Post的區別 ?
(1)post更安全(不會作為url的一部分,不會被緩存、保存在服務器日志、以及瀏覽器瀏覽記錄中)
(2)post發送的數據更大(get有url長度限制)
(3)post能發送更多的數據類型(get只能發送ASCII字符)
(4)post比get慢
(5)post用於修改和寫入數據,get一般用於搜索排序和篩選之類的操作(淘寶,支付寶的搜索查詢都是get提交),目的是資源的獲取,讀取數據
Q:一次完整的Http請求是怎樣的?
DNS域名解析 –> 發起TCP的三次握手 –> 建立TCP連接后發起http請求 –> 服務器響應http請求,瀏覽器得到html代碼 –> 瀏覽器解析html代碼,並請求html代碼中的資源(如javascript、css、圖片等) –> 瀏覽器對頁面進行渲染呈現給用戶
Q:講一下會話。
因為Http是無狀態機制,需要會話Session來保存狀態。Session有SessionId,還有會話時長。
Q:Session和Cookie的區別是什么?
(1)存在的位置:
cookie 存在於客戶端,臨時文件夾中; session存在於服務器的內存中,一個session域對象為一個用戶瀏覽器服務
(2)安全性:
cookie是以明文的方式存放在客戶端的,安全性低,可以通過一個加密算法進行加密后存放; session存放於服務器的內存中,所以安全性好
(3)網絡傳輸量:
cookie會傳遞消息給服務器; session本身存放於服務器,不會有傳送流量
(4)生命周期(以20分鍾為例):
cookie的生命周期是累計的,從創建時,就開始計時,20分鍾后,cookie生命周期結束;
session的生命周期是間隔的,從創建時,開始計時如在20分鍾,沒有訪問session,那么session生命周期被銷毀。但是,如果在20分鍾內(如在第19分鍾時)訪問過session,那么,將重新計算session的生命周期。關機會造成session生命周期的結束,但是對cookie沒有影響。
(5)訪問范圍:
cookie為多個用戶瀏覽器共享; session為一個用戶瀏覽器獨享
Q:講一下Http緩存。
Q:講一下Http長連接和短連接。

Tcp

Q:Tcp三次握手。
SYN:它的全稱是 Synchronize Sequence Numbers,同步序列編號。是 TCP/IP 建立連接時使用的握手信號。在客戶機和服務器之間建立 TCP 連接時,首先會發送的一個信號。客戶端在接受到 SYN 消息時,就會在自己的段內生成一個隨機值 X。
SYN-ACK:服務器收到 SYN 后,打開客戶端連接,發送一個 SYN-ACK 作為答復。確認號設置為比接收到的序列號多一個,即 X + 1,服務器為數據包選擇的序列號是另一個隨機數 Y。
ACK:Acknowledge character, 確認字符,表示發來的數據已確認接收無誤。最后,客戶端將 ACK 發送給服務器。序列號被設置為所接收的確認值即 Y + 1。

Q:為什么不能用兩次握手進行連接?
3次握手完成兩個重要的功能,既要雙方做好發送數據的准備工作(雙方都知道彼此已准備好),也要允許雙方就初始序列號進行協商,這個序列號在握手過程中被發送和確認。

現在把三次握手改成僅需要兩次握手,死鎖是可能發生的。作為例子,考慮計算機S和C之間的通信,假定C給S發送一個連接請求分組,S收到了這個分組,並發 送了確認應答分組。按照兩次握手的協定,S認為連接已經成功地建立了,可以開始發送數據分組。可是,C在S的應答分組在傳輸中被丟失的情況下,將不知道S 是否已准備好,不知道S建立什么樣的序列號,C甚至懷疑S是否收到自己的連接請求分組。在這種情況下,C認為連接還未建立成功,將忽略S發來的任何數據分 組,只等待連接確認應答分組。而S在發出的分組超時后,重復發送同樣的分組。這樣就形成了死鎖。

Q:Tcp四次揮手。

首先,客戶端應用程序決定要終止連接(這里服務端也可以選擇斷開連接)。這會使客戶端將 FIN 發送到服務器,並進入 FIN_WAIT_1 狀態。當客戶端處於 FIN_WAIT_1 狀態時,它會等待來自服務器的 ACK 響應。
然后第二步,當服務器收到 FIN 消息時,服務器會立刻向客戶端發送 ACK 確認消息。
當客戶端收到服務器發送的 ACK 響應后,客戶端就進入 FIN_WAIT_2 狀態,然后等待來自服務器的 FIN 消息
服務器發送 ACK 確認消息后,一段時間(可以進行關閉后)會發送 FIN 消息給客戶端,告知客戶端可以進行關閉。
當客戶端收到從服務端發送的 FIN 消息時,客戶端就會由 FIN_WAIT_2 狀態變為 TIME_WAIT 狀態。處於 TIME_WAIT 狀態的客戶端允許重新發送 ACK 到服務器為了防止信息丟失。客戶端在 TIME_WAIT 狀態下花費的時間取決於它的實現,在等待一段時間后,連接關閉,客戶端上所有的資源(包括端口號和緩沖區數據)都被釋放。

Q:為什么連接的時候是三次握手,關閉的時候卻是四次握手?

因為當Server端收到Client端的SYN連接請求報文后,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

Q:Tcp的頭部有什么?

Q:如果已經建立了連接,但是客戶端突然出現故障了怎么辦?

TCP還設有一個保活計時器,顯然,客戶端如果出現故障,服務器不能一直等下去,白白浪費資源。服務器每收到一次客戶端的請求后都會重新復位這個計時器,時間通常是設置為2小時,若兩小時還沒有收到客戶端的任何數據,服務器就會發送一個探測報文段,以后每隔75秒鍾發送一次。若一連發送10個探測報文仍然沒反應,服務器就認為客戶端出了故障,接着就關閉連接。

Udp

Q:Tcp和Udp的區別?
是否連接:Tcp面向連接,Udp面向非連接
傳輸可靠性:Tcp可靠,Udp不可靠
應用場合: Tcp傳輸大量數據,Udp少量數據
速度:Tcp速度慢 , Udp速度快
模式:Tcp面向字節流,Udp是面向報文的

NIO

Q:NIO、AIO、BIO有什么區別?
同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。
Q:NIO和IO有什么區別?
IO是多線程的,阻塞的。NIO,是同步的非阻塞IO。
IO面向Stream(流),而NIO面向Buffer(緩沖區)。
IO是多個線程的,不存在Selector。而Java NIO的Selector(選擇器)允許一個單獨的線程來監視多個Channel(輸入通道)。
Q:講一下NIO
NIO,同步非阻塞,IO多路復用。
NIO包括Channel、Select、Buffer這些。
Selector允許單線程處理多個 Channel。

Netty

Q:講一下Netty。
Q:講一下Netty的線程模型。
參考資料:
搞定計算機網絡面試
Http請求/響應報文

https://blog.csdn.net/qq_38950316/article/details/81087809

https://juejin.im/post/5e9cda81e51d4547092219fa


免責聲明!

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



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