計算機網絡基礎面試題總結


1.OSI有哪幾層,這七層分別有什么作用?
    1. 應用層(數據):確定進程之間通信的性質以滿足用戶需要以及提供網絡與用戶應用
    2. 表示層(數據):主要解決擁護信息的語法表示問題,如加密解密
    3. 會話層(數據):提供包括訪問驗證和會話管理在內的建立和維護應用之間通信的機 制,如服務器驗證用戶登錄便是由會話層完成的
    4. 傳輸層(段):實現網絡不同主機上用戶進程之間的數據通信,可靠與不可靠的傳輸,傳輸層的錯誤檢測,流量控制等
    5. 網絡層(包):提供邏輯地址(IP)、選路,數據從源端到目的端的 傳輸
    6. 數據鏈路層(幀):將物理層的比特流數據封裝成幀,提供簡單的差錯監測
    7. 物理層(比特流):設備之間比特流的傳輸,簡單的傳送01比特

2.ARP的作用? 
    ARP為IP 地址到對應的硬件地址提供動態映射。 

3.點對點鏈路使用ARP嗎? 
    點對點鏈路不使用ARP協議,因為在設置這些鏈路時,網絡設備已獲得了鏈路兩端的MAC地址,不需要ARP協議來實現IP地址和不同網絡硬件地址的動態映射。

4.ARP高效運行的關鍵是什么? 
    關鍵是每個主機上都有一個ARP的高速緩存。 

5.數據鏈路層MTU的最大值和最小值是多少? 
    最小MTU為64字節,最大MTU為1500 字節。

6.如何理解IP協議的不可靠和無連接。 
    不可靠:指的是不能保證數據報能成功地到達目的地。 發生錯誤時候,丟棄該數據包,發送ICMP消息給信源端。 可靠性由上層提供。 
    無連接:IP不維護關於后續數據報的狀態信息。 體現在,IP數據可以不按順序發送和接收。A發送連續的數據報,到達B不一定是連續的, 來回路由選擇可能不一樣,路線也不一樣,到達先后順序也不一樣。 

7.IP 與 ICMP,IGMP,TCP,UDP 的首部校驗和有什么區 別與共同點? 
    共同點:用到的算法都是一樣的。
    區別:IP計算的時候沒有將數據包括在內。 ICMP,IGMP,TCP,UDP同時覆蓋首部和數據檢驗碼。 

8.如果路由表中沒有默認項,而又沒有找到匹配項,這時如何處理? 
    結果取決於該IP 數據報是由主機產生的還是被轉發的。 如果數據報是由本機產生的,那么就給發送該數據報的應用程序返回一個差錯,或者是“主機不可達差錯”或者是“網絡不可達差錯”。 如果是被轉發的數據報,就給原始發送一份ICMP主機不可達的差錯報文。 

9.ICMP的分類和作用。 
    ICMP分為兩類,一類是ICMP查詢報文,另一類是ICMP差錯報文 。主要傳遞一些差錯報文和其他需要注意的信息。 

10.ICMP的主機不可達報文是在什么情況下發出的? 
    三層設備(路由器)給該主機尋路時,沒有找到相應路徑,向源IP發回ICMP主機不可達 

11.什么情況不會導致產生ICMP差錯報文? 
    1) ICMP差錯報文。
    2) 目的地址是廣播地址或者多播地址的IP數據報。
    3) 鏈路層廣播的數據報
    4) 不是IP 分片的第一片
    5) 源地址不是單個主機的數據包。 

12.UDP和TCP 的簡單介紹。 
    UDP是一個簡單的面向數據報的運輸層協議:進程的每個輸出操作都正好產生一個UDP數據報,並組裝成一份待發送的IP數據報。
    TCP是面向字節流,應用程序產生的全體數據與真正發送的單個IP數據包可能沒什么聯系。

13. UDP的校驗和是怎么計算的? 
    UDP的校驗和要計算首部和數據部分。首部還包括偽首部。 如果檢驗和有錯,則UDP數據報被悄悄丟棄,不產生任何差錯報文。 

14.TCP通過哪些方式來保證可靠性? 
    1) 應用數據被分割成TCP認為最適合發送的數據塊。
    2) 確認機制,發送報文后,等待確認。
    3) 超時重傳,沒有收到確認,將重發數據段。
    4) 保持它首部和數據的校驗和。確認數據的准確性。
    5) 排序,丟棄重復的,流量控制。 

