1. 程式人生 > >計算機網路面試必備(二)

計算機網路面試必備(二)

TCP3次握手,4次關閉

TCP是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立一個連線。

下面是一些名詞解釋(PS:ACK、SYN和FIN等大寫單詞表示標誌位,取值只能是0或1ack、seq小寫的單詞表示序號):

位碼即TCP標誌位,有6種標示:SYN(synchronous建立聯機)、ACK(acknowledgement 確認)、PSH(push傳送)、FIN(finish結束)、RST(reset重置)、URG(urgent緊急)。

    同步SYN:連線建立時用於同步序號。當SYN=1,ACK=0時表示:這是一個連線請求報文段。若同意連線,則在響應報文段中使得SYN=1,ACK=1。因此,SYN=1表示這是一個連線請求,或連線接受報文。SYN這個標誌位只有在TCP建產連線時才會被置1,握手完成後SYN標誌位被置0。

    ACK:佔1位,僅當ACK=1時,確認號欄位才有效。ACK=0時,確認號無效 。

    終止FIN:用來釋放一個連線。FIN=1表示:此報文段的傳送方的資料已經發送完畢,並要求釋放運輸連線 。

序號Sequence number(順序號碼)/Seq序號,佔32位,用來標識從TCP源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記。

確認號Acknowledge number,ack序號,佔32位,只有ACK標誌位為1時,確認號欄位才有效,ack=Seq+1

(1)為什麼要等待2MSL呢?    

     MSL即Maximum Segment Lifetime,也就是最大報文生存時間,他是任何報文在網路上存在的最長時間,超過這個時間報文將被丟棄。引用《TCP/IP詳解》中的話:“它(MSL)是任何報文段被丟棄前在網路內的最長時間”。RFC 793中規定MSL為2分鐘,實際應用中常用的是30秒,1分鐘和2分鐘等。

(2)為什麼TCP釋放連線需要四次?    

   TCP建立連線要進行三次握手,而斷開連線要進行四次。這是由於TCP的半關閉造成的。因為TCP連線是全雙工的(即資料可在兩個方向上同時傳遞)所以進行關閉時每個方向上都要單獨進行關閉。這個單方向的關閉就叫半關閉。當一方完成它的資料傳送任務,就傳送一個FIN來向另一方通告將要終止這個方向的連線。

丟包、粘包

    UDP丟包是因為資料包在傳送過程中丟失了,而TCP是基於流式的傳送,並且存在丟包重發機制,TCP是可靠連線而UDP是不可靠的。關於TCP的粘包,正是由於TCP是流式傳送的,也就是連線建立後可以一直不停的傳送,並沒有明確的邊界定義,而你用

UDP傳送的時候,是可以按照一個個資料包去傳送的,一個數據包就是一個明確的邊界。

    所以丟包是針對UDP,粘包是針對TCP。

    粘包,是指傳送端傳送的兩個報文,在接收端被拼在一起。TCP會開闢一個緩衝區,傳送端往其中寫入資料,每過一段時間就傳送出去,然後接收端接收到這些資料 。由於TCP是面向流的協議,報文與報文之間是沒有分界符號的。在接收端,所有的資料都邏輯上拼在一起給你。舉例來說,你分10次傳送10個長度為10的報文,在接收端,你可能只收到一個長度為100的報文,而不會收到10個訊息。為了解決這個問題,你必須在接收端有能力把這些報文分隔開來。如果訊息長度總是固定的,這就比較容易,只要按長度取出即可。如果長度不固定,一般有兩種方法解決:     ●使用特徵位元組。例如:如果是聊天程式,傳送的是普通文字,一些字元是絕對不可能出現在正文中的,你可以使用這些字元做分隔符隔離不同訊息。我們可以使用'\0'做分隔,一般對於全文字傳輸是比較安全的。     ●在傳送方傳送正文前,先發送一個長度。例如你要傳送2345位元組的內容,你可以先發送一個2位元組的長度給對方,然後再發正文。接收放只要收到這個長度資訊,就可以正確的分包。需要注意的,到底用多少位元組來發送長度是應該預先約定的,一般2位元組就足夠,不過你約定4位元組也是可以的。還要注意的是,如果接收一次報文後,解包完畢還剩下一部分內容,這些內容應該留給下次報文分包使用,而不能扔掉。

     注:粘包的情況是無法絕對避免的,因為網路環境是很複雜的,依賴傳送和接收緩衝區的控制是不能保證100%的,只要在傳送的資料中說明資料的寬度,隨後在接收部分按照這個寬度拆開就OK了。寬度全都是統一的已知寬度的情況下拆開更加容易,連在傳送端填入寬度資料都可以省去了。

