JavaAPI(網絡編程)

網絡通信協議

通信協議

?所謂通信協議,是指通信雙方在進行數據交換時必須遵守的規則和約定。?這些規則確保了雙方能夠有效地進行通信,實現信息的交換和資源共享。通信協議定義了傳輸時的數據格式控制信息以及傳輸順序速度等,確保雙方能夠“說同樣的語言”,從而成功地進行通信。

從產生"用戶數據"到真正使用"通信電纜"將數據發送出去這個階段,需要將用戶數據進行各種封裝與設計。而如何封裝和設計,這里有兩種模型可以選擇:

  • TCP/IP模型 : 設計4個層次,來封裝"用戶數據"。 簡單、方便、易用, 而被廣泛使用。

  • OSI模型 : 設計了7個層次,來封裝"用戶數據"。該模型過于理想化,未能在因特網上進行廣泛推廣

通信協議有很多種。

  • 應用層中,有HTTP、FTP、TELNET、DNS等。

  • 傳輸層中,有TCP、UDP。

  • 網絡層中,有IP、ICMP、ARP、RARP等。

我們在這里舉個例子,比如用戶想要消息到另一個客戶端,采用了HTTP、TCP、IP這些協議,以及調用了以太網接口。這個過程如下:

網絡接口層

網絡接口層,也叫數據鏈路層,該層的主要功能就是將準備要傳輸的數據的字節序列(0和1的序列),劃分成數據幀從一個節點傳輸到臨近的另一個節點,這些節點是通過MAC來唯一標識的。

  1. 封裝成幀: 把網絡層數據報加頭和尾,封裝成幀,幀頭中包括源MAC地址和目的MAC地址。

  2. 透明傳輸:零比特填充、轉義字符。

  3. 可靠傳輸: 在出錯率很低的鏈路上很少用,但是無線鏈路WLAN會保證可靠傳輸。

  4. 差錯檢測(CRC):接收者檢測錯誤,如果發現差錯,丟棄該幀。

網絡層

網絡層最常用的通信協議,就是IP協議了。所有的TCP,UDP,ICMP,IGMP的數據都基于IP協議的數據格式進行傳輸的。在數據鏈路層中我們一般通過MAC地址來識別不同的節點,而在網絡層我們也要有一個類似的地址標識,這就是IP地址

IP是 Internet Protocol (網絡互連協議),在計算機中,使用IP地址來描述一個上網終端的唯一的地址編號。分為 IPv4 和 IPv6。

IPv4 : 使用4個字節(32位)來描述一個IP地址,由四部分組成,每一部分一個字節。

IPv6 : 使用6個字節(48位)來描述一個IP地址,由六部分組成,每一部分一個字節。

32位IP地址分為網絡位和地址位,這樣做可以減少路由器中路由表記錄的數目,有了網絡地址,就可以限定擁有相同網絡地址的終端都在同一個范圍內,那么路由表只需要維護一條這個網絡地址的方向,就可以找到相應的這些終端了。

IP 地址的分類:

A類: 1.0.0.1 ~ 126.255.255.254 :保留給政府機構

B類: 128.0.0.1 ~ 191.255.255.254 :分配給大中型企業

C類: 192.0.0.1 ~ 223.255.255.254 :分配給任何有需要的個人

D類: 224.0.0.1 ~ 239.255.255.254 :用于組播

E類: 240.0.0.1 ~ 255.255.255.254 :用于實驗

IP協議頭部

這里只說一個生存時間(TTL),這個不是一個時間的概念,實際上是指可以中轉多少個路由器的意思,每經過一個路由器,TTL會減少 1,直到變成0 則丟棄該包。這個字段的最大值也就是255,也就是說一個協議包也就在路由器里面穿行255次就會被拋棄了,根據系統的不同,這個數字也不一樣,一般是32或者是64

IP 作為整個 TCP/IP 協議族中至關重要的協議,主要負責將數據包發送給最終的目標計算機,為上層協議提供無狀態、無連接、不可靠的服務。

  • 無狀態:無狀態是指 IP 通信雙方是不同步傳輸數據的狀態信息。所有 IP 數據報的發送、傳輸和接收都是相互獨立。

  • 無連接:無連接是指 IP 通信雙方都不長久的維持對方的任何信息。上層協議每次發送數據的時候,都需要明確指出對方的 IP 地址。

  • 不可靠:不能保證 IP 數據報準確到達接收端,它只承諾盡最大努力交付。IP 模塊一旦檢測到數據報發送失敗,就通知上層協議,而不會試圖重傳。

