天天看點

TCP/UDP協定是什麼?深入了解TCP、UDP協定及兩者的差別

作者:工控自動化程式設計

一、TCP協定:

位于傳輸層, 提供可靠的位元組流服務。所謂的位元組流服務(Byte Stream Service) 是指, 為了友善傳輸, 将大塊資料分割成以封包段(segment) 為機關的資料包進行管理。 而可靠的傳輸服務是指, 能夠把資料準确可靠地傳給對方。 即TCP 協定為了更容易傳送大資料才把資料分割, 而且 TCP 協定能夠确認資料最終是否送達到對方。是以,TCP連接配接相當于兩根管道(一個用于伺服器到用戶端,一個用于用戶端到伺服器),管道裡面資料傳輸是通過位元組碼傳輸,傳輸是有序的,每個位元組都是一個一個來傳輸。

(1)、三次握手:握手過程中使用了 TCP 的标志(flag) —— SYN(synchronize) 和ACK(acknowledgement) 。

第一次握手:建立連接配接時,用戶端A發送SYN包(SYN=j)到伺服器B,并進入SYN_SEND狀态,等待伺服器B确認。

第二次握手:伺服器B收到SYN包,必須确認客戶A的SYN(ACK=j+1),同時自己也發送一個SYN包(SYN=k),即SYN+ACK包,此時伺服器B進入SYN_RECV狀态。

第三次握手:用戶端A收到伺服器B的SYN+ACK包,向伺服器B發送确認包ACK(ACK=k+1),此包發送完畢,完成三次握手。

TCP/UDP協定是什麼?深入了解TCP、UDP協定及兩者的差別

若在握手過程中某個階段莫名中斷, TCP 協定會再次以相同的順序發送相同的資料包。

(2)、四次揮手:由于TCP連接配接是全雙工的,是以每個方向都必須單獨進行關閉。這個原則是當一方完成它的資料發送任務後就能發送一個FIN來終止這個方向的連接配接。收到一個 FIN隻意味着這一方向上沒有資料流動,一個TCP連接配接在收到一個FIN後仍能發送資料。先進行關閉的一方将執行主動關閉,而另一方被動關閉。

用戶端A發送一個FIN,用來關閉客戶A到伺服器B的資料傳送。

伺服器B收到這個FIN,它發回一個ACK,确認序号為收到的序号加1。

伺服器B關閉與用戶端A的連接配接,發送一個FIN給用戶端A。

用戶端A發回ACK封包确認,并将确認序号設定為收到序号加1。

三次握手和四次揮手:在TCP連接配接中,伺服器端的SYN和ACK向用戶端發送是一次性發送的,而在斷開連接配接的過程中, B端向A

端發送的ACK和FIN是分兩次發送的。因為在B端接收到A端的FIN後, B端可能還有資料要傳輸,是以先發送ACK,等B端處理完自己的事情後就可以發送FIN斷開連接配接了。

(3)、深入了解TCP連接配接:

由于TCP是全雙工的,是以在每一個方向都必須單獨關閉。這原則是當一方完成它的資料發送任務後就能發送一個FIN來終止這個方向的連接配接。收到一個FIN隻意味着這個方向上沒有資料流動,一個TCP連接配接在接收到一個FIN後仍能發送資料。 首先進行關

閉的一方将執行主動關閉,而另一方執行被動關閉。

TCP協定的連接配接是全雙工連接配接,一個TCP連接配接存在雙向的讀寫通道。簡單來說,是“先關讀,再關寫” ,總共需要4個階段。以客戶機發起關閉連接配接為例:1.伺服器讀通道關閉;2.用戶端寫通道關閉;3.用戶端讀通道關閉;4.伺服器寫通道關閉。

關閉行為是在發起方資料發送完畢之後,給對方發出一個FIN(finish)資料段,直到接收到對方發送的FIN,且對方收到了接收确認的ACK之後,雙方的資料通信完全結束,過程中每次都需要傳回确認資料段ACK。

(4)、TCP使用滑動視窗機制來進行流量控制。

建立連接配接時,各端配置設定一個緩沖區用來存儲接收的資料,并将緩沖區的尺寸發送給另一端。接收方發送的确認消息中包含了自己剩餘的緩沖區尺寸。剩餘緩沖區空間的數量叫做視窗。其實就是建立連接配接的雙虎互相知道彼此剩餘的緩沖區大小。

