socket通信需要网线连接吗_socket网络编程基础知识篇
網(wǎng)絡(luò)通信是一種進(jìn)程間通信(IPC,
Inter-Process
Communication),要求位于不同網(wǎng)絡(luò)節(jié)點(diǎn)不同進(jìn)程的通信雙方必須遵循統(tǒng)一的通信協(xié)議方可實(shí)現(xiàn)。基于套接字(Socket)通信是應(yīng)用在不同節(jié)點(diǎn)上的進(jìn)程間通信的典型辦法。
1、基本原理
1.1、 Socket API基本概念
Socket
API是TCP/IP網(wǎng)絡(luò)的API,用于提供IPC通信。下面是socket
API的概念模型。?
Socket是物理網(wǎng)絡(luò)地址和邏輯端口號(hào)的一個(gè)集合,通過這個(gè)集合可以向另外一個(gè)位置的與它具有相同定義的Socket進(jìn)行數(shù)據(jù)傳輸。由于Socket是由機(jī)器地址和端口號(hào)來(lái)識(shí)別,那么在一個(gè)特定的計(jì)算機(jī)網(wǎng)絡(luò)上,每一個(gè)socket都是由此方式被唯一標(biāo)識(shí)的,這也使得應(yīng)用程序可以被唯一定位。socket類型有兩種:一個(gè)是流式socket,提供進(jìn)程之間的邏輯鏈接,并且支持可靠的數(shù)據(jù)交換;另一個(gè)則是數(shù)據(jù)包socket,無(wú)連接且不可靠。
1.2、 JAVA對(duì)網(wǎng)絡(luò)通信的支持
JDK提供的預(yù)定義類庫(kù)支持Java程序直接發(fā)送與接收TCP數(shù)據(jù)段或UDP數(shù)據(jù)報(bào),并幫助程序員以更直接的方式處理建立在TCP之上的應(yīng)用層協(xié)議HTTP、FTP等。JDK預(yù)定義的類均放在程序包java.net中,使用其中哪些類取決于所需要處理的通信協(xié)議。例如,基于TCP的應(yīng)用程序可使用Socket,ServerSocket等類;基于HTTP和FTP等協(xié)議直接訪問URL資源的應(yīng)用程序可使用URL、URLConnection等類。
1.3、TCP、UDP與端口
傳輸控制協(xié)議(TCP,
Transfer Control
Protocol)是一種面向連接的傳輸層協(xié)議,可為兩臺(tái)主機(jī)上的應(yīng)用程序提供可靠的數(shù)據(jù)流連接。所謂”面向連接”意味著兩個(gè)使用TCP通信的應(yīng)用程序在交換數(shù)據(jù)之前必須先建立一個(gè)TCP連接,帶通信結(jié)束后須關(guān)閉該連接。這一過程與電話通信類似。TCP執(zhí)行的任務(wù)包括把應(yīng)用層傳來(lái)的數(shù)據(jù)分解為合適的數(shù)據(jù)段交給網(wǎng)絡(luò)層,確認(rèn)接收到的數(shù)據(jù)分組,設(shè)置發(fā)送最后確認(rèn)分組的超時(shí)時(shí)間等,為應(yīng)用層屏蔽了實(shí)現(xiàn)端到端可靠通信的細(xì)節(jié)。TCP可保證數(shù)據(jù)從連接的一端送到另一端時(shí)仍能保持原來(lái)發(fā)送時(shí)的次序,否則將出現(xiàn)一個(gè)傳輸錯(cuò)誤。TCP為需要可靠通信的應(yīng)用程序提供了一種點(diǎn)對(duì)點(diǎn)信道,在因特網(wǎng)上常見的FTP、SMTP等協(xié)議都是建立在TCP的基礎(chǔ)上。
用戶數(shù)據(jù)報(bào)協(xié)議(UDP, User
Datagram
Protocol)不是基于連接的,而是為應(yīng)用層提供一種非常簡(jiǎn)單、高效的傳輸服務(wù)。UDP從一個(gè)應(yīng)用程序向另一個(gè)應(yīng)用程序發(fā)送獨(dú)立的數(shù)據(jù)報(bào),但并不保證這些數(shù)據(jù)報(bào)一定能到達(dá)另一方,并且這些數(shù)據(jù)報(bào)的傳輸次序無(wú)保障,后發(fā)送的數(shù)據(jù)報(bào)可能先到達(dá)目的地。使用UDP協(xié)議時(shí),任何必需的可靠性都須由應(yīng)用層自己提供。UDP適用于對(duì)通信可靠性要求低且對(duì)通信性能要求高的應(yīng)用,如DNS、RIP等協(xié)議都建立在UDP的基礎(chǔ)上。
由于現(xiàn)代計(jì)算機(jī)大多運(yùn)行多任務(wù)操作系統(tǒng),故一臺(tái)主機(jī)上可能同時(shí)運(yùn)行多個(gè)應(yīng)用程序進(jìn)程,并且一個(gè)進(jìn)程還可能使用多個(gè)不同的連接,因而僅用主機(jī)名或IP地址無(wú)法唯一標(biāo)識(shí)數(shù)據(jù)包的源或目標(biāo)。端口為標(biāo)識(shí)參與通信的主機(jī)、進(jìn)程與連接提供了一種統(tǒng)一的、唯一的方法。
2、數(shù)據(jù)報(bào)socket
2.1
面向無(wú)連接數(shù)據(jù)包UDP
UDP協(xié)議使用數(shù)據(jù)報(bào)式套接字,在數(shù)據(jù)傳輸之前不需要先建立連接,UDP沒有組裝和重傳請(qǐng)求的功能,并不保證接收方能夠接收到該數(shù)據(jù)包,也不保證接收方所接收到的數(shù)據(jù)和發(fā)送方所發(fā)送的數(shù)據(jù)在內(nèi)容和順序上是完全一致的。其主要工作是將應(yīng)用程序傳輸過來(lái)的數(shù)據(jù)分塊交給網(wǎng)絡(luò)層,確認(rèn)接收到分組信息。?
2.2
面向連接數(shù)據(jù)包UDP
一般來(lái)說(shuō),很少用數(shù)據(jù)報(bào)socket實(shí)現(xiàn)面向連接通信,因?yàn)榇薃PI提供的連接非常簡(jiǎn)單,通常難以滿足應(yīng)用需求。?
3、流式socket
3.1
基本編程原理
流式socket所完成的通信是一種基于連接的通信,即在通信開始之前先由通信雙方確認(rèn)身份并建立一條專用的虛擬連接通道,然后它們通過這條通道傳送數(shù)據(jù)信息進(jìn)行通信,當(dāng)通信結(jié)束時(shí)再將原先所建立的連接拆除。在這個(gè)過程中,Server端首先在某個(gè)端口提供一個(gè)監(jiān)聽Client請(qǐng)求的監(jiān)聽服務(wù),并處于監(jiān)聽狀態(tài),當(dāng)Client端向該Server的這個(gè)端口提出服務(wù)請(qǐng)求時(shí),Server端課Client端就建立了一個(gè)連接和一條傳輸數(shù)據(jù)的通道,通信結(jié)束時(shí)該通道被拆除。?
3.2
單線程服務(wù)程序與客戶程序
使用基于TCP協(xié)議的雙向通信時(shí),網(wǎng)絡(luò)中的兩個(gè)應(yīng)用程序之間必須首先建立一個(gè)連接,這一連接的兩個(gè)端點(diǎn)分別被稱為socket。由于socket被綁定到某一固定的端口號(hào),故TCP可將數(shù)據(jù)傳輸給正確的應(yīng)用程序。從應(yīng)用變成的角度看,應(yīng)用程序可將一個(gè)輸入流或一個(gè)輸出流綁定到某一socket,讀寫這些輸入/輸出流即可實(shí)現(xiàn)基于TCP的通信。
使用網(wǎng)絡(luò)通信的應(yīng)用程序普遍采用客戶機(jī)/服務(wù)器計(jì)算模型(C/S架構(gòu)),其中客戶程序作為通信的發(fā)起者,向服務(wù)器提出信息或服務(wù)請(qǐng)求;服務(wù)程序則負(fù)責(zé)提供這種信息或服務(wù),服務(wù)程序經(jīng)常在一個(gè)無(wú)限循環(huán)中等待客戶程序的請(qǐng)求并執(zhí)行相應(yīng)的服務(wù)。
在,申請(qǐng)建立一個(gè)到服務(wù)程序的連接。服務(wù)程序在收到某一客戶程序的連接請(qǐng)求后,并不是利用對(duì)外發(fā)布的那個(gè)端口號(hào)建立與該客戶程序的連接,而是另外分配一個(gè)新的端口號(hào)建立與客戶程序之間的連接,原端口號(hào)仍用于監(jiān)聽其他客戶程序的連接請(qǐng)求,不會(huì)因?yàn)樵摱丝陂L(zhǎng)期處理客戶程序請(qǐng)求而導(dǎo)致其他客戶程序阻塞。?
3.3 多線程服務(wù)程序
單線程的服務(wù)端在同一時(shí)刻只能處理一個(gè)客戶連接,一旦服務(wù)程序的accept()被調(diào)用,服務(wù)程序主線程將持續(xù)執(zhí)行客戶程序發(fā)來(lái)的服務(wù)請(qǐng)求,再無(wú)其他線程監(jiān)聽服務(wù)程序?qū)ν獍l(fā)布的端口,導(dǎo)致后續(xù)的客戶連接請(qǐng)求失敗。一種簡(jiǎn)單的改進(jìn)途徑是當(dāng)服務(wù)程序處理完一個(gè)客戶連接后再次循環(huán)執(zhí)行accept()。這種改進(jìn)雖然可以使服務(wù)程序在處理完一個(gè)客戶程序的所有服務(wù)請(qǐng)求后,還可繼續(xù)建立與下一客戶程序的連接并處理請(qǐng)求。但在一個(gè)客戶程序提交的服務(wù)請(qǐng)求需占用服務(wù)程序較長(zhǎng)時(shí)間的情況下,其他客戶程序的連接請(qǐng)求將進(jìn)入隊(duì)列等待,甚至可能因隊(duì)列溢出而丟失。
另外一種改進(jìn)途徑是使用多線程編程方式,讓服務(wù)程序的主線程執(zhí)行監(jiān)聽客戶程序連接請(qǐng)求的任務(wù),而處理客戶程序服務(wù)請(qǐng)求的任務(wù)則交由另一個(gè)新建的線程負(fù)責(zé)。
4、應(yīng)用層協(xié)議開發(fā)
4.1 應(yīng)用層協(xié)議理解
一般來(lái)說(shuō),網(wǎng)絡(luò)協(xié)議有三個(gè)要素,分別是:語(yǔ)法、語(yǔ)義與規(guī)則(時(shí)序)。語(yǔ)義規(guī)定了通信雙方彼此之間準(zhǔn)備”講什么”,即確定協(xié)議元素的類型;語(yǔ)法規(guī)定通信雙發(fā)彼此之間”如何講”,即確定協(xié)議元素的格式;變換規(guī)則用以規(guī)定通信雙方彼此之間的”應(yīng)答關(guān)系”,即確定通信過程中的狀態(tài)變化,通常可用狀態(tài)變化圖來(lái)描述。針對(duì)應(yīng)用層協(xié)議,此三要素的含義是:語(yǔ)法是消息的語(yǔ)法和描寫,語(yǔ)義是指消息的解釋或含義,規(guī)則是進(jìn)程間通信的順序。
4.2 FTP協(xié)議開發(fā)
文件傳輸協(xié)議FTP(File
Transfer
Protocol)是一個(gè)用于在兩臺(tái)裝有不同操作系統(tǒng)的計(jì)算機(jī)之間傳輸計(jì)算機(jī)文件的軟件標(biāo)準(zhǔn),工作于應(yīng)用層。FTP服務(wù)一般運(yùn)行在20和21兩個(gè)端口。端口20用于在客戶端和服務(wù)器之間傳輸數(shù)據(jù)流,而端口21用于傳輸控制流。當(dāng)數(shù)據(jù)通過數(shù)據(jù)流傳輸時(shí),控制流處于空閑狀態(tài)。?
FTP協(xié)議有兩種工作方式:PORT方式和PASV方式,即主動(dòng)模式和被動(dòng)模式。主動(dòng)模式要求客戶端和服務(wù)器同時(shí)打開并且監(jiān)聽一個(gè)端口以建立連接,主動(dòng)模式的連接過程是:客戶端向服務(wù)器的FTP端口(默認(rèn)是21)發(fā)送連接請(qǐng)求,服務(wù)器接受連接,建立一條命令鏈路。當(dāng)需要傳送數(shù)據(jù)時(shí),服務(wù)器從20端口向客戶端的空閑端口發(fā)送連接請(qǐng)求,建立一條數(shù)據(jù)鏈路來(lái)傳送數(shù)據(jù)。
在主動(dòng)模式下,客戶端可以由于安裝了防火墻會(huì)產(chǎn)生一些問題,所以創(chuàng)立了被動(dòng)模式。被動(dòng)模式只要求服務(wù)器端產(chǎn)生一個(gè)監(jiān)聽相應(yīng)端口的過程,這樣就可以繞過客戶端安裝了防火墻的問題。被動(dòng)模式的連接過程是:客戶端向服務(wù)器的FTP端口發(fā)送請(qǐng)求,服務(wù)器接受連接,建立一條命令鏈路。當(dāng)需要傳送數(shù)據(jù)時(shí),客戶端向服務(wù)器空閑端口發(fā)送連接請(qǐng)求,建立一條數(shù)據(jù)鏈路來(lái)傳送數(shù)據(jù)。
4.3 HTTP協(xié)議開發(fā)
超文本傳輸協(xié)議HTTP采用典型的”請(qǐng)求-答復(fù)”通信模型:客戶程序建立與服務(wù)器程序的連接后,向服務(wù)程序發(fā)送一個(gè)服務(wù)請(qǐng)求;服務(wù)程序根據(jù)請(qǐng)求獲取相應(yīng)的文檔作為答復(fù)送回客戶程序,最后關(guān)閉連接。?
由于在客戶程序和服務(wù)程序的整個(gè)會(huì)話過程中可能需要建立多個(gè)連接(例如,為獲取兩個(gè)不同URL指定的資源而分別建立兩個(gè)TCP連接),而不是持久地使用同一TCP連接,故HTTP是一種無(wú)狀態(tài)協(xié)議。在HTTP協(xié)議的實(shí)現(xiàn)中可通過減少TCP連接的建立與次數(shù)以提高通信效率,HTTP/1.1的持久連接機(jī)制甚至還保證了客戶程序與服務(wù)程序之間同一類型元素持久地使用同一連接,但HTTP仍不能被視為一種可保持會(huì)話狀態(tài)的協(xié)議。
總結(jié)
以上是生活随笔為你收集整理的socket通信需要网线连接吗_socket网络编程基础知识篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue-resource如何设置同步异步
- 下一篇: h5 一镜到底_这些一镜到底的H5还能怎