TCP,UDP協議

傳輸層

傳輸層位於應用層之下,嚮應用層提供通信服務。與IP層不同的是,IP層主要是處理點到點的通信,即主機與主機之間的通信;而傳輸層要處理的是端到端的通信,即主機上進程之間的通信。
傳輸層的主要功能是實現複用與分用。

  • 複用即發送方的不同應用進程都可以使用傳輸層的協議進行發送。
  • 分用指的是接收方在剝去報文的首部之後能把數據正確的交給目的應用進程。

傳輸層主要有兩種運輸協議:UDP協議與TCP協議。

UDP協議

使用UDP傳輸的數據叫做UDP用戶數據報
UDP協議的特點:

  1. UDP是無連接的。即發送數據之前不用建立連接。
  2. UDP使用盡最大努力交付,即不保證可靠交付。
  3. UDP是面向報文的。即UDP把應用層交給它的報文只做簡單的添加首部即向下交付給IP層。UDP對應用層交下來的報文,即不合並,也不拆分。即UDP協議一次性交付整個報文。
  4. UDP不支持擁塞控制。
  5. UDP首部開銷小,只有8字節,包含源端口,目的端口,長度,檢驗和。UDP的檢驗和是把首部與數據部分一起檢驗的。

TCP協議

1.TCP協議的主要特點:

  1. TCP是面向連接的傳輸層協議
  2. 每一條TCP連接只能有兩個端點
  3. TCP提供可靠交付。即TCP傳輸數據時,無差錯、不丟失、不重複、並且按序到達。
  4. 面向字節流。即TCP只是把數據看成是一個一個的字節,而不知道這些字節的具體含義。這些字節的組合交給使用TCP的應用層協議去區分。

2.可靠傳輸的工作原理
1) 停止等待協議:即發送方對自己發送的報文維護一個計時器,每發送一個報文就開始計時。如果在計時時間內等到了接受方發送過來的確認報文才繼續發送下一個報文。如果在計時時間內沒有等到確認報文,就重發當前報文。
需要注意的是:
對於遲到的確認報文,發送方會丟棄這個確認報文。

2)連續ARQ協議
發送方維護一個發送窗口,採取累積確認的方式:即接收方在接受到一批報文後,只對按序到達的最後一個報文發送確認。

3.TCP協議的報文格式
序號:4字節,每一個字節都按序編號。
確認號:期望收到的下一個報文段的第一個數據字節的序號。
ACK:當ACK位爲1時,確認號纔有用。
SYN:在連接建立時用來同步序號。當SYN=1,ACK=0時,表面這是一個連接請求報文;如果對方同意連接,則在響應報文中使用SYN=1,ACK=1。
FIN:用來釋放一個連接。FIN=1表示發送方數據發送完畢,請求釋放連接。
窗口:表示的是接收方的接收窗口大小。

4.TCP可靠傳輸的實現
1)以字節爲單位的滑動窗口
比如A是發送方,B是接收方。A就要維護一個發送方的發送窗口,B要維護一個接收方的接收窗口,發送窗口大小肯定是不大於接收窗口的。
對於A而言,在沒有接收到B的確認的情況下,他可以連續把窗口內的數據都發送出去。凡是發送過的數據,在未接到確認之前都必須暫時保留,以便在超時重傳時使用。
發送窗口後面表示的是已經收到確認的數據,前面表示的是還不允許發送的數據。
在發送方接到確認之後,發送窗口就可以前移了。(但是也可能不會前移,因爲B的接收窗口變小了,那麼A的發送窗口大小也必然會變小。)

5.TCP的流量控制
流量控制指的是讓發送方的發送速度不要太快,要讓接收方能夠來的及接收(注意與擁塞控制的區別,擁塞控制指的是防止網絡擁塞)
流量控制是通過讓接收方維護的接收窗口的大小來控制的。

