PS.老規矩,列出可能遇到的20個問題,若是您是都能回答的高手,請您繞道,我是小菜,只作本身的學習筆記。程序員
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
二。傳輸層如何區分不一樣應用程序的數據流?學習
由於,對應傳輸層而言,它只須要知道目標主機上的哪一個服務程序來響應這個程序,而不須要知道這個服務程序是幹什麼的。所以,咱們只須要可以抽象的表示出來這些應用程序和服務程序便可。咱們使用端口號來抽象標識每一個網絡程序。編碼
傳輸層的TCP和UDP能夠接收來自多個應用程序的數據流,用端口號標識他們,而後把他們送給Internet層處理;spa 同時TCP和UDP接收來自Internet層的數據包,用端口號區分他們,而後交給不一樣的應用程序。視頻 |
所以:在同一IP地址(同一個目標主機)上不一樣的端口號是兩個不一樣的連接。IP地址和端口號用來惟一的肯定網絡上數據的目的地。ip
三。傳輸層有哪些協議?ci
傳輸層的兩大協議: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的可靠性,是經過預期確認來實現的。即發送方發送一個數據段後,須要獲得對方的確認後,纔會發送下一個數據段。
所以,假設一個數據段大小爲64KB(IP包最大值),一次發送和確認須要的時間爲500MS,則,1S內,只能傳送128KB的數據,若是帶寬爲1M,顯然很浪費帶寬。爲了充分利用帶寬,咱們使用窗口技術。滑動窗口容許發送方在收到接收方的確認以前發送多個數據段。(窗口大小決定了在收到確認前能夠發送的數據段數量)
十七:如何實現流量控制?
窗口數決定了當前傳輸的最大流量。當咱們在傳輸過程當中,通訊雙方能夠根據網絡條件動態協商窗口大小,調整窗口大小時,便可實現流量控制。(在TCP的每一個確認中,除了ACK外,還包括一個窗口通知)
十八:UDP的開銷很小,具體是指什麼?
1.由於UDP是無鏈接的。在傳輸數據以前,不須要進行復雜的三次握手來創建鏈接。
2.在傳輸數據時,沒有協議間通訊流量(確認信號),也不須要浪費沒必要要的處理時間(接收確認信號再發一下)。
3;傳輸結束後,也不用再用改進的三次握手來端口鏈接。
十九:UDP數據包、TCP數據包大小如何確認?
二十: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協議的環境:
當網絡硬件失效或者負擔過重時,數據包可能就會產生丟失、重複、延時、亂序的現象。這些都會致使咱們的通訊不正常的時候。若是讓應用程序來擔負差錯控制的工做,無疑將給程序員帶來許多複雜的工做,因而,咱們使用獨立的通訊協議來保證通訊的可靠性是很是必要的。