天天看點

socket通信需要網線連接配接嗎_socket網絡程式設計基礎知識篇

網絡通信是一種程序間通信(IPC,

Inter-Process

Communication),要求位于不同網絡節點不同程序的通信雙方必須遵循統一的通信協定方可實作。基于套接字(Socket)通信是應用在不同節點上的程序間通信的典型辦法。

1、基本原理

1.1、 Socket API基本概念

Socket

API是TCP/IP網絡的API,用于提供IPC通信。下面是socket

API的概念模型。 

socket通信需要網線連接配接嗎_socket網絡程式設計基礎知識篇

Socket是實體網絡位址和邏輯端口号的一個集合,通過這個集合可以向另外一個位置的與它具有相同定義的Socket進行資料傳輸。由于Socket是由機器位址和端口号來識别,那麼在一個特定的計算機網絡上,每一個socket都是由此方式被唯一辨別的,這也使得應用程式可以被唯一定位。socket類型有兩種:一個是流式socket,提供程序之間的邏輯連結,并且支援可靠的資料交換;另一個則是資料包socket,無連接配接且不可靠。

1.2、 JAVA對網絡通信的支援

JDK提供的預定義類庫支援Java程式直接發送與接收TCP資料段或UDP資料報,并幫助程式員以更直接的方式處理建立在TCP之上的應用層協定HTTP、FTP等。JDK預定義的類均放在程式包java.net中,使用其中哪些類取決于所需要處理的通信協定。例如,基于TCP的應用程式可使用Socket,ServerSocket等類;基于HTTP和FTP等協定直接通路URL資源的應用程式可使用URL、URLConnection等類。

1.3、TCP、UDP與端口

傳輸控制協定(TCP,

Transfer Control

Protocol)是一種面向連接配接的傳輸層協定,可為兩台主機上的應用程式提供可靠的資料流連接配接。所謂”面向連接配接”意味着兩個使用TCP通信的應用程式在交換資料之前必須先建立一個TCP連接配接,帶通信結束後須關閉該連接配接。這一過程與電話通信類似。TCP執行的任務包括把應用層傳來的資料分解為合适的資料段交給網絡層,确認接收到的資料分組,設定發送最後确認分組的逾時時間等,為應用層屏蔽了實作端到端可靠通信的細節。TCP可保證資料從連接配接的一端送到另一端時仍能保持原來發送時的次序,否則将出現一個傳輸錯誤。TCP為需要可靠通信的應用程式提供了一種點對點信道,在網際網路上常見的FTP、SMTP等協定都是建立在TCP的基礎上。

使用者資料報協定(UDP, User

Datagram

Protocol)不是基于連接配接的,而是為應用層提供一種非常簡單、高效的傳輸服務。UDP從一個應用程式向另一個應用程式發送獨立的資料報,但并不保證這些資料報一定能到達另一方,并且這些資料報的傳輸次序無保障,後發送的資料報可能先到達目的地。使用UDP協定時,任何必需的可靠性都須由應用層自己提供。UDP适用于對通信可靠性要求低且對通信性能要求高的應用,如DNS、RIP等協定都建立在UDP的基礎上。

由于現代計算機大多運作多任務作業系統,故一台主機上可能同時運作多個應用程式程序,并且一個程序還可能使用多個不同的連接配接,因而僅用主機名或IP位址無法唯一辨別資料包的源或目标。端口為辨別參與通信的主機、程序與連接配接提供了一種統一的、唯一的方法。

2、資料報socket

2.1

面向無連接配接資料包UDP

UDP協定使用資料報式套接字,在資料傳輸之前不需要先建立連接配接,UDP沒有組裝和重傳請求的功能,并不保證接收方能夠接收到該資料包,也不保證接收方所接收到的資料和發送方所發送的資料在内容和順序上是完全一緻的。其主要工作是将應用程式傳輸過來的資料分塊交給網絡層,确認接收到分組資訊。 

socket通信需要網線連接配接嗎_socket網絡程式設計基礎知識篇

2.2

面向連接配接資料包UDP

一般來說,很少用資料報socket實作面向連接配接通信,因為此API提供的連接配接非常簡單,通常難以滿足應用需求。 

socket通信需要網線連接配接嗎_socket網絡程式設計基礎知識篇

3、流式socket

3.1

基本程式設計原理

流式socket所完成的通信是一種基于連接配接的通信,即在通信開始之前先由通信雙方确認身份并建立一條專用的虛拟連接配接通道,然後它們通過這條通道傳送資料資訊進行通信,當通信結束時再将原先所建立的連接配接拆除。在這個過程中,Server端首先在某個端口提供一個監聽Client請求的監聽服務,并處于監聽狀态,當Client端向該Server的這個端口提出服務請求時,Server端課Client端就建立了一個連接配接和一條傳輸資料的通道,通信結束時該通道被拆除。 

socket通信需要網線連接配接嗎_socket網絡程式設計基礎知識篇

3.2

單線程服務程式與客戶程式

