TCP和UDP的區別 ?tcp/ip三四握手和四次揮手?以及TCP,UDP在服務器和客戶端的執行步驟

什麼是TCP

TCP(Transmission Control Protocol傳輸控制協議)是一種面向連接的,可靠的,基於字節流的傳輸通信協議。
1、tcp(Transmission Control Protocol傳輸控制協議)
2、傳輸層協議
3、原因:應用層需要可靠的連接,但是IP層沒有這樣的流機制
4、面向連接,即在客戶端和服務器之間發送數據之間,必須先建立連接

5、位於應用層和IP層之間
6、連接需要建立三次握手、四次揮手斷開連接

7、傳輸數據時可靠的

TCP連接建立——使用三次握手建立連接

1、客戶端發送請求【尋址請求】
2、服務器端收到報文請求,迴應客戶端【確認請求】
3、客戶端收到服務端的報文進行迴應。【連接請求】
三次握手完成,TCP客戶端和服務端成功地建立連接,可以傳輸數據。

TCP終止一個連接——四次握手

1、數據驗證請求碼
2、傳輸結束標記
3、確認結束標記
4、連接斷開標記

UDP(User Datagram Protocol用戶數據報協議)

1、UDP(User Datagram Protocol用戶數據報協議)
2、傳輸層協議
3、無連接的數據報協議
4、不能提供數據報分組,組裝和不能對數據報進行排序
5、主要用於不要求分組順序到達的傳輸中,分組傳輸順序的檢查和排序有應用層完成。
6、提供面向事務的簡單不可靠傳遞服務。
7、UDP協議使用端口分別運行在同一臺設備上的多個應用程序
8、功能:爲了在給定的主句上能識別多個目的的地址,同時允許多個應用程序在同一臺主句上工作並能夠獨立地進行數據包的發送和接受,設計用戶數據報協議UDP

TCP與UDP的異同(服務端接收數據,客戶端發送數據)

面向TCP連接的socket通信程序
服務端:創建套接字,指定協議族(sockaddr_in),綁定,監聽(listen),接受鏈接(accept),發送或接收數據;客戶端:創建套接字,指定協議族,連接,發送或接收數據
這幾個步驟都是必須的。
補充:在發送和接受數據時:write/send/sendto,read/recv/recvfrom都可以用,通常會用:send,recv;但需要注意的是:在面向UDP的socket程序中,發送數據時,如果用sendto的話,就不用connect了;但是,在面向TCP的程序中,在發送數據時,即使sendto,也必須connect,也就是說connect這一步是必不可少的。

 

面向UDP連接的socket通信程序:
服務端:創建套接字,指定協議族(sockaddr_in),綁定(不需要listen和accept),發送或接收數據;客戶端:創建套接字,指定協議族,連接(和TCP的客戶端步驟一樣),發送或接收數據。
補充:在發送和接收數據時,和TCP大同小異,write/send/sendto,read/recv/recvfrom都可以用,但UDP通常會用sendto,recvfrom;需要注意的是:當用sendto發送數據的時候,就不用connect了(用了也沒事),其他的(write,send)必須connect。

 

區別:

TCP---傳輸控制協議,提供的是面向連接、可靠的字節流服務。當客戶和服務器彼此交換數據前,必須先在雙方之間建立一個TCP連接,之後才能傳輸數據。TCP提供超時重發,丟棄重複數據,檢驗數據,流量控制等功能,保證數據能順序地從一端傳到另一端。
UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸數據報前不用在客戶和服務器之間建立一個連接,且沒有超時重發等機制,不保證數據按順序傳遞,故而傳輸速度很快。

總結:

TCP與UDP區別總結:
1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接
2、TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保   證可靠交付
3、TCP面向字節流,實際上是TCP把數據看成一連串無結構的字節流;UDP是面向報文的
  UDP沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)
4、每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
5、TCP首部開銷20字節;UDP的首部開銷小,只有8個字節

6、TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道

步驟:

TCP編程的服務器端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt(); * 可選
3、綁定IP地址、端口等信息到socket上,用函數bind();
4、開啓監聽,用函數listen();
5、接收客戶端上來的連接,用函數accept();
6、收發數據,用函數send()和recv(),或者read()和write();
7、關閉網絡連接;
8、關閉監聽;

TCP編程的客戶端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、端口等信息到socket上,用函數bind();* 可選
4、設置要連接的對方的IP地址和端口等屬性;
5、連接服務器,用函數connect();
6、收發數據,用函數send()和recv(),或者read()和write();
7、關閉網絡連接;
 
UDP編程的服務器端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、端口等信息到socket上,用函數bind();
4、循環接收數據,用函數recvfrom();
5、關閉網絡連接;

UDP編程的客戶端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、端口等信息到socket上,用函數bind();* 可選
4、設置對方的IP地址和端口等屬性;
5、發送數據,用函數sendto();
6、關閉網絡連接;


補充(來自網絡):
1.socket()的參數不同
2.UDP Server不需要調用listen和accept
3.UDP收發數據用sendto/recvfrom函數
4.UDP:shutdown函數無效
5.TCP:地址信息在connect/accept時確定
  UDP:在sendto/recvfrom函數中每次均需指定地址信息

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章