1. 程式人生 > >TCP 傳輸層面試中常問的問題彙總(你所不知道的傳輸層)

TCP 傳輸層面試中常問的問題彙總(你所不知道的傳輸層)

1. 傳輸層的主要功能是什麼?

2. 傳輸層如何區分不同應用程式的資料流?
3. 傳輸層有哪些協議?
4. 什麼是UDP協議?
5. 為什麼有了UDP,還需要TCP?
6. 什麼是TCP協議?
7. 怎麼理解協議和程式?
8. TCP是否真的有連結?
9. 連結是如何建立的(邏輯上)?
10. 所謂的建立TCP連結開銷很大,具體是指什麼?
11. 三次握手的目的是什麼?
12. TCP如何提供可靠性?
13. 什麼是預期確認?什麼是肯定確認與重新傳輸?哪些情況會重傳?
14. TCP中,序列號和應答號有哪些作用?
15. TCP連結中,網路失敗,是怎麼判斷的?
16. 為什麼需要視窗技術?
17. 如何實現流量控制?
18. UDP的開銷很小,具體是指什麼?

19. UDP資料包、TCP資料包大小如何確認?

20. UDP適合哪些環境?TCP適合哪些環境?

一、傳輸層的主要功能是什麼?

分割並重新組裝上層提供的資料流,為資料流提供端到端的傳輸服務。

二、傳輸層如何區分不同應用程式的資料流?

因為,對應傳輸層而言,它只需要知道目標主機上的哪個服務程式來響應這個程式,而不需要知道這個服務程式是幹什麼的。因此,我們只需要能夠抽象的表示出來這些應用程式和服務程式即可。我們使用埠號來抽象標識每個網路程式。

傳輸層的TCP和UDP可以接收來自多個應用程式的資料流,用埠號標識他們,然後把他們送給Internet層處理;

同時TCP和UDP接收來自Internet層的資料包,用埠號區分他們,然後交給不同的應用程式。



因此:在同一IP地址(同一個目標主機)上不同的埠號是兩個不同的連結。IP地址和埠號用來唯一的確定網路上資料的目的地。

三、傳輸層有哪些協議?

傳輸層的兩大協議:TCP(傳輸控制協議)UDP(使用者資料包協議)

TCP是一個可靠的面向連結的協議,UDP是不可靠的或者說無連線的協議。

可以用打電話和發簡訊來說明這種關係:

UDP就好似發簡訊,只管發出去,至於對方是不是空號(網路不可到達)能不能收到(丟包)等並不關心。

TCP好像打電話,雙方要通話,首先,要確定對方不是開機(網路可以到達),然後要確定是不是沒有訊號(),然後還需要對方接聽(通訊連結)。

四、什麼是UDP協議?

UDP資料包結構如下圖所示

源埠(16)

目標埠(16)

報文長度(16)

校驗和(16)

資料(可變)

UDP為應用程式提供的是一種不可靠的、無連線的分組交付,因此,UDP報文可能會出現丟失、亂序、重複、延時等問題。因為它不提供可靠性,它的開銷很小。開銷很小具體指什麼?下文揭祕)

五、為什麼有了UDP,還需要TCP?

問題4中已經說到,UDP為應用程式提供的是一種無連線、不可靠的分組交付。當網路硬體失效或者負擔太重時,資料包可能就會產生丟失、重複、延時、亂序的現象。這些都會導致我們的通訊不正常。如果讓應用程式來擔負差錯控制的工作,無疑將給程式設計師帶來許多複雜的工作,於是,我們使用獨立的通訊協議來保證通訊的可靠性是非常必要的。

六、什麼是TCP協議?

 傳輸控制協議TCP是一個面向連結的、可靠的通訊協議。


1. 在開始傳輸前,需要進行三次握手建立連結
2. 可靠性:在傳輸過程中,通訊雙方的協議模組繼續進行通訊
3. 通訊結束後,通訊雙方都會使用改進的三次握手來關閉連結


TCP資料包結構如下圖

源埠(16)

目標埠(16)

序號(32)

應答號(32)

頭長度(4)

保留(6)

編碼位(6)

視窗(16)

校驗和(16)

緊急(16)

可選項(如果有,032)

資料(可變)

七、怎麼理解協議和程式?

如同我們自定義的應用層協議一樣:協議只是給出了一組規範,規定我們應該怎麼樣(按什麼規則)儲存資料。

