TCP和UDP的一些基礎


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.  
    1.  
      1. 依靠序列號重組數據段
      2. 依靠數據包消除網絡中的重複包
      3. 依靠序列號和應答號進行差錯重傳,提高了TCP的可靠性

十六:爲什麼需要窗口技術?

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


 

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

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

 

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

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

 

十九:UDP數據包、TCP數據包大小如何確認?

  1.  

    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協議的環境:

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

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