目錄
前言
一、TCP協(xié)議?
1、TCP協(xié)議首部組成
2、TCP三次握手和四次揮手
2、1 三次握手
2、2?四次揮手?
3、代碼實現(xiàn)
二、UDP協(xié)議
1、UDP特點??
2、首部格式?
3、代碼實現(xiàn)
三、TCP和UDP的區(qū)別?
前言
????????在我們的OSI七層模型或者是四層模型中,我們的傳輸層始終保持不變,傳輸層負(fù)責(zé)定義兩臺主機(jī)進(jìn)程之間的通信,提供數(shù)據(jù)傳輸服務(wù),提供端到端的可靠傳輸,所以我們需要用到的兩個主要的協(xié)議是:
- TCP協(xié)議:傳輸控制協(xié)議,提供面向連接、可靠的數(shù)據(jù)傳輸服務(wù),主要提供完整性服務(wù)
- UDP協(xié)議:用戶數(shù)據(jù)協(xié)議,提供無連接、盡最大努力交互的服務(wù),不保證數(shù)據(jù)的可靠性,主要提供及時性服務(wù)
一、TCP協(xié)議?
1、TCP協(xié)議首部組成:
????????
源端口和目的端口(4個字節(jié))
????????源端口是發(fā)送端,目的端口是接收方,各自占2個字節(jié)
序號(4個字節(jié))
????????傳送的數(shù)據(jù)的數(shù)據(jù)流中每一個字節(jié)都擁有自己的序號,序號表示本報文段所發(fā)送的數(shù)據(jù)的第一個字節(jié)的序號,代表每次數(shù)據(jù)發(fā)送的位置,每發(fā)送一次就累加一次該數(shù)據(jù)字節(jié)數(shù)的大小,序號是計算機(jī)生成的隨機(jī)數(shù)。
確認(rèn)號(4個字節(jié))
????????期望收到對方的下一個報文段數(shù)據(jù)的第一個字節(jié)的序號
數(shù)據(jù)偏移(4位)
????????表示數(shù)據(jù)部分距離報文首部的偏移量,“數(shù)據(jù)偏移”的計算單位是4個字節(jié),數(shù)據(jù)偏移量是占四位,那么最大表示為1111,最大1111表示15 x 4= 60個字節(jié),即表示TCP首部最大長度為60個字節(jié),因此“選項”部分最多40個字節(jié)。
保留字段(4位)一般設(shè)置為0
標(biāo)志位(8位)? ? ??
- 緊急(URG):URG=1表示緊急指針有效,需要盡快傳送,不需要排隊直接優(yōu)先傳輸
- 確認(rèn)(ACK):對已接受數(shù)據(jù)的確認(rèn),默認(rèn)為0,建立連接后,所以傳送的報文都必須將ACK置為1,當(dāng)ACK=1表示確認(rèn)號字段有效
- 同步(SYN):在鏈接建立時使用,SYN=1,ACK=0表示是一個鏈接請求,若對方同意建立連接,則響應(yīng)報文段為SYN=1,ACK=1
- 推送(PSH):接收 TCP 收到 PSH = 1 的報文段,就盡快地交付接收應(yīng)用進(jìn)程,而不再等到整個緩存都填滿了后再向上交付。
- 復(fù)位(RST):當(dāng) RST = 1 時,表明 TCP 連接中出現(xiàn)嚴(yán)重差錯(如由于主機(jī)崩潰或其他原因),必須釋放連接,然后再重新建立運(yùn)輸連接。
- 終止(FIN):FIN = 1 表明此報文段的發(fā)送端的數(shù)據(jù)已發(fā)送完畢,并要求釋放運(yùn)輸連接。
窗口
????????窗口值作為接受方讓發(fā)送方設(shè)置其發(fā)送窗口的依據(jù),單位為字節(jié)(限制是因為接受方的數(shù)據(jù)緩存空間是有限的)
檢驗和(占 2 字節(jié))
????????檢驗和字段檢驗的范圍包括首部和數(shù)據(jù)這兩部分。在計算檢驗和時,要在 TCP 報文段的前面加上 12 字節(jié)的偽首部。
緊急指針(占 16 位)
????????指出在本報文段中緊急數(shù)據(jù)共有多少個字節(jié)(緊急數(shù)據(jù)放在本報文段數(shù)據(jù)的最前面)。
?2、TCP三次握手和四次揮手
?2、1 三次握手
第一次握手:客戶端向服務(wù)端發(fā)送了一個同步報文段
? ? ? ? SYN=1:表示客戶端請求連接
第二次握手:服務(wù)端收到了用戶端的請求,同意建立連接,然后服務(wù)器發(fā)送確認(rèn)報文段給客戶端
? ? ? ? SYN=1 ACK=1:表示同意建立連接
第三次握手:客戶端收到了服務(wù)端同意連接的確認(rèn)之后,開始發(fā)送第一個數(shù)據(jù)包? ?
? ? ? ? ACK:表示收到服務(wù)器的確認(rèn)數(shù)據(jù)包?
2、2?四次揮手?
?????????
?第一次揮手:客戶端向服務(wù)端發(fā)送連接釋放的請求報文,并且停止發(fā)送數(shù)據(jù)
? ? ? ? FIN=1:客戶端主動釋放客戶端到服務(wù)端的TCP連接
第二次揮手:服務(wù)端收到了客戶端的請求釋放報文,給客戶端發(fā)送確認(rèn)報文。從客戶端到服務(wù)端這個方向上的連接就釋放了,TCP連接處于半關(guān)閉狀態(tài)。此時客戶端無法發(fā)送數(shù)據(jù)給服務(wù)端,但是服務(wù)端還可以發(fā)送數(shù)據(jù)給客戶端,客戶端仍可以接收。
? ? ? ? ACK=1:表示同意客戶端釋放連接請求
第三次揮手:服務(wù)端沒有數(shù)據(jù)再發(fā)給客戶端數(shù)據(jù),其應(yīng)用進(jìn)程就通知TCP釋放連接,并向客戶端發(fā)送確認(rèn)報文
? ? ? ? FIN=1 ACK=1:表示服務(wù)器釋放服務(wù)器到客戶端的TCP連接
第四次揮手:客戶端收到服務(wù)端的釋放報文段后,給服務(wù)端發(fā)送同意確認(rèn)報文?
3、代碼實現(xiàn)
? ? ? ? TCP進(jìn)行數(shù)據(jù)的傳輸是基于流進(jìn)行的
????????客戶端:使用的是Socket對象發(fā)送數(shù)據(jù)
public static void main(String[] args) {
try(Socket clientSocket= new Socket("192.168.1.113",8080);) {
//客戶端接收服務(wù)端發(fā)送的數(shù)據(jù)
try(BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));) {
String result = reader.readLine();
System.out.println(result);
}
} catch (Exception e) {
e.printStackTrace();
}
}
?????????服務(wù)端:使用的是ServerSocket?對象接受數(shù)據(jù)
public static void main(String[] args) {
try(ServerSocket server = new ServerSocket(8080);) {
//服務(wù)器處于阻塞狀態(tài),等待客戶端的連接
Socket accept = server.accept();
System.out.println(accept.getRemoteSocketAddress());
//服務(wù)端向客戶端發(fā)送數(shù)據(jù)
try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()))) {
writer.write("提貨碼:"+UUID.randomUUID().toString().substring(0,6).toUpperCase());
writer.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
二、UDP協(xié)議
1、UDP特點??
- 用戶數(shù)據(jù)報協(xié)議UDP(User Datagram Protocol) 是傳輸層的協(xié)議,無連接(即發(fā)送數(shù)據(jù)之前不需要建立連接)。
- UDP 面向報文傳輸,不保證可靠交付,同時也不使用擁塞控制,適合多媒體通信的要求。
- UDP 支持一對一、一對多、多對一和多對多的交互通信。
- UDP 的首部開銷小,只有 8 個字節(jié)
2、首部格式?
- UDP的首部沒有“序號”字段,因為UDP協(xié)議只需要傳輸一個數(shù)據(jù)包,所以不需要序號。
- 用戶數(shù)據(jù)報 UDP 有兩個字段:數(shù)據(jù)字段和首部字段。首部字段有 8 個字節(jié),由 4 個字段組成,每個字段都是兩個字節(jié)。
?
3、代碼實現(xiàn)
? ? ? ? UDP進(jìn)行數(shù)據(jù)的傳輸使用的是數(shù)據(jù)包的方式?
????????客戶端?
public static void main(String[] args) {
//設(shè)置數(shù)據(jù)包
byte[] buff="你好?。。?!".getBytes();
DatagramPacket packet = new DatagramPacket(buff, buff.length);
packet.setData(buff); //將需要的數(shù)據(jù)寫入數(shù)據(jù)包
//基于UDP的Socket
//8081是設(shè)置自己的端口號
try(DatagramSocket socket=new DatagramSocket(8081)) {
//設(shè)置接收方的IP和端口
socket.connect(Inet4Address.getByName("192.168.0.148"),8080);
//發(fā)送數(shù)據(jù)包
socket.send(packet);
//接收接收端的回應(yīng)
byte[] buf=new byte[64];
packet.setData(buf);
socket.receive(packet);
//接受到的內(nèi)容
String result = new String(packet.getData(),packet.getOffset(),packet.getLength());
System.out.println("服務(wù)端發(fā)送的內(nèi)容:"+result);
} catch (IOException e) {
e.printStackTrace();
}
}
?????????服務(wù)端文章來源:http://www.zghlxwxcb.cn/news/detail-406124.html
public static void main(String[] args) {
//創(chuàng)建數(shù)據(jù)包用于接收
byte[] buff = new byte[64];
DatagramPacket packet = new DatagramPacket(buff, buff.length);
//監(jiān)聽8080端口
try(DatagramSocket socket = new DatagramSocket(8080)) {
//接受數(shù)據(jù),存入數(shù)據(jù)包
socket.receive(packet);
System.out.println("來自客戶端的字節(jié)內(nèi)容:"+Arrays.toString(packet.getData()));
System.out.println("來自客戶端的字節(jié)長度:"+packet.getLength());
System.out.println("來自客戶端的字節(jié)位置:"+packet.getOffset());
//接受到的內(nèi)容
String result = new String(packet.getData(),packet.getOffset(),packet.getLength());
System.out.println("客戶端發(fā)送的內(nèi)容:"+result);
//給發(fā)送方進(jìn)行反饋
packet.setData("收到了!?。?.getBytes());
socket.connect(Inet4Address.getByName("192.168.0.137"),8081);
socket.send(packet);
} catch (Exception e) {
e.printStackTrace();
}
}
三、TCP和UDP的區(qū)別?
- 面向連接:TCP協(xié)議需要建立連接,僅支持一對一通信;UDP協(xié)議無需建立連接,支持一對一、一對多、多對一和多對多的交互通信。
- 可靠傳輸:TCP協(xié)議通過確認(rèn)應(yīng)答、連接管理、流量控制、擁塞控制來確??煽啃詡鬏?;UDP不保證可靠性傳輸。
- 性能效率:TCP協(xié)議傳輸效率慢,需要較多的資源開銷。UDP協(xié)議傳輸效率快,需要較少的資源開銷。
- 首部格式:TCP協(xié)議的首部需要20-60個字節(jié),UDP協(xié)議需要8個字節(jié)。
-
應(yīng)用場景:TCP要求通信數(shù)據(jù)可靠(比如文件傳輸、郵件傳輸?shù)龋?,UDP適用于喲求通信速度快(如音頻、視頻等)文章來源地址http://www.zghlxwxcb.cn/news/detail-406124.html
到了這里,關(guān)于TCP協(xié)議與UDP協(xié)議的區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!