在計算機間傳輸的永遠都是二進位制位元組碼(對於傳輸層,可以理解為傳輸的始終是下層的IP資料包),計算機中的程式通過對這些位元組碼進行邏輯分析、判斷,來控制程式完成差錯控制等功能。
至於解析這些位元組碼的程式,則可以有不同的實現,只要我們按照規則來解析,並作出相應的控制,我們大可以自己寫個程式是實現相應功能。

知道了這些後,顯然,我們也可以使用前面說的Jpcap,來自己實現一個基於Java的TCP或者UDP協議。可以參考Linux下的Tcp原始碼。

/net/ipv4/udp.c
/net/ipv4/datagram.c 
/net/ipv4/tcp_input.c 
/net/ipv4//tcp_output.c 
/net/ipv4/tcp.c  

八、TCP是否真的有連結?

我們都知道,TCP通過完成三次握手來建立連結的,但是這種連線是面向虛電路的,是物理上不存在的只是雙方的TCP程式,邏輯上的認為建立了這樣的連結。 

九、連結是如何建立的(邏輯上)?

        假設:當我們在主機A上啟動一個程式,通過TCP去連結主機B上的9091埠。


整個過程是怎麼樣的呢?邏輯上我們可以這麼理解建立連結的過程:

1.SYN:seq=X;

1.1 A的TCP程式,為這個連結分配一個埠(設為9090)。

1.2 同時邏輯上的將TCP連線的狀態設定為:正在連線。(通過在連結狀態表中新增一條記錄,記錄中狀態為:正在連線)

TCP程式中, 應該有張表來保持連結的狀態,其中每個狀態應該有:

本機地址(IP加port)、對方地址、連結狀態

1.3 同時,隨機生成一個初始序列號X,生成一個TCP包,將初始化序列號X設定為TCP中的序列號,傳送給主機B。

 2.SYN:seq=Y ACK:ack=X+1;

2.1 B上TCP程式收到該資料包,查詢9091埠狀態,如果可以連結。

2.2 同樣的,在邏輯上的將TCP連線的狀態設定為:正在連線

2.3 同時,隨機生成一個初始化序列號Y,根據接收的序列號X,生成應答號X+1,生成一個TCP包,將序列號和應答號分別設定到TCP包頭中,將TCP資料包發給主機A。

3.SYN:seq=X+1 ACK:ack=Y+1.

3.1  A上的TCP程式接收到資料包,查詢9090埠狀態。

3.2 根據收到的SYN:seq=Y;ACK:ack=X+1; 封裝一個TCP包 SYN:seq=x+1;ACK:ack=Y+1;傳送給主機B。同時,TCP程式將連結狀態表中該條記錄狀態設定為已連線。

3.3 主機B收到資料包,TCP程式將連結狀態表中該條記錄狀態設定為已連線。

至此,一個TCP連結建立(三次握手)完成。

我們可以看到:

第一:傳送的都是IP資料包,其實只是將收到的資料包交給TCP程式處理。

第二:連結狀態,只是TCP程式中的一個邏輯狀態。

十、所謂的建立TCP連結開銷很大,具體是指什麼?

從九中,很容易看出。要簡歷TCP連結,必須進行三次IP資料包的成功傳輸。

十一、三次握手的目的是什麼?

TCP是面向連結的,在面向連結的環境中,開始傳輸資料之前,在兩個中端之間必須先建立一個連結。建立連結的過程可以確保通訊雙方在傳送應用程式資料包之前,都已經準備好了傳送和接收資料。並且使通訊雙方統一了初始化序列號。

十二、TCP如何提供可靠性?

在傳輸過程中,通訊雙方的協議模組繼續進行通訊,從而確保了傳輸的可靠性。
針對亂序:在通過三次握手進行連結時,序列號被初始化。在傳輸過程中,TCP繼續使用這個序列號來標記傳送的每一個數據段,沒傳送一個數據段,序列號加一。接收方依據序列號重灌收到的資料段。
針對丟包:在傳輸過程中,接收方收到一個數據段後,會用ACK應答碼向傳送端回覆一個IP包進行應答,確認號ACK用來告訴傳送端哪些資料包已經成功接收,傳送方對未被應答的報文段提供重傳
針對重複:接收端收到資料段後,檢視序列號,如果已經成功接收改資料包,則丟棄後面這個資料段。
針對延時:延時造成的第一個問題,就是資料包達到接收端時亂序。
當延時嚴重時,接收端一直未收到資料段,則不會回覆ACK,傳送端認為丟包,重發。

