今日介紹內(nèi)容
1箫爷、網(wǎng)絡(luò)通信協(xié)議
2蛹含、UDP通信
3旱捧、TCP通信
第一章 網(wǎng)絡(luò)通信協(xié)議
? ? ? ? 通過計(jì)算機(jī)網(wǎng)絡(luò)可以使多臺計(jì)算機(jī)實(shí)現(xiàn)連接耘子,位于同一網(wǎng)絡(luò)中的計(jì)算機(jī)在進(jìn)行連接和通信時(shí)需要遵守一定的規(guī)則,這就好比在道路中行駛的汽車一定要遵守交通規(guī)則一樣她我。在計(jì)算機(jī)網(wǎng)絡(luò)中虹曙,這些連接和通信的規(guī)則被稱為網(wǎng)絡(luò)通信協(xié)議,它對數(shù)據(jù)的傳輸格式鸦难、傳輸速率、傳輸步驟等做了統(tǒng)一規(guī)定员淫,通信雙方必須同時(shí)遵守才能完成數(shù)據(jù)交換合蔽。
? ? ? ? 網(wǎng)絡(luò)通信協(xié)議有很多種,目前應(yīng)用最廣泛的是TCP/IP協(xié)議(Transmission Control Protocal/Internet Protocol 傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議)介返,它是一個(gè)包括TCP協(xié)議和IP協(xié)議拴事,UDP(User Datagram Protocol)協(xié)議和其它一些協(xié)議的協(xié)議組,
? ? ? 在進(jìn)行數(shù)據(jù)傳輸時(shí)圣蝎,要求發(fā)送的數(shù)據(jù)和收到的數(shù)據(jù)完全一樣刃宵,這時(shí),就需要在原有的數(shù)據(jù)上添加很多信息徘公,以保證數(shù)據(jù)在傳輸過程中數(shù)據(jù)格式完全一致牲证。TCP/IP協(xié)議的層次結(jié)構(gòu)比較簡單,共分為四層关面,如圖所示:
? ? ? ?上圖中:TCP/IP協(xié)議中的四層分別是應(yīng)用層坦袍、傳輸層、網(wǎng)絡(luò)層和鏈路層等太,每層分別負(fù)責(zé)不同的通信功能捂齐。四層詳解如下:
鏈路層:鏈路層是用于定義物理傳輸通道,通常是對某些網(wǎng)絡(luò)連接設(shè)備的驅(qū)動協(xié)議缩抡,例如針對光纖奠宜、網(wǎng)絡(luò)提供的驅(qū)動。
網(wǎng)絡(luò)層:網(wǎng)絡(luò)層是整個(gè)TCP/IP協(xié)議的核心,它主要用于將傳輸?shù)臄?shù)據(jù)進(jìn)行分組压真,將分組數(shù)據(jù)發(fā)送到目標(biāo)計(jì)算機(jī)或者網(wǎng)絡(luò)娩嚼。
傳輸層:主要使網(wǎng)絡(luò)程序進(jìn)行通信,在進(jìn)行網(wǎng)絡(luò)通信時(shí)榴都,可以采用TCP協(xié)議待锈,也可以采用UDP協(xié)議。
應(yīng)用層:主要負(fù)責(zé)應(yīng)用程序的協(xié)議嘴高,例如HTTP協(xié)議竿音、FTP協(xié)議等。
1.1 ?IP地址和端口號
? ? ? ?要想使網(wǎng)絡(luò)中的計(jì)算機(jī)能夠通信拴驮,必須為每臺計(jì)算機(jī)指定一個(gè)標(biāo)識號春瞬,通過這個(gè)標(biāo)識號來指定接受數(shù)據(jù)的計(jì)算機(jī)或者發(fā)送數(shù)據(jù)的計(jì)算機(jī)。
? ? ? ?在TCP/IP協(xié)議中套啤,這個(gè)標(biāo)識號就是IP地址宽气,它可以唯一標(biāo)識一臺計(jì)算機(jī),目前潜沦,IP地址廣泛使用的版本是IPv4萄涯,它是由4個(gè)字節(jié)大小的二進(jìn)制數(shù)來表示,如:0000010100000000000000000000001由于二進(jìn)制形式表示的IP地址非常不便記憶和處理唆鸡,因此通常會將IP地址寫成十進(jìn)制的形式涝影,每個(gè)字節(jié)用一個(gè)十進(jìn)制數(shù)字(0-255)表示,數(shù)字間用符號“.”分開争占,如:“192.168.1.100”燃逻。
? ? ? 隨著計(jì)算機(jī)網(wǎng)絡(luò)規(guī)模的不斷擴(kuò)大,對IP地址的需求也越來越多臂痕,IPv4這種4個(gè)字節(jié)表示的IP地址面臨枯竭伯襟,因此IPv6便應(yīng)用而生了,IPv6使用16個(gè)字節(jié)表示IP地址握童,它所擁有的地址容量約十IPv4的8*10^28倍姆怪,(8乘以10的28次冪倍)達(dá)到2^128個(gè)(算上全零的),這樣就解決了網(wǎng)絡(luò)地址資源數(shù)量不夠的問題澡绩。
通過IP地址可以連接到指定計(jì)算機(jī)片效,但如果想訪問目標(biāo)計(jì)算機(jī)中的某個(gè)應(yīng)用程序,還需要指定端口號英古。在計(jì)算機(jī)中淀衣,不同的應(yīng)用程序是通過端口號區(qū)分的,端口號是用兩個(gè)字節(jié)(16位的二進(jìn)制數(shù))表示的召调,它的取值范圍是0~65535膨桥,其中蛮浑,0~1023之間的端口號用于一些知名的網(wǎng)絡(luò)服務(wù)和應(yīng)用,用戶的普通應(yīng)用程序需要使用1024以上的端口號只嚣,從而避免端口號被另外一個(gè)應(yīng)用或服務(wù)所占用沮稚。我們通過一個(gè)圖來描述IP地址和端口號的作用,如圖:
從上圖中可以清楚地看到册舞,位于網(wǎng)絡(luò)中一臺計(jì)算機(jī)可以通過IP地址去訪問另一臺計(jì)算機(jī)蕴掏,并通過端口號訪問目標(biāo)計(jì)算機(jī)中的某個(gè)應(yīng)用程序。
上述歸納如下:
IP地址 :(1)網(wǎng)絡(luò)中設(shè)備的標(biāo)識调鲸。(2)不易記憶盛杰,可用主機(jī)名 (3)本地回環(huán)地址:127.0.0.1 主機(jī)名:localhost ??
端口號:(1)用于識別進(jìn)程的邏輯地址,不同的進(jìn)程的標(biāo)識藐石。(2)有效端口:0~65535即供,其中0~1024系統(tǒng)使用或者保留端口。
傳輸協(xié)議:通訊的規(guī)則于微,常見協(xié)議:TCP UDP
1.2 InetAdderss
了解了IP地址的作用逗嫡,在java中,JDK提供了一個(gè)InetAdderss類株依,該類用于封裝一個(gè)IP地址驱证,并提供了一系列與IP地址相關(guān)的方法,如下表
其中恋腕,前兩個(gè)方法用于獲得該類的實(shí)例對象抹锄,第一個(gè)方法用于獲得表示指定主機(jī)的InterAddress對象,第二個(gè)方法用于獲得表示本地的InteAddress對象吗坚,通過InetAddress對象便可獲取指定主機(jī)名祈远,IP地址等呆万,案例演示如下:
第二章 UDP與TCP協(xié)議
? ? ? ? ?在介紹TCP/IP結(jié)構(gòu)時(shí) ?,提到傳輸層的兩個(gè)重要的高級協(xié)議谋减,分別是UDP和TCP牡彻,其中UDP是User Datagram Protocol 的簡稱,稱為用戶數(shù)據(jù)報(bào)協(xié)議出爹,TCP是Transmission Control Protocol 的簡稱庄吼,稱為傳輸控制協(xié)議。
? ? ? ? UDP是無連接通信協(xié)議严就,即在數(shù)據(jù)傳輸時(shí)总寻,數(shù)據(jù)的發(fā)送端盒接收端不建立邏輯連接。簡單來說梢为,當(dāng)一臺計(jì)算機(jī)向另一臺計(jì)算機(jī)發(fā)送數(shù)據(jù)時(shí)渐行,發(fā)送端不會確認(rèn)接收端是否存在轰坊,就會發(fā)送數(shù)據(jù),同樣接收端在收到數(shù)據(jù)時(shí)祟印,也不會向發(fā)送端反饋是否收到數(shù)據(jù)肴沫。
由于使用UDP協(xié)議消耗資源小,通信效率高蕴忆,所以通常都會用于音頻和普通數(shù)據(jù)的傳輸颤芬,例如視頻會議都是用UDP協(xié)議,因?yàn)檫@種情況即使偶爾丟失一兩個(gè)數(shù)據(jù)包套鹅,也不會對接收結(jié)果產(chǎn)生太大影響站蝠。
但時(shí)在使用UDP協(xié)議傳送數(shù)據(jù)時(shí),由于UDP的面向無連接性芋哭,不能保證數(shù)據(jù)的完整性沉衣,因此在傳輸重要數(shù)據(jù)時(shí)不建議使用UDP協(xié)議,UDP的交換過程如下圖所示
以上歸納:(1)將數(shù)據(jù)及源和目的封裝成數(shù)據(jù)包减牺,不需要建立連接豌习。(2)每個(gè)數(shù)據(jù)報(bào)的大小限制在64K內(nèi)(3)因無連接,是不可靠協(xié)議 (4)不需要建立連接拔疚,速度快
2.1.1 DatagramPacket
前面介紹了UDP是一種面向無連接的協(xié)議肥隆,因此,在通信時(shí)發(fā)送端和接收端不用建立連接稚失。UDP通信的過程就像貨運(yùn)公司在兩個(gè)碼頭間發(fā)送貨物一樣栋艳,在碼頭發(fā)送和接收貨物時(shí)都需要使用集裝箱來裝卸貨物,UDP通信也是一樣句各,發(fā)送和接收的數(shù)據(jù)也需要使用“集裝箱”進(jìn)行打包吸占,為此JDK中提供了一個(gè)DatagramPacket類,該類的實(shí)例對象相當(dāng)于一個(gè)集裝箱凿宾,用于封裝UDP通信中發(fā)送或者接收的數(shù)據(jù)矾屯。
想要創(chuàng)建一個(gè)DatagramPacket對象,首先需要了解一下它的構(gòu)造方法初厚。在創(chuàng)建發(fā)送端和接收端的DatagramPacket對象時(shí)件蚕,使用的構(gòu)造方法有所不同,接收端的構(gòu)造方法只需要接收一個(gè)字節(jié)數(shù)組來存放接收到的數(shù)據(jù)产禾,而發(fā)送端的構(gòu)造方法不但要接收存放了發(fā)送數(shù)據(jù)的字節(jié)數(shù)組排作,還需要指定發(fā)送端IP地址和端口號。通過API文檔進(jìn)行詳細(xì)了解
2.1.2 DatagramSocket
DatagramPacket數(shù)據(jù)包的作用就如同是“集裝箱”亚情,可以將發(fā)送端或者接收端的數(shù)據(jù)封裝起來妄痪。然而運(yùn)輸貨物只有“集裝箱 ”是不夠的,還需要有碼頭楞件。在程序中國年需要實(shí)現(xiàn)通信只有DatagramPacket數(shù)據(jù)包也同樣不行衫生,為此JDK中提供的一個(gè)DatagramSocket類僧著。DatagramSocket類的作用就類似于碼頭,使用這個(gè)類的實(shí)例對象就可以發(fā)送和接收DatagramPacket數(shù)據(jù)包障簿,發(fā)送數(shù)據(jù)的過程如下圖所示:
2.1.3 網(wǎng)絡(luò)程序
講解了DatagramPacket和DatagramSocket的作用盹愚,接下來通過案例來學(xué)習(xí)在程序中的具體用法。下圖是UDP發(fā)送端與接收端交互圖解:
要實(shí)現(xiàn)UDP通信需要創(chuàng)建一個(gè)發(fā)送端程序和一個(gè)接收端程序站故,很明顯皆怕,在通信時(shí)只有接受收端程序先運(yùn)行,才能避免因發(fā)送端發(fā)送的數(shù)據(jù)無法接受西篓,而造成數(shù)據(jù)丟失愈腾,因此,首先需要來完成接受端程序的編寫岂津。
UDP完成數(shù)據(jù)的發(fā)送:發(fā)送端
2.2 TCP協(xié)議
TCP協(xié)虱黄,議是面向連接的通信協(xié)議,即在傳輸數(shù)據(jù)前先在發(fā)送端和接收端建立邏輯連接吮成,然后再傳輸數(shù)據(jù)橱乱,它提供了兩臺計(jì)算機(jī)之間可靠無差錯的數(shù)據(jù)傳輸。在TCP連接中必須要明確客戶端與服務(wù)器端粱甫,由客戶端向服務(wù)器發(fā)出連接請求泳叠,每次連接的創(chuàng)建都需要經(jīng)過“三次握手”。第一次握手:客戶端向服務(wù)器發(fā)出連接請求茶宵,等待服務(wù)器確認(rèn)危纫,第二次握手,服務(wù)器向客戶端回送一個(gè)響應(yīng)乌庶,通知客戶端收到了連接請求种蝶,第三次握手,客戶端再次向服務(wù)器端發(fā)送確認(rèn)信息瞒大,確認(rèn)連接螃征,整個(gè)交互過程如下圖:
由于TCP協(xié)議的面向連接特性,它可以保證傳輸數(shù)據(jù)的安全性糠赦,所以是一個(gè)被廣泛采用的協(xié)議会傲,例如在下載文件時(shí)锅棕,如果數(shù)據(jù)接收不完整拙泽,將會導(dǎo)致文件數(shù)據(jù)丟失而不能被打開,因此裸燎,下載文件時(shí)必須采用TCP協(xié)議顾瞻。
以上歸納:(1)建立連接,形成傳輸數(shù)據(jù)的通道德绿。(2)在連接中進(jìn)行大數(shù)據(jù)量傳輸 (3)通過三次握手完成連接荷荤,是可靠協(xié)議 (4)必須建立連接退渗,效率會稍低
2.2.2 TCP通信
TCP通信同UDP通信一樣,都能實(shí)現(xiàn)兩臺計(jì)算機(jī)之間的通信蕴纳,通信的兩端都需要創(chuàng)建socket對象会油。區(qū)別在于,UDP中只有發(fā)送端和接收端古毛,不區(qū)分客戶端與服務(wù)器端翻翩,計(jì)算機(jī)之間可以任意地發(fā)送數(shù)據(jù)。
而TCP通信是嚴(yán)格區(qū)分客戶端與服務(wù)器端的稻薇,在通信時(shí)嫂冻,必須先由客戶端去連接服務(wù)器端才能實(shí)現(xiàn)通信,服務(wù)器端不可以主動連接客戶端塞椎,并且服務(wù)器端程序需要事先啟動桨仿,等待客戶端的連接。
在java中案狠,JDK中提供了兩個(gè)類用于實(shí)現(xiàn)TCP程序服傍,一個(gè)是ServerSocket類,用于表示服務(wù)器端骂铁,就一個(gè)是Socket類伴嗡,用于表示客戶端。
通信時(shí)从铲,首先創(chuàng)建代表服務(wù)器端的ServerSocket對象瘪校,該對象相當(dāng)于開啟了一個(gè)服務(wù),并等待客戶端的連接名段,然后創(chuàng)建代表客戶端的Socket對象向服務(wù)器端發(fā)出連接的請求阱扬,服務(wù)器端響應(yīng)請求,兩者建立連接開始通信伸辟。
2.2.3簡單的TCP網(wǎng)絡(luò)程序