騰訊計算機網絡操作系統高頻面試題

1. TCP和UDP的區別

 

2. TCP如何保證可靠連接

 

3.  TIME-WAIT狀態

 

1. time_wait狀態如何產生?
由上面的變遷圖,首先調用close()發起主動關閉的一方,在發送最後一個ACK之後會進入time_wait的狀態,也就說該發送方會保持2MSL時間之後纔會回到初始狀態。MSL值得是數據包在網絡中的最大生存時間。產生這種結果使得這個TCP連接在2MSL連接等待期間,定義這個連接的四元組(客戶端IP地址和端口,服務端IP地址和端口號)不能被使用。

2.time_wait狀態產生的原因

1)爲實現TCP全雙工連接的可靠釋放

由TCP狀態變遷圖可知,假設發起主動關閉的一方(client)最後發送的ACK在網絡中丟失,由於TCP協議的重傳機制,執行被動關閉的一方(server)將會重發其FIN,在該FIN到達client之前,client必須維護這條連接狀態,也就說這條TCP連接所對應的資源(client方的local_ip,local_port)不能被立即釋放或重新分配,直到另一方重發的FIN達到之後,client重發ACK後,經過2MSL時間週期沒有再收到另一方的FIN之後,該TCP連接才能恢復初始的CLOSED狀態。如果主動關閉一方不維護這樣一個TIME_WAIT狀態,那麼當被動關閉一方重發的FIN到達時,主動關閉一方的TCP傳輸層會用RST包響應對方,這會被對方認爲是有錯誤發生,然而這事實上只是正常的關閉連接過程,並非異常。

2)爲使舊的數據包在網絡因過期而消失

爲說明這個問題,我們先假設TCP協議中不存在TIME_WAIT狀態的限制,再假設當前有一條TCP連接:(local_ip, local_port, remote_ip,remote_port),因某些原因,我們先關閉,接着很快以相同的四元組建立一條新連接。本文前面介紹過,TCP連接由四元組唯一標識,因此,在我們假設的情況中,TCP協議棧是無法區分前後兩條TCP連接的不同的,在它看來,這根本就是同一條連接,中間先釋放再建立的過程對其來說是“感知”不到的。這樣就可能發生這樣的情況:前一條TCP連接由local peer發送的數據到達remote peer後,會被該remot peer的TCP傳輸層當做當前TCP連接的正常數據接收並向上傳遞至應用層(而事實上,在我們假設的場景下,這些舊數據到達remote peer前,舊連接已斷開且一條由相同四元組構成的新TCP連接已建立,因此,這些舊數據是不應該被向上傳遞至應用層的),從而引起數據錯亂進而導致各種無法預知的詭異現象。作爲一種可靠的傳輸協議,TCP必須在協議層面考慮並避免這種情況的發生,這正是TIME_WAIT狀態存在的第2個原因。

3)總結
具體而言,local peer主動調用close後,此時的TCP連接進入TIME_WAIT狀態,處於該狀態下的TCP連接不能立即以同樣的四元組建立新連接,即發起active close的那方佔用的local port在TIME_WAIT期間不能再被重新分配。由於TIME_WAIT狀態持續時間爲2MSL,這樣保證了舊TCP連接雙工鏈路中的舊數據包均因過期(超過MSL)而消失,此後,就可以用相同的四元組建立一條新連接而不會發生前後兩次連接數據錯亂的情況。

3.time_wait狀態如何避免

首先服務器可以設置SO_REUSEADDR套接字選項來通知內核,如果端口忙,但TCP連接位於TIME_WAIT狀態時可以重用端口。在一個非常有用的場景就是,如果你的服務器程序停止後想立即重啓,而新的套接字依舊希望使用同一端口,此時SO_REUSEADDR選項就可以避免TIME_WAIT狀態。

 

 

4. 流量控制和擁塞控制的區別

流量控制:

是爲了控制發送方的發送速率,確保接收方來得及接收。

接收方發送的確認報文中窗口字段可以用來控制發送方窗口大小,從而影響發送方的發送速率。窗口大小設置爲0,則發送方無法發送數據。

擁塞控制(慢開始,擁塞避免、快重傳、快恢復):

如果網絡出現擁塞,分組將會丟失,那麼發送方將會重新傳輸數據,從而導致網絡擁塞程度更高。因此,需要控制發送發的速率,和流量控制很像,但是出發點不同,流量控制是爲了保證接收方來得及接收,而擁塞控制是爲了降低網絡擁塞程度。

 

32位的Linux中內存模型

 

32位的Linux中內存模型

程序內存在地址空間中的分佈情況稱爲內存模型(Memory Model)。
虛擬地址空間在32位環境下的大小爲 4GB。那麼,一個C語言程序的內存在整個地址空間中是如何分佈的呢?

內核空間和用戶空間

對於32位環境,理論上程序可以擁有 4GB 的虛擬地址空間,我們在C語言中使用到的變量、函數、字符串等都會對應內存中的一塊區域。但是,在這 4GB 的地址空間中,要拿出一部分給操作系統內核使用,應用程序無法直接訪問這一段內存,這一部分內存地址被稱爲內核空間(Kernel Space)。Linux 默認情況下會將高地址的 1GB 空間分配給內核。應用程序只能使用剩下的 2GB 或 3GB 的地址空間,稱爲用戶空間(User Space)。

用戶空間內存分佈

下圖是Linux下32位環境的一種經典內存模型:

 

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章