傳輸層

TCP/UDP都是傳輸層的協議,但是兩者具有不同的特性,同時也具有不同的應用場景,下面以圖表的形式對比分析。

TCPUDP
可靠性可靠不可靠
連接線面向連接無連接
報文面向字節流面向報文
效率
雙工性全雙工一對一,一對多,多對一,多對多
流量控制滑動窗口
擁塞控制慢開始,擁塞避免,快重傳,快恢復
應用場景對效率要求低,對準確性要求高,有連接需求的場景對效率要求高,對準確性要求低
  • 面向報文

    面向報文的傳輸方式是應用層交給UDP多長的報文,UDP就照樣發送,即一次發送一個報文。因此,應用程序必須選擇合適大小的報文。若報文太長,則IP層需要分片,降低效率。若太短,會是IP太小

  • 面向字節流

    面向字節流的話,雖然應用程序和TCP的交互是一次一個數據塊(大小不等),但TCP把應用程序看成是一連串的無結構的字節流。TCP有一個緩沖,當應用程序傳送的數據塊太長,TCP就可以把它劃分短一些再傳送。

?TCP和UDP協議的一些應用

應用層協議應用場景傳輸層
SMTP電子郵件TCP
TELNET遠程終端連接TCP
HTTP萬維網TCP
FTP文件傳輸TCP
DNS域名轉換UDP
TFTP文件傳輸UDP
SNMP網絡管理UDP
NFS遠程文件服務器UDP

?網絡編程概述

其實,所謂的網絡編程,就是編寫程序,實現讓同一個網絡中的機器可以進行數據的傳遞,實現通信。

Java是 Internet 的語言,它從語言級上提供了對網絡應用程序的支持。

Java提供的網絡類庫,可以實現無痛的網絡連接,聯網的底層細節被隱藏在 Java 的本機安裝系統里,由 JVM 進行控制,并且Java 實現了一個跨平臺的網絡庫,因此程序員面對的是一個統一的網絡編程環境,很容易開發常見的網絡應用程序。

網絡編程必備的條件

如果要實現兩臺機器之間實現通信,必須要滿足幾點要求:

1、需要知道對方的 IP 地址。

2、需要知道對方的哪一個端口號來做數據的接收。

3、通信的雙方,需要遵循相同的通信協議。

IP地址和端口號

端口是設備與外界進行通信的數據的出口。端口號的范圍: [0,65535]。

常見的端口占用:

3306: MySQL

1521 :Oracle

8080 :Tomcat

80:HTTP

區別:

  • IP地址(Internet Protocol Address)是一個獨特的標識符,用于在網絡中標識設備(如計算機、服務器、路由器等)。它可以是 IPv4(如 192.168.1.1)或 IPv6(如 2001:0db8:85a3:0000:0000:8a2e:0370:7334)格式。IP地址的主要功能是確定設備的位置,以便在網絡上進行數據傳輸。
  • 主要用于網絡層,負責尋址和路由,幫助數據包找到目的地。每個連接到網絡的設備必須有一個唯一的 IP地址,以便其他設備能夠通過這個地址與它進行通信。
  • 通常用字符串表示,IPv4格式為四組數字(每組0到255),用點分隔(如 192.168.1.1);IPv6格式為八組十六進制數字,用冒號分隔(如 2001:0db8:85a3:0000:0000:8a2e:0370:7334)。
  • 連接到網絡上的設備,如:192.168.1.1010.0.0.5

  • 端口號是一個 16 位的數字(范圍在 0 到 65535),用于標識網絡服務或應用程序。在同一臺設備上,多個應用程序可以通過不同的端口號進行通信。例如,HTTP 服務通常使用端口 80,HTTPS 使用端口 443,FTP 使用端口 21。
  • 主要用于傳輸層,負責識別設備上的特定服務或應用程序。通過組合 IP地址和端口號,可以確定特定設備上的特定應用程序(例如,通過?192.168.1.1:80?可以訪問該 IP 地址下的 HTTP 服務)。
  • 僅為一個整數,通常在 IP 地址之后以冒號形式表示(例如,192.168.1.1:8080)。
  • 如果你在瀏覽器中輸入?http://192.168.1.10:8080,這里的?192.168.1.10?是目標設備的 IP地址,而?8080?是指定的服務端口號。

    IP地址和端口號一起構成了一個完整的網絡地址,用于唯一標識在網絡上的一個特定服務。例如,一個 web 服務器的地址可以表示為?192.168.1.10:80,其中?192.168.1.10?是 IP 地址,80?是端口號。

