TCP、UDP原理及比較


TCP、UDP基礎知識

  TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)協議屬於傳輸層協議。其中TCP提供IP環境下的數據可靠傳輸,它提供的服務包括數據流傳送,可靠性、有效流控、全雙工操作和多路復用。通過面向連接、端到端和可靠的數據包發送。通俗說,它是事先為所發送的數據開辟出連接好的通道,然后再進行數據發送;而UDP對應的則是可靠性要求低,傳輸經濟的應用。TCP支持的應用層協議主要有:Telnet、FTP、SMTP等;UDP支持的應用層協議主要有:NFS(網絡文件系統)、SNMP(簡單網絡管理協議)、DNS(主域名稱系統)、TFTP(通用文件傳輸協議)等。

面向連接的TCP

  "面向連接"就是在正式通信前必須與對方建立連接。比如你給別人打電話,必須等線路接通了,對方拿起話筒才能相互通話。TCP(Transmission Control Protocol,傳輸控制協議)是基於連接的協議,也就是說,在正式收發數據前,必須和對方建立可靠的連接。一個TCP連接必須要經過三次"對話"才能建立起來,其中的過程非常復雜,這里只做簡單、形象的介紹,只要做到能夠理解這個過程即可。我們來看看這三次對話的簡單過程:主機A向主機B發出連接請求數據包:"我想給你發送數據,可以嗎?",這是第一次對話;主機B向主機A發送同意連接和要求同步(同步就是兩台主機一個在發送,一個在接收,協調工作)的數據包:"可以,你什么時候?",這是第二次對話;主機A再發出一個數據包確認主機B的要求同步:"我現在就發,你接着吧!",這是第三次對話。三次"對話"的目的是使數據包的發送和接收同步,進過三次"對話"之后,主機A才向主機B正式發送數據。

面向非連接的UDP

  "面向非連接"就是在正式通信前不必與對方先建立連接,不管對方狀態就直接發送。與手機短信非常相似:你在發短信的時候,只需要輸入對方號碼就OK了。

  UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是面向非連接的協議,它不與對方建立連接,而是直接就把數據包發送過來!

  UDP適用於一次只傳少量數據,對可靠性要求不高的應用環境。比如,經常使用"ping"命令來測試兩台主機之間TCP/IP通信是否正常,其實"ping"命令的原理就是向對方主機發送UDP數據包,然后對方主機確認收到數據包,如果數據包是否到達的消息及時反饋回來,那么網絡就是通的。

TCP與UDP區別

  

  TCP UDP
是否連接 面向連接 面向非連接
傳輸可靠性 可靠的 不可靠的
應用場合 傳輸大量的數據 少量數據
速度

Java中實現TCP和UDP

  在Java的API中,Socket是連接套接字,Java分別為TCP和UDP提供了相應的類,TCP是java.net.ServerSocket(用於服務器端)和java.net.Socket(用於客戶端);UDP是java.net.DatagramSocket。在API明顯的區別是:UDP的Socket編程是不提供監聽功能的,也就是雙方更為平等,面對的接口是完全一樣的。但是為了用於UDP實現C/S結構,在使用UDP時可以使用DatagramSocket.receive()來實現類似於監聽的功能。因為receive()是阻塞的函數,即等待數據接收,如果沒有收到數據就會進入等待狀態,程序停在receive()函數這里,如果接收數據,程序就會繼續執行。因而可以根據讀入的數據報來決定下一步的動作,這就達到了跟網絡監聽相似的效果。

  UDP不連接就send()和receive(),TCP需要獲得一個OutputStream和InputStream才能讀寫,在獲得流時就等於在建立連接。

  在DatagramSocket方法中有connect(SocketAddress addr)和disconnect()。

  • connect()方法實際不建立TCP意義上的連接。這里連接只是將DatagramSocket指定遠程主機和遠程端口發包。此時試圖向另外的主機和端口發包將會拋出異常IllegalArgumentException異常。
  • disconnect():中止已連接DatagramSocket的"連接",這樣可以再次收發任何主機和端口的包。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM