1. 程式人生 > >計算機網路常見面試題總結(二)

計算機網路常見面試題總結(二)

面試中網路方面的知識被問到的概率很大,尤其是網際網路公司,要熟悉osi七層模型,其中TCP/IP方面的知識尤其重要。如果自己平時有Socket程式設計的經驗對面試也是很有幫助的。網路方面有空可以看看TCP/IP詳解卷一和UNIX網路程式設計以下總結了一些面試中常問的問題:

1、TCP為什麼需要3次握手,4次斷開?

“三次握手”的目的是“為了防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤”。 client發出的第一個連線請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連線釋放以後的某個時間才到達server。本來這是一個早已失效的報文段。但server收到此失效的連線請求報文段後,就誤認為是client再次發出的一個新的連線請求。於是就向client發出確認報文段,同意建立連線。假設不採用“三次握手”,那麼只要server發出確認,新的連線就建立了。由於現在client並沒有發出建立連線的請求,因此不會理睬server的確認,也不會向server傳送資料。但server卻以為新的運輸連線已經建立,並一直等待client發來資料。這樣,server的很多資源就白白浪費掉了。採用“三次握手”的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連線。”。主要目的防止server端一直等待,浪費資源。

為什麼4次斷開?

因為TCP有個半關閉狀態,假設A.B要釋放連線,那麼A傳送一個釋放連線報文給BB收到後傳送確認,這個時候A不發資料,但是B如果發資料A還是要接受,這叫半關閉。然後B還要發給A連線釋放報文,然後A發確認,所以是4次。

在tcp連線握手時為何ACK是和SYN一起傳送,這裡ACK卻沒有和FIN一起傳送呢。原因是因為tcp是全雙工模式接收到FIN時意味將沒有資料再發來,但是還是可以繼續傳送資料。

2、TCP和UDP有什麼區別?

TCP是傳輸控制協議,提供的是面向連線、可靠的位元組流服務。通訊雙方彼此交換資料前,必須先通過三次握手協議建立連線,之後才能傳輸資料。TCP提供超時重傳,丟棄重複資料,檢驗資料,流量控制等功能,保證資料能從一端傳到另一端。UDP是使用者資料報協議,是一個簡單的面向無連線的協議。UDP不提供可靠的服務。在資料資料前不用建立連線故而傳輸速度很快。UDP主要使用者流媒體傳輸,IP電話等對資料可靠性要求不是很高的場合。

3、交換機與路由器有什麼區別?

①工作所處的OSI層次不一樣,交換機工作在OSI第二層資料鏈路層,路由器工作在OSI第三層網路層

②定址方式不同:交換機根據MAC地址定址,路由器根據IP地址定址

③轉發速不同:交換機的轉發速度快,路由器轉發速度相對較慢。

3、TCP/IP的流量控制?

利用滑動視窗實現流量控制,如果傳送方把資料傳送得過快,接收方可能會來不及接收,這就會造成資料的丟失。所謂流量控制就是讓傳送方的傳送速率不要太快,要讓接收方來得及接收。

 TCP為每一個連線設有一個持續計時器(persistence timer)。只要TCP連線的一方收到對方的零視窗通知,就啟動持續計時器。若持續計時器設定的時間到期,就傳送一個零視窗控測報文段(攜1位元組的資料),那麼收到這個報文段的一方就重新設定持續計時器。

4、TCP擁塞控制?

防止過多的資料注入到網路中,這樣可以使網路中的路由器或鏈路不致過載。擁塞控制所要做的都有一個前提:網路能夠承受現有的網路負荷。擁塞控制是一個全域性性的過程,涉及到所有的主機、路由器,以及與降低網路傳輸效能有關的所有因素。

 擁塞控制代價:需要獲得網路內部流量分佈的資訊。在實施擁塞控制之前,還需要在結點之間交換資訊和各種命令,以便選擇控制的策略和實施控制。這樣就產生了額外的開銷。擁塞控制還需要將一些資源分配給各個使用者單獨使用,使得網路資源不能更好地實現共享。

幾種擁塞控制方法:

慢開始(slow-start )、擁塞避免(congestion avoidance )、快重傳( fastretransmit )和快恢復( fastrecovery )。