15.TCP與UDP的概念相互的區別及優劣 ?
    1. TCP面向連接,UDP無連接
    2. TCP面向字節流,UDP面向數據報 
    3. TCP提供可靠傳輸服務(數據順序、正確性),UDP盡最大努力交付,不可靠
    4. TCP協議傳輸速度慢,UDP協議傳輸速度快 
    5. TCP協議對系統資源要求多(頭部開銷大),UDP協議要求少 

16.畫出TCP通信從連接到釋放連接的全過程?

17.為什么要三次握手?
    三次握手的過程即是通信雙方相互告知序列號起始值, 並確認對方已經收到了序列號起始值的必經步驟,如果只是兩次握手, 至多只有連接發起方的起始序列號能被確認, 另一方選擇的序列號則得不到確認。同時,三次握手還可以避免兩次握手情況下會出現的資源浪費(已過期的連接請求報文突然又傳送到服務器,因而產生錯誤)。

18.為什么要設置TIME_WAIT?為什么TIME_WAIT是兩倍的MSL(IP數據報能夠在因特網上存活的最長時間)?
    因為如果第四次揮手主動方(先請求釋放連接的一方)發送的確認在網絡中丟失了,那么在兩倍MSL時間內能夠收到被動方(后請求釋放連接的一方)重新發送的釋放連接請求。由於被動方超時重發之前需要一倍MSL,發送后最多需要一倍MSL到達主動方。

19.TCP的擁塞控制機制?
    慢啟動(慢開始): 1. 慢開始不是指cwnd的增長速度慢(指數增長),而是指TCP開始發送設置cwnd=1。  2. 思路:不要一開始就發送大量的數據,先探測一下網絡的擁塞程度,也就是說由小到大 逐漸增加擁塞窗口的大小。這里用報文段的個數的擁塞窗口大小舉例說明慢開始算法,實時 擁塞窗口大小是以字節為單位的。 3. 為了防止cwnd增長過大引起網絡擁塞,設置一個慢開始門限(ssthresh狀態變量)  當cnwd<ssthresh,使用慢開始算法  當cnwd=ssthresh,既可使用慢開始算法,也可以使用擁塞避免算法  當cnwd>ssthresh,使用擁塞避免算法 
    擁塞避免: 1. 擁塞避免並非完全能夠避免擁塞,是說在擁塞避免階段將擁塞窗口控制為按線性規律增 長,使網絡比較不容易出現擁塞。  2. 思路:讓擁塞窗口cwnd緩慢地增大,即每經過一個往返時間RTT就把發送方的擁塞控制窗口加一。 
    無論是在慢開始階段還是在擁塞避免階段,只要發送方判斷網絡出現擁塞(其根據就是沒有 收到確認,雖然沒有收到確認可能是其他原因的分組丟失,但是因為無法判定,所以都當做 擁塞來處理),就把慢開始門限設置為出現擁塞時的發送窗口大小的一半。然后把擁塞窗口設置為1,執行慢開始算法。 如圖所示: 


    快速重傳: 1. 快重傳要求接收方在收到一個失序的報文段后就立即發出重復確認(為的是使發送方及 早知道有報文段沒有到達對方)而不要等到自己發送數據時捎帶確認。快重傳算法規定,發 送方只要一連收到三個重復確認就應當立即重傳對方尚未收到的報文段,而不必繼續等待設 置的重傳計時器時間到期。 2. 由於不需要等待設置的重傳計時器到期,能盡早重傳未被確認的報文段,能提高整個網 絡的吞吐量。 
    快速恢復: 1. 當發送方連續收到三個重復確認時,就執行“乘法減小”算法,把ssthresh門限減半。 但是接下去並不執行慢開始算法。  2. 考慮到如果網絡出現擁塞的話就不會收到好幾個重復的確認,所以發送方現在認為網絡可能沒有出現擁塞。所以此時不執行慢開始算法,而是將cwnd設置為ssthresh的大小, 然后執行擁塞避免算法。 

 

20.DNS的概念,用途?
    域名解析,將域名轉換成 ip地址,能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的 ip 地址。

21.GET、POST區別?
    在客戶機和服務器之間進行請求-響應時,兩種最常被用到的請求方法是:GET 和 POST。GET:從指定的資源請求數據。POST向指定的資源提交要被處理的數據。
    1.GET是從服務器上獲取數據,POST是向服務器提交數據。
    2.請求參數位置:GET在HTTP包頭,POST在HTTP正文。
    本質上都是使用的TCP傳輸協議,只不過在應用層規定了不同的請求格式以適應不同的場景。

