1. 程式人生 > >什麼是TCP,UDP,兩者的區別?

什麼是TCP,UDP,兩者的區別?

TCP

TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連線的,可靠的,基於位元組流的傳輸層通訊協議。當客戶端和伺服器交換資料前,必須先在雙方之間建立可靠的TCP連線,一個TCP連線必須要經過三次“握手”才能傳輸資料。TCP提供超時重發,丟棄重複資料,檢驗資料,流量控制等功能,保證資料能從一端輸到另一端。資料傳輸完成後,經過四次“揮手”斷開連線,正是有了三次握手和四次揮手對於連線可靠性保障,才能讓TCP協議端的資料互動變得可行,但是同樣由於該協議的國語可靠,被有心人利用經常實施DDOS拒絕服務攻擊。

UDP

UDP(User Datagram Protoco)是使用者資料報協議,是一種面向無連線的傳輸層協議。它只是把應用程式傳給IP層的資料報文傳送出去,但是並不能保證他們能否到達目的地。UDP協議的主要作用是將網路資料流量壓縮成資料包的形式,傳送時先把資料放到報文,寫到緩衝區位元組陣列在傳送,界首市,從緩衝器陣列讀取,打包到報文。由於UDP在傳輸資料報前不用在客戶和伺服器之間建立一個連線,且沒有超時重發等機制,故而傳輸速度很快。UDP適用於一次只傳送少量資料、對可靠性要求不高的應用環境。

兩者區別:

TCP:面向連線,可靠性高,傳輸資料量大,出書速度慢 UDP:面向無連線,會丟包,可靠性低,傳輸資料量小,傳輸速度快

TCP與UDP的選擇

當資料傳輸的效能必須讓位於資料傳輸的完整性、可控制性和可靠性時,TCP協議是當然的選擇。當強調傳輸效能而不是傳輸的完整性時,UDP是最好的選擇。在資料傳輸時間很短,以至於此前的連線過程成為整個流量主體的情況下,UDP也是一個好的選擇

TCP的三次握手和四次揮手的過程

三次握手建立連線

在這裡插入圖片描述 最初兩端的TCP程序都處於CLOSED關閉狀態,A主動開啟連線,而B被動開啟連線。(A、B關閉狀態CLOSED——B收聽狀態LISTEN——A同步已傳送狀態SYN-SENT——B同步收到狀態SYN-RCVD——A、B連線已建立狀態ESTABLISHED)

B的TCP伺服器程序先建立傳輸控制塊TCB,準備接受客戶程序的連線請求。然後伺服器程序就處於LISTEN(收聽)狀態,等待客戶的連線請求。若有,則作出響應。
1)第一次握手:A的TCP客戶程序也是首先建立傳輸控制塊TCB,然後向B發出連線請求報文段,(首部的同步位SYN=1,初始序號seq=x),(SYN=1的報文段不能攜帶資料)但要消耗掉一個序號,此時TCP客戶程序進入SYN-SENT(同步已傳送)狀態。
2)第二次握手:B收到連線請求報文段後,如同意建立連線,則向A傳送確認,在確認報文段中(SYN=1,ACK=1,確認號ack=x+1,初始序號seq=y),測試TCP伺服器程序進入SYN-RCVD(同步收到)狀態;
3)第三次握手:TCP客戶程序收到B的確認後,要向B給出確認報文段(ACK=1,確認號ack=y+1,序號seq=x+1)(初始為seq=x,第二個報文段所以要+1),ACK報文段可以攜帶資料,不攜帶資料則不消耗序號。TCP連線已經建立,A進入ESTABLISHED(已建立連線)。
當B收到A的確認後,也進入ESTABLISHED狀態。

三次握手過程

第一次握手:起初兩端都處於CLOSED關閉狀態,Client將標誌位SYN置為1,隨機產生一個值seq=x,並將該資料包傳送給Server,Client進入SYN-SENT狀態,等待Server確認;
第二次握手:Server收到資料包後由標誌位SYN=1得知Client請求建立連線,Server將標誌位SYN和ACK都置為1,ack=x+1,隨機產生一個值seq=y,並將該資料包傳送給Client以確認連線請求,Server進入SYN-RCVD狀態,此時作業系統為該TCP連線分配TCP快取和變數;
第三次握手:Client收到確認後,檢查ack是否為x+1,ACK是否為1,如果正確則將標誌位ACK置為1,ack=y+1,並且此時作業系統為該TCP連線分配TCP快取和變數,並將該資料包傳送給Server,Server檢查ack是否為y+1,ACK是否為1,如果正確則連線建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client和Server就可以開始傳輸資料。

四次揮手斷開連線

在這裡插入圖片描述

1)A的應用程序先向其TCP發出連線釋放報文段(FIN=1,序號seq=u),並停止再發送資料,主動關閉TCP連線,進入FIN-WAIT-1(終止等待1)狀態,等待B的確認。
2)B收到連線釋放報文段後即發出確認報文段,(ACK=1,確認號ack=u+1,序號seq=v),B進入CLOSE-WAIT(關閉等待)狀態,此時的TCP處於半關閉狀態,A到B的連線釋放。
3)A收到B的確認後,進入FIN-WAIT-2(終止等待2)狀態,等待B發出的連線釋放報文段。
4)B沒有要向A發出的資料,B發出連線釋放報文段(FIN=1,ACK=1,序號seq=w,確認號ack=u+1),B進入LAST-ACK(最後確認)狀態,等待A的確認。
5)A收到B的連線釋放報文段後,對此發出確認報文段(ACK=1,seq=u+1,ack=w+1),A進入TIME-WAIT(時間等待)狀態。此時TCP未釋放掉,需要經過時間等待計時器設定的時間2MSL後,A才進入CLOSED狀態。

為什麼連線的時候是三次握手,關閉的時候卻是四次握手?

因為當Server端收到Client端的SYN連線請求報文後,可以直接傳送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連線時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,“你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能傳送FIN報文,因此不能一起傳送。故需要四步握手。