慢開始和擁塞避免

傳送方維持一個擁塞視窗cwnd ( congestion window )的狀態變數。擁塞視窗的大小取決於網路的擁塞程度,並且動態地在變化。傳送方讓自己的傳送視窗等於擁塞視窗。
    傳送方控制擁塞視窗的原則是:只要網路沒有出現擁塞,擁塞視窗就再增大一些,以便把更多的分組傳送出去。但只要網路出現擁塞,擁塞視窗就減小一些,以減少注入到網路中的分組數。
    慢開始演算法:當主機開始傳送資料時,如果立即把大量資料位元組注入到網路,那麼就有可能引起網路擁塞,因為現在並不清楚網路的負荷情況。因此,較好的方法是先探測一下,即由小到大逐漸增大發送視窗,也就是說,由小到大逐漸增大擁塞視窗數值。通常在剛剛開始傳送報文段時,先把擁塞視窗 cwnd 設定為一個最大報文段MSS的數值。而在每收到一個對新的報文段的確認後,把擁塞視窗增加至多一個MSS的數值。用這樣的方法逐步增大發送方的擁塞視窗 cwnd ,可以使分組注入到網路的速率更加合理。

每經過一個傳輸輪次,擁塞視窗 cwnd 就加倍。一個傳輸輪次所經歷的時間其實就是往返時間RTT。不過“傳輸輪次”更加強調:把擁塞視窗cwnd所允許傳送的報文段都連續傳送出去,並收到了對已傳送的最後一個位元組的確認。
另,慢開始的“慢”並不是指cwnd的增長速率慢,而是指在TCP開始傳送報文段時先設定cwnd=1,使得傳送方在開始時只發送一個報文段(目的是試探一下網路的擁塞情況),然後再逐漸增大cwnd。
    為了防止擁塞視窗cwnd增長過大引起網路擁塞,還需要設定一個慢開始門限ssthresh狀態變數(如何設定ssthresh)。慢開始門限ssthresh的用法如下:
    當 cwnd < ssthresh 時,使用上述的慢開始演算法。
    當 cwnd > ssthresh 時,停止使用慢開始演算法而改用擁塞避免演算法。
    當 cwnd = ssthresh 時,既可使用慢開始演算法,也可使用擁塞控制避免演算法。
擁塞避免演算法:讓擁塞視窗cwnd緩慢地增大,即每經過一個往返時間RTT就把傳送方的擁塞視窗cwnd加1,而不是加倍。這樣擁塞視窗cwnd按線性規律緩慢增長,比慢開始演算法的擁塞視窗增長速率緩慢得多。
    無論在慢開始階段還是在擁塞避免階段,只要傳送方判斷網路出現擁塞(其根據就是沒有收到確認),就要把慢開始門限ssthresh設定為出現擁塞時的傳送方視窗值的一半(但不能小於2)。然後把擁塞視窗cwnd重新設定為1,執行慢開始演算法。這樣做的目的就是要迅速減少主機發送到網路中的分組數,使得發生擁塞的路由器有足夠時間把佇列中積壓的分組處理完畢。過程圖如下:


快速重傳:

那就是收到3個相同的ACK。TCP在收到亂序到達包時就會立即傳送ACK,TCP利用3個相同的ACK來判定資料包的丟失,此時進行快速重傳,快速重傳做的事情有:

1.     把ssthresh設定為cwnd的一半

2.     把cwnd再設定為ssthresh的值(具體實現有些為ssthresh+3)

3.重新進入擁塞避免階段。

快速恢復:

1.  當收到3個重複ACK時,把ssthresh設定為cwnd的一半,把cwnd設定為ssthresh的值加3,然後重傳丟失的報文段,加3的原因是因為收到3

2.  再收到重複的ACK時,擁塞視窗增加1。

3.  收到新的資料包的ACK時,把cwnd設定為第一步中的ssthresh的值。原因是因為該ACK確認了新的資料,說明從重複ACK時的資料都已收到,該恢復過程已經結束,可以回到恢復之前的狀態了,也即再次進入擁塞避免狀態。

5、ARP是地址解析協議,簡單語言解釋一下工作原理。

(1)首先,每個主機都會在自己的ARP緩衝區中建立一個ARP列表,以表示IP地址和MAC地址之間的對應關係。