22.HTTP和HTTPS的區別?
    http的連接很簡單,是無狀態的。Https協議是由SSL+Http協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
    http的信息是明文傳輸,https是具有安全性的ssl加密傳輸協議。
    https需要到證書頒發機構申請證書,而http不用。

23.一次完整的HTTP請求過程?

    DNS域名解析,得到對應的IP地址
    根據這個IP地址找到對應服務器
    TCP三次握手建立連接
    發起HTTP請求
    服務器響應HTTP請求
    瀏覽器得到html代碼
    瀏覽器解析html代碼的資源
    瀏覽器對頁面進行渲染呈現給用戶
    釋放TCP連接

24.Socket是什么?
    套接字(socket)是一個抽象層,應用程序可以通過它發送或接收數據,可對其進行像對文件一樣的打開、讀寫和關閉等操作。套接字允許應用程序將I/O插入到網絡中,並與網絡中的其他應用程序進行通信。網絡套接字是IP地址與端口的組合。建立網絡通信連接至少要一對端口號(socket)。socket本質是API,對TCP/IP的封裝。

 


25.說一下幾種I/O模型(linux)?
    推薦博客https://www.cnblogs.com/javalyy/p/8882066.html
    1)同步阻塞I/O:當用戶進程需要進行I/O操作時,會執行一個系統調用(recvform),在內核等待數據和數據拷貝到用戶內存的時候都處於阻塞狀態。
    2)同步非阻塞I/O:它與同步阻塞I/O的區別就是當數據沒有准備好的時候不會一直阻塞,而是直接返回,然后不停的去詢問數據是否准備完畢(輪詢)。准備完畢拷貝數據的過程仍然阻塞。
    3)I/O多路復用:調用select/epoll等待多個socket,從而實現對多個I/O端口的監聽,其中任意一個端口數據到達了就通知用戶進程,之后再調用系統調用recvform,將數據從內核態拷貝到用戶進程,這個過程仍然是阻塞的。
    4)信號驅動I/O:應用進程使用sigaction系統調用,內核立即返回,應用進程可以繼續執行,內核等到數據到達時應向應用進程發送信號,之后用戶進程執行系統調用拷貝數據。
    5)異步I/O:用戶進程執行系統調用之后立即返回,可以去做其他事情,然后,內核會等待數據准備完成,然后將數據拷貝到用戶內存,當這一切都完成之后,會給用戶進程發送一個signal,告訴它read操作完成了。

26.說一下Select、poll與epoll的區別?
    1)進程最大連接數:select:單個進程所能打開的最大連接數由FD_SETSIZE限制,默認比較小。Poll:本質與select沒有區別,但是它沒有最大連接數的限制,原因是它基於鏈表存儲。Epoll:沒有fd數量限制。
    2)FD劇增后到來的I/O效率問題:select:每次調用會對連接進行線性便利,所以隨着FD的增加會導致遍歷速度的線性下降的性能問題。Poll:同select。Epoll:由於epoll是根據每個fd上的callback函數來實現的,只有活躍的socket才會主動調用callback,所以在活躍socket較少的情況下,使用epoll不會有性能問題,但是當所有socket都很活躍的情況下,可能會有性能問題。
    3)消息傳遞方式:select:內核需要將消息傳遞到用戶空間,需要內核的拷貝動作。Poll:同select。Epoll:通過內核和用戶空間共享一塊內存來實現,性能較高。

27.epoll中ET與LT的區別?
    LT(level triggered)是缺省的工作方式,在這種做法中,內核告訴你一個文件描述符是否就緒了,然后你可以對這個就緒的fd進行IO操作。如果你不作任何操作,內核還是會繼續通知你的,所以,這種模式編程出錯誤可能性要小一點。傳統的select/poll都是這種模型的代表.
    ET (edge-triggered)是高速工作方式,在這種模式下,當描述符從未就緒變為就緒時,內核通過epoll告訴你。然后它會假設你知道文件描述符已經就緒,並且不會再為那個文件描述 符發送更多的就緒通知,直到你做了某些操作導致那個文件描述符不再為就緒狀態了。ET模式減少了epoll被重復觸發的次數,效率比LT高。