TCP/UDP協定是什麼?深入了解TCP、UDP協定及兩者的差別

(5)、擁塞控制

擁塞控制:防止過多的資料注入到網路中,這樣可以使網絡中的路由器或鍊路不至于阻塞。擁塞控制是一個全局性的過程,和流量控制不同,流量控制是點對點的控制。

TCP/UDP協定是什麼?深入了解TCP、UDP協定及兩者的差別

1、慢開始:發送方維持一個叫做擁塞視窗cwnd(congestion window)的狀态變量。擁塞視窗的大小取決于網絡的擁塞程度,并且動态的變化。發送方讓自己的發送視窗等于擁塞視窗,另外考慮到接收方的接收能力,發送視窗可能小于擁塞視窗。思路就是:不要一開始就發送大量的資料,先試探一下網絡的擁塞程度,也就是說由小到大增加擁塞視窗的大小。

為了防止cwnd增長過大引起網絡擁塞,還需要設定一個慢開始門限ssthresh狀态變量。 ssthresh的方法如下:

當cwnd < ssthresh時,開始使用慢開始算法;當cwnd > ssthresh, 改用擁塞避免算法;當cwnd = ssthresh時,慢開始與擁塞算法任意。

2.擁塞避免:

擁塞避免算法讓擁塞視窗緩慢增長,即每經過一個往返時間RTT就把發送方的擁塞視窗cwnd加1,而不是加倍,這樣擁塞視窗按照線性規律緩慢增長。無論是在慢開始階段還是在擁塞避免階段,隻要發送方判斷網絡出現擁塞(其根據就是沒有收到确認,雖然沒有收到确認可能是其他原因的分組丢失,但是因為⽆法判定,是以都當作擁塞處理),就把慢開始門限設定為出現擁塞時的發送視窗的一半,然後把擁塞視窗設定為1,執行慢開始算法:

TCP/UDP協定是什麼?深入了解TCP、UDP協定及兩者的差別

此外,還有快速重傳和快速恢複,停止-等待協定,回退N幀協定,選擇重傳協定等。

二、UDP協定:

無連接配接協定,也稱透明協定,也位于傳輸層。

兩者差別:

1) TCP提供面向連接配接的傳輸,通信前要先建立連接配接(三次握手機制); UDP提供無連接配接的傳輸,通信前不需要建立連接配接。

2) TCP提供可靠的傳輸(有序,無差錯,不丢失,不重複); UDP提供不可靠的傳輸。

3) TCP面向位元組流的傳輸,是以它能将資訊分割成組,并在接收端将其重組; UDP是面向資料報的傳輸,沒有分組開銷。

4) TCP提供擁塞控制和流量控制機制; UDP不提供擁塞控制和流量控制機制。

三、長連接配接和短連接配接

HTTP的長連接配接和短連接配接本質上是TCP長連接配接和短連接配接。HTTP屬于應用層協定,在傳輸層使用TCP協定,在網絡層使用IP協定。 IP協定主要解決網絡路由和尋址問題,TCP協定主要解決如何在IP層之上可靠地傳遞資料包,使得網絡上接收端收到發送端所發出的所有包,并且順序與發送順序一緻。TCP協定是可靠的、面向連接配接的。

在HTTP/1.0中預設使用短連接配接。也就是說,用戶端和伺服器每進行一次HTTP操作,就建立一次連接配接,任務結束就中斷連接配接。當用戶端浏覽器通路的某個HTML或其他類型的Web頁中包含有其他的Web資源(如JavaScript檔案、圖像檔案、CSS檔案等),每遇到這樣一個Web資源,浏覽器就會重建立立一個HTTP會話。

而從HTTP/1.1起,預設使用長連接配接,用以保持連接配接特性。使用長連接配接的HTTP協定,會在響應頭加入這行代碼:

Connection:keep-alive

在使用長連接配接的情況下,當一個網頁打開完成後,用戶端和伺服器之間用于傳輸HTTP資料的TCP連接配接不會關閉,用戶端再次通路這個伺服器時,會繼續使用這一條已經建立的連接配接。Keep-Alive不會永久保持連接配接,它有一個保持時間,可以在不同的伺服器軟體(如Apache)中設定這個時間。實作長連接配接需要用戶端和服務端都支援長連接配接。

HTTP協定的長連接配接和短連接配接,實質上是TCP協定的長連接配接和短連接配接。