TCP/IP程序編程

C/S架構模型

CS架構由客戶端和服務器兩個部分組成,通常采用C/S模式進行通信。其中,客戶端負責向用戶提供界面和交互功能,而服務器則負責存儲和處理數據。在這種架構中,客戶端和服務器之間通過網絡進行通信,客戶端向服務器發出請求,服務器響應并返回相應的結果。

目前,CS架構已被廣泛應用于各種場景中,如Web應用程序、電子郵件、數據庫管理等,并且具有可擴展性、可靠性和安全性等優點。

TCP利用Socket(套接字)接口來實現C/S模型的網絡程序開發,其早已被廣泛的采用。通常,主動發起通信的應用程序屬于客戶端。而服務器則是等待通信請求,當服務器收到客戶端的請求,執行需要的運算然后向客戶端返回結果。

如我們使用QQ軟件時,我們電腦上安裝的就是一個客戶端軟件,而騰訊必需運行一個服務器。

Socket套接字介紹

socket被稱為套接字,用于描述IP地址和端口號。主機上一般運行了多個服務軟件,同時提供多種服務,每種服務都會打開一個Socket,并綁定到一個端口上,不同的端口對應不同的服務。

Socket和ServerSocket類位于java.net包中,ServerSocket用于服務端,Socket是建立網絡連接時使用的。在連接成功時,應用程序兩端都會產生一個Socket實例,兩個Socket構成一個通信管道。操作這個實例,完成所需要的通信。

套接字的基本操作有七個基本操作:

  1. 連接到遠程主機

  2. 綁定到端口

  3. 接收從遠程機器來的連接請求

  4. 監聽到達的數據

  5. 發送數據

  6. 接收數據

  7. 關閉連接。

Socket編程步驟

1)服務端編程步驟如下:
  1. 調用 ServerSocket(int port) 創建一個服務器端套接字,并綁定到指定端口上。

  2. 調用 accept(),監聽連接請求,如果客戶端請求連接,則接受連接,返回通信套接字。

  3. 調用 Socket類的 getOutputStream 和 getInputStream 獲取輸出流和輸入流,開始網絡數據的發送和接收。

  4. 最后關閉通信套接字。

2)客戶段編程步驟如下:
  1. 創建 Socket。根據指定的 IP和port構造 Socket 類對象,并發送連接請求。如服務器端響應,則建立客戶端到服務器的通信線路。

  2. 通過Socket獲取與服務器的通信流。 使用 getInputStream()方法獲得輸入流,使用 getOutputStream()方法獲得輸出流。

  3. 按照一定的協議對 Socket進行讀/寫操作。通過輸入流讀取服務端響應的信息,通過輸出流將信息發送給服務端。

  4. 關閉 Socket。斷開客戶端到服務器的連接,釋放線路

3)流連接
  1. 客戶端和服務器端的套接字對象誕生以后,必須進行輸入、輸出流的連接。

  2. 套接字調用 close()可以關閉雙方的套接字連接,只要一方關閉連接,就會導致對方發生IOException異常。

三個常用類的API

InetAddress

InetAddress,是一個用來描述IP地址的類;常用的兩個子類,分別是Inet4Address 、Inet6Address 。

InetAddress的實例對象由一個IP地址和可能與之對應的主機名(域名)組成

互聯網中的主機地址有兩種表現形式:
域名: www.baidu.com
IP地址: 110.242.68.4
域名容易記憶,當在連接網絡時輸入一個主機的域名后,域名服務器(DNS)負責將域名轉化成IP地址,這樣才能和主機建立連接。

  • ?static ?InetAddress ?getLocalHost()?