十三、什麼是預期確認?什麼是肯定確認與重新傳輸?哪些情況會重傳?

1.確認號ACK會告訴傳送端哪些資料段已經成功接收,並且確認號會向傳送端指出接收端希望收到的下一個序列號。即,確實號ACK為上個數據序列號+1,這種機制稱為預期確認


2.為了提高效率,我們在傳送端,將資料段儲存在緩衝區中,直道傳送端收到來自接收端的確認號。這種機制被稱為“肯定確認與重新傳輸”。


3.當傳送端在給定時間間隔內收不到那個資料段的應答時,傳送端就會重傳那個資料段
情況1:網路延時/環路,資料段丟失
情況2:網路延時,資料段推遲到達
情況3:資料段成功到達,應答因為1.2不能達到。

 十四、TCP中,序列號和應答號有哪些作用?

從以上10,11,12中,很明顯的可以看到

1、依靠序列號重組資料段

2、依靠資料包消除網路中的重複包

3、依靠序列號和應答號進行差錯重傳,提高了TCP的可靠性

十六、為什麼需要視窗技術?

前面我們已經說了,TCP的可靠性,是通過預期確認來實現的。即傳送方傳送一個數據段後,需要得到對方的確認後,才會傳送下一個資料段。
因此,假設一個數據段大小為64KB(IP包最大值),一次傳送和確認需要的時間為500MS,則,1S內,只能傳送128KB的資料,如果頻寬為1M,顯然很浪費頻寬。為了充分利用頻寬,我們使用視窗技術滑動視窗允許傳送方在收到接收方的確認之前傳送多個數據段。(視窗大小決定了在收到確認前可以傳送的資料段數量)

十七:如何實現流量控制?

視窗數決定了當前傳輸的最大流量。當我們在傳輸過程中,通訊雙方可以根據網路條件動態協商視窗大小,調整視窗大小時,即可實現流量控制。(在TCP的每個確認中,除了ACK外,還包括一個視窗通知)

十八、UDP的開銷很小,具體是指什麼?

1.因為UDP是無連線的。在傳輸資料之前,不需要進行復雜的三次握手來建立連線。
2.在傳輸資料時沒有協議間通訊流量(確認訊號),也不需要浪費不必要的處理時間(接收確認訊號再發一下)。
3;傳輸結束後,也不用再用改進的三次握手來埠連線

十九、UDP資料包、TCP資料包大小如何確認?

1、無論TCP還是UDP資料包,都需要交給Internet層封裝為IP包,而一個IP包,包頭中的長度位為16位,所以IP包最大為2的16方,即65535(64KB還需要減去各種包頭長度)。

2、TCP因為面向流,且可以憑藉序列號對大檔案進行分段和重組,因此,TCP可以用來傳輸較大的檔案。而UDP,如果要傳輸大於64KB的資料,則需要自己在應用層進行差錯控制

3、為了提高傳輸效率和減少網路通訊量(協議間的通訊),TCP也會一次傳輸足夠多的資料。

4、因為MTU的存在,TCP包和UDP包不是越大越好。(在路由中分包,在接收端重組,加大路由與接收端負擔,增大丟包概率。分組丟失,整個資料包重傳。)

二十:UDP適用哪些環境?TCP適用哪些環境?

適合UDP的環境:

1、在高效可靠的網路環境中(不需要考慮網路不好導致的丟包、亂序、延時、重複等問題),因為UDP是無連線的服務,不用消耗不必要的網路資源(TCP中的協議間通訊)和處理時間(預期確認需要的時間),從而效率要高的多。
2、在輕權通訊中,當需要傳輸的資料量很小(可以裝在一個IP資料包內)時。如果我們使用TCP協議,那麼,先建立連線,一共需要傳送3個IP資料包,然後資料傳輸,1個IP資料包,產生一個確認訊號的IP包,然後關閉連線,需要傳輸5個IP資料包。使用TCP協議IP包的利用率為1/10。而使用UDP,只需要傳送一個IP資料包。哪怕丟包(服務不成功),也可重新申請服務(重傳)。

