Java Socket編程:基本的術(shù)語(yǔ)和概念
計(jì)算機(jī)程序能夠相互聯(lián)網(wǎng),相互通訊,這使一切都成為可能,這也是當(dāng)今互聯(lián)網(wǎng)存在的基礎(chǔ)。那么程序是如何通過(guò)網(wǎng)絡(luò)相互通信的呢?這就是我記錄這系列的筆記的原因。Java語(yǔ)言從一開始就是為了互聯(lián)網(wǎng)而設(shè)計(jì)的,它為實(shí)現(xiàn)程序的相互通信提供了許多有用API,這類應(yīng)用編程接口被稱為套接字(Socket)。在開始學(xué)習(xí)Java Socket之前我們需要先來(lái)了解一下基本的術(shù)語(yǔ)和概念。
1.計(jì)算機(jī)網(wǎng)絡(luò)
計(jì)算機(jī)網(wǎng)絡(luò)由一組通過(guò)通信信道(Communication channel)相互連接的機(jī)器組成。這些機(jī)器被稱為:主機(jī)(hosts)和路由器(routers):
- 通信信道 —— 是將字節(jié)序列從一個(gè)主機(jī)傳輸?shù)搅硪粋€(gè)主機(jī)的一種手段(有線、無(wú)線(WiFi)等方式)。
- 主機(jī) —— 作用是運(yùn)行程序的計(jì)算機(jī)。
- 路由器 —— 作用是將信息從一個(gè)通信信道傳遞或轉(zhuǎn)發(fā)到另一個(gè)通信信道。
TCP/IP網(wǎng)絡(luò)通信流程圖:
2.分組報(bào)文
- 分組報(bào)文 —— 在網(wǎng)絡(luò)環(huán)境中由程序創(chuàng)建和解釋的字節(jié)序列。
3.協(xié)議
協(xié)議相當(dāng)于相互通信的一種約定,協(xié)議規(guī)定了分組報(bào)文的交換方式和它們包含意義。
互聯(lián)網(wǎng)所使用的協(xié)議是 TCP/IP 協(xié)議,TCP/IP 協(xié)議族主要包括:
- IP 協(xié)議(Internet Protocol,互聯(lián)網(wǎng)協(xié)議)
- TCP 協(xié)議(Transmission Control Protocol,傳輸控制協(xié)議)
- UDP 協(xié)議(User Datagram Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)
IP協(xié)議
- IP 協(xié)議 —— 是TCP/IP協(xié)議中唯一屬于網(wǎng)絡(luò)層的協(xié)議。將數(shù)據(jù)從一臺(tái)主機(jī)傳輸?shù)搅硪慌_(tái)主機(jī)。
- IP 協(xié)議 —— 提供了一種數(shù)據(jù)服務(wù):每組分組報(bào)文都有網(wǎng)絡(luò)獨(dú)立處理和分發(fā),類似于信件或包裹通過(guò)郵政系統(tǒng)發(fā)送一樣。
- IP 協(xié)議 —— 是一個(gè)"盡力而為"(best-effort)的協(xié)議:它試圖分發(fā)每一個(gè)分組報(bào)文,在網(wǎng)絡(luò)傳輸過(guò)程中,偶爾也會(huì)發(fā)生丟失報(bào)文是報(bào)文順序打亂,或者重復(fù)發(fā)送報(bào)文的情況?! ?/li>
在IP協(xié)議層之上是傳輸層(transport layer),它提供了兩種可選的協(xié)議:TCP協(xié)議和UDP協(xié)議,兩種協(xié)議都建立在IP層所提供的服務(wù)基礎(chǔ)上,二者也被稱為"端到端傳輸協(xié)議(end-to-end transport protocol)"根據(jù)應(yīng)用程序協(xié)議(Application protocol)的不同需求,使用了不同的方式傳輸數(shù)據(jù)。二者都有一個(gè)共同的功能:尋址。TCP協(xié)議和UDP協(xié)議使用的地址叫做端口號(hào)(port number),是用來(lái)區(qū)分同一主機(jī)不同應(yīng)用程序的。
TCP 協(xié)議
TCP協(xié)議能夠檢測(cè)和恢復(fù)IP層提供的主機(jī)到主機(jī)的信道中可能發(fā)生的報(bào)文丟失、重復(fù)以及其他錯(cuò)誤。TCP協(xié)議是一種面向連接(connection oriented)協(xié)議:在使用它進(jìn)行通信之前,兩個(gè)應(yīng)用程序之間首先要建立一個(gè)TCP連接,這涉及兩臺(tái)相互通信的主機(jī)的TCP部件間完成的握手消息(handshake message)的交換。
UDP 協(xié)議
UDP協(xié)議并不嘗試對(duì)IP層產(chǎn)生的錯(cuò)誤進(jìn)行修復(fù),它僅僅簡(jiǎn)單拓展了IP協(xié)議,"盡力而為"的數(shù)據(jù)服務(wù),使它能夠在應(yīng)用程序之間工作,而不是在主機(jī)之間工作。使用UDP協(xié)議的應(yīng)用程序需要對(duì)處理報(bào)文丟失、順序混亂等問(wèn)題做好準(zhǔn)備。
4.關(guān)于地址
在TCP/IP協(xié)議中,有兩部分信息用來(lái)定位一個(gè)指定的程序:互聯(lián)網(wǎng)地址(Internet address)和端口號(hào)(port number,范圍1-65535)。前者由IP協(xié)議使用,后者由傳輸協(xié)議(TCP/UDP)對(duì)其進(jìn)行解析。
互聯(lián)網(wǎng)地址有二進(jìn)制數(shù)字組成,有兩種形式:IPv4(32位)和IPv6(128位)。為了方便使用,兩個(gè)版本的IP協(xié)議有不同的表示方法:
- IPv4地址被表示為一組為4個(gè)十進(jìn)制數(shù),每?jī)蓚€(gè)數(shù)之間用圓點(diǎn)隔開,這種表示方法叫做:點(diǎn)分形式(dotted-quad)。
- IPv6地址的16個(gè)字節(jié)由幾組16進(jìn)制的數(shù)字表示,這些十六進(jìn)制數(shù)之間有分號(hào)隔開,每組數(shù)字分別代表了地址中的兩個(gè)字節(jié)。
回環(huán)地址
回環(huán)地址(loopback address)是被分配的一個(gè)特殊的回環(huán)接口(loopback interface),回環(huán)接口是一種虛擬設(shè)備,它的功能只是簡(jiǎn)單的把發(fā)送給它的報(bào)文立即返回給發(fā)送者。如IPv4中的:127.0.0.1
5.域名系統(tǒng)(Domain Name System,DNS)和本地配置數(shù)據(jù)庫(kù)
DNS是一種分布式數(shù)據(jù)庫(kù),它將向www.baidu.com這樣的域名映射到真實(shí)的互聯(lián)網(wǎng)地址和其他信息上。DNS協(xié)議允許連接到互聯(lián)網(wǎng)的主機(jī)通過(guò)TCP或者UDP協(xié)議從DNS數(shù)據(jù)庫(kù)獲取信息。
本地配置數(shù)據(jù)庫(kù)通常是一種與具體操作系統(tǒng)相關(guān)的機(jī)制,用來(lái)實(shí)現(xiàn)本地與互聯(lián)網(wǎng)地址的映射?! ?/p>
6.客戶端和服務(wù)器
客戶端(client)和服務(wù)器(server)這兩個(gè)術(shù)語(yǔ)分別代表了兩種角色:
- 客戶端是通信的發(fā)起者,而服務(wù)器程序則被動(dòng)等待客戶端發(fā)起通信,并對(duì)其作出響應(yīng)。
- 客戶端和服務(wù)器組成了應(yīng)用程序。
7.什么是Socket(套接字)
Socket(套接字)是一種抽象層,應(yīng)用程序通過(guò)它來(lái)發(fā)送和接受數(shù)據(jù),就像應(yīng)用程序打開一個(gè)文件句柄,將數(shù)據(jù)讀寫到穩(wěn)定的存儲(chǔ)器上一樣。
在TCP/IP協(xié)議族中的主要Socket類型為:
- 流套接字(stream socket):傳輸層使用TCP協(xié)議,提供了一個(gè)可信賴的字節(jié)流服務(wù)
- 數(shù)據(jù)報(bào)套接字(datagram socket):傳輸層使用UDP協(xié)議,提供了一個(gè)"盡力而為"的數(shù)據(jù)報(bào)服務(wù),最長(zhǎng)一次可以發(fā)送65500個(gè)字節(jié)的數(shù)據(jù)。
參考資料:《TCP/IP Socket in Java》
原文鏈接:http://www.cnblogs.com/IPrograming
【編輯推薦】