?? ?返回本地主機的地址。 ?

  • static ?InetAddress ?getByName(String host)?

?? ?確定主機名稱的IP地址。

  • String ?getHostAddress()?

?? ?返回文本顯示中的IP地址字符串。 ?

  • String ?getHostName()?

?? ?獲取此IP地址的主機名。 ?


 //獲取本機的信息InetAddress local = InetAddress.getLocalHost();System.out.println("主機名:"+local.getHostName());System.out.println("主機地址:"+local.getHostAddress());System.out.println("地址的字節數組形式:"+ Arrays.toString(local.getAddress()));//注意:  getByName(String ip),該方法會主動與指定的IP地址發送請求連接,如果連接成功則會獲取一些網絡信息。//      如果該ip在互聯網上不存在,則報異常:UnknownHostExceptionInetAddress byName = InetAddress.getByName("www.baidu.com");System.out.println("主機名:"+byName.getHostName());System.out.println("主機地址:"+byName.getHostAddress());System.out.println("地址的字節數組形式:"+ Arrays.toString(byName.getAddress()));

客戶端編程:Socket

Socket是一個用來描述TCP中的客戶端的類

常用構造器

  • ?Socket(String ip,int port)
  • ?Socket(InetAddress ip,int port)

? ?ip是指要連接的服務端的IP
? ?port是指要連接的服務端的端口號


常用方法

  • InetAddress getLocalAddress()

返回對方Socket中的IP的InetAddress對象

  • int getLocalPort()

返回本地Socket中的端口號

  • InetAddress getInetAddress()

返回對方Socket中IP地址

  • int getPort()

返回對方Socket中的端口號

  • void close() throws IOException

關閉Socket,釋放資源

  • InputStream getInputStream() throws IOException

獲取與Socket相關聯的字節輸入流,用于從Socket中讀數據。

  • OutputStream getOutputStream() throws IOException

獲取與Socket相關聯的字節輸出流,用于向Socket中寫數據。


  try {//定義客戶端的Socket,向服務端發送請求Socket client = new Socket(InetAddress.getByName("192.168.30.50"),10086);System.out.println(client);// 服務端的IP,Port,還有自己的端口號(系統隨機分配的)System.out.println("服務端的端口號:"+client.getPort());System.out.println("服務端的IP:"+client.getInetAddress().getHostName());//如何向服務端發送信息呢?  通過套接字的輸出流對象OutputStream outputStream = client.getOutputStream();PrintWriter pw = new PrintWriter(new OutputStreamWriter(outputStream,"utf-8"),true);//發送信息,調用輸出方法while (true){try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}pw.println("是你嗎?服務端");}} catch (IOException e) {e.printStackTrace();}}

?服務端編程: ServerSocket

常用構造器:

  • ServerSocket(int port)

通過指定一個端口號,來規定服務端某一個通信服務功能。


常用方法:

  • Socket accept() throws IOException

?用來接收客戶端的請求,如果獲得了請求操作,則返回與那個客戶端相關的Socket套接字對象,如果沒有獲取請求操作前,具有阻塞效果。

?注意:如果客戶端莫名的死掉了,則與服務端斷開連接了,服務端這邊針對于那個客戶端的socket就會斷開,然后拋出異常

  • void close()throws IOException

關閉監聽Socket

  • InetAddress getInetAddress()

返回此服務器套接字的本地地址

  • int getLocalPort()

返回此套接字在其上監聽的端口號

  • SocketAddress getLocalSocketAddress()

返回此套接字綁定的端點的地址

  • void setSoTimeout(int timeout) throws SocketException

設置accept()方法等待連接的時間為timeout毫秒。若時間已到,還沒有客戶端連接,則拋出InterruptedIOException異常,accept()方法不再阻塞,該傾聽Socket可繼續使用。若timeout值為0,則表示accept()永遠等待。該方法必須在傾聽Socket創建后,在accept()之前調用才有效。


 BufferedReader br = null;try {//定義一個通信服務端口,用來搜集客戶端的信息ServerSocket server = new ServerSocket(10086);//用于規定阻塞方法accept()的等待時間,如果超時,則拋異常,不再等待。server.setSoTimeout(10000);InetAddress inetAddress = server.getInetAddress();System.out.println("主機名:"+inetAddress.getHostName());System.out.println("主機地址:"+inetAddress.getHostAddress());System.out.println("地址的字節數組形式:"+ Arrays.toString(inetAddress.getAddress()));int localPort = server.getLocalPort();System.out.println("該通信服務端綁定的端口號:"+localPort);SocketAddress localSocketAddress = server.getLocalSocketAddress();System.out.println("本套接字綁定的Ip和端口號:"+localSocketAddress);Socket accept = server.accept(); //只有獲取到請求連接時,才會繼續向下執行。(阻塞效果)System.out.println("---服務端說:已經有一個客戶端連接上了--");System.out.println("客戶端的端口號:"+accept.getPort());System.out.println("客戶端的IP:"+accept.getInetAddress().getHostName());//如何獲取客戶端發送過來的數據: 調用與那個客戶端相關的套接字來獲取輸入流InputStream inputStream = accept.getInputStream();br = new BufferedReader(new InputStreamReader(inputStream,"utf-8"));String line = null;while((line = br.readLine())!=null){  //注意,此時的readline()是有阻塞效果的System.out.println(line);}System.out.println("------over-----------");} catch (IOException e) {e.printStackTrace();}finally {try {br.close();} catch (IOException e) {e.printStackTrace();}}

?傳輸層的TCP連接

三次握手

三次握手的原文是 three-way handshake,整個名詞的可以翻譯為:需要三個步驟才能建立握手/連接的機制。當然,三次握手也可以叫 three-message handshake,通過三條消息來建立的握手/連接。

進行三次握手的主要作用就是為了確認雙方的接收能力和發送能力是否正常、指定自己的 初始化序列號(Init Sequense Number, ISN) 為后面的可靠性傳輸做準備。

  • SYN:連接請求/接收報文段

  • seq:發送的第一個字節的序號

  • ACK:確認報文段

  • ack:確認號。希望收到的下一個數據的第一個字節的序號

剛開始客戶端處于 Closed 的狀態,而服務端處于 Listen 狀態

CLOSED :沒有任何連接狀態

LISTEN :偵聽來自遠方 TCP 端口的連接請求

1)第一次握手:客戶端向服務端發送一個連接請求報文。報文中有SYN = 1,和 seq = x(x是隨機的初始化序列號ISN,表示本報文段所發送的數據的第一個字節的序號)。TCP規定,SYN報文段(SYN=1的報文段)不能攜帶數據,但需要消耗掉一個序號。這個三次握手中的開始。表示客戶端想要和服務端建立連接。此時客戶端處于 SYN_Send 狀態。

SYN-SENT :同步已發送狀態

2)第二次握手:服務器收到客戶端的 SYN 報文之后,如何同意連接,則發出確認報文。確認報文中有SYN = 1,ACK = 1,同時把 x + 1 作為確認號 ack 的值,并且指定自己的初始化序列號 ISN(y),即圖中的 seq = y。這個報文也不能攜帶數據,但是同樣要消耗一個序號。這個報文帶有SYN(建立連接)和ACK(確認)標志,詢問客戶端是否準備好。此時服務器處于 SYN_REVD 的狀態。

SYN-RECEIVED:同步收到狀態

3)第三次握手:客戶端收到服務器端的確認報文后,還會再向服務器發送一個 確認報文。確認報文中有ACK = 1 ,同時把服務器的 ISN + 1 作為 ack 的值(ack = y + 1),表示已經收到了服務端發來的的 SYN 報文。并指明此時客戶端的序列號 seq = x + 1(表示第二個報文)。

TCP規定,ACK報文段可以攜帶數據,但是如果不攜帶數據則不消耗序號。這里客戶端表示我已經準備好。

此時客戶端處于 Establised 狀態。服務器收到 ACK 報文之后,也處于 Establised 狀態,至此,雙方建立起了 TCP 連接。

ESTABLISHED:已建立連接狀態

?為什么要三次握手

三次夠用了,不需要四次。但是二次握手就建立連接的話,有可能在網絡波動的情況下讓服務端產生連接錯覺。

舉例:已失效的連接請求報文段。