使用基于TCP協定的雙向通信時,網絡中的兩個應用程式之間必須首先建立一個連接配接,這一連接配接的兩個端點分别被稱為socket。由于socket被綁定到某一固定的端口号,故TCP可将資料傳輸給正确的應用程式。從應用變成的角度看,應用程式可将一個輸入流或一個輸出流綁定到某一socket,讀寫這些輸入/輸出流即可實作基于TCP的通信。

使用網絡通信的應用程式普遍采用客戶機/伺服器計算模型(C/S架構),其中客戶程式作為通信的發起者,向伺服器提出資訊或服務請求;服務程式則負責提供這種資訊或服務,服務程式經常在一個無限循環中等待客戶程式的請求并執行相應的服務。

在,申請建立一個到服務程式的連接配接。服務程式在收到某一客戶程式的連接配接請求後,并不是利用對外釋出的那個端口号建立與該客戶程式的連接配接,而是另外配置設定一個新的端口号建立與客戶程式之間的連接配接,原端口号仍用于監聽其他客戶程式的連接配接請求,不會因為該端口長期處理客戶程式請求而導緻其他客戶程式阻塞。 

socket通信需要網線連接配接嗎_socket網絡程式設計基礎知識篇

3.3 多線程服務程式

單線程的服務端在同一時刻隻能處理一個客戶連接配接,一旦服務程式的accept()被調用,服務程式主線程将持續執行客戶程式發來的服務請求,再無其他線程監聽服務程式對外釋出的端口,導緻後續的客戶連接配接請求失敗。一種簡單的改進途徑是當服務程式處理完一個客戶連接配接後再次循環執行accept()。這種改進雖然可以使服務程式在處理完一個客戶程式的所有服務請求後,還可繼續建立與下一客戶程式的連接配接并處理請求。但在一個客戶程式送出的服務請求需占用服務程式較長時間的情況下,其他客戶程式的連接配接請求将進入隊列等待,甚至可能因隊列溢出而丢失。

另外一種改進途徑是使用多線程程式設計方式,讓服務程式的主線程執行監聽客戶程式連接配接請求的任務,而處理客戶程式服務請求的任務則交由另一個建立的線程負責。

4、應用層協定開發

4.1 應用層協定了解

一般來說,網絡協定有三個要素,分别是:文法、語義與規則(時序)。語義規定了通信雙方彼此之間準備”講什麼”,即确定協定元素的類型;文法規定通信雙發彼此之間”如何講”,即确定協定元素的格式;變換規則用以規定通信雙方彼此之間的”應答關系”,即确定通信過程中的狀态變化,通常可用狀态變化圖來描述。針對應用層協定,此三要素的含義是:文法是消息的文法和描寫,語義是指消息的解釋或含義,規則是程序間通信的順序。

4.2 FTP協定開發

檔案傳輸協定FTP(File

Transfer

Protocol)是一個用于在兩台裝有不同作業系統的計算機之間傳輸計算機檔案的軟體标準,工作于應用層。FTP服務一般運作在20和21兩個端口。端口20用于在用戶端和伺服器之間傳輸資料流,而端口21用于傳輸控制流。當資料通過資料流傳輸時,控制流處于空閑狀态。 

socket通信需要網線連接配接嗎_socket網絡程式設計基礎知識篇

FTP協定有兩種工作方式:PORT方式和PASV方式,即主動模式和被動模式。主動模式要求用戶端和伺服器同時打開并且監聽一個端口以建立連接配接,主動模式的連接配接過程是:用戶端向伺服器的FTP端口(預設是21)發送連接配接請求,伺服器接受連接配接,建立一條指令鍊路。當需要傳送資料時,伺服器從20端口向用戶端的空閑端口發送連接配接請求,建立一條資料鍊路來傳送資料。

在主動模式下,用戶端可以由于安裝了防火牆會産生一些問題,是以創立了被動模式。被動模式隻要求伺服器端産生一個監聽相應端口的過程,這樣就可以繞過用戶端安裝了防火牆的問題。被動模式的連接配接過程是:用戶端向伺服器的FTP端口發送請求,伺服器接受連接配接,建立一條指令鍊路。當需要傳送資料時,用戶端向伺服器空閑端口發送連接配接請求,建立一條資料鍊路來傳送資料。

4.3 HTTP協定開發

超文本傳輸協定HTTP采用典型的”請求-答複”通信模型:客戶程式建立與伺服器程式的連接配接後,向服務程式發送一個服務請求;服務程式根據請求擷取相應的文檔作為答複送回客戶程式,最後關閉連接配接。 

socket通信需要網線連接配接嗎_socket網絡程式設計基礎知識篇

由于在客戶程式和服務程式的整個會話過程中可能需要建立多個連接配接(例如,為擷取兩個不同URL指定的資源而分别建立兩個TCP連接配接),而不是持久地使用同一TCP連接配接,故HTTP是一種無狀态協定。在HTTP協定的實作中可通過減少TCP連接配接的建立與次數以提高通信效率,HTTP/1.1的持久連接配接機制甚至還保證了客戶程式與服務程式之間同一類型元素持久地使用同一連接配接,但HTTP仍不能被視為一種可保持會話狀态的協定。