一. 概述
本文是網(wǎng)絡(luò)編程系列的第一篇文章旗扑,所以不講代碼,主要是網(wǎng)絡(luò)編程的一些基礎(chǔ)知識,下面的這些知識點(diǎn)主要是對java網(wǎng)絡(luò)編程這本書的歸納與整理佃牛。
我們知道計(jì)算機(jī)之間的通信要經(jīng)過一系列復(fù)雜的過程,計(jì)算機(jī)之間通過傳輸介質(zhì)床未、通信設(shè)施和網(wǎng)絡(luò)通信協(xié)議互聯(lián)竭翠,實(shí)現(xiàn)資源共享和數(shù)據(jù)傳輸。而我們的網(wǎng)絡(luò)編程就是使用程序使互聯(lián)網(wǎng)的兩個(gè)(或多個(gè))計(jì)算機(jī)之間進(jìn)行數(shù)據(jù)傳輸薇搁。當(dāng)然java語言斋扰,為了實(shí)現(xiàn)兩個(gè)計(jì)算機(jī)之間的數(shù)據(jù)傳輸,提供了一系列的接口啃洋,使得開發(fā)人員可以方便的實(shí)現(xiàn)传货。
不過在正式開始代碼編寫之前就先看看一些通信的基本知識。
二 宏娄、網(wǎng)絡(luò)體系結(jié)構(gòu)
計(jì)算機(jī)之間的通信要經(jīng)過一系列復(fù)雜的過程问裕,必須將這兩臺計(jì)算機(jī)的物理邏輯和通信邏輯好好的規(guī)劃好。為此我們先看看計(jì)算機(jī)網(wǎng)絡(luò)的層次模型孵坚。然后再進(jìn)行分析粮宛。
從上面這張圖我們對計(jì)算機(jī)之間的通信特點(diǎn)進(jìn)行整理一下:
(1)計(jì)算機(jī)之間的網(wǎng)絡(luò)通信被分解為多個(gè)層,層與層之間用接口連接卖宠。
(2)通信的雙方具有相同的層次窟勃,層次實(shí)現(xiàn)的功能由協(xié)議數(shù)據(jù)單元(PDU)來描述。
(3)不同系統(tǒng)中的同一層構(gòu)成對等層逗堵,對等層之間通過對等層協(xié)議進(jìn)行通信秉氧。
(4)在通信的時(shí)候數(shù)據(jù)必須由一層依次傳遞到下一層,不能跨級傳輸蜒秤。
為了促進(jìn)計(jì)算機(jī)網(wǎng)絡(luò)的發(fā)展汁咏,國際標(biāo)準(zhǔn)化組織ISO在現(xiàn)有網(wǎng)絡(luò)的基礎(chǔ)上,提出了不基于具體機(jī)型作媚、操作系統(tǒng)或公司的網(wǎng)絡(luò)體系結(jié)構(gòu)攘滩,稱為開放系統(tǒng)互連參考模型,即OSI/RM纸泡。但是ISO制定的OSI參考模型過于龐大漂问、復(fù)雜招致了許多批評。因此美國國防部提出了TCP/IP協(xié)議棧參考模型女揭,簡化了OSI參考模型蚤假,獲得了廣泛的應(yīng)用。
1吧兔、OSI參考模型
這里首先介紹OSI參考模型磷仰,是國際標(biāo)準(zhǔn)化組織ISO提出的,把網(wǎng)絡(luò)通信的工作分為7層境蔼,分別是物理層灶平、數(shù)據(jù)鏈路層伺通、網(wǎng)絡(luò)層、傳輸層逢享、會(huì)話層罐监、表示層和應(yīng)用層。也是我們在大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)課程中認(rèn)識的那樣瞒爬。下面一張圖來看看笑诅。
(1)物理層處于OSI的最底層,是開放系統(tǒng)的基礎(chǔ)疮鲫,它的功能主要是為計(jì)算機(jī)提供傳送數(shù)據(jù)的通路以及傳輸數(shù)據(jù)吆你。
(2)數(shù)據(jù)鏈路層的主要任務(wù)是實(shí)現(xiàn)計(jì)算機(jī)網(wǎng)絡(luò)中相鄰節(jié)點(diǎn)之間的可靠傳輸,把原始的俊犯、有差錯(cuò)的物理傳輸數(shù)據(jù)加上數(shù)據(jù)鏈路協(xié)議以后妇多,構(gòu)成邏輯上可靠的數(shù)據(jù)鏈路。
(3)網(wǎng)絡(luò)層主要完成的功能主要包括路由選擇燕侠、網(wǎng)絡(luò)尋址者祖、流量控制、擁塞控制绢彤、網(wǎng)絡(luò)互連等七问。實(shí)現(xiàn)兩個(gè)計(jì)算機(jī)節(jié)點(diǎn)之間的數(shù)據(jù)傳輸。
(4)傳輸層涉及源端節(jié)點(diǎn)到目的端節(jié)點(diǎn)之間可靠的信息傳輸茫舶。也就是說是采用TCP/IP還是采用UDP協(xié)議械巡。他需要三次握手四次揮手。
(5)會(huì)話層的主要功能是負(fù)責(zé)應(yīng)用程序之間建立饶氏、維持和中斷會(huì)話讥耗,提供單工、半雙工和全雙工3種不同的通信方式疹启,使系統(tǒng)和服務(wù)之間有序地進(jìn)行通信古程。
(6)表示層關(guān)心所傳輸數(shù)據(jù)信息的格式定義,其主要功能是把應(yīng)用層提供的信息變換為能夠共同理解的形式喊崖,提供字符代碼挣磨、數(shù)據(jù)格式、控制信息格式荤懂、加密等的統(tǒng)一表示茁裙。
(7)應(yīng)用層是直接為應(yīng)用進(jìn)程提供服務(wù)的。其作用是多個(gè)系統(tǒng)應(yīng)用進(jìn)程相互通信的同時(shí)势誊,完成一系列業(yè)務(wù)處理所需的服務(wù)呜达。
2 谣蠢、TCP/IP參考模型
TCP/IP參考模型采用4層的層級結(jié)構(gòu)粟耻,每一層都呼叫它的下一層所提供的協(xié)議來完成自己的需求查近,這4個(gè)層次分別是:網(wǎng)絡(luò)接口層、網(wǎng)絡(luò)層(IP層)挤忙、傳輸層(TCP層)霜威、應(yīng)用層。
(1)網(wǎng)絡(luò)接口層:對應(yīng)著OSI參考模型的物理層和數(shù)據(jù)鏈路層
(2)網(wǎng)絡(luò)層(IP層):是整個(gè)TCP/IP協(xié)議棧的核心册烈。它的功能是把分組數(shù)據(jù)發(fā)往目標(biāo)網(wǎng)絡(luò)或主機(jī)戈泼。可以完成將不同類型的網(wǎng)絡(luò)(異構(gòu)網(wǎng))互連的任務(wù)赏僧。除此之外大猛,還需要完成擁塞控制的功能。
(3)傳輸層(TCP層):傳輸層負(fù)責(zé)在應(yīng)用進(jìn)程之間建立端到端的連接和可靠通信淀零。TCP層涉及兩個(gè)協(xié)議挽绩,TCP和UDP。TCP協(xié)議提供面向連接的服務(wù)驾中,提供按字節(jié)流的有序唉堪、可靠傳輸,可以實(shí)現(xiàn)連接管理肩民、差錯(cuò)控制唠亚、流量控制、擁塞控制等持痰。也就是可靠傳輸灶搜。UDP協(xié)議提供無連接的服務(wù),用于不需要或無法實(shí)現(xiàn)面向連接的網(wǎng)絡(luò)應(yīng)用中工窍。也就是不可靠傳輸占调。
(4)應(yīng)用層:為各種網(wǎng)絡(luò)應(yīng)用提供服務(wù)。
3移剪、網(wǎng)絡(luò)協(xié)議
OSI參考模型和TCP/IP模型在不同的層次中有許多不同的網(wǎng)絡(luò)協(xié)議究珊,如圖所示:
網(wǎng)絡(luò)協(xié)議之間的關(guān)系圖如下:
下面我們抽出來一些重要的協(xié)議看一下。其他的協(xié)議用到的時(shí)候再說纵苛。
(1)IP協(xié)議
IP協(xié)議的作用在于把各種數(shù)據(jù)包準(zhǔn)備無誤的傳遞給對方剿涮。由于IP地址是稀有資源,不可能每個(gè)人都擁有一個(gè)IP地址攻人,所以我們通常的IP地址是路由器給我們生成的IP地址取试,路由器里面會(huì)記錄我們的MAC地址。而MAC地址是全球唯一的怀吻。舉例瞬浓,IP地址就如同是我們居住小區(qū)的地址,而MAC地址就是我們住的那棟樓那個(gè)房間那個(gè)人蓬坡。
(2)TCP協(xié)議
TCP層是位于IP層之上猿棉,應(yīng)用層之下的中間層磅叛。有可靠的、像管道一樣的TCP連接萨赁,還有不可靠的包交換的UDP鏈接弊琴。那tcp協(xié)議之間的通信數(shù)據(jù)格式是什么樣子的呢?也就是什么樣的數(shù)據(jù)在傳輸杖爽,下面一張圖來看一下:
TCP報(bào)文段包括協(xié)議首部和數(shù)據(jù)兩部分敲董,協(xié)議首部的固定部分是20個(gè)字節(jié),首部的固定部分后面是選項(xiàng)部分慰安。
下面是報(bào)文段首部各個(gè)字段的含義腋寨,也是《計(jì)算機(jī)網(wǎng)絡(luò)》書中的說明:
源端口號以及目的端口號:各占2個(gè)字節(jié),端口是傳輸層和應(yīng)用層的服務(wù)接口化焕,用于尋找發(fā)送端和接收端的進(jìn)程精置,一般來講,通過端口號和IP地址锣杂,可以唯一確定一個(gè)TCP連接脂倦,在網(wǎng)絡(luò)編程中,通常被稱為一個(gè)socket接口元莫。
序號:Seq序號赖阻,占4個(gè)字節(jié)、32位踱蠢。用來標(biāo)識從TCP發(fā)送端向TCP接收端發(fā)送的數(shù)據(jù)字節(jié)流火欧。發(fā)起方發(fā)送數(shù)據(jù)時(shí)對此進(jìn)行標(biāo)記。
確認(rèn)序號:Ack序號茎截,占4個(gè)字節(jié)苇侵、32位。包含發(fā)送確認(rèn)的一端所期望收到的下一個(gè)序號企锌。只有ACK標(biāo)記位為1時(shí)榆浓,確認(rèn)序號字段才有效,因此撕攒,確認(rèn)序號應(yīng)該是上次已經(jīng)成功收到數(shù)據(jù)字節(jié)序號加1陡鹃,即Ack=Seq + 1。
數(shù)據(jù)偏移:占4個(gè)字節(jié)抖坪,用于指出TCP首部長度萍鲸,若不存在選項(xiàng),則這個(gè)值為20字節(jié)擦俐,數(shù)據(jù)偏移的最大值為60字節(jié)脊阴。
保留字段占6位,暫時(shí)可忽略,值全為0嘿期。
-
標(biāo)志位品擎,6個(gè)
URG(緊急):為1時(shí)表明緊急指針字段有效
ACK(確認(rèn)):為1時(shí)表明確認(rèn)號字段有效
PSH(推送):為1時(shí)接收方應(yīng)盡快將這個(gè)報(bào)文段交給應(yīng)用層
RST(復(fù)位):為1時(shí)表明TCP連接出現(xiàn)故障必須重建連接
SYN(同步):在連接建立時(shí)用來同步序號
FIN(終止):為1時(shí)表明發(fā)送端數(shù)據(jù)發(fā)送完畢要求釋放連接
接收窗口:占2個(gè)字節(jié),用于流量控制和擁塞控制秽五,表示當(dāng)前接收緩沖區(qū)的大小孽查。在計(jì)算機(jī)網(wǎng)絡(luò)中饥悴,通常是用接收方的接收能力的大小來控制發(fā)送方的數(shù)據(jù)發(fā)送量坦喘。TCP連接的一端根據(jù)緩沖區(qū)大小確定自己的接收窗口值,告訴對方西设,使對方可以確定發(fā)送數(shù)據(jù)的字節(jié)數(shù)瓣铣。
校驗(yàn)和:占2個(gè)字節(jié),范圍包括首部和數(shù)據(jù)兩部分贷揽。
選項(xiàng)是可選的棠笑,默認(rèn)情況是不選。
三次握手與四次揮手(超級重要禽绪。面試必問)
TCP是面向連接的協(xié)議蓖救,因此每個(gè)TCP連接都有3個(gè)階段:連接建立、數(shù)據(jù)傳送和連接釋放印屁。連接建立經(jīng)歷三個(gè)步驟循捺,通常稱為“三次握手”。
TCP三次握手過程如下:
1. 第一次握手(客戶端發(fā)送請求)
男孩:“咱倆處對象吧”雄人,并等待對方回復(fù)確認(rèn)从橘。
2. 第二次握手(服務(wù)端回傳確認(rèn))
女孩:告訴男孩說“可以”,
3. 第三次握手(客戶端回傳確認(rèn))
男孩說:“那就在一塊吧”础钠,于是倆人有了情侶鏈接關(guān)系了恰力。
注意:握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后旗吁,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)踩萎。
TCP四次揮手過程如下:
由于TCP連接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉很钓。這原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來終止這個(gè)方向的連接驻民。收到一個(gè)FIN只意味著這一方向上沒有數(shù)據(jù)流動(dòng),一個(gè)TCP連接在收到一個(gè)FIN后仍能發(fā)送數(shù)據(jù)履怯。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉回还,而另一方執(zhí)行被動(dòng)關(guān)閉。
1. 女孩:要和男孩分手叹洲,并等待男孩回應(yīng)
2. 男孩:回復(fù)女孩柠硕,先同意分手,不過還是又考慮了一段時(shí)間。
3. 男孩思考了一段時(shí)間蝗柔,還是選擇了分手闻葵。
4. 女孩收到消息,于是倆人正式分手癣丧。
注意:為什么連接的時(shí)候是三次握手槽畔,關(guān)閉的時(shí)候卻是四次揮手?
因?yàn)楫?dāng)服務(wù)端收到客戶端的SYN連接請求報(bào)文后胁编,可以直接發(fā)送SYN+ACK報(bào)文厢钧。其中ACK報(bào)文是用來應(yīng)答的,SYN報(bào)文是用來同步的嬉橙。但是關(guān)閉連接時(shí)早直,當(dāng)服務(wù)端收到FIN報(bào)文時(shí),很可能并不會(huì)立即關(guān)閉socket市框,所以只能先回復(fù)一個(gè)ACK報(bào)文霞扬,告訴客戶端,“你發(fā)的FIN報(bào)文枫振,我收到了”喻圃。只有等到服務(wù)端所有的報(bào)文都發(fā)送完了,我才能發(fā)送FIN報(bào)文粪滤,因此不能一起發(fā)送斧拍,故需要四步揮手。
(3)UDP協(xié)議
UDP额衙,用戶數(shù)據(jù)報(bào)協(xié)議饮焦,它是TCP/IP協(xié)議簇中無連接的運(yùn)輸層協(xié)議。
UDP是一個(gè)非連接的協(xié)議窍侧,傳輸數(shù)據(jù)之前源端和終端不建立連接县踢,當(dāng)它想傳送時(shí)就簡單地去抓取來自應(yīng)用程序的數(shù)據(jù),并盡可能快地把它扔到網(wǎng)絡(luò)上伟件。
由于傳輸數(shù)據(jù)不建立連接硼啤,因此也就不需要維護(hù)連接狀態(tài),包括收發(fā)狀態(tài)等斧账,因此一臺服務(wù)器可同時(shí)向多個(gè)客戶端傳輸相同的消息谴返。
UDP信息包的標(biāo)題很短,只有8個(gè)字節(jié)咧织,相對于TCP的20個(gè)字節(jié)信息包的額外開銷很小嗓袱。
吞吐量不受擁擠控制算法的調(diào)節(jié),只受應(yīng)用軟件生成數(shù)據(jù)的速率习绢、傳輸帶寬渠抹、源端和終端主機(jī)性能的限制蝙昙。
UDP使用盡量最大努力交付,即不保證可靠交付梧却,因此主機(jī)不需要維持復(fù)雜的鏈接狀態(tài)表奇颠。
UDP是面向報(bào)文的。發(fā)送方的UDP對應(yīng)用程序交下來的報(bào)文放航,在添加首部受就向下交付給IP層烈拒。既不拆分,也不合并广鳍,而是保留這些報(bào)文的邊界荆几,因此,應(yīng)用程序需要選擇合適的報(bào)文大小搜锰。
UDP協(xié)議格式
UDP協(xié)議由兩部分組成:首部和數(shù)據(jù)伴郁。其中耿战,首部僅有8個(gè)字節(jié)蛋叼,包括源端口和目的端口、長度(UDP用于數(shù)據(jù)報(bào)的長度)剂陡、校驗(yàn)和狈涮。
(4) TCP與UDP的區(qū)別
TCP基于連接,UDP是無連接的鸭栖;
對系統(tǒng)資源的要求歌馍,TCP較多,UDP較少晕鹊;
UDP程序結(jié)構(gòu)較簡單松却;
TCP是流模式,而UDP是數(shù)據(jù)報(bào)模式溅话;
TCP保證數(shù)據(jù)正確性晓锻,而UDP可能丟包;TCP保證數(shù)據(jù)順序飞几,而UDP不保證砚哆;
(5)HTTP協(xié)議
HTTP,超文本傳輸協(xié)議屑墨,它是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議躁锁。HTTP是一種應(yīng)用層協(xié)議,它是基于TCP協(xié)議之上的請求/響應(yīng)式的協(xié)議卵史。
對于從客戶端到服務(wù)器的每一個(gè)請求战转,都有4個(gè)步驟:
默認(rèn)情況下,客戶端在端口80打開與服務(wù)器的一個(gè)TCP連接以躯,URL中還可以指定其他端口槐秧。
客戶端向服務(wù)器發(fā)送消息,請求指定路徑上的資源。這個(gè)資源包括一個(gè)首部色鸳,可選地(取決于請求的性質(zhì))還可以有一個(gè)空行社痛,后面是這個(gè)請求的數(shù)據(jù)。
服務(wù)器向客戶端發(fā)送響應(yīng)命雀。響應(yīng)以響應(yīng)碼開頭蒜哀,后面是包含數(shù)據(jù)的首部、一個(gè)空行以及所請求的文檔或錯(cuò)誤消息吏砂。
服務(wù)器關(guān)閉連接撵儿。
HTTP報(bào)文
HTTP協(xié)議是基于TCP協(xié)議之上的請求/響應(yīng)式協(xié)議,下面主要介紹HTTP報(bào)文的格式狐血,HTTP報(bào)文主要有請求報(bào)文和響應(yīng)報(bào)文兩種淀歇。
首先看HTTP請求報(bào)文的格式:
下圖是谷歌瀏覽器內(nèi)訪問服務(wù)器查看的HTTP請求例子:
HTTP響應(yīng)報(bào)文格式:
上面這張圖是HTTP響應(yīng)報(bào)文,它由狀態(tài)行匈织、首部行和實(shí)體主體組成浪默。下圖為HTTP響應(yīng)報(bào)文例子:
HTTP請求方法和響應(yīng)狀態(tài)碼
在上面的HTTP請求報(bào)文例子中,我們可以看到請求方法是GET缀匕,這表示請求讀取由URL所標(biāo)志的信息纳决,除了GET,還有其他幾種常用的方法乡小。
在HTTP響應(yīng)報(bào)文的例子中阔加,我們可以看到狀態(tài)碼是200,表示響應(yīng)成功满钟。下表是其他狀態(tài)碼胜榔,總共5大類,33種湃番。
HTTP和HTTPS的區(qū)別
超文本傳輸協(xié)議HTTP協(xié)議被用于在Web瀏覽器和網(wǎng)站服務(wù)器之間傳遞信息夭织。HTTP協(xié)議以明文方式發(fā)送內(nèi)容,不提供任何方式的數(shù)據(jù)加密牵辣,如果攻擊者截取了Web瀏覽器和網(wǎng)站服務(wù)器之間的傳輸報(bào)文摔癣,就可以直接讀懂其中的信息,因此HTTP協(xié)議不適合傳輸一些敏感信息纬向,比如信用開號择浊、密碼等。
為了解決HTTP協(xié)議的這一缺陷逾条,需要使用另一種協(xié)議:安全套接字層超文本傳輸協(xié)議HTTPS琢岩。為了數(shù)據(jù)傳輸?shù)陌踩琀TTPS在HTTP的基礎(chǔ)上加入了SSL協(xié)議师脂,SSL依靠證書來驗(yàn)證服務(wù)器的身份担孔,并為瀏覽器和服務(wù)器之間的通信加密江锨。
HTTPS和HTTP的區(qū)別主要為以下四點(diǎn):
https協(xié)議需要到ca申請證書,一般免費(fèi)證書很少糕篇,需要繳費(fèi)啄育。
http是超文本傳輸協(xié)議,信息是明文傳輸拌消,https則是具有安全性的ssl加密傳輸協(xié)議挑豌。
http和https使用的是完全不同的連接方式,用的端口也不一樣墩崩,前者是80氓英,后者是443。
http的連接很簡單鹦筹,是無狀態(tài)的铝阐;https協(xié)議是有ssl+http協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議铐拐,比http協(xié)議安全徘键。
HTTP和TCP/IP協(xié)議的關(guān)系
“我們在傳輸數(shù)據(jù)時(shí),可以只使用(傳輸層)TCP/IP協(xié)議余舶,但是那樣的話啊鸭,如 果沒有應(yīng)用層锹淌,便無法識別數(shù)據(jù)內(nèi)容匿值,如果想要使傳輸?shù)臄?shù)據(jù)有意義,則必須使用到應(yīng)用層協(xié)議赂摆,應(yīng)用層協(xié)議有很多挟憔,比如HTTP、FTP烟号、TELNET等绊谭,也 可以自己定義應(yīng)用層協(xié)議。WEB使用HTTP協(xié)議作應(yīng)用層協(xié)議汪拥,以封裝HTTP文本信息达传,然后使用TCP/IP做傳輸層協(xié)議將它發(fā)到網(wǎng)絡(luò)上∑戎”