1. 程式人生 > >JAVA TCP與UDP的區別

JAVA TCP與UDP的區別

The difference between TCP/IP and UDP

Java主要關注傳輸層, 在傳輸層TCP,UDP是兩種傳輸資料流的方式。

一、TCP(Transmission Control Protocol,傳輸控制協議)Connection-oriented protocal.也就是說,在收發資料前,雙方會先建立一條虛擬的通訊道,必須和對方建立可靠的連線。

3次握手:1 、A向B 傳送資料段,(告訴B 兩件事:我想要和你通訊;你可以用哪個序列號作為起始資料段來回應我.)2 、B 收到A的請求後,用一個帶有確認應答(ACK)和同步序列號(SYN)標誌位的資料段響應A,(也告訴主機A兩件事,你可以傳輸資料了;你要用哪個序列號作為起始資料段來回應我)3 、A收到之後,再發送一個確認應答(”我已收到回覆,我現在要開始傳輸實際資料了)

這樣3次握手就完成了,主機A和主機B 就可以傳輸資料了.

TCP斷開連線要進行4次

1 、當A完成資料傳輸後,將控制位FIN置1,提出停止TCP連線的請求2 、主機B收到FIN後對其作出響應,確認這一方向上的TCP連線將關閉,將ACK置13 、由B 端再提出反方向的關閉請求,將FIN置14 、主機A對主機B的請求進行確認,將ACK置1,雙方向的關閉結束.

名詞解釋

ACK  TCP報頭的控制位之一,對資料進行確認.確認由目的端發出,用它來告訴傳送端這個序列號之前的資料段都收到了.比如,確認號為X,則表示前X-1個數據段都收到了,只有當ACK=1時,確認號才有效,當ACK=0時,確認號無效,這時會要求重傳資料,保證資料的完整性.

SYN  同步序列號,TCP建立連線時將這個位置1,連線建立之後SYN為0

FIN  傳送端完成傳送任務位,當TCP完成資料傳輸需要斷開時,提出斷開連線的一方將這位置1

UDP(User Data Protocol,使用者資料報協議)

(1) UDP Is a Connectionlessprotocol,Connectionless messages may arrive

out of order。當它想傳送時就簡單地去抓取來自應用程式的資料,並儘可能快地把它扔到網路上。在傳送端,UDP傳送資料的速度僅僅是受應用程式生成資料的速度、計算機的能力和傳輸頻寬的限制;在接收端,UDP把每個訊息段放在佇列中,應用程式每次從佇列中讀一個訊息段。

(3) UDP資訊包的標題很短,只有8個位元組,相對於TCP的20個位元組資訊包的額外開銷很小。

小結TCP與UDP的區別:

1.基於連線與無連線;2.對系統資源的要求(TCP較多,UDP少);3.UDP程式結構較簡單;4.流模式與資料報模式 ;5.TCP保證資料正確性,UDP可能丟包,TCP保證資料順序,UDP不保證。

三.例子

TCP: ServerSocket ss = newServerSocket(2000);UDP: 建立DatagramSocket物件,DatagramSocket區別於Tcp方式下的socket物件。DatagramSocket   ds=new   DatagramSocket();

[java] view plain copy print?
  1. //TCP伺服器端
  2. package com.zakisoft.tcp;    
  3. import java.io.InputStreamReader;    
  4. import java.net.ServerSocket;    
  5. import java.net.Socket;    
  6. publicclass TCPServer {    
  7.     publicstaticvoid main(String[] args) throws Exception {    
  8.         ServerSocket ss = new ServerSocket(2000);    
  9.         while (true) {    
  10.             Socket s = ss.accept();    
  11.             System.out.println(”A client has heen connected.”);    
  12.             InputStreamReader r = new InputStreamReader(s.getInputStream());    
  13.             int c = 0;    
  14.             while ((c = r.read()) > -1) {    
  15.                 System.out.print((char) c);    
  16.             }    
  17.             System.out.println();    
  18.             r.close();    
  19.             s.close();    
  20.         }    
  21.     }    
  22. }  
//TCP伺服器端
package com.zakisoft.tcp;  
import java.io.InputStreamReader;  
import java.net.ServerSocket;  
import java.net.Socket;  

public class TCPServer {  
    public static void main(String[] args) throws Exception {  
        ServerSocket ss = new ServerSocket(2000);  
        while (true) {  
            Socket s = ss.accept();  
            System.out.println("A client has heen connected.");  
            InputStreamReader r = new InputStreamReader(s.getInputStream());  
            int c = 0;  
            while ((c = r.read()) > -1) {  
                System.out.print((char) c);  
            }  
            System.out.println();  
            r.close();  
            s.close();  
        }  
    }  
}
[java] view plain copy print?
  1. //TCP客戶端
  2. package com.zakisoft.tcp;    
  3. import java.io.OutputStreamWriter;    
  4. import java.net.Socket;    
  5. publicclass TCPClient {    
  6.     publicstaticvoid main(String[] args) throws Exception {    
  7.         Socket s = new Socket(“127.0.0.1”2000);    
  8.         OutputStreamWriter w = new OutputStreamWriter(s.getOutputStream());    
  9.         w.write(”Hello伺服器”);    
  10.         w.flush();    
  11.         w.close();    
  12.         s.close();    
  13.     }    
  14. }   
//TCP客戶端
package com.zakisoft.tcp;  

import java.io.OutputStreamWriter;  
import java.net.Socket;  

public class TCPClient {  
    public static void main(String[] args) throws Exception {  
        Socket s = new Socket("127.0.0.1", 2000);  
        OutputStreamWriter w = new OutputStreamWriter(s.getOutputStream());  
        w.write("Hello伺服器");  
        w.flush();  
        w.close();  
        s.close();  
    }  
}