注:而且無論UDP還是TCP,傳輸的都是IP資料包。當網路環境不好導致丟包時,無論TCP還是UDP都會丟包,這是沒有區別的。(如果考慮傳送丟包,那麼TCP效率更低),只是使用TCP,當連線建立成功後,TCP程式會進行可靠性控制。

UDP很適合這種客戶機向伺服器傳送簡單服務請求的環境。此類應用層協議包括TFTP , SNMP , DNS ,DHCP等。
3、在對實時性要求很強的通訊中:在諸如實時視訊直播等對實時性要求很高的環境中,從而允許一定量的丟包的情況下(直播比賽,前面丟失的包,重傳出來已經意義不大了),UDP更適合。(可以根據具體需要通過應用層協議提供可靠性,不用像TCP那麼嚴格。)

適合TCP協議的環境:

當網路硬體失效或者負擔太重時,資料包可能就會產生丟失、重複、延時、亂序的現象。這些都會導致我們的通訊不正常的時候。如果讓應用程式來擔負差錯控制的工作,無疑將給程式設計師帶來許多複雜的工作,於是,我們使用獨立的通訊協議來保證通訊的可靠性是非常必要的。 



相關推薦

TCP 傳輸面試的問題彙總知道傳輸

1. 傳輸層的主要功能是什麼? 2. 傳輸層如何區分不同應用程式的資料流?3. 傳輸層有哪些協議?4. 什麼是UDP協議?5. 為什麼有了UDP,還需要TCP?6. 什麼是TCP協議?7. 怎麼理解協議和程式?8. TCP是否真的有連結?9. 連結是如何建立的(邏輯上)?1

Java面試的Spring方面問題

fff 時間 需要 mail 業務邏輯 有意 服務器 全局 文件 Spring Framework 現在幾乎已成為 Java Web 開發的標配框架。那麽,作為 Java 程序員,你對 Spring 的主要技術點又掌握了多少呢?不妨用本文的問題來檢測一下。 1、一般問題 1

面試的List去重問題,都答對了嗎?

面試中經常被問到的list如何去重,用來考察你對list資料結構,以及相關方法的掌握,體現你的java基礎學的是否牢固。 我們大家都知道,set集合的特點就是沒有重複的元素。如果集合中的資料型別是基本資料型別,可以直接將list集合轉換成set,就會自動去除重複的元素,這個就相對比較簡單。

面試的HTTP/1.0狀態碼

狀態碼錶 HTTP/1.0中,狀態碼200 301 304 403 404 500的含義? 200 OK 伺服器成功處理了請求 204 請求被受理但沒有資源可以返回 301 永久性重定向,請求的URL已移走 302 臨時重定向 304 表示未修改,客戶

Vue 面試知識點整理

看看面試題,只是為了查漏補缺,看看自己那些方面還不懂。切記不要以為背了面試題,就萬事大吉了,最好是理解背後的原理,這樣面試的時候才能侃侃而談。不然,稍微有水平的面試官一看就能看出,是否有真才實學還是剛好背中了這道面試題。 (都是一些基礎的vue面試題,大神不用浪費時間往下看)

Java面試的資料庫方面問題

MySQL 為什麼用自增列作為主鍵 如果我們定義了主鍵(PRIMARY KEY),那麼InnoDB會選擇主鍵作為聚集索引、如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作為主鍵索引、如果也沒有這樣的唯一索引,則InnoDB會選擇內

php高階研發或架構師必瞭解---很多問題面試到!

最近接連面試了幾家公司,有些重要問題記錄一下,督促自己學習提高,同時希望給朋友們一些幫助。 內容很多,一點點完善,一步步學習。。 有些是面試被問,有些是招聘要求,有些是自己整理加的。一、MySQL相關知識     1、 mysql優化方式             MYSQL

面試到的資料庫的一些問題

1 簡述檢視的意義 參考答案 檢視的意義在於兩個方面: 1)簡化複雜查詢。如果需要經常執行某項複雜查詢,可以基於這個複雜查詢建立檢視,此後查詢此檢視即可。 2)限制資料訪問。檢視本質上就是一條SELECT語句,所以當訪問檢視時,只能訪問到所對應的SELECT語句中涉及到的列,對基表中的其它列起到安全和保密的

前端面試的問題

play section 深克隆 數據類型 use count () group flex布局   1、event loop是什麽?    主線程和任務隊    2、HTTP協議與狀態碼,HTTP2.0等,狀態碼301、302等    3、原生實現promise    //

Java開發面試的資料庫方面問題

mysql為什麼用自增列作為主鍵如果我們定義了主鍵(PRIMARY KEY),那麼InnoDB會選擇主鍵作為聚集索引、如果沒有顯式定義主鍵,則InnoDB會選擇第一個不包含有NULL值的唯一索引作為主鍵索引、如果也沒有這樣的唯一索引,則InnoDB會選擇內建6位元組長的ROWID作為隱含的聚集索引(ROWID

面試到:在工作碰到的最困難的問題是什麼?

  首先,面試官問道這個問題的目的肯定是想從側面瞭解你對技術的理解,或者說我解決問題的思路。那麼說,我們回答這個問題也要從這點著手。我是這樣總結的。   在我的程式設計生涯中,我總結出了幾點: 1. 良好的程式設計習慣是對有效率程式設計最大的幫助。 2.

知道的單例模式和多線程並發在單例模式的影響

影響 編程問題 rop key 是我 提升 註意 特性 是不是 單例對象(Singleton)是一種常用的設計模式。在Java應用中,單例對象能保證在一個JVM中,該對象只有一個實例存在。這樣的模式有幾個好處: 1、某些類創建比較頻繁,對於一些大型的對象,這是一筆很大的系

java知道的CAS操作

sta mar 一個 swap 不知道 通過 樂觀 變換 沒有 1.CAS是什麽   Compare and Swap(比較並操作),由處理器架構支持,語義是如果當前值V和舊值A相同,則將當前值修改為B,如果不相同則不修改。CAS操作采用的是樂觀鎖技術,當多線程同時修改某個

Go基礎之--位操作知道的用法

turn 自己 use 應用 const 代碼 只需要 寫法 直接 之前一直忽略的就是所有語言中關於位操作,覺得用處並不多,可能用到也非常簡單的用法,但是其實一直忽略的是它們的用處還是非常大的,下面先回顧一下位操作符的基礎 位操作符 與操作:&1 & 1 =

知道的,Java 操作符的秘密?

tint 正常的 示例 itl 相等 params obi equal 拷貝 在 Java 編程的過程中,我們對數據的處理,都是通過操作符來實現的。例如,用於賦值的賦值操作符、用於運算的運算操作符等、用於比較的比較操作符,還包括邏輯操作符、按位操作符、移位操作符、三元操作符

知道的有關Java 和Scala的同步問題

在實際應用中所有的服務端程式都需要在多執行緒之間進行某種同步。大多數同步已經有框架完成了,比如我們的web伺服器,DB客戶端和訊息框架。Java和Scala提供了大量的元件用來實現穩定的多執行緒程式。包括物件池,併發集合,高階鎖,執行上下文等。 為了更好的理解這些元件,我們深入瞭解一下最常用

AndroidContext詳解 ---- 知道的Context

             前言:本文是我讀《Android核心剖析》第7章 後形成的讀書筆記 ,在此向欲瞭解Android框架的書籍推薦此書。         大家好,  今天給大家介紹下我們在應用開發中最熟悉而陌生的朋友-----Context類 ,說它熟

QML知道的state

       最後一次寫QML已經是2010年了,最近由於產品需要,重拾QML。之前nokia給我們培訓QML的時候,對於state這個概念理解的不是很透徹。最近在做產品前期的QML熱身,發現QML中的state有一種神奇的功能:歷史記憶效應       state核心就是體

JS的函式(二):函式引數可能知道的引數傳遞

前言: 函式分為有參有返回值,有參無返回值,無參無返回值,無參有返回值;那麼對於無引數的函式你想使用函式的呼叫怎麼辦呢?如果你想封裝一個程式碼,實現多種功能,但是形參大於實參或者實參大於形參又該如何?本文就發生函式呼叫過程中,值傳遞,引數的不對等處理原則等關於引數的一些

淺談在網頁知道的css背景屬性

縱橫比 percent 頁面 ges ack ont 應用 500px cli 在很多網頁設計中,很多人對於css的背景屬性,只是停留在設置背景。今天我們來談談它的其他應用。 比如背景的定位,它能實現很多翻轉網頁效果。 background-position:指定背景圖像的