(2)當源主機要傳送資料時,首先檢查ARP列表中是否有對應IP地址的目的主機的MAC地址,如果有,則直接傳送資料,如果沒有,就向本網段的所有主機發送ARP資料包,該資料包包括的內容有:源主機IP地址,源主機MAC地址,目的主機的IP地址。

(3)當本網路的所有主機收到該ARP資料包時,首先檢查資料包中的IP地址是否是自己的IP地址,如果不是,則忽略該資料包,如果是,則首先從資料包中取出源主機的IP和MAC地址寫入到ARP列表中,如果已經存在,則覆蓋,然後將自己的MAC地址寫入ARP響應包中,告訴源主機自己是它想要找的MAC地址。

(4)源主機收到ARP響應包後。將目的主機的IP和MAC地址寫入ARP列表,並利用此資訊傳送資料。如果源主機一直沒有收到ARP響應資料包,表示ARP查詢失敗。

廣播發送ARP請求,單播發送ARP響應。

6、ICMP協議?

ICMP是InternetControl Message Protocol,因特網控制報文協議。它是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制訊息。控制訊息是指網路通不通、主機是否可達、路由器是否可用等網路本身的訊息。這些控制訊息雖然並不傳輸使用者資料,但是對於使用者資料的傳遞起著重要的作用。ICMP報文有兩種:差錯報告報文和詢問報文。

7、DHCP協議?

動態主機配置協議,是一種讓系統得以連線到網路上,並獲取所需要的配置引數手段。通常被應用在大型的區域網絡環境中,主要作用是集中的管理、分配IP地址,使網路環境中的主機動態的獲得IP地址、Gateway地址、DNS伺服器地址等資訊,並能夠提升地址的使用率。

8網橋的作用?

網橋是一個區域網與另一個區域網之間建立連線的橋樑

9、資料鏈路層協議可能提供的服務?

成幀、鏈路訪問、透明傳輸、可靠交付、流量控制、差錯檢測、差錯糾正、半雙工和全雙工。最重要的是幀定界(成幀)、透明傳輸以及差錯檢測。

10、網路介面卡(網絡卡)的功能?

1)進行序列/並行轉換。

2)對資料進行快取。

3)在計算機的作業系統安裝裝置驅動程式。

4)實現乙太網協議。

11、私有(保留)地址?

A類:10.0.0.0——10.255.255.255

       B類:172.16.0.0——172.31.255.255

       C類:192.168.0.0——192.168.255.255

12、TTL是什麼?作用是什麼?哪些工具會用到它(ping traceroute ifconfig  netstat)?

TTL是指生存時間,簡單來說,它表示了資料包在網路中的時間,經過一個路由器後TTL就減一,這樣TTL最終會減為0,當TTL0時,則將資料包丟棄,這樣也就是因為兩個路由器之間可能形成環,如果沒有TTL的限制,則資料包將會在這個環上一直死轉,由於有了TTL,最終TTL0後,則將資料包丟棄。ping傳送資料包裡面有TTL,但是並非是必須的,即是沒有TTL也是能正常工作的,traceroute正是因為有了TTL才能正常工作,ifconfig是用來配置網絡卡資訊的,不需要TTLnetstat是用來顯示路由表的,也是不需要TTL的。

13、路由表是做什麼用的?在Linux環境中怎麼配置一條預設路由?

路由表是用來決定如何將一個數據包從一個子網傳送到另一個子網的,換句話說就是用來決定從一個網絡卡接收到的包應該送到哪一個網絡卡上去。路由表的每一行至少有目標網路號、子網掩碼、到這個子網應該使用的網絡卡這三條資訊。當路由器從一個網絡卡接收到一個包時,它掃描路由表的每一行,用裡面的子網掩碼與資料包中的目標IP地址做邏輯與運算(&)找出目標網路號。如果得出的結果網路號與這一行的網路號相同,就將這條路由表六下來作為備用路由。如果已經有備用路由了,就載這兩條路由裡將網路號最長的留下來,另一條丟掉(這是用無分類編址CIDR的情況才是匹配網路號最長的,其他的情況是找到第一條匹配的行時就可以進行轉發了)。如此接著掃描下一行直到結束。如果掃描結束仍沒有找到任何路由,就用預設路由。確定路由後,直接將資料包送到對應的網絡卡上去。在具體的實現中,路由表可能包含更多的資訊為選路由演算法的細節所用。