28.常見的HTTP狀態碼?
    1XX:通知。
    2XX:成功。
        200(“OK”):一切正常。
    3XX:重定向。
        301(“Moved Permanently”):當客戶端觸發的動作引起了資源URI的變化時發送此響應代碼。
        304(“Not Modified”):未修改。客戶端希望只返回在指定日期之后修改的資源
    4XX:客戶端錯誤。
        400(“Bad Request”):客戶端方面的問題。
        404(“Not Found”) :服務器端不知道客戶端要請求哪個資源。
        409(“Conflict”):當客戶端試圖執行一個”會導致一個或多個資源處於不一致狀態“的操作時,發送此響應代碼。
        410(“Gone”):服務器端知道客戶端所請求的資源曾經存在,但現在已經不存在了。
    5XX:服務端錯誤。
        500(“Internal Sever Error”):服務器執行響應過程中發生錯誤。
        501(“Not Implemented”):服務器不支持請求的功能,無法完成請求。

29.DNS的查詢方式?
    遞歸查詢:客戶機向dns服務器發送請求,DNS服務器會使用一個准確的查詢結果回復給客戶機,如果DNS服務器本地沒有儲存查詢的DNS信息,那么它會查詢其他的DNS服務器,並將查詢結果提交給客戶機。
    迭代查詢:客戶機向dns服務器發送請求,如果該服務器本地沒有儲存查詢的DNS信息,那么它會告訴客戶機另一台DNS服務器的地址,客戶機在向這台DNS服務器查詢DNS信息,依次循環直到返回結果。

30.HTTPS如何實現加密傳輸?
    使用SSL/TLS協議進行加密傳輸,讓客戶端拿到服務器的公鑰,然后客戶端隨機生成一個對稱加密的秘鑰,使用公鑰加密,傳輸給服務端,后續的所有信息都通過該對稱秘鑰進行加密解密,完成整個HTTPS的流程。

31.TTL指的是什么?
    TTL是IP數據包在計算機網絡中可以轉發的最大跳數。TTL字段由IP數據包的發送者設置,在IP數據包從源到目的的整個轉發路徑上。每經過一個路由器,路由器都會把該TTL的值減1,然后再將IP包轉發出去。如果在IP包到達目的IP之前,TTL減少為0,路由器將會丟棄收到的TTL=0的IP包並向IP包的發送者發送 ICMP消息。

32.traceroute的過程?
    首先,tracertout首先給目的主機發送一個TTL=1的UDP數據報,而經過一個路由器之后TTL減為0,路由器將這個數據報丟棄,然后發送一份主機不可達的ICMP報文給源主機,主機收到這個報文之后就獲得了第一個路由器的IP地址,然后繼續發送一個TTL=2的UDP數據報給目的地址,以此類推。當UDP到達目的主機之后,由於tracertout發送的是端口號很大的UDP數據報,所以到達目的主機的時候,目的主機只能發送一個目的端口不可達的ICMP報文給主機,這時主機收到報文之后就完成了tracertout操作。

33.什么是半連接狀態?
    三次握手中,主動發起握手的一方不發最后一次ACK,使得服務器端阻塞在SYN_RECV狀態。

34.什么是SYN攻擊?
    半連接攻擊(SYN攻擊):會耗盡服務器資源,使得真正的請求無法建立連接。

35.session和cookies的區別?
    1)cookie數據存放在客戶端,session數據放在服務器上。
    2)cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,考慮到安全應當使用session。
    3)session會在一定時間內保存在服務器上,當訪問增多,會比較占用你服務器的性能,考慮性能應當使用cookie。
    4)不同瀏覽器對cookie的數據大小限制不同,個數限制也不相同。
    5)可以考慮將登陸信息等重要信息存放為session,不重要的信息可以放在cookie中。

36.time_wait的原因是什么,如果有大量time_wait會發生什么,該怎么解決?
    原因:1)為實現TCP的可靠釋放。2)為使舊的數據包在網絡因過期而消失。
    當請求量比較大的時候,而且所有的請求都是短連接,就會產生大量的time_wait。如果有大量time_wait會使得資源(客戶端IP地址和端口)被浪費。
    服務器可以設置SO_REUSEADDR套接字選項來通知內核,如果端口忙,但TCP連接位於TIME_WAIT狀態時可以重用端口。在一個非常有用的場景就是,如果你的服務器程序停止后想立即重啟,而新的套接字依舊希望使用同一端口,此時SO_REUSEADDR選項就可以避免TIME_WAIT狀態。

37.close_wait 狀態出現在什么時候?
    出現大量close_wait的現象,主要原因是某種情況下對方關閉了socket連接,但是我方忙於讀或寫,沒有關閉連接。

38.什么情況下收到三個連續的重復確認?
    收到的包的編號亂序會導致收到三個連續的重復確認。

