目錄
TCP(Transmission Control Protocol , 傳輸控制協議)協議
UDP(User Data Protocol,用戶數據報協議)協議
TCP如何實現可靠性傳輸TCP協議如何實現流量控制TCP協議如何避免網絡擁塞
傳輸層兩個協議
TCP(Transmission Control Protocol , 傳輸控制協議)協議
需要將傳輸文件分段,傳輸建立會話,流量控制,是可靠傳輸
TCP概述:
1.TCP是面向連接的傳輸層協議
2.每一條TCP連接只能有兩個端點,每一條TCP連接只能是點對點
3.TCP提供可靠交付的服務
4.TCP提供全雙工通信
5.面向字節流
UDP(User Data Protocol,用戶數據報協議)協議
一個數據包就能完成數據通信,不需要分段不需要建立對話不需要流量控制,是不可靠控制
UDP特點:
1.無連接:發送數據前不用建立連接
2.使用盡最大努力交付,即不保證可靠交付,同時也不適用擁塞控制
3.面向報文,UDP沒有擁塞控制,適合多媒體通信
4.支持一對一、一對多、多對一和多對多的交互通信
5.首部開銷小,只有8字節
UDP首部
TCP報文段的格式
序號:數據段的第一個字節在整段中的位置是多少
確認號:給對方提示發第幾個字節,也就是下圖中203的接下來的數據
標誌位:
URG = 1時,會無視在TCP緩存中的位置,優先傳輸過去
ACK = 1時,確認號才起作用
SYN = 1時,說明這個包是一個請求建立連接的包
PSH = 1時,在傳輸完成後放在目的地的TCP緩存中的最前排
RST = 1時,代表異常中斷,會結束後面的通信
FIN = 1時,代表通信完成,需要釋放,一般出現在末尾的包
窗口大小:指發送端的tcp緩存大小要和接收端的tcp緩存大小對應
緊急指針:只有當標誌URG = 1時才起作用,緊急指針爲50時,說明TCP數據部分的1~50個字節爲緊急數據
主機和網頁的交互過程
TCP如何實現可靠性傳輸TCP協議如何實現流量控制TCP協議如何避免網絡擁塞
可靠性傳輸工作原理——停止等待協議
確認丟失和確認遲到都會重傳
總結:只要沒收到確認,就重傳
可靠通信的實現
使用上述的確認和重傳機制,就可以在不可靠傳輸網絡上實現可靠的通信,這種可靠傳輸協議通常被稱爲自動重傳請求ARQ(Automatic Repeat reQuest),ARQ表明重傳請求是自動進行的
停止等待的優點是簡單,但是缺點是信道利用率太低
解決方法有:連續ARQ(流水線傳輸)和累計確認
連續ARQ的機制是
1》先發送5個包(爲什麼是5個包,是因爲發送窗口是5),然後等待第一個的確認
2》第一個得到確認後從TCP緩存中去掉,接着發送第六個包,等待第二個確認,以此類推
累計確認
累計確認是累積到一定數量的包後一次性確認,當收到的包不是規定順序的時候,就只確認正確序列的最後一個,錯誤包以及以後的都得不到確認。
還有一種方法是滑動窗口技術,類似於上面兩種方法的結合體
TCP協議如何實現流量控制
A窗口向B窗口發送數據
B窗口的緩存大小是10,發給A窗口的包爲ack=0,rwnd=10,建立連接,然後A窗口開始發送數據,當接收到一定數據後,例如收到了前四個數據,B窗口再次發送 ack = 5,rwnd = 8,此時接收A從第五個數據開始的幾個數據,此時B窗口的TCP緩存中已經有相當一部分數據了,可以讓程序讀出這些數據,這時B向A發送的包爲 ack = 14 ,rwnd = 0,rwnd表示發送窗口爲 0 ,停止A發送數據,然後B在這個階段讀取緩存中的數據,這樣就達到了流量控制的效果
TCP協議如何避免網絡擁塞
出現擁塞的條件:對資源需求的總和 > 可用資源
擁塞控制是一個全局性的過程,涉及到所有主機和路由器
慢開始和避免擁塞
發送方維持擁塞窗口 cwnd(congestion window)
發送方控制擁塞窗口的原則是:
- 只要網絡沒有出現擁塞,擁塞窗口就再增大一些,以便把更多的分組發送出去
- 只要網絡中出現擁塞,擁塞窗口就減小一些,以減小注入到網絡中的分組數
慢開始算法
慢開始算法是加倍cwnd
慢開始門限ssthresh的用法如下:
- 當cwnd < ssthresh,使用慢開始算法
- 當cwnd > ssthresh,停止使用慢開始算法而改用擁塞避免算法
- 當cwnd = ssthresh,既可以使用慢開始算法也可以使用擁塞避免算法
擁塞避免算法的思路是讓cwnd緩慢增大,即每經過一個往返時間RTT就把擁塞窗口cwnd+1,而不是加倍
ps:無論在慢開始階段還是擁塞避免階段,只要發送方判斷網絡出現擁塞,就要把慢開始門限ssthresh設置爲出現擁塞時的cwnd的一半,但不能小於2,然後把cwnd設置爲1,執行慢開始算法。
慢開始和擁塞避免算法實例
快恢復是什麼
快恢復是發生在傳輸過程中丟包進行快速重傳之後的,如果只是單個的意外丟包,這時候沒必要進行慢開始和擁塞避免,這樣會浪費資源和時間,快重傳之後,門限變爲傳送窗口大小,窗口大小變爲一半,直接進行擁塞避免,當出現大面積時才執行上面介紹的步驟,門限變爲窗口一半,窗口變爲1.
TCP三次握手建立連接
-
第一次握手(SYN=1, seq=x),發送完畢後,客戶端進入 SYN_SEND 狀態
-
第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1), 發送完畢後,服務器端進入 SYN_RCVD 狀態。
-
第三次握手(ACK=1,ACKnum=y+1),發送完畢後,客戶端進入 ESTABLISHED 狀態,當服務器端接收到這個包時,也進入 ESTABLISHED 狀態,TCP 握手,即可以開始數據傳輸。
TCP四次揮手斷開連接
-
第一次揮手(FIN=1,seq=a),發送完畢後,客戶端進入 FIN_WAIT_1 狀態
-
第二次揮手(ACK=1,ACKnum=a+1),發送完畢後,服務器端進入 CLOSE_WAIT 狀態,客戶端接收到這個確認包之後,進入 FIN_WAIT_2 狀態
-
第三次揮手(FIN=1,seq=b),發送完畢後,服務器端進入 LAST_ACK 狀態,等待來自客戶端的最後一個ACK。
-
第四次揮手(ACK=1,ACKnum=b+1),客戶端接收到來自服務器端的關閉請求,發送一個確認包,並進入 TIME_WAIT狀態,等待了某個固定時間(兩個最大段生命週期,2MSL,2 Maximum Segment Lifetime)之後,沒有收到服務器端的 ACK ,認爲服務器端已經正常關閉連接,於是自己也關閉連接,進入 CLOSED 狀態。服務器端接收到這個確認包之後,關閉連接,進入 CLOSED 狀態。