client發送了第一個連接的請求報文,但是由于網絡不好,這個請求沒有立即到達服務端,而是在某個網絡節點中滯留了,直到某個時間才到達server
本來這已經是一個失效的報文,但是server端接收到這個請求報文后,還是會想client發出確認的報文,表示同意連接。
假如不采用三次握手,那么只要server發出確認,新的建立就連接了,但其實這個請求是失效的請求,client是不會理睬server的確認信息,也不會向服務端發送確認的請求
但是server認為新的連接已經建立起來了,并一直等待client發來數據,這樣,server的很多資源就沒白白浪費掉了
采用三次握手就是為了防止這種情況的發生,server會因為收不到確認的報文,就知道client并沒有建立連接。這就是三次握手的作用。

?連接中

建立連接后,兩臺主機就可以相互傳輸數據了。如下圖所示:

1)主機A初始seq為1200,滑動窗體為100,向主機B傳遞數據的過程。

2)假設主機B在完全成功接收數據的基礎上,那么主機B為了確認這一點,向主機A發送 ACK 包,并將 Ack 號設置為 1301。因此按如下的公式確認 Ack 號:

Ack號 = Seq號 + 傳遞的字節數 + 1 (這是在完全接受成功的情況下)

3)主機A獲得B傳來的ack(1301)后,開始發送seq為1301,滑動窗體為100的數據。

......

與三次握手協議相同,最后加 1 是為了告訴對方要傳遞的 Seq 號。上面說了,主機B完全成功接收A發來的數據才是這樣的,如果存在丟包該如何。

下面分析傳輸過程中數據包丟失的情況,如下圖所示:

上圖表示通過 Seq 1301 數據包向主機B傳遞100字節的數據,但中間發生了錯誤,主機B未收到。經過一段時間后,主機A仍未收到對于 Seq 1301 的ACK確認,因此嘗試

重傳數據。為了完成數據包的重傳,TCP套接字每次發送數據包時都會啟動定時器,如果在一定時間內沒有收到目標機器傳回的 ACK 包,那么定時器超時,數據包會重傳。

上面也只是一種可能,比如數據1250丟失,那么Ack返回的就是1250。

四次揮手

?

第一次揮手

客戶端發送請求,請求斷開連接,請求報文里有

  • FIN = 1 (表示數據已經完成了數據的發送,沒有新的數據要發送了),

  • seq = u(等于前面已經傳送過來的數據的最后一個字節的序號加1),

此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。 TCP規定,FIN報文段即使不攜帶數據,也要消耗一個序號。

第二次揮手

服務端收到客戶端的請求斷開連接的報文后,需要向客戶端發送一個確認報文,該報文里有ACK = 1 ,ack = u + 1,seq = v(自己的序列號).

此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。

這個時候,客戶端不能給服務器發送信息報文,只能接收。但是服務器要是還有信息要傳給客戶端,仍然能傳送。

客戶端收到服務器的確認請求后,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最后的數據)。

第三次揮手

服務器將最后的數據發送完畢后,就向客戶端發送連接釋放報文,FIN = 1,ACK = 1,ack=u+1,seq=w(在半關閉狀態,服務器很可能又發送了一些數據,序列化發生了變化)。

此時,服務器就進入了LAST-ACK(最后確認)狀態,等待客戶端的確認。

第四次揮手

客戶端接收到服務器的連接釋放報文后,需要向服務器發送確認報文。

ACK=1,ack=w+1,seq=u+1(自己的序列號)。

此時,客戶端就進入了TIME-WAIT(時間等待)狀態。

注意此時TCP連接還沒有釋放,必須經過2??MSL(最長報文段壽命)的時間后,當客戶端撤銷相應的TCB后,才進入CLOSED狀態。

服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB后,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。

通信協議

TCP協議

是一個傳輸層的通信協議,是一個安全的,面向連接的通信協議。所謂的安全,指的是在數據傳遞的過程中,不會出現數據丟失的問題。 特點:安全的、面向連接。

TCP/IP 因其傳輸控制協議(TCP)和網絡互聯協議(IP)而得名。實際上是一組協議,其包含多個具有不同功能且互為關聯的協議。

TCP/IP協議模型從更實用的角度出發,形成了高效的四層體系結構,即網絡接口層、IP層、傳輸層和應用層。