linux上可以用“route add default gw<預設路由器 IP>”命令配置一條預設路由。

14、RARP?

逆地址解析協議,作用是完成硬體地址到IP地址的對映,主要用於無盤工作站,因為給無盤工作站配置的IP地址不能儲存。

15、運輸層協議與網路層協議的區別?

網路層協議負責的是提供主機間的邏輯通訊

       運輸層協議負責的是提供程序間的邏輯通訊

16、說說靜態路由和動態路由有什麼區別。

靜態路由是由管理員手工配置的,適合比較簡單的網路或需要做路由特殊控制。而動態路由則是由動態路由協議自動維護的,不需人工干預,適合比較複雜大型的網路。

路由器能夠自動地建立自己的路由表,並且能夠根據實際實際情況的變化適時地進行調整。動態路由機制的運作依賴路由器的兩個基本功能:對路由表的維護;路由器之間適時的路由資訊交換。

17、HTTP的長連線和短連線?

HTTP的長連線和短連線本質上是TCP長連線和短連線。HTTP屬於應用層協議.

短連線:瀏覽器和伺服器每進行一次HTTP操作,就建立一次連線,但任務結束就中斷連線。

長連線:當一個網頁開啟完成後,客戶端和伺服器之間用於傳輸HTTP資料的 TCP連線不會關閉,如果客戶端再次訪問這個伺服器上的網頁,會繼續使用這一條已經建立的連線。Keep-Alive不會永久保持連線,它有一個保持時間,可以在不同的伺服器軟體(如Apache)中設定這個時間。實現長連線要客戶端和服務端都支援長連線。

TCP短連線: clientserver發起連線請求,server接到請求,然後雙方建立連線。clientserver傳送訊息,server迴應client,然後一次讀寫就完成了,這時候雙方任何一個都可以發起close操作,不過一般都是client先發起 close操作.短連線一般只會在 client/server間傳遞一次讀寫操作

TCP長連線: clientserver發起連線,server接受client連線,雙方建立連線。Clientserver完成一次讀寫之後,它們之間的連線並不會主動關閉,後續的讀寫操作會繼續使用這個連線。

18IO中同步與非同步,阻塞與非阻塞區別

同步和非同步關注的是訊息通訊機制(synchronous communication/asynchronous communication)
所謂同步,就是在發出一個*呼叫*時,在沒有得到結果之前,該*呼叫*就不返回。但是一旦呼叫返回,就得到返回值了。換句話說,就是由*呼叫者*主動等待這個*呼叫*的結果。非同步則是相反,*呼叫*在發出之後,這個呼叫就直接返回了,所以沒有返回結果。換句話說,當一個非同步過程呼叫發出後,呼叫者不會立刻得到結果。而是在*呼叫*發出後,*被呼叫者*通過狀態、通知來通知呼叫者,或通過回撥函式處理這個呼叫。

阻塞和非阻塞關注的是程式在等待呼叫結果(訊息,返回值)時的狀態.

阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。函式只有在得到結果之後才會返回。

非阻塞:不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回。

19ip地址分段

A類網路的IP地址範圍為1.0.0.1127.255.255.254
B
類網路的IP地址範圍為:128.1.0.1191.255.255.254
C
類網路的IP地址範圍為:192.0.1.1223.255.255.254、

20為什麼TIME_WAIT狀態還需要等2*MSLMax SegmentLifetime,最大分段生存期)秒之後才能返回到CLOSED狀態呢?

因為雖然雙方都同意關閉連線了,而且握手的4個報文也都發送完畢,按理可以直接回到CLOSED狀態(就好比從SYN_SENT狀態到ESTABLISH狀態那樣),但是我們必須假想網路是不可靠的,你無法保證你最後傳送的ACK報文一定會被對方收到,就是說對方處於LAST_ACK狀態下的SOCKET可能會因為超時未收到ACK報文,而重發FIN報文,所以這個TIME_WAIT狀態的作用就是用來重發可能丟失的ACK報文