TCP/IP傳輸層,你懂多少?
原創地址:http://java-mzd.iteye.com/blog/1007577,寫的很好,建議到原創地址欣賞原文,此處僅作備份。
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) |
||
可選項(如果有,0或32) |
|||
資料(可變) |
**七。怎麼理解協議和程式?**
如同我們自定義的應用層協議一樣:協議只是給出了一組規範,規定我們應該怎麼樣(按什麼規則)儲存資料。
在計算機間傳輸的永遠都是二進位制位元組碼(對於傳輸層,可以理解為傳輸的始終是下層的IP資料包),是計算機中的程式通過對這些位元組碼進行邏輯分析、判斷,來控制程式完成差錯控制等功能。
至於解析這些位元組碼的程式,則可以有不同的實現,只要我們按照規則來解析,並作出相應的控制,我們大可以自己寫個程式是實現相應功能。
知道了這些後,顯然,我們也可以使用前面說的Jpcap,來自己實現一個基於Java的TCP或者UDP協議。可以參考Linux下的Tcp原始碼。 /net/ipv4/udp.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中,很明顯的可以看到
-
-
- 依靠序列號重組資料段
- 依靠資料包消除網路中的重複包
- 依靠序列號和應答號進行差錯重傳,提高了TCP的可靠性
-
十六:為什麼需要視窗技術?
前面我們已經說了,TCP的可靠性,是通過預期確認來實現的。即傳送方傳送一個資料段後,需要得到對方的確認後,才會傳送下一個資料段。
因此,假設一個資料段大小為64KB(IP包最大值),一次傳送和確認需要的時間為500MS,則,1S內,只能傳送128KB的資料,如果頻寬為1M,顯然很浪費頻寬。為了充分利用頻寬,我們使用視窗技術。滑動視窗允許傳送方在收到接收方的確認之前傳送多個資料段。(視窗大小決定了在收到確認前可以傳送的資料段數量)
十七:如何實現流量控制?
視窗數決定了當前傳輸的最大流量。當我們在傳輸過程中,通訊雙方可以根據網路條件動態協商視窗大小,調整視窗大小時,即可實現流量控制。(在TCP的每個確認中,除了ACK外,還包括一個視窗通知)
十八:UDP的開銷很小,具體是指什麼?
1.因為UDP是無連線的。在傳輸資料之前,不需要進行復雜的三次握手來建立連線。
2.在傳輸資料時,沒有協議間通訊流量(確認訊號),也不需要浪費不必要的處理時間(接收確認訊號再發一下)。
3;傳輸結束後,也不用再用改進的三次握手來埠連線。
十九:UDP資料包、TCP資料包大小如何確認?
-
無論TCP還是UDP資料包,都需要交給Internet層封裝為IP包,而一個IP包,包頭中的長度位為16位,所以IP包最大為2的16方,即65535(64KB還需要減去各種包頭長度)。
TCP因為面向流,且可以憑藉序列號對大檔案進行分段和重組,因此,TCP可以用來傳輸較大的檔案。而UDP,如果要傳輸大於64KB的資料,則需要自己在應用層進行差錯控制。
為了提高傳輸效率和減少網路通訊量(協議間的通訊),TCP也會一次傳輸足夠多的資料。
因為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/IP五層模型-傳輸層-TCP協議TCP模型協議
- TCP/IP 通訊傳輸流TCP
- 傳輸層協議 TCP 和 UDP協議TCPUDP
- TCP/IP五層協議TCP協議
- OSI七層模型與TCP/IP五層模型TCP
- TCP/IP協議 - 網路層TCP協議
- TCP|你真的懂 HTTP 嗎?TCPHTTP
- TCP可靠傳輸原理TCP
- OSI七層模型與TCP/IP五層模型模型TCP
- OSI 七層模型與 TCP IP 五層模型模型TCP
- 網路分層TCP/IP 與HTTPTCPHTTP
- 傳輸層和網路層的checksum區別,TCP cksum為何包含偽首部TCP
- TCP/IP五層模型-應用層-DNS協議TCP模型DNS協議
- Internet傳輸層
- 傳輸層協議協議
- TCP傳輸協議詳解TCP協議
- TCP傳輸資料長度TCP
- CCNA-Part5 - 傳輸層 ,TCP 為什麼是三次握手?TCP
- 大白話聊OSI七層模型和TCP/IP四層模型模型TCP
- TCP/IP 中的OSI分層模型詳解TCP模型
- TCP/IP 協議及網路分層模型TCP協議模型
- 傳輸控制協議/網際網路協議(TCP / IP)是什麼意思?-VeCloud協議TCPCloud
- QT從入門到入土(九)——TCP/IP網路通訊(以及檔案傳輸)QTTCP
- Laravel框架的核心架構,你懂多少?Laravel框架架構
- 跨境檔案傳輸換上鐳速傳輸,看看能提速多少?
- TCP 學習筆記(三) 可靠傳輸TCP筆記
- 如何確保TCP包的有序傳輸?TCP
- 計網作業(傳輸層)
- 帶你瞭解TCP/IP協議族TCP協議
- TCP/IP中最高大上的鏈路層簡介TCP
- 對Docker的瞭解,你能讀懂多少?Docker
- 分分鐘讀懂tcp/ip通訊協議原理(含視訊)TCP協議
- 計算機網路之傳輸層TCP與UDP對比、流量控制、擁塞控制、超時重傳時間的選擇、可靠傳輸計算機網路TCPUDP
- 計算機網路之TCP可靠傳輸計算機網路TCP
- 用python實現TCP協議傳輸功能PythonTCP協議
- 傳輸層的七七八八
- 一篇帶你瞭解TCP/IP 概念TCP
- 9、如何理解應用層、傳輸層、網路層、鏈路層、物理層
- TCP/IP族TCP