6.TCP的擁塞控制
1)慢開始與擁塞避免
發送方會維持一個擁塞窗口cwnd以及一個閥值s。在慢開始階段,cwnd=1:表示我們這次能發送的報文最多是1,在發送並接到確認之後,擁塞窗口會變爲2。即沒經過一個傳輸輪次,擁塞窗口就加倍。當擁塞窗口的大小要超過閥值的大小時,把擁塞窗口的大小設置爲閥值大小。這時進入擁塞避免狀態。
擁塞避免:每經過一個傳輸輪次,即一個RTT,發送方就把擁塞窗口加1。這樣擁塞窗口就會緩慢增加。
但是有網絡超時出現時,就會把閥值s設置爲當前擁塞窗口大小的一半,並且將擁塞窗口重新設爲1,重新開始慢開始階段。
2)快重傳與快恢復
快重傳:接收方在接受到失序報文之後就會立即發送重複的確認報文,而不是等到自己想發送時捎帶,發送方連續收到3個重複確認報文時,就把慢開始閥值減成當前擁塞窗口大小的一半。
快恢復:在執行上面的操作之後,發送方不去把擁塞窗口設爲1,而是直接把擁塞窗口設爲當前慢開始的閥值大小。因爲發送送認爲接收方既然能夠發送重複確認報文說明網絡還沒有阻塞,那麼就沒有必要重新開始 慢開始階段。
另外需要注意的是發送方的發送窗口大小 = min[接收窗口,cwnd]

7.TCP的連接管理
1)三次握手
例如A是客戶,B 是服務器。那麼A主動打開連接,B被動打開連接。
首先A發送SYN=1, seq=x表示想要進行連接的建立。此時報文段不可以攜帶數據,但是會消耗一個序號。
接着B發送ACK=1, SYN=1, seq=y, ack=x+1,表示我知道A想建立連接了。這個報文也不能攜帶數據,同時也會消耗序號。
然後A繼續發送ACK=1, seq=x+1, ack=y+1,表示好的,那麼我們開始傳輸吧。這個報文可以攜帶數據,這樣會消耗序號;但是不帶數據就不會消耗序號。

之所以要三次握手,是因爲服務器是被動打開連接的。那麼在A請求建立連接之後,B會發送確認報文。如果A第一次發送的請求沒有按時到達,這時A又會發送一個連接請求。而B會接受到兩次連接建立請求,如果沒有第三次握手,B會以爲A要建立兩個連接請求,而A實際上只有一個連接建立請求。這樣就會造成B一直在等待A的另一個請求發送數據,造成服務器資源的浪費。

2)四次揮手
例如A是客戶,B是服務器。
1.首先A發送FIN=1, seq=u,這個u是已傳的最後的一個字節的編號加1。表示我沒有數據要發送了,進入FIN-WAIT1狀態。等待B的確認。
2.接着B接收到了這個報文知道A沒有數據了,但是如果B還有數據給A,那麼B 就會繼續向A發送報文,格式是ACK=1, seq=v, ack=u+1。A接收到這個報文進入FIN-WAIT2狀態。當B也不想發數據了,此時B會發送一個FIN=1,ACK=1,seq=w,ack=u+1的報文給A表示我也沒有數據了,我們停止這次交流吧。然後進入CLOSE-WAIT狀態。等待A的確認。
3.在A接到A的結束報文後,A就知道這次交流要結束了,於是發送ACK=1, seq=u+1, ack=w+1的報文給B,進入TIME-WAIT狀態,開啓計時器(一般是兩個RTT時間)。
4.B接收到A的確認報文之後,就關閉這次交流了。
5.在A的計時器結束之後,A也關閉這次交流。

之所以A在TIME-WAIT狀態下還要等待2MSL時間:

  • 第一爲了保證A發送的最後一個ACK報文段能夠到達B,若這個報文段丟失而A沒有wait,那麼B就不可以正常關閉了。若A wait了,就會接受到B發的重複結束報文。這樣A就在再次發送一個確認報文,重新進入TIME-WAIT狀態。
  • 第二,保證這次連接的重複數據段從網絡中消失。比如,A在closed之後又想向B建立連接請求了,這時有可能端口與上回的端口一致,而上回的重複數據卻任然在網路中,導致TCP協議不知道這個數據是上次的還是這次的。有了TIME-WAIT,就會保證上回的重複數據都消失了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章