TCP與UDP的區別

運輸層協議中有兩個非常重要的協議:

  • 傳輸控制協議TCP(Transmission Control Protocol)

  • 用戶數據報協議UDP(User Datagram Protocol)

TCP是面向連接的運輸層協議。即應用進程(或程序)在使用TCP協議之前,必須先建立TCP連接,在傳輸完畢后,釋放已經建立的連接。利用TCP協議進行通信的兩個應用進程,一個是服務器進程。另一個是客戶進程。

UDP是面向無連接的運輸層協議。即應用進程(或程序)在使用UDP協議之前,不必先建立連接。自然,發送數據結束時也沒有連接需要釋放。因此,減少了開銷和發送數據之前的時延。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72266.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72266.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72266.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java---入門基礎篇(下)---方法與數組

前言 本篇文章主要講解有關方法與數組的知識點 ,是基礎篇的一部分 , 而在下一篇文章我會講解類和對象的知識點 入門基礎篇上的鏈接給大家放在下面啦 ! Java---入門基礎篇(上)-CSDN博客 感謝大家點贊👍🏻收藏?評論?🏻 歡迎各位大佬指點…

Python 爬蟲 – BeautifulSoup

Python 爬蟲(Web Scraping)是指通過編寫 Python 程序從互聯網上自動提取信息的過程。 爬蟲的基本流程通常包括發送 HTTP 請求獲取網頁內容、解析網頁并提取數據,然后存儲數據。 Python 的豐富生態使其成為開發爬蟲的熱門語言,特…

圖像分類項目1:基于卷積神經網絡的動物圖像分類

一、選題背景及動機 在現代社會中,圖像分類是計算機視覺領域的一個重要任務。動物圖像分類具有廣泛的應用,例如生態學研究、動物保護、農業監測等。通過對動物圖像進行自動分類,可以幫助人們更好地了解動物種類、數量和分布情況,…

物聯網 智慧園區井蓋管理辦法和功能介紹

在園區內實現 智慧井蓋 的定位、內部氣體檢測和紅外監測等頂級功能,可以顯著提升園區的安全管理水平和運維效率。以下是智慧井蓋系統的詳細設計方案和功能實現: 一、系統架構 智慧井蓋系統可以分為以下層次: 1. 感知層 定位模塊&#xff1…

零基礎deep seek+剪映,如何制作高品質的視頻短片

