網絡通信協議
通信協議
?所謂通信協議,是指通信雙方在進行數據交換時必須遵守的規則和約定。?這些規則確保了雙方能夠有效地進行通信,實現信息的交換和資源共享。通信協議定義了傳輸時的數據格式、控制信息以及傳輸順序和速度等,確保雙方能夠“說同樣的語言”,從而成功地進行通信。
從產生"用戶數據"到真正使用"通信電纜"將數據發送出去這個階段,需要將用戶數據進行各種封裝與設計。而如何封裝和設計,這里有兩種模型可以選擇:
-
TCP/IP模型 : 設計4個層次,來封裝"用戶數據"。 簡單、方便、易用, 而被廣泛使用。
-
OSI模型 : 設計了7個層次,來封裝"用戶數據"。該模型過于理想化,未能在因特網上進行廣泛推廣
通信協議有很多種。
-
應用層中,有HTTP、FTP、TELNET、DNS等。
-
傳輸層中,有TCP、UDP。
-
網絡層中,有IP、ICMP、ARP、RARP等。
我們在這里舉個例子,比如用戶想要消息到另一個客戶端,采用了HTTP、TCP、IP這些協議,以及調用了以太網接口。這個過程如下:
網絡接口層
網絡接口層,也叫數據鏈路層,該層的主要功能就是將準備要傳輸的數據的字節序列(0和1的序列),劃分成數據幀從一個節點傳輸到臨近的另一個節點,這些節點是通過MAC來唯一標識的。
-
封裝成幀: 把網絡層數據報加頭和尾,封裝成幀,幀頭中包括源MAC地址和目的MAC地址。
-
透明傳輸:零比特填充、轉義字符。
-
可靠傳輸: 在出錯率很低的鏈路上很少用,但是無線鏈路WLAN會保證可靠傳輸。
-
差錯檢測(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都是傳輸層的協議,但是兩者具有不同的特性,同時也具有不同的應用場景,下面以圖表的形式對比分析。
TCP | UDP | |
可靠性 | 可靠 | 不可靠 |
連接線 | 面向連接 | 無連接 |
報文 | 面向字節流 | 面向報文 |
效率 | 低 | 高 |
雙工性 | 全雙工 | 一對一,一對多,多對一,多對多 |
流量控制 | 滑動窗口 | 無 |
擁塞控制 | 慢開始,擁塞避免,快重傳,快恢復 | 無 |
應用場景 | 對效率要求低,對準確性要求高,有連接需求的場景 | 對效率要求高,對準確性要求低 |
面向報文
面向報文的傳輸方式是應用層交給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.10
、10.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構成一個通信管道。操作這個實例,完成所需要的通信。
套接字的基本操作有七個基本操作:
-
連接到遠程主機
-
綁定到端口
-
接收從遠程機器來的連接請求
-
監聽到達的數據
-
發送數據
-
接收數據
-
關閉連接。
Socket編程步驟
1)服務端編程步驟如下:
-
調用 ServerSocket(int port) 創建一個服務器端套接字,并綁定到指定端口上。
-
調用 accept(),監聽連接請求,如果客戶端請求連接,則接受連接,返回通信套接字。
-
調用 Socket類的 getOutputStream 和 getInputStream 獲取輸出流和輸入流,開始網絡數據的發送和接收。
-
最后關閉通信套接字。
2)客戶段編程步驟如下:
-
創建 Socket。根據指定的 IP和port構造 Socket 類對象,并發送連接請求。如服務器端響應,則建立客戶端到服務器的通信線路。
-
通過Socket獲取與服務器的通信流。 使用 getInputStream()方法獲得輸入流,使用 getOutputStream()方法獲得輸出流。
-
按照一定的協議對 Socket進行讀/寫操作。通過輸入流讀取服務端響應的信息,通過輸出流將信息發送給服務端。
-
關閉 Socket。斷開客戶端到服務器的連接,釋放線路
3)流連接
-
客戶端和服務器端的套接字對象誕生以后,必須進行輸入、輸出流的連接。
-
套接字調用 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協議之前,不必先建立連接。自然,發送數據結束時也沒有連接需要釋放。因此,減少了開銷和發送數據之前的時延。