JAVA TCP與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?- //TCP伺服器端
- package com.zakisoft.tcp;
- import java.io.InputStreamReader;
- import java.net.ServerSocket;
- import java.net.Socket;
- publicclass TCPServer {
- publicstaticvoid 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.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?- //TCP客戶端
- package com.zakisoft.tcp;
- import java.io.OutputStreamWriter;
- import java.net.Socket;
- publicclass TCPClient {
- publicstaticvoid 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();
- }
- }
//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();
}
}