一、概述
二骂倘、計(jì)算機(jī)網(wǎng)絡(luò)
? 1.網(wǎng)絡(luò)協(xié)議
? 2.網(wǎng)絡(luò)體系結(jié)構(gòu)
三、OSI參考模型
四巴席、TCP/IP參考模型
五历涝、常見網(wǎng)絡(luò)協(xié)議
? 1.TCP協(xié)議
? 2.UDP協(xié)議
? 3.HTTP協(xié)議
六、計(jì)網(wǎng)常見問題
七、Java網(wǎng)絡(luò)編程
一荧库、概述
計(jì)算機(jī)網(wǎng)絡(luò)是通過傳輸介質(zhì)堰塌、通信設(shè)施和網(wǎng)絡(luò)通信協(xié)議,把分散在不同地點(diǎn)的計(jì)算機(jī)設(shè)備互連起來(lái)分衫,實(shí)現(xiàn)資源共享和數(shù)據(jù)傳輸?shù)南到y(tǒng)场刑。網(wǎng)絡(luò)編程就就是編寫程序使聯(lián)網(wǎng)的兩個(gè)(或多個(gè))設(shè)備(例如計(jì)算機(jī))之間進(jìn)行數(shù)據(jù)傳輸。Java語(yǔ)言對(duì)網(wǎng)絡(luò)編程提供了良好的支持蚪战,通過其提供的接口我們可以很方便地進(jìn)行網(wǎng)絡(luò)編程牵现。下面先對(duì)網(wǎng)絡(luò)編程的一些基礎(chǔ)知識(shí)進(jìn)行介紹,最后給出使用Java語(yǔ)言進(jìn)行網(wǎng)絡(luò)編程的實(shí)例邀桑。
二瞎疼、計(jì)算機(jī)網(wǎng)絡(luò)
計(jì)算機(jī)網(wǎng)絡(luò)20世紀(jì)60年代出現(xiàn),經(jīng)歷了20世紀(jì)70年代概漱、80年代和90年代的發(fā)展减俏,進(jìn)入21世紀(jì)后畸肆,計(jì)算機(jī)網(wǎng)絡(luò)已經(jīng)成為信息社會(huì)的基礎(chǔ)設(shè)施,深入到人類社會(huì)的方方面面,與人們的工作从藤、學(xué)習(xí)和生活息息相關(guān)。
網(wǎng)絡(luò)協(xié)議
如同人與人之間相互交流是需要遵循一定的規(guī)矩一樣毕谴,計(jì)算機(jī)之間能夠進(jìn)行相互通信是因?yàn)樗鼈兌脊餐袷匾欢ǖ囊?guī)則攻人,即網(wǎng)絡(luò)協(xié)議。
網(wǎng)絡(luò)體系結(jié)構(gòu)
計(jì)算機(jī)網(wǎng)絡(luò)是個(gè)復(fù)雜的系統(tǒng)这揣,按照人們解決復(fù)雜問題的方法悔常,把計(jì)算機(jī)網(wǎng)絡(luò)實(shí)現(xiàn)的功能分到不同的層次上,層與層之間用接口連接给赞。通信的雙方具有相同的層次机打,層次實(shí)現(xiàn)的功能由協(xié)議數(shù)據(jù)單元(PDU)來(lái)描述。不同系統(tǒng)中的同一層構(gòu)成對(duì)等層片迅,對(duì)等層之間通過對(duì)等層協(xié)議進(jìn)行通信残邀,理解彼此定義好的規(guī)則和約定。
計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)是計(jì)算機(jī)網(wǎng)絡(luò)層次和協(xié)議的集合柑蛇,網(wǎng)絡(luò)體系結(jié)構(gòu)對(duì)計(jì)算機(jī)網(wǎng)絡(luò)實(shí)現(xiàn)的功能芥挣,以及網(wǎng)絡(luò)協(xié)議、層次耻台、接口和服務(wù)進(jìn)行了描述空免,但并不涉及具體的實(shí)現(xiàn)。接口是同一節(jié)點(diǎn)內(nèi)相鄰層之間交換信息的連接處盆耽,也叫服務(wù)訪問點(diǎn)(SAP)蹋砚。
計(jì)算機(jī)網(wǎng)絡(luò)層次模型
三扼菠、OSI參考模型
前面我們介紹了計(jì)算機(jī)網(wǎng)絡(luò)的體系結(jié)構(gòu),因?yàn)橛?jì)算機(jī)網(wǎng)絡(luò)是個(gè)復(fù)雜的系統(tǒng)都弹,所以把計(jì)算機(jī)網(wǎng)絡(luò)實(shí)現(xiàn)的功能分到不同的層次上娇豫,而計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)是計(jì)算機(jī)網(wǎng)絡(luò)層次和協(xié)議的集合。那么畅厢,計(jì)算機(jī)網(wǎng)絡(luò)如何進(jìn)行分層呢冯痢?下面先介紹的是OSI參考模型。
簡(jiǎn)介
世界上第一個(gè)網(wǎng)絡(luò)體系結(jié)構(gòu)由IBM公司提出(1974年框杜,SNA)浦楣,以后其他公司也相繼提出自己的網(wǎng)絡(luò)體系結(jié)構(gòu)如:Digital公司的DNA,美國(guó)國(guó)防部的TCP/IP等咪辱,多種網(wǎng)絡(luò)體系結(jié)構(gòu)并存振劳,其結(jié)果是若采用IBM的結(jié)構(gòu),只能選用IBM的產(chǎn)品油狂,只能與同種結(jié)構(gòu)的網(wǎng)絡(luò)互聯(lián)历恐。
為了促進(jìn)計(jì)算機(jī)網(wǎng)絡(luò)的發(fā)展,國(guó)際標(biāo)準(zhǔn)化組織ISO于1977年成立了一個(gè)委員會(huì)专筷,在現(xiàn)有網(wǎng)絡(luò)的基礎(chǔ)上弱贼,提出了不基于具體機(jī)型、操作系統(tǒng)或公司的網(wǎng)絡(luò)體系結(jié)構(gòu)磷蛹,稱為開放系統(tǒng)互連參考模型吮旅,即OSI/RM (Open System Interconnection Reference Model)。OSI模型把網(wǎng)絡(luò)通信的工作分為7層味咳,分別是物理層庇勃、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層槽驶、傳輸層责嚷、會(huì)話層、表示層和應(yīng)用層掂铐。
OSI參考模型的7個(gè)層次
OSI模型層次功能
物理層
物理層處于OSI的最底層罕拂,是整個(gè)開放系統(tǒng)的基礎(chǔ)。物理層涉及通信信道上傳輸?shù)脑急忍亓?bits)堡纬,它的功能主要是為數(shù)據(jù)端設(shè)備提供傳送數(shù)據(jù)的通路以及傳輸數(shù)據(jù)聂受。
數(shù)據(jù)鏈路層
數(shù)據(jù)鏈路層的主要任務(wù)是實(shí)現(xiàn)計(jì)算機(jī)網(wǎng)絡(luò)中相鄰節(jié)點(diǎn)之間的可靠傳輸蒿秦,把原始的烤镐、有差錯(cuò)的物理傳輸線路加上數(shù)據(jù)鏈路協(xié)議以后,構(gòu)成邏輯上可靠的數(shù)據(jù)鏈路棍鳖。需要完成的功能有鏈路管理炮叶、成幀碗旅、差錯(cuò)控制以及流量控制等。其中成幀是對(duì)物理層的原始比特流進(jìn)行界定镜悉,數(shù)據(jù)鏈路層也能夠?qū)膩G失進(jìn)行處理祟辟。
網(wǎng)絡(luò)層
網(wǎng)絡(luò)層涉及源主機(jī)節(jié)點(diǎn)到目的主機(jī)節(jié)點(diǎn)之間可靠的網(wǎng)絡(luò)傳輸,它需要完成的功能主要包括路由選擇侣肄、網(wǎng)絡(luò)尋址旧困、流量控制、擁塞控制稼锅、網(wǎng)絡(luò)互連等吼具。
傳輸層
傳輸層起著承上啟下的作用,涉及源端節(jié)點(diǎn)到目的端節(jié)點(diǎn)之間可靠的信息傳輸矩距。傳輸層需要解決跨越網(wǎng)絡(luò)連接的建立和釋放拗盒,對(duì)底層不可靠的網(wǎng)絡(luò),建立連接時(shí)需要三次握手锥债,釋放連接時(shí)需要四次揮手陡蝇。
會(huì)話層和表示層
會(huì)話層的主要功能是負(fù)責(zé)應(yīng)用程序之間建立、維持和中斷會(huì)話哮肚,同時(shí)也提供對(duì)設(shè)備和結(jié)點(diǎn)之間的會(huì)話控制登夫,協(xié)調(diào)系統(tǒng)和服務(wù)之間的交流,并通過提供單工绽左、半雙工和全雙工3種不同的通信方式悼嫉,使系統(tǒng)和服務(wù)之間有序地進(jìn)行通信。
表示層關(guān)心所傳輸數(shù)據(jù)信息的格式定義拼窥,其主要功能是把應(yīng)用層提供的信息變換為能夠共同理解的形式戏蔑,提供字符代碼、數(shù)據(jù)格式鲁纠、控制信息格式总棵、加密等的統(tǒng)一表示。
應(yīng)用層
應(yīng)用層為OSI的最高層改含,是直接為應(yīng)用進(jìn)程提供服務(wù)的情龄。其作用是在實(shí)現(xiàn)多個(gè)系統(tǒng)應(yīng)用進(jìn)程相互通信的同時(shí),完成一系列業(yè)務(wù)處理所需的服務(wù)捍壤。
四骤视、TCP/IP參考模型
OSI參考模型的初衷是提供全世界范圍的計(jì)算機(jī)網(wǎng)絡(luò)都要遵循的統(tǒng)一標(biāo)準(zhǔn),但是由于存在模型和協(xié)議自身的缺陷鹃觉,遲遲沒有成熟的產(chǎn)品推出专酗。TCP/IP協(xié)議在實(shí)踐中不斷完善和發(fā)展取得成功,作為網(wǎng)絡(luò)的基礎(chǔ)盗扇,Internet的語(yǔ)言祷肯,可以說沒有TCP/IP協(xié)議就沒有互聯(lián)網(wǎng)的今天沉填。
簡(jiǎn)介
TCP/IP,即Transmission Control Protocol/Internet Protocol的簡(jiǎn)寫佑笋,中譯名為傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議翼闹,是Internet最基本的協(xié)議、Internet國(guó)際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ)蒋纬。
TCP/IP協(xié)議是一個(gè)開放的網(wǎng)絡(luò)協(xié)議簇猎荠,它的名字主要取自最重要的網(wǎng)絡(luò)層IP協(xié)議和傳輸層TCP協(xié)議。TCP/IP協(xié)議定義了電子設(shè)備如何連入因特網(wǎng)蜀备,以及數(shù)據(jù)如何在它們之間傳輸?shù)臉?biāo)準(zhǔn)法牲。TCP/IP參考模型采用4層的層級(jí)結(jié)構(gòu),每一層都呼叫它的下一層所提供的協(xié)議來(lái)完成自己的需求琼掠,這4個(gè)層次分別是:網(wǎng)絡(luò)接口層拒垃、互聯(lián)網(wǎng)層(IP層)、傳輸層(TCP層)瓷蛙、應(yīng)用層悼瓮。
OSI 和 TCP/IP模型對(duì)比
TCP/IP模型層次功能
網(wǎng)絡(luò)接口層
TCP/IP協(xié)議對(duì)網(wǎng)絡(luò)接口層沒有給出具體的描述,網(wǎng)絡(luò)接口層對(duì)應(yīng)著物理層和數(shù)據(jù)鏈路層艰猬。
**互聯(lián)網(wǎng)層 ( IP層 ) **
互聯(lián)網(wǎng)層是整個(gè)TCP/IP協(xié)議棧的核心横堡。它的功能是把分組發(fā)往目標(biāo)網(wǎng)絡(luò)或主機(jī)。同時(shí)冠桃,為了盡快地發(fā)送分組命贴,可能需要沿不同的路徑同時(shí)進(jìn)行分組傳遞。因此食听,分組到達(dá)的順序和發(fā)送的順序可能不同胸蛛,這就需要上層必須對(duì)分組進(jìn)行排序∮1ǎ互聯(lián)網(wǎng)層除了需要完成路由的功能外葬项,也可以完成將不同類型的網(wǎng)絡(luò)(異構(gòu)網(wǎng))互連的任務(wù)。除此之外迹蛤,互聯(lián)網(wǎng)層還需要完成擁塞控制的功能民珍。
**傳輸層 ( TCP層 ) **
TCP層負(fù)責(zé)在應(yīng)用進(jìn)程之間建立端到端的連接和可靠通信,它只存在與端節(jié)點(diǎn)中盗飒。TCP層涉及兩個(gè)協(xié)議嚷量,TCP和UDP。其中逆趣,TCP協(xié)議提供面向連接的服務(wù)蝶溶,提供按字節(jié)流的有序、可靠傳輸汗贫,可以實(shí)現(xiàn)連接管理身坐、差錯(cuò)控制、流量控制落包、擁塞控制等部蛇。UDP協(xié)議提供無(wú)連接的服務(wù),用于不需要或無(wú)法實(shí)現(xiàn)面向連接的網(wǎng)絡(luò)應(yīng)用中咐蝇。
應(yīng)用層
應(yīng)用層為Internet中的各種網(wǎng)絡(luò)應(yīng)用提供服務(wù)涯鲁。
五、常見網(wǎng)絡(luò)協(xié)議
上面主要介紹了OSI參考模型和TCP/IP模型的相關(guān)內(nèi)容有序,從下面這張圖可以看出TCP/IP協(xié)議簇中不同的層次中有著很多不同的網(wǎng)絡(luò)協(xié)議抹腿,下面主要介紹傳輸層的TCP、UDP協(xié)議和應(yīng)用層的HTTP協(xié)議旭寿。
TCP協(xié)議
簡(jiǎn)介
TCP(Transmission Control Protocol 警绩,傳輸控制協(xié)議)是面向連接的傳輸層協(xié)議。TCP層是位于IP層之上盅称,應(yīng)用層之下的中間層肩祥。不同主機(jī)的應(yīng)用層之間經(jīng)常需要可靠的、像管道一樣的連接缩膝,但是IP層不提供這樣的流機(jī)制混狠,而是提供不可靠的包交換。TCP協(xié)議采用字節(jié)流傳輸數(shù)據(jù)疾层。
TCP報(bào)文段格式
TCP報(bào)文段包括協(xié)議首部和數(shù)據(jù)兩部分将饺,協(xié)議首部的固定部分有20個(gè)字節(jié),首部的固定部分后面是選項(xiàng)部分痛黎。
TCP報(bào)文段
下面是報(bào)文段首部各個(gè)字段的含義予弧。
源端口號(hào)以及目的端口號(hào),各占2個(gè)字節(jié)湖饱,端口是傳輸層和應(yīng)用層的服務(wù)接口桌肴,用于尋找發(fā)送端和接收端的進(jìn)程,一般來(lái)講琉历,通過端口號(hào)和IP地址坠七,可以唯一確定一個(gè)TCP連接,在網(wǎng)絡(luò)編程中旗笔,通常被稱為一個(gè)socket接口彪置。
序號(hào),占4字節(jié)蝇恶,用來(lái)標(biāo)識(shí)從TCP發(fā)送端向TCP接收端發(fā)送的數(shù)據(jù)字節(jié)流拳魁。
確認(rèn)序號(hào),占4字節(jié)撮弧,包含發(fā)送確認(rèn)的一端所期望收到的下一個(gè)序號(hào)潘懊,因此姚糊,確認(rèn)序號(hào)應(yīng)該是上次已經(jīng)成功收到數(shù)據(jù)字節(jié)序號(hào)加1.
數(shù)據(jù)偏移,占4位授舟,用于指出TCP首部長(zhǎng)度救恨,若不存在選項(xiàng),則這個(gè)值為20字節(jié)释树,數(shù)據(jù)偏移的最大值為60字節(jié)肠槽。
保留字段占6位,暫時(shí)可忽略奢啥,值全為0
標(biāo)志位
URG(緊急) : 為1時(shí)表明緊急指針字段有效
ACK(確認(rèn)):為1時(shí)表明確認(rèn)號(hào)字段有效
PSH(推送):為1時(shí)接收方應(yīng)盡快將這個(gè)報(bào)文段交給應(yīng)用層
RST(復(fù)位):為1時(shí)表明TCP連接出現(xiàn)故障必須重建連接
SYN(同步):在連接建立時(shí)用來(lái)同步序號(hào)
FIN (終止): 為1時(shí)表明發(fā)送端數(shù)據(jù)發(fā)送完畢要求釋放連接
接收窗口占2個(gè)字節(jié)秸仙,用于流量控制和擁塞控制,表示當(dāng)前接收緩沖區(qū)的大小桩盲。在計(jì)算機(jī)網(wǎng)絡(luò)中寂纪,通常是用接收方的接收能力的大小來(lái)控制發(fā)送方的數(shù)據(jù)發(fā)送量。TCP連接的一端根據(jù)緩沖區(qū)大小確定自己的接收窗口值赌结,告訴對(duì)方弊攘,使對(duì)方可以確定發(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三次握手過程如下:
TCP三次握手.jpg
第一次握手
客戶機(jī)發(fā)送連接請(qǐng)求報(bào)文段到服務(wù)器卦洽,并進(jìn)入SYN_SENT狀態(tài)贞言,等待服務(wù)器確認(rèn)。(SYN = 1,seq=x)
第二次握手
服務(wù)器收到連接請(qǐng)求報(bào)文阀蒂,如果同意建立連接该窗,向客戶機(jī)發(fā)回確認(rèn)報(bào)文段,并為該TCP連接分配TCP緩存和變量蚤霞。(SYN=1,ACK=1,seq=y,ack=x+1)酗失。
第三次握手
客戶機(jī)收到服務(wù)器的確認(rèn)報(bào)文段后,向服務(wù)器給出確認(rèn)報(bào)文段昧绣,并且也要給該連接分配緩存和變量规肴。此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED(TCP連接成功)狀態(tài),完成三次握手拖刃。(ACK=1,seq=x+1,ack=y+1)删壮。
TCP四次揮手過程如下:
四次揮手.png
由于TCP連接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉兑牡。這原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來(lái)終止這個(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)閉垄琐。
TCP客戶端發(fā)送一個(gè)FIN边酒,用來(lái)關(guān)閉客戶到服務(wù)器的數(shù)據(jù)傳送。
服務(wù)器收到這個(gè)FIN狸窘,它發(fā)回一個(gè)ACK墩朦,確認(rèn)序號(hào)為收到的序號(hào)加1。和SYN一樣翻擒,一個(gè)FIN將占用一個(gè)序號(hào)氓涣。
服務(wù)器關(guān)閉客戶端的連接,發(fā)送一個(gè)FIN給客戶端陋气。
客戶端發(fā)回ACK報(bào)文確認(rèn)劳吠,并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1。
UDP協(xié)議
簡(jiǎn)介
UDP巩趁,用戶數(shù)據(jù)報(bào)協(xié)議痒玩,英文全稱是User Datagram Protocol,它是TCP/IP協(xié)議簇中無(wú)連接的運(yùn)輸層協(xié)議议慰。
UDP協(xié)議格式
UDP格式
從圖中可以看到蠢古,UDP協(xié)議十分簡(jiǎn)單,它由兩部分組成:首部和數(shù)據(jù)别凹。其中草讶,首部?jī)H有8個(gè)字節(jié),包括源端口和目的端口炉菲,長(zhǎng)度(UDP用于數(shù)據(jù)報(bào)的長(zhǎng)度)堕战、校驗(yàn)和。
HTTP協(xié)議
簡(jiǎn)介
HTTP拍霜,超文本傳輸協(xié)議践啄,英文全稱是Hypertext Transfer Protocol,它是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議沉御。HTTP是一種應(yīng)用層協(xié)議屿讽,它是基于TCP協(xié)議之上的請(qǐng)求/響應(yīng)式的協(xié)議,即一個(gè)客戶端與服務(wù)器建立連接后,向服務(wù)器發(fā)送一個(gè)請(qǐng)求伐谈;服務(wù)器接到請(qǐng)求后烂完,給予相應(yīng)的響應(yīng)信息。HTTP協(xié)議默認(rèn)的端口號(hào)為80.
現(xiàn)在使用的HTTP協(xié)議是HTTP/1.1版本诵棵,1997年之前采用的是HTTP1.0版本抠蚣。HTTP連接在1.0版本中采用非持續(xù)連接工作方式,1.1版本采用的是持續(xù)連接工作方式履澳,持續(xù)連接是指服務(wù)器在發(fā)送響應(yīng)后仍然在一段時(shí)間內(nèi)保持這條由TCP運(yùn)輸層協(xié)議建立起來(lái)的連接嘶窄,使客戶機(jī)和服務(wù)器可以繼續(xù)在這條連接上傳輸HTTP報(bào)文。
是否采用持續(xù)連接工作方式距贷,1.0中默認(rèn)是關(guān)閉的柄冲,需要在HTTP頭加入"Connection:Keep-Alive",才能啟用Keep-Alive忠蝗。HTTP1.1中默認(rèn)啟用Keep-Alive现横,如果加入"Connection:close",才關(guān)閉阁最。目前大部分瀏覽器都是用HTTP1.1協(xié)議戒祠,也就是說默認(rèn)都會(huì)發(fā)起Keep-Alive的連接請(qǐng)求了,所以是否能完成一個(gè)完整的Keep- Alive連接就看服務(wù)器設(shè)置情況速种。
HTTP報(bào)文
HTTP協(xié)議是基于TCP協(xié)議之上的請(qǐng)求/響應(yīng)式協(xié)議姜盈,下面主要介紹HTTP報(bào)文的格式,HTTP報(bào)文主要有請(qǐng)求報(bào)文和響應(yīng)報(bào)文兩種配阵。首先看請(qǐng)求報(bào)文的格式:
HTTP請(qǐng)求報(bào)文格式
HTTP請(qǐng)求報(bào)文由請(qǐng)求行贩据、首部行和實(shí)體主體組成,由瀏覽器發(fā)送給服務(wù)器闸餐。上面這張圖中SP表示空格饱亮,cr lf表示回車和換行。
HTTP響應(yīng)報(bào)文格式
上面這張圖是HTTP響應(yīng)報(bào)文舍沙,它由狀態(tài)行近上、首部行和實(shí)體主體組成。下面兩張圖是在谷歌瀏覽器內(nèi)訪問服務(wù)器查看的HTTP請(qǐng)求和響應(yīng)拂铡。
HTTP請(qǐng)求報(bào)文例子
HTTP響應(yīng)報(bào)文例子
HTTP請(qǐng)求方法和響應(yīng)狀態(tài)碼
在上面的HTTP請(qǐng)求報(bào)文例子中壹无,我們可以看到請(qǐng)求方法是GET,這表示請(qǐng)求讀取由URL所標(biāo)志的信息感帅,除了GET斗锭,還有其它幾種常用的方法。
HTTP請(qǐng)求報(bào)文的一些方法
在HTTP響應(yīng)報(bào)文的例子中失球,我們可以看到狀態(tài)碼是200岖是,表示響應(yīng)成功帮毁。下表是其它狀態(tài)碼,總共5大類豺撑,33種烈疚。
HTTP響應(yīng)報(bào)文的狀態(tài)碼
HTTPS和HTTP的區(qū)別
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標(biāo)的HTTP通道聪轿,簡(jiǎn)單講是HTTP的安全版爷肝。即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL陆错,因此加密的詳細(xì)內(nèi)容就需要SSL灯抛。它是一個(gè)URI scheme(抽象標(biāo)識(shí)符體系),句法類同http:體系音瓷。用于安全的HTTP數(shù)據(jù)傳輸对嚼。https:URL表明它使用了HTTP免钻,但HTTPS存在不同于HTTP的默認(rèn)端口及一個(gè)加密/身份驗(yàn)證層(在HTTP與TCP之間)蝙云。
超文本傳輸協(xié)議HTTP協(xié)議被用于在Web瀏覽器和網(wǎng)站服務(wù)器之間傳遞信息。HTTP協(xié)議以明文方式發(fā)送內(nèi)容,不提供任何方式的數(shù)據(jù)加密偷线,如果攻擊者截取了Web瀏覽器和網(wǎng)站服務(wù)器之間的傳輸報(bào)文,就可以直接讀懂其中的信息沽甥,因此HTTP協(xié)議不適合傳輸一些敏感信息声邦,比如信用卡號(hào)、密碼等摆舟。
為了解決HTTP協(xié)議的這一缺陷亥曹,需要使用另一種協(xié)議:安全套接字層超文本傳輸協(xié)議HTTPS。為了數(shù)據(jù)傳輸?shù)陌踩抻眨琀TTPS在HTTP的基礎(chǔ)上加入了SSL協(xié)議媳瞪,SSL依靠證書來(lái)驗(yàn)證服務(wù)器的身份,并為瀏覽器和服務(wù)器之間的通信加密照宝。
HTTPS和HTTP的區(qū)別主要為以下四點(diǎn):1蛇受、https協(xié)議需要到ca申請(qǐng)證書,一般免費(fèi)證書很少厕鹃,需要交費(fèi)兢仰。2、http是超文本傳輸協(xié)議剂碴,信息是明文傳輸把将,https 則是具有安全性的ssl加密傳輸協(xié)議。3忆矛、http和https使用的是完全不同的連接方式察蹲,用的端口也不一樣,前者是80,后者是443递览。4叼屠、http的連接很簡(jiǎn)單,是無(wú)狀態(tài)的绞铃;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸镜雨、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全儿捧。
六荚坞、常見問題
到這里,關(guān)于計(jì)算機(jī)網(wǎng)絡(luò)部分的總結(jié)內(nèi)容就結(jié)束了菲盾,下面是幾個(gè)常見的問題颓影,匯總在這里。
OSI參考模型的分為哪幾層懒鉴,每層的功能诡挂?
OSI,開放系統(tǒng)互連參考模型临谱,它的7個(gè)層次自頂?shù)较乱来螢閼?yīng)用層璃俗,表示層,會(huì)話層悉默,傳輸層城豁,網(wǎng)絡(luò)層,數(shù)據(jù)鏈路層和物理層抄课。各層的功能見文章開始唱星。
TCP協(xié)議和UDP協(xié)議的區(qū)別?
TCP協(xié)議是傳輸控制協(xié)議跟磨,UDP協(xié)議是用戶數(shù)據(jù)報(bào)協(xié)議间聊,兩者都是傳輸層的協(xié)議,主要區(qū)別在于前者是可靠的抵拘,面向連接的協(xié)議哎榴,后者是不可靠的,無(wú)連接的協(xié)議仑濒。其它的區(qū)別還有叹话,TCP協(xié)議傳輸速度慢,UDP常用于一次性傳輸比較少量數(shù)據(jù)的網(wǎng)絡(luò)應(yīng)用墩瞳。
TCP三次握手為什么不能是兩次?
主要是防止兩次握手情況下已經(jīng)失效的連接請(qǐng)求報(bào)文段突然又傳送到服務(wù)端而產(chǎn)生錯(cuò)誤驼壶。例如,客戶機(jī)A向服務(wù)器B發(fā)送TCP連接請(qǐng)求喉酌,第一個(gè)連接請(qǐng)求報(bào)文在網(wǎng)絡(luò)的某個(gè)節(jié)點(diǎn)長(zhǎng)時(shí)間滯留热凹,A超時(shí)后認(rèn)為報(bào)文丟失泵喘,于是再重傳一次連接請(qǐng)求,B收到后建立連接般妙。數(shù)據(jù)傳輸完畢后雙方斷開連接纪铺,而這時(shí)之前滯留的連接請(qǐng)求到達(dá)了服務(wù)端B,而B認(rèn)為A又發(fā)來(lái)連接請(qǐng)求碟渺。如果兩次握手建立連接鲜锚,A并無(wú)連接請(qǐng)求,造成B的資源浪費(fèi)苫拍。
HTTP請(qǐng)求的GET方法和POST方法的區(qū)別芜繁?
GET和POST是HTTP請(qǐng)求的兩種方法,主要區(qū)別在于GET方法是請(qǐng)求讀取由URL所標(biāo)志的信息绒极,POST是給服務(wù)器添加信息骏令。點(diǎn)擊查看更多
在瀏覽器中輸入網(wǎng)址到顯示出頁(yè)面的整個(gè)過程?
(1) 輸出包含域名的網(wǎng)址 (2) 瀏覽器向DNS請(qǐng)求解析域名對(duì)應(yīng)的IP地址 (3) 域名系統(tǒng)DNS解析出域名對(duì)應(yīng)的IP地址 (4) 瀏覽器與該服務(wù)器建立TCP連接 (5) 瀏覽器發(fā)送HTTP請(qǐng)求 (6) 服務(wù)器通過HTTP響應(yīng)把頁(yè)面文件發(fā)送給瀏覽器 (7) TCP連接釋放 (8) 瀏覽器解釋文件垄提,并顯示
七榔袋、Java網(wǎng)絡(luò)編程
Java的網(wǎng)絡(luò)編程主要涉及到的內(nèi)容是Socket編程,那么什么是Socket呢铡俐?簡(jiǎn)單地說凰兑,Socket,套接字高蜂,就是兩臺(tái)主機(jī)之間邏輯連接的端點(diǎn)聪黎。TPC/IP協(xié)議是傳輸層協(xié)議罕容,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸备恤,而HTTP是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)锦秒。Socket露泊,本質(zhì)上就是一組接口,是對(duì)TCP/IP協(xié)議的封裝和應(yīng)用(程序員層面上)旅择。
整體流程
Socket編程主要涉及到客戶端和服務(wù)器端兩個(gè)方面惭笑,首先是在服務(wù)器端創(chuàng)建一個(gè)服務(wù)器套接字(ServerSocket),并把它附加到一個(gè)端口上生真,服務(wù)器從這個(gè)端口監(jiān)聽連接沉噩。端口號(hào)的范圍是0到65536,但是0到1024是為特權(quán)服務(wù)保留的端口號(hào)柱蟀,我們可以選擇任意一個(gè)當(dāng)前沒有被其他進(jìn)程使用的端口川蒙。
客戶端請(qǐng)求與服務(wù)器進(jìn)行連接的時(shí)候,根據(jù)服務(wù)器的域名或者IP地址长已,加上端口號(hào)畜眨,打開一個(gè)套接字昼牛。當(dāng)服務(wù)器接受連接后,服務(wù)器和客戶端之間的通信就像輸入輸出流一樣進(jìn)行操作康聂。
實(shí)例一
下面是一個(gè)客戶端和服務(wù)器端進(jìn)行數(shù)據(jù)交互的簡(jiǎn)單例子贰健,客戶端輸入正方形的邊長(zhǎng),服務(wù)器端接收到后計(jì)算面積并返回給客戶端恬汁,通過這個(gè)例子可以初步對(duì)Socket編程有個(gè)把握伶椿。
服務(wù)器端
publicclassSocketServer{publicstaticvoidmain(String[] args)throwsIOException{// 端口號(hào)intport =7000;// 在端口上創(chuàng)建一個(gè)服務(wù)器套接字ServerSocket serverSocket =newServerSocket(port);// 監(jiān)聽來(lái)自客戶端的連接Socket socket = serverSocket.accept();? ? ? ? DataInputStream dis =newDataInputStream(newBufferedInputStream(socket.getInputStream()));? ? ? ? DataOutputStream dos =newDataOutputStream(newBufferedOutputStream(socket.getOutputStream()));do{doublelength = dis.readDouble();? ? ? ? ? ? System.out.println("服務(wù)器端收到的邊長(zhǎng)數(shù)據(jù)為:"+ length);doubleresult = length * length;? ? ? ? ? ? dos.writeDouble(result);? ? ? ? ? ? dos.flush();? ? ? ? }while(dis.readInt() !=0);? ? ? ? socket.close();? ? ? ? serverSocket.close();? ? }}
客戶端
publicclassSocketClient{publicstaticvoidmain(String[] args)throwsUnknownHostException, IOException{intport =7000;? ? ? ? String host ="localhost";// 創(chuàng)建一個(gè)套接字并將其連接到指定端口號(hào)Socket socket =newSocket(host, port);? ? ? ? DataInputStream dis =newDataInputStream(newBufferedInputStream(socket.getInputStream()));? ? ? ? DataOutputStream dos =newDataOutputStream(newBufferedOutputStream(socket.getOutputStream()));? ? ? ? Scanner sc =newScanner(System.in);booleanflag =false;while(!flag) {? ? ? ? ? ? System.out.println("請(qǐng)輸入正方形的邊長(zhǎng):");doublelength = sc.nextDouble();? ? ? ? ? ? dos.writeDouble(length);? ? ? ? ? ? dos.flush();doublearea = dis.readDouble();? ? ? ? ? ? System.out.println("服務(wù)器返回的計(jì)算面積為:"+ area);while(true) {? ? ? ? ? ? ? ? System.out.println("繼續(xù)計(jì)算?(Y/N)");? ? ? ? ? ? ? ? String str = sc.next();if(str.equalsIgnoreCase("N")) {? ? ? ? ? ? ? ? ? ? dos.writeInt(0);? ? ? ? ? ? ? ? ? ? dos.flush();? ? ? ? ? ? ? ? ? ? flag =true;break;? ? ? ? ? ? ? ? }elseif(str.equalsIgnoreCase("Y")) {? ? ? ? ? ? ? ? ? ? dos.writeInt(1);? ? ? ? ? ? ? ? ? ? dos.flush();break;? ? ? ? ? ? ? ? }? ? ? ? ? ? }? ? ? ? }? ? ? ? socket.close();? ? }}
實(shí)例二
可以看到上面的服務(wù)器端程序和客戶端程序是一對(duì)一的關(guān)系氓侧,為了能讓一個(gè)服務(wù)器端程序能同時(shí)為多個(gè)客戶提供服務(wù)悬垃,可以使用多線程機(jī)制,每個(gè)客戶端的請(qǐng)求都由一個(gè)獨(dú)立的線程進(jìn)行處理甘苍。下面是改寫后的服務(wù)器端程序尝蠕。
publicclassSocketServerM{publicstaticvoidmain(String[] args)throwsIOException{intport =7000;intclientNo =1;? ? ? ? ServerSocket serverSocket =newServerSocket(port);// 創(chuàng)建線程池ExecutorService exec = Executors.newCachedThreadPool();try{while(true) {? ? ? ? ? ? ? ? Socket socket = serverSocket.accept();? ? ? ? ? ? ? ? exec.execute(newSingleServer(socket, clientNo));? ? ? ? ? ? ? ? clientNo++;? ? ? ? ? ? }? ? ? ? }finally{? ? ? ? ? ? serverSocket.close();? ? ? ? }? ? }}classSingleServerimplementsRunnable{privateSocket socket;privateintclientNo;publicSingleServer(Socket socket,intclientNo){this.socket = socket;this.clientNo = clientNo;? ? }@Overridepublicvoidrun(){try{? ? ? ? ? ? DataInputStream dis =newDataInputStream(newBufferedInputStream(socket.getInputStream()));? ? ? ? ? ? DataOutputStream dos =newDataOutputStream(newBufferedOutputStream(socket.getOutputStream()));do{doublelength = dis.readDouble();? ? ? ? ? ? ? ? System.out.println("從客戶端"+ clientNo +"接收到的邊長(zhǎng)數(shù)據(jù)為:"+ length);doubleresult = length * length;? ? ? ? ? ? ? ? dos.writeDouble(result);? ? ? ? ? ? ? ? dos.flush();? ? ? ? ? ? }while(dis.readInt() !=0);? ? ? ? }catch(IOException e) {? ? ? ? ? ? e.printStackTrace();? ? ? ? }finally{? ? ? ? ? ? System.out.println("與客戶端"+ clientNo +"通信結(jié)束");try{? ? ? ? ? ? ? ? socket.close();? ? ? ? ? ? }catch(IOException e) {? ? ? ? ? ? ? ? e.printStackTrace();? ? ? ? ? ? }? ? ? ? }? ? }}
鏈接:http://www.reibang.com/p/ae5e1cee5b04