網(wǎng)絡編程的概述
網(wǎng)絡編程的實質(zhì)就是用來實現(xiàn)網(wǎng)絡互連的不同計算機上運行的程序間可以進行數(shù)據(jù)交換。
一.OSI網(wǎng)絡模型
由于世界各大計算機廠商推出各自不同的網(wǎng)絡體系結(jié)構(gòu),影響了網(wǎng)絡通信的統(tǒng)一性。因此國際標準化組織ISO于1978年推出“開放系統(tǒng)互聯(lián)”,即著名的OSI(Open System Interconneection)。
開發(fā)系統(tǒng)互連系統(tǒng)參考模型力求將網(wǎng)絡簡化,并以模塊化的方式簡化網(wǎng)絡。
開發(fā)系統(tǒng)互連參考模型把計算機網(wǎng)絡分成物理層、數(shù)據(jù)鏈路層、網(wǎng)絡層、傳輸層、會話層、表示層、應用層等七層,受到計算機界和通信業(yè)的極大關(guān)注。經(jīng)過十多年的發(fā)展和推進,OSI模型已成為各種計算機網(wǎng)絡結(jié)構(gòu)的參考標準。
OSI網(wǎng)絡模型七層概述:
1.物理層:
????主要定義物理設備標準,如網(wǎng)線、光纖的接口類型,各種傳輸介質(zhì)的傳輸速率等,它的主要作用就是傳輸比特流。指兩臺電腦進行傳輸數(shù)據(jù)的網(wǎng)線。
2.數(shù)據(jù)鏈路層:
????主要將從物理層接收的數(shù)據(jù)進行MAC地址的封裝與解封裝。這一層的數(shù)據(jù)叫做幀。
3.網(wǎng)絡層:
????主要講從下層接收到的數(shù)據(jù)進行IP地址的封裝與解封裝。在這一層工作的設備是路由器,常把這一層的數(shù)據(jù)叫做數(shù)據(jù)包。將發(fā)送端電腦發(fā)送的數(shù)據(jù)通過路由器分配給指定IP的電腦上。
4.傳輸層:
????定義了一些傳輸數(shù)據(jù)的協(xié)議和端口號,如:TCP(傳輸控制協(xié)議),UDP(用戶數(shù)據(jù)報協(xié)議)
5.會話層:
????通過傳輸層建立數(shù)據(jù)傳輸?shù)耐罚饕谀愕南到y(tǒng)之間發(fā)起會話或者接受會話請求,要設置目標電腦的IP地址和端口號,才可以找到接收端的電腦和應用。
6.表示層:
????主要是進行對接收的數(shù)據(jù)進行解釋,加密與解密,壓縮與解壓縮等。將文字或者圖片轉(zhuǎn)換成電腦識別的二進制數(shù)據(jù)。
7.應用層:
???? 主要是一些終端應用,比如說:QQ,微信,淘寶。
二.TCP/IP網(wǎng)絡模型
TCP/IP模型是互聯(lián)網(wǎng)的基礎,想要理解互聯(lián)網(wǎng)的通信,就必須理解這個模型。但是,它不好懂,對于大部分編程人員來說,簡單了解網(wǎng)絡通信的機制即可。
什么是TCP/IP模型?
TCP/IP模型是一系列網(wǎng)絡協(xié)議的總稱,這些協(xié)議的目的,就是為了使計算機之間可以進行信息交換。
所謂“協(xié)議”可以理解為機器之間交談的語言,每一次協(xié)議都有自己的目的。TCP/IP模型一共有幾百種協(xié)議,對互聯(lián)網(wǎng)交換信息的各個方面都做了規(guī)定。
TCP/IP模型的四層結(jié)構(gòu)
這些協(xié)議可以分為四個層次,上一層的層次都以下一層的協(xié)議為基礎。就像下面這張圖:
TCP/IP四層概述:
理解這個結(jié)構(gòu)的關(guān)鍵,在于理解科學家在70年代設計互聯(lián)網(wǎng)的原始目的,就是為了傳輸文本。所有協(xié)議最初都是為了這個目標而設計的,互聯(lián)網(wǎng)架構(gòu)的核心就是文本對話。
1.網(wǎng)絡接口層:
????連接層負責建立電路連接,是整個網(wǎng)絡的物理基礎,典型的協(xié)議包括以太網(wǎng)、ADSL等等。
2.網(wǎng)際層:
????網(wǎng)絡層負責分配地址和傳送二進制數(shù)據(jù),主要協(xié)議是IP協(xié)議。
3.傳輸層:
????傳輸層負責傳送文本數(shù)據(jù),主要協(xié)議是TCP協(xié)議,UDP協(xié)議。
4.應用層:
????應用層負責傳送各種最終形態(tài)的數(shù)據(jù),是直接與用戶打交道的層,典型協(xié)議是HTTP、FTP等。
三.TCP/IP模型與OSI模型比較
OSI模型與TCP/IP模型對應圖
共同點
都采用了層次結(jié)構(gòu)概念
都能夠提供面向連接和無連接兩種通信服務機制
不同點
前者是七層模型,后者是四層機構(gòu)
對可靠性要求不同(后者更高)
OSI模型是在協(xié)議開發(fā)前設計的,具有通用性;TCP/IP是先有協(xié)議集然后建立模型,不適用于非TCP/IP網(wǎng)絡
實際市場應用不同(OSI模型只是理論上的模型,并沒有成熟的產(chǎn)品,而TCP/IP已經(jīng)成為“實際上的國際標準”)
四.計算機的通信
上文已經(jīng)提及網(wǎng)絡編程的實質(zhì)就是計算機與計算機的通信,現(xiàn)在我們就大概講下不同設備之間是如何通信的。
IP地址
為了能夠方便的識別網(wǎng)絡上的每個設備,網(wǎng)絡中的每個設備都會有一個唯一的數(shù)字標識,這個就是IP地址。在計算機網(wǎng)絡中,現(xiàn)在命名IP地址的規(guī)定是IPv4協(xié)議,該協(xié)議規(guī)定每個IP地址由4個0-255之間的數(shù)字組成,例如10.0.120.34。每個接入網(wǎng)絡的計算機都擁有唯一的IP地址,這個IP地址可能是固定的,例如網(wǎng)絡上各種各樣的服務器,也可以是動態(tài)的,例如使用ADSL撥號上網(wǎng)的寬帶用戶,無論以何種方式獲得或是否是固定的,每個計算機在聯(lián)網(wǎng)以后都擁有一個唯一的合法IP地址,就像每個手機號碼一樣。
域名
但是由于IP地址不容易記憶,所以為了方便記憶,有創(chuàng)造了另外一個概念——域名(Domain Name),例如sohu.com等。一個IP地址可以對應多個域名,一個域名只能對應一個IP地址。域名的概念可以類比手機中的通訊簿,由于手機號碼不方便記憶,所以添加一個姓名標識號碼,在實際撥打電話時可以選擇該姓名,然后撥打即可。
在網(wǎng)絡中傳輸?shù)臄?shù)據(jù),全部是以IP地址作為地址標識,所以在實際傳輸數(shù)據(jù)以前需要將域名轉(zhuǎn)換為IP地址,實現(xiàn)這種功能的服務器稱之為DNS服務器,也就是通俗的說法叫做域名解析。例如當用戶在瀏覽器輸入域名時,瀏覽器首先請求DNS服務器,將域名轉(zhuǎn)換為IP地址,然后將轉(zhuǎn)換后的IP地址反饋給瀏覽器,然后再進行實際的數(shù)據(jù)傳輸。
當DNS服務器正常工作時,使用IP地址或域名都可以很方便的找到計算機網(wǎng)絡中的某個設備,例如服務器計算機。當DNS不正常工作時,只能通過IP地址訪問該設備。所以IP地址的使用要比域名通用一些。
端口
IP地址和域名很好的解決了在網(wǎng)絡中找到一個計算機的問題,但是為了讓一個計算機可以同時運行多個網(wǎng)絡程序,就引入了另外一個概念——端口(port)。
在介紹端口的概念以前,首先來看一個例子,一般一個公司前臺會有一個電話,每個員工會有一個分機,這樣如果需要找到這個員工的話,需要首先撥打前臺總機,然后轉(zhuǎn)該分機號即可。這樣減少了公司的開銷,也方便了每個員工。在該示例中前臺總機的電話號碼就相當于IP地址,而每個員工的分機號就相當于端口。
有了端口的概念以后,在同一個計算機中每個程序?qū)ㄒ坏亩丝冢@樣一個計算機上就可以通過端口區(qū)分發(fā)送給每個端口的數(shù)據(jù)了,換句話說,也就是一個計算機上可以并發(fā)運行多個網(wǎng)絡程序,而不會在互相之間產(chǎn)生干擾。
在硬件上規(guī)定,端口的號碼必須位于0-65535之間,每個端口唯一的對應一個網(wǎng)絡程序,一個網(wǎng)絡程序可以使用多個端口。這樣一個網(wǎng)絡程序運行在一臺計算上時,不管是客戶端還是服務器,都是至少占用一個端口進行網(wǎng)絡通訊。在接收數(shù)據(jù)時,首先發(fā)送給對應的計算機,然后計算機根據(jù)端口把數(shù)據(jù)轉(zhuǎn)發(fā)給對應的程序。
有了IP地址和端口的概念以后,在進行網(wǎng)絡通訊交換時,就可以通過IP地址查找到該臺計算機,然后通過端口標識這臺計算機上的一個唯一的程序。這樣就可以進行網(wǎng)絡數(shù)據(jù)的交換了。
協(xié)議
最后再介紹一個網(wǎng)絡編程中最重要,也是最復雜的概念——協(xié)議(Protocol)。按照前面的介紹,網(wǎng)絡編程就是運行在不同計算機中兩個程序之間的數(shù)據(jù)交換。在實際進行數(shù)據(jù)交換時,為了讓接收端理解該數(shù)據(jù),計算機比較笨,什么都不懂的,那么就需要規(guī)定該數(shù)據(jù)的格式,這個數(shù)據(jù)的格式就是協(xié)議。
五.網(wǎng)絡通信方式
在現(xiàn)有的網(wǎng)絡中,網(wǎng)絡通訊的方式主要有兩種:
TCP(傳輸控制協(xié)議)方式
UDP(用戶數(shù)據(jù)報協(xié)議)方式
TCP通訊協(xié)議
定義:Transmission Control Protocol,即傳輸控制協(xié)議,是一種傳輸層通信協(xié)議
基于TCP的應用層協(xié)議有FTP、Telnet、SMTP、HTTP、POP3與DNS。
特點:面向連接、面向字節(jié)流,全雙工通道,可靠
1).面向連接:指的是要使用TCP傳輸數(shù)據(jù),必須先建立TCP連接,傳輸完成后釋放連接,就像打電話一樣必須先撥號建立一條連接,打完后掛機釋放連接。
2).全雙工通信:即一旦建立了TCP連接,通信雙方可以在任何時候都能發(fā)送數(shù)據(jù)。
3).可靠的:指的是通過TCP連接傳送的數(shù)據(jù),無差錯,不丟失,不重復,并且按序到達。
4).面向字節(jié)流:流,指的是流入到進程或從進程流出的字符序列。簡單來說,雖然有時候要傳輸數(shù)據(jù)流太大,TCP報文長度有限制,不能一次傳輸完,要把它分為好幾個數(shù)據(jù)塊,但是由于可靠性保證,接收方可以按順序接收數(shù)據(jù)塊然后重新組成分塊之前的數(shù)據(jù)流,所以TCP看起來就像直接互相傳輸字節(jié)流一樣,面向字節(jié)流。
TCP建立連接
必須進行三次握手:若A要與B進行連接,則必須
1.第一次握手:建立連接。客戶端發(fā)送連接請求報文段,將SYN位置為1,Sequence Number為x;然后,客戶端進入SYN_SEND狀態(tài),等待服務器的確認。即A發(fā)送信息給B
2.第二次握手:服務器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認。即B收到連接信息后向A返回確認信息
3.第三次握手:客戶端收到服務器的(SYN+ACK)報文段,并向服務器發(fā)送ACK報文段。即A收到確認信息后再次向B返回確認連接信息
此時,A告訴自己上層連接建立;B收到連接信息后告訴上層連接建立
這樣就完成TCP三次握手 = 一條TCP連接建立完成 = 可以開始發(fā)送數(shù)據(jù)
三次握手期間任何一次未收到對面回復都要重發(fā)
最后一個確認報文段發(fā)送完畢以后,客戶端和服務器端都進入ESTABLISHED狀態(tài)。
TCP斷開連接
TCP釋放連接需要四次揮手過程,現(xiàn)在假設A主動釋放連接:(數(shù)據(jù)傳輸結(jié)束后,通信的雙方都可釋放連接)
第一次揮手:A發(fā)送釋放信息到B;(發(fā)出去之后,A->B發(fā)送數(shù)據(jù)這條路徑就斷了)
第二次揮手:B收到A的釋放信息之后,回復確認釋放的信息:我同意你的釋放連接請求
第三次揮手:B發(fā)送“請求釋放連接“信息給A
第四次揮手:A收到B發(fā)送的信息后向B發(fā)送確認釋放信息:我同意你的釋放連接請求
B收到確認信息后就會正式關(guān)閉連接;
A等待2MSL后依然沒有收到回復,則證明B端已正常關(guān)閉,于是A關(guān)閉連接
為什么TCP要進行三次握手四次揮手?
三次握手
答:防止服務器端因為接收了早已失效的連接請求報文從而一直等待客戶端請求,從而浪費資源
已失效的連接請求報文段”的產(chǎn)生在這樣一種情況下:Client發(fā)出的第一個連接請求報文段并沒有丟失,而是在某個網(wǎng)絡結(jié)點長時間的滯留了,以致延誤到連接釋放以后的某個時間才到達server。
這是一個早已失效的報文段。但Server收到此失效的連接請求報文段后,就誤認為是Client再次發(fā)出的一個新的連接請求。
于是就向Client發(fā)出確認報文段,同意建立連接。
假設不采用“三次握手”:只要Server發(fā)出確認,新的連接就建立了。
由于現(xiàn)在Client并沒有發(fā)出建立連接的請求,因此不會向Server發(fā)送數(shù)據(jù)。
但Server卻以為新的運輸連接已經(jīng)建立,并一直等待Client發(fā)來數(shù)據(jù)。>- 這樣,Server的資源就白白浪費掉了。
采用“三次握手”的辦法可以防止上述現(xiàn)象發(fā)生:
Client不會向Server的確認發(fā)出確認
Server由于收不到確認,就知道Client并沒有要求建立連接
所以Server不會等待Client發(fā)送數(shù)據(jù),資源就沒有被浪費
四次揮手
為了保證雙方都能通知對方“需要釋放連接”,即在釋放連接后都無法接收或發(fā)送消息給對方
1.當主機1發(fā)出FIN報文段時,只是表示主機1已經(jīng)沒有數(shù)據(jù)要發(fā)送了,主機1告訴主機2,它的數(shù)據(jù)已經(jīng)全部發(fā)送完畢了 但是,這個時候主機1還是可以接受來自主機2的數(shù)據(jù)。
2.當主機2返回ACK報文段時,表示它已經(jīng)知道主機1沒有數(shù)據(jù)發(fā)送了,但是主機2還是可以發(fā)送數(shù)據(jù)到主機1的
3.當主機2也發(fā)送了FIN報文段時,這個時候就表示主機2也沒有數(shù)據(jù)要發(fā)送了,就會告訴主機1,我也沒有數(shù)據(jù)要發(fā)送了,之后彼此就會愉快的中斷這次TCP連接。
此時,主機1和2已經(jīng)無法進行通信:主機1無法發(fā)送數(shù)據(jù)給主機2,主機2也無法發(fā)送數(shù)據(jù)給主機1,此時,TCP的連接才算釋放
UDP通訊協(xié)議
UDP(User Data Protocol,用戶數(shù)據(jù)報協(xié)議)
1、UDP是一個非連接的協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接,當它想傳送時就簡單地去抓取來自應用程序的數(shù)據(jù),并盡可能快地把它扔到網(wǎng)絡上。在發(fā)送端,UDP傳送數(shù)據(jù)的速度僅僅是受應用程序生成數(shù)據(jù)的速度、計算機的能力和傳輸帶寬的限制;在接收端,UDP把每個消息段放在隊列中,應用程序每次從隊列中讀一個消息段。
2.由于傳輸數(shù)據(jù)不建立連接,因此也就不需要維護連接狀態(tài),包括收發(fā)狀態(tài)等,因此一臺服務機可同時向多個客戶機傳輸相同的消息。
3.UDP信息包的標題很短,只有8個字節(jié),相對于TCP的20個字節(jié)信息包的額外開銷很小。
4.吞吐量不受擁擠控制算法的調(diào)節(jié),只受應用軟件生成數(shù)據(jù)的速率、傳輸帶寬、源端和終端主機性能的限制。
5.UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持復雜的鏈接狀態(tài)表(這里面有許多參數(shù))。
6.UDP是面向報文的。發(fā)送方的UDP對應用程序交下來的報文,在添加首部后就向下交付給IP層。既不拆分,也不合并,而是保留這些報文的邊界,因此,應用程序需要選擇合適的報文大小。
UDP和TCP的區(qū)別:
1.TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接
2.TCP提供可靠的服務。也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯,不丟失,不重復,且按序到達;UDP盡最大努力交付,即不保 證可靠交付
3.TCP面向字節(jié)流,實際上是TCP把數(shù)據(jù)看成一連串無結(jié)構(gòu)的字節(jié)流;UDP是面向報文的
UDP沒有擁塞控制,因此網(wǎng)絡出現(xiàn)擁塞不會使源主機的發(fā)送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)
4.每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
5.udp每個數(shù)據(jù)大小限制在64KB
6.TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
Http協(xié)議
HTTP協(xié)議(HyperText Transfer Protocol,超文本傳輸協(xié)議)是用于從WWW服務器傳輸超文本到本地瀏覽器的傳送協(xié)議。它可以使瀏覽器更加高效,使網(wǎng)絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內(nèi)容首先顯示(如文本先于圖形)等。
HTTP由請求和響應構(gòu)成,是一個標準的客戶端服務器模型(B/S)。HTTP協(xié)議永遠都是客戶端發(fā)起請求,服務器回送響應。
HTTP是一個無狀態(tài)的協(xié)議。無狀態(tài)是指客戶機(Web瀏覽器)和服務器之間不需要建立持久的連接,這意味著當一個客戶端向服務器端發(fā)出請求,然后服務器返回響應(response),連接就被關(guān)閉了,在服務器端不保留連接的有關(guān)信息.HTTP遵循請求(Request)/應答(Response)模型。客戶機(瀏覽器)向服務器發(fā)送請求,服務器處理請求并返回適當?shù)膽稹K蠬TTP連接都被構(gòu)造成一套請求和應答。
Http工作流程:
一次HTTP操作稱為一個事務,其工作整個過程如下:
1 .地址解析,
如用客戶端瀏覽器請求這個頁面:http://localhost.com:8080/index.htm
從中分解出協(xié)議名、主機名、端口、對象路徑等部分,對于我們的這個地址,解析得到的結(jié)果如下:
協(xié)議名:http
主機名:localhost.com
端口:8080
對象路徑:/index.htm
在這一步,需要域名系統(tǒng)DNS解析域名localhost.com,得主機的IP地址。
2.封裝HTTP請求數(shù)據(jù)包
把以上部分結(jié)合本機自己的信息,封裝成一個HTTP請求數(shù)據(jù)包
3.封裝成TCP包,建立TCP連接(TCP的三次握手)
在HTTP工作開始之前,客戶機(Web瀏覽器)首先要通過網(wǎng)絡與服務器建立連接,該連接是通過TCP來完成的,該協(xié)議與IP協(xié)議共同構(gòu)建Internet,即著名的TCP/IP協(xié)議族,因此Internet又被稱作是TCP/IP網(wǎng)絡。HTTP是比TCP更高層次的應用層協(xié)議,根據(jù)規(guī)則,只有低層協(xié)議建立之后才能,才能進行更層協(xié)議的連接,因此,首先要建立TCP連接,一般TCP連接的端口號是80。這里是8080端口
4.客戶機發(fā)送請求命令
建立連接后,客戶機發(fā)送一個請求給服務器,請求方式的格式為:統(tǒng)一資源標識符(URL)、協(xié)議版本號,后邊是MIME信息包括請求修飾符、客戶機信息和可內(nèi)容。
5.服務器響應
服務器接到請求后,給予相應的響應信息,其格式為一個狀態(tài)行,包括信息的協(xié)議版本號、一個成功或錯誤的代碼,后邊是MIME信息包括服務器信息、實體信息和可能的內(nèi)容。
實體消息是服務器向瀏覽器發(fā)送頭信息后,它會發(fā)送一個空白行來表示頭信息的發(fā)送到此為結(jié)束,接著,它就以Content-Type應答頭信息所描述的格式發(fā)送用戶所請求的實際數(shù)據(jù)
6.服務器關(guān)閉TCP連接
一般情況下,一旦Web服務器向瀏覽器發(fā)送了請求數(shù)據(jù),它就要關(guān)閉TCP連接,然后如果瀏覽器或者服務器在其頭信息加入了這行代碼
Connection:keep-alive
TCP連接在發(fā)送后將仍然保持打開狀態(tài),于是,瀏覽器可以繼續(xù)通過相同的連接發(fā)送請求。保持連接節(jié)省了為每個請求建立新連接所需的時間,還節(jié)約了網(wǎng)絡帶寬。
HTTPS協(xié)議
HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL。其所用的端口號是443。
SSL:安全套接層,是netscape公司設計的主要用于web的安全傳輸協(xié)議。這種協(xié)議在WEB上獲得了廣泛的應用。通過證書認證來確保客戶端和網(wǎng)站服務器之間的通信數(shù)據(jù)是加密安全的。
有兩種基本的加解密算法類型:
1.對稱加密(symmetrcic encryption):密鑰只有一個,加密解密為同一個密碼,且加解密速度快,典型的對稱加密算法有DES、AES,RC5,3DES等;
對稱加密主要問題是共享秘鑰,除你的計算機(客戶端)知道另外一臺計算機(服務器)的私鑰秘鑰,否則無法對通信流進行加密解密。解決這個問題的方案非對稱秘鑰。
2.非對稱加密:使用兩個秘鑰:公共秘鑰和私有秘鑰。私有秘鑰由一方密碼保存(一般是服務器保存),另一方任何人都可以獲得公共秘鑰。
這種密鑰成對出現(xiàn)(且根據(jù)公鑰無法推知私鑰,根據(jù)私鑰也無法推知公鑰),加密解密使用不同密鑰(公鑰加密需要私鑰解密,私鑰加密需要公鑰解密),相對對稱加密速度較慢,典型的非對稱加密算法有RSA、DSA等。
過程大致如下:
1)SSL客戶端通過TCP和服務器建立連接之后(443端口),并且在一般的tcp連接協(xié)商(握手)過程中請求證書。
即客戶端發(fā)出一個消息給服務器,這個消息里面包含了自己可實現(xiàn)的算法列表和其它一些需要的消息,SSL的服務器端會回應一個數(shù)據(jù)包,這里面確定了這次通信所需要的算法,然后服務器向客戶端返回證書。(證書里面包含了服務器信息:域名。申請證書的公司,公共秘鑰)。
2)Client在收到服務器返回的證書后,判斷簽發(fā)這個證書的公共簽發(fā)機構(gòu),并使用這個機構(gòu)的公共秘鑰確認簽名是否有效,客戶端還會確保證書中列出的域名就是它正在連接的域名。
3) 如果確認證書有效,那么生成對稱秘鑰并使用服務器的公共秘鑰進行加密。然后發(fā)送給服務器,服務器使用它的私鑰對它進行解密,這樣兩臺計算機可以開始進行對稱加密進行通信。
https通信的優(yōu)點:
1)客戶端產(chǎn)生的密鑰只有客戶端和服務器端能得到;
2)加密的數(shù)據(jù)只有客戶端和服務器端才能得到明文;
3)客戶端到服務端的通信是安全的。
Http協(xié)議與Https協(xié)議的區(qū)別
HTTPS和HTTP的區(qū)別主要如下:
1、https協(xié)議需要到ca申請證書,一般免費證書較少,因而需要一定費用。
2、http是超文本傳輸協(xié)議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協(xié)議。
3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
4、http的連接很簡單,是無狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進行加密傳輸、身份認證的網(wǎng)絡協(xié)議,比http協(xié)議安全。
Sokcet套接字
即套接字,是一個對 TCP / IP協(xié)議進行封裝 的編程調(diào)用接口(API)
即通過Socket,我們才能在Andorid平臺上通過 TCP/IP協(xié)議進行開發(fā)
Socket不是一種協(xié)議,而是一個編程調(diào)用接口(API),屬于傳輸層(主要解決數(shù)據(jù)如何在網(wǎng)絡中傳輸)
套接字(Socket)是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡通信的基本操作單元。它是網(wǎng)絡通信過程中端點的抽象表示,包含進行網(wǎng)絡通信必須的五種信息:連接使用的協(xié)議,本地主機的IP地址,本地進程的協(xié)議端口,遠地主機的IP地址,遠地進程的協(xié)議端口。
應用層通過傳輸層進行數(shù)據(jù)通信時,TCP會遇到同時為多個應用程序進程提供并發(fā)服務的問題。多個TCP連接或多個應用程序進程可能需要通過同一個 TCP協(xié)議端口傳輸數(shù)據(jù)。為了區(qū)別不同的應用程序進程和連接,許多計算機操作系統(tǒng)為應用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口。應用層可以和傳輸層通過Socket接口,區(qū)分來自不同應用程序進程或網(wǎng)絡連接的通信,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務。
建立Sokcet的過程
Socket是對TCP/IP協(xié)議棧操作的抽象,是一個調(diào)用接口(API)。Socket套節(jié)字對象,是連接兩個網(wǎng)絡端點的發(fā)送器。
Sokcet通信的過程
Socket與Http的區(qū)別
HTTP是應用層協(xié)議,主要解決如何包裝數(shù)據(jù)。
Socket是對TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個調(diào)用接口(API),通過Socket,我們才能使用TCP/IP協(xié)議。
http連接:http連接就是所謂的短連接,即客戶端向服務器端發(fā)送一次請求,服務器端響應后連接即會斷掉;
socket連接:socket連接就是所謂的長連接,理論上客戶端和服務器端一旦建立起連接將不會主動斷掉;但是由于各種環(huán)境因素可能會是連接斷開,比如說:服務器端或客戶端主機down了,網(wǎng)絡故障,或者兩者之間長時間沒有數(shù)據(jù)傳輸,網(wǎng)絡防火墻可能會斷開該連接以釋放網(wǎng)絡資源。所以當一個socket連接中沒有數(shù)據(jù)的傳輸,那么為了維持連接需要發(fā)送心跳消息~~具體心跳消息格式是開發(fā)者自己定義的
Socket通信的步驟
3、Socket通信的步驟
① 創(chuàng)建ServerSocket和Socket
② 打開連接到Socket的輸入/輸出流
③ 按照協(xié)議對Socket進行讀/寫操作
④ 關(guān)閉輸入輸出流、關(guān)閉Socket
4、服務器端:
① 創(chuàng)建ServerSocket對象,綁定監(jiān)聽端口
② 通過accept()方法監(jiān)聽客戶端請求
③ 連接建立后,通過輸入流讀取客戶端發(fā)送的請求信息
④ 通過輸出流向客戶端發(fā)送鄉(xiāng)音信息
⑤ 關(guān)閉相關(guān)資源
/**
* 基于TCP協(xié)議的Socket通信,實現(xiàn)用戶登錄,服務端
*/
//1、創(chuàng)建一個服務器端Socket,即ServerSocket,指定綁定的端口,并監(jiān)聽此端口
ServerSocket serverSocket =newServerSocket(10086);//1024-65535的某個端口
//2、調(diào)用accept()方法開始監(jiān)聽,等待客戶端的連接
Socket socket = serverSocket.accept();
//3、獲取輸入流,并讀取客戶端信息
InputStream is = socket.getInputStream();
InputStreamReader isr =newInputStreamReader(is);
BufferedReader br =newBufferedReader(isr);
String info =null;
while((info=br.readLine())!=null){
System.out.println("我是服務器,客戶端說:"+info);
}
socket.shutdownInput();//關(guān)閉輸入流
//4、獲取輸出流,響應客戶端的請求
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("歡迎您!");
pw.flush();
//5、關(guān)閉資源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
5、客戶端:
① 創(chuàng)建Socket對象,指明需要連接的服務器的地址和端口號
② 連接建立后,通過輸出流想服務器端發(fā)送請求信息
③ 通過輸入流獲取服務器響應
④ 關(guān)閉響應資源
//客戶端
//1、創(chuàng)建客戶端Socket,指定服務器地址和端口
Socket socket =newSocket("localhost",10086);
//2、獲取輸出流,向服務器端發(fā)送信息
OutputStream os = socket.getOutputStream();//字節(jié)輸出流
PrintWriter pw =newPrintWriter(os);//將輸出流包裝成打印流
pw.write("用戶名:admin;密碼:123");
pw.flush();
socket.shutdownOutput();
//3、獲取輸入流,并讀取服務器端的響應信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while((info=br.readLine())!null){
System.out.println("我是客戶端,服務器說:"+info);
}
//4、關(guān)閉資源
br.close();
is.close();
pw.close();
參考網(wǎng)站:
http://movesan.me/2017/03/09/network-b/