以下是專為零基礎學習者設計的 剪映專業版詳細教程+Deep seek配合制 ,包含從入門到精通的系統化教學,配合具體操作步驟與實用技巧: 基于DeepSeek與剪映協同制作高品質視頻短片的專業流程指南(2025年最新實踐版&#x…

PHP:IDEA開發工具配置XDebug,斷點調試

文章目錄 一、php.ini配置二、IDEA配置 一、php.ini配置 [xdebug] zend_extension"F:\wamp64\bin\php\php7.4.0\ext\php_xdebug-2.8.0-7.4-vc15-x86_64.dll" xdebug.remote_enable on xdebug.remote_host 127.0.0.1 xdebug.remote_port 9001 xdebug.idekey"…

改進YOLOv8模型的空間注意力機制研究:RFAConv的貢獻與實現

文章目錄 1. 背景介紹2. 什么是RFAConv?3. YOLOv8中的RFAConv實現3.1 RFAConv模塊設計3.2 在YOLOv8中集成RFAConv4. 性能對比與實驗結果4.1 實驗設置4.2 實驗結果5. 模型優化與調優5.1 調整RFAConv模塊的超參數5.2 數據增強策略5.3 更深層的注意力機制5.4 混合卷積與優化計算圖…

【Java】使用jdk自帶的zip壓縮實現任意文件壓縮打包下載功能(復制即用)

前言 在實際項目中,我們可能會接到將文件或者資料打包壓縮導出的需求,例如將系統中某些生成的文件一起打包壓縮下載提供給客戶使用,今天提供一個jdk自帶的工具類快速實現打包壓縮的功能,方法我已經封裝好,大家如果在項…

騰訊云擴容記錄

騰訊云擴容: sudo yum install -y cloud-utils-growpart 安裝擴容工具 sudo file -s /dev/vda1 有數據 sudo LC_ALLen_US.UTF-8 growpart /dev/vda 1 sudo resize2fs /dev/vda1 df -Th 完畢 以下是對執行的命令的詳細解釋以及背后的原理: 1. 安裝 cloud…

服務流程設計和服務或端口重定向及其websocket等應用示例

服務流程設計和服務或端口重定向及其websocket等應用示例 目錄 服務或端口重定向的服務設計和websocket等應用示例 一、通用請求控制流程 1.1、入口 1.2、所有GET請求首先預檢控制單元 1.3、http請求會分別自動307重定向 1.4、所有請求首先執行跨源控制單元 1.5、然后…

PHP面試題--后端部分

本文章持續更新內容 之前沒來得及整理時間問題導致每次都得找和重新背 這次整理下也方便各位小伙伴一起更輕松的一起踏入編程之路 歡迎各位關注博主不定期更新各種高質量內容適合小白及其初級水平同學一起學習 一起成為大佬 數組函數有那些 ps:本題挑難的背因為…

深入了解 MySQL 中的 JSON_CONTAINS

深入了解 MySQL 中的 JSON_CONTAINS MySQL 5.7 及更高版本引入了對 JSON 數據類型的支持,使得在數據庫中存儲和查詢 JSON 數據成為可能。在這些新功能中,JSON_CONTAINS 函數是一個非常有用的工具,允許我們檢查一個 JSON 文檔是否包含特定的值…

git命令學習記錄

1. git reset 參數說明 git reset 是用來回退版本的,它可以添加三個參數,常用的使用格式是這樣的:git reset [--hard | --soft | --mixed] 版本號 一般使用git修改文件并提交需要三步,第一步在文本編輯器中編輯文件,也…

使用DeepSeek+KIMI生成高質量PPT

一、使用DeepSeek DeepSeek官網:DeepSeek 點擊“開始對話”,進入交互頁面。 在上圖中,輸入問題,即可獲取AI生成的結果。 基礎模型(V3):通用模型(2024.12),高…

深度學習工程師的技術圖譜和學習路徑

在構建一個深度學習工程師的技術圖譜時,按照“技能樹與能力模型”的結構可以幫助清晰地展示出技術體系的層次化關系,幫助學習者更好地理解每個技術點的依賴與順序。 深度學習工程師的技術圖譜和學習路徑 以下是深度學習工程師的技能樹,包括從基礎到進階的學習路徑,以及對…

RabbitMQ系列(五)基本概念之Queue

在 RabbitMQ 中,Queue(隊列) 是存儲消息的容器,也是消息傳遞的核心載體。以下是其核心特性與作用的全方位解析: 一、Queue 的定義與核心作用 消息存儲容器 Queue 是 RabbitMQ 中實際存儲消息的實體,生產者…

MySQL—使用binlog日志恢復數據

一、binlog日志恢復數據簡介 在 MySQL 中,使用二進制日志(binlog)恢復數據是一種常見的用于故障恢復或數據找回的方法。以下是詳細的使用步驟: 確認 binlog 已啟用:首先需要確認 MySQL 服務器已經啟用了二進制日志功…

VADv2: 基于矢量表征和概率規劃的E2E架構

1. 寫在前面 今天分享一篇自動駕駛領域的論文VADv2(End-to-End Vectorized Autonomous Driving via Probabilistic Planning), 基于矢量表征和概率規劃的E2E架構,2024年2月份華中科技大和地平線合作的一篇文章, 在經典的端到端模型架構上作出了基于概率規劃去輸出規劃軌跡的…

NLP11-命名實體識別(NER)概述

目錄 一、序列標注任務 常見子任務 二、 命名實體識別(NER) (一)簡介 (二)目標 (三)應用場景 (四)基本方法 (五)工具與資源 一…

虛擬仿真無線路由器5G和2.4G發射信號輻射對比(虛擬仿真得出最小安全距離,與國際標準要求一致)

1、前言 有人說,只要有電磁波的地方就有輻射。5G和2.4G信號輻射強度是多少?是否會對人體構成危害?無線路由器的2.4GHz頻段,頻率范圍:2.4 GHz 至 2.4835 GHz,信道寬度:通常為20 MHz,…