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

TCP 與 UDP的區別 java

                         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();

//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();  
        }  
    }  
}
//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();  
    }  
}