39.TCP報文接收端怎樣保證有序?
    TCP會將報文編號,如果發現接受的報文失序,那么接收方會將收到的報文暫時緩存,等到失序報文到達再將報文重新排列好。

40.TCP丟包怎么解決?從客戶端和服務器的角度來談。
    接收方若收到失序的報文,會對失序的報文發送重復確認。
    發送方發送報文段時,會創建一個特定報文段的重傳計時器,若在收到對特定報文段的確認之前計時器超時,則重傳該報文,並把計時器復位。當收到三次對報文的重復確認后,會執行快速重傳/快速恢復。

41.三次握手涉及到的api?
    客戶端函數調用順序:socket、connect、read/write、close
    服務端函數調用順序:socket、bind、listen、accept、read/write、close

42.TCP和UDP的應用場景?
    TCP適用於對效率要求相對較低,但對准確性要求相對較高的,或者是有連接的場景。
    UDP適用於對效率要求較高,對准確性要求相對較低的場景。

43.TCP流量控制和擁塞控制的區別?
    流量控制是為了解決發送方和接收方速度不同導致的數據丟失問題,當發送方發送的太快,接收方來不及接受就會導致數據丟失,是點對點通信量的控制。流量控制用滑動窗口的形式解決問題。
    擁塞控制就是防止過多的數據注入到網絡中,這樣可以使網絡中的路由器或鏈路不至於過載。擁塞控制所要做的都有一個前提,就是網絡能承受現有的網絡負荷。擁塞問題是一個全局性的問題,涉及到所有的主機、所有的路由器、以及與降低網絡傳輸性能有關的所有因素。通過維護一個擁塞窗口的狀態變量,擁塞窗口的大小取決於網絡的擁塞程度。注意考慮到接受方的接收能力,發送窗口可能小於擁塞窗口,兩者並不等價。

44.http無狀態怎么實現用戶登錄?
    通過cookie和session。

45.局域網內的一次訪問網站的流程?
    首先PC要做域名解析,會向DNS服務器發送請求
    而DNS服務器一般和PC不在同一子網里,所以要把數據包發給網關
    為了把數據包發給網關,要知道網關的MAC地址,所以向廣播ARP數據包
    得到了網關的MAC地址可將IP數據包發給網關,收到后可能會進行網絡地址轉換
    當數據包被轉發出去之后,就會通過IP路由協議轉發到DNS服務器
    DNS服務器會回復網站的IP地址
    之后就可以把HTTP請求封裝到TCP數據包中通過IP包進行交互

46.為什么揮手不可以三次?
    因為如果三次就意味着一方關閉連接,另一方也必須被迫關閉連接。但是有可能另一方還有數據未發送則無法實現。

47.http連接之后服務機內部都會干什么事?
    (1 建立連接——接受一個客戶端連接, 或者如果不希望與這個客戶端建立連接, 就將其關閉。
    (2 接收請求——從網絡中讀取一條 HTTP 請求報文。
    (3 處理請求——對請求報文進行解釋, 並采取行動。
    (4 訪問資源——訪問報文中指定的資源。
    (5 構建響應——創建帶有正確首部的 HTTP 響應報文。
    (6 發送響應——將響應回送給客戶端。
    (7 記錄事務處理過程——將與已完成事務有關的內容記錄在一個日志文件中。

48.說一下TCP粘包,拆包?
    TCP是以流動的方式傳輸數據,傳輸的最小單位為一個報文段。也就是說發送端發送的消息如果太長了就會被切割成若干個報文段,然后以報文段的形式發送,同時如果消息比較短那么發送方就會先將消息緩存在緩沖區,直到達到可以發送的長度之后再發送。那么如果發送方發送的兩條完整的消息在一個數據包中,被接收方接收之后沒辦法知道第一條消息從哪里結束,這種情況就叫做TCP粘包。同樣,如果第一條消息只有一部分在第一個數據包中,剩下的部分在第二個數據包中,那么這種情況就叫做TCP拆包。

49.粘包,拆包的解決辦法?
    1)使用帶消息頭的協議、消息頭存儲消息開始標識及消息長度信息,服務端獲取消息頭的時候解析出消息長度,然后向后讀取該長度的內容。
    2)設置定長消息,服務端每次讀取既定長度的內容作為一條完整消息。
    3)設置消息邊界,服務端從網絡流中按消息編輯分離出消息內容。

50.什么叫字節流,什么叫數據報?
    字節流就是散亂的一堆數據,接收方每次取多少由自己決定,而數據報指的是發送方發送多少接收方就要原封不動地接收多少。


免責聲明!

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



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