UDP是無連線的,面向訊息的資料傳輸協議,與TCP相比,有兩個致命的缺點,一是資料包容易丟失,二是資料包無序

丟包具體問題分析   

  ● 傳送頻率過高導致丟包:   

       很多人會不理解發送速度過快為什麼會產生丟包,原因就是UDP的SendTo不會造成執行緒阻塞,也就是說,UDP的SentTo不會像TCP中的SendTo那樣,直到資料完全傳送才會return回撥用函式,它不保證當執行下一條語句時資料是否被髮送。(SendTo方法是非同步的)這樣,如果要傳送的資料過多或者過大,那麼在緩衝區滿的那個瞬間要傳送的報文就很有可能被丟失。至於對”過快”的解釋,作者這樣說:”A few packets a second are not an issue; hundreds or thousands may be an issue.”(一秒鐘幾個資料包不算什麼,但是一秒鐘成百上千的資料包就不好辦了)。 要解決接收方丟包的問題很簡單,首先要保證程式執行後馬上開始監聽(如果資料包不確定什麼時候發過來的話),其次,要在收到一個數據包後最短的時間內重新回到監聽狀態,其間要儘量避免複雜的操作(比較好的解決辦法是使用多執行緒回撥機制)。   

  ● 報文過大丟包 :  

     至於報文過大的問題,可以通過控制報文大小來解決,使得每個報文的長度小於MTU。乙太網的MTU通常是1500 bytes,其他一些諸如撥號連線的網路MTU值為1280 bytes,如果使用speaking這樣很難得到MTU的網路,那麼最好將報文長度控制在1280 bytes以下。   

   ● 傳送方丟包 :  

    內部緩衝區(internal buffers)已滿,並且傳送速度過快(即傳送兩個報文之間的間隔過短);  接收方丟包:Socket未開始監聽;  雖然UDP的報文長度最大可以達到64 kb,但是當報文過大時,穩定性會大大減弱。這是因為當報文過大時會被分割,使得每個分割塊(翻譯可能有誤差,原文是fragmentation)的長度小於MTU,然後分別傳送,並在接收方重新組合(reassemble),但是如果其中一個報文丟失,那麼其他已收到的報文都無法返回給程式,也就無法得到完整的資料了。 

流量控制、擁塞控制

流量控制和擁塞控制是有區別的:

流量控制——控制雙方的傳送速率在雙方可以接受的範圍內。

擁塞控制——描述的是整個網路的狀態,通過是否重傳以及傳輸速率的大小去感知網路的擁塞情況,進而進行調整,達到恢復網路的目的。(感知整體網路,通過控制每一個個體去fix網路狀況)。

子網劃分

IPV4和IPV6

    如今,IPv4的地址遠遠不能滿足人們的需求。隨著移動網際網路的不斷髮展,人們可能會有好幾個移動終端,每一個終端都需要一個地址。網際網路的飛快發展對IP地址的資源需求更加強烈。加上逐漸成熟的雲端計算,也加劇了IP地址匱乏資源短缺的壓力。

     IPv6的地址分配一開始就遵循聚類(Aggregation)的原則,這使得路由器能在路由表中用一條記錄(Entry)表示一片子網,大大減小了路由器中路由表的長度,提高了路由器轉發資料包的速度。 IPv6最大的優點是增大了地址空間。中國學生人數較多,幾乎達到了美國的總人口數,有句笑話是“中國一打鈴,全美國都上課”,因此,教育網的發展是非常關鍵的。

    IPv6的制約因素: 一是採用私有地址轉換,這是解決IP地址短缺的權宜之計,不利於保障網路服務質量和網路安全,影響我國網際網路長遠發展;二是缺少IPv6資訊資源;三是網路安全防護現狀,防火牆管理控制,制約了IPv6發展。重要的還有:IPv4和IPv6理論上不相容,所以互聯互通技術有待發展。

    IPV4向IPV6的過渡主要有兩種方法: ( 1)雙棧技術:主機或路由器同時裝有IPV4和IPV6兩個協議棧,因此主機既能和IPV4通 信,  也能和IPV6通訊。 (2)隧道技術:在IPV6分組進入IPV4網路時,將IPV6分組封裝成IPV4分組; 當 封裝成IPV4分組 離開IPV4網路時,再裝資料部分(IPV6部分)轉發給目的節點。