1. 程式人生 > >Java/Android中的網路程式設計--(上)

Java/Android中的網路程式設計--(上)

網路是20世紀最偉大的發明之一,眾多的裝置可以以有線或者無線的方式連入整個網際網路,進而互相通訊。為了更好的開發、管理、接入網路,科學家設計了通訊協議,將整個網路架構分為7層(4層),並規範了每一層的功能。

網路分層

早期的OSI參考模型將網路分為7層:應用層、表示層、會話層、傳輸層、網路、資料鏈路層、物理層。為什麼要這麼分?各層的功能如下:

1.應用層:實現應用間的通訊;

2.表示層:提供字元程式碼、資料格式、控制資訊格式、加密等的統一表示。

3.會話層:對傳輸的報文提供同步管理服務

4.傳輸層:資料傳送的通道;

5.網路層:資料的儲存轉發;

6.資料鏈路層:物理定址,

7.物理層:通過物理媒介上的傳輸。

OSI參考模型相對繁雜,TCP/IP模型在其基礎上進行了相應的簡化,將應用、表示、會話這3層壓縮成了應用層,將資料鏈路層、物理層統稱為網路通訊層。兩種分層模式具體如下:

由上圖可以看出:OSI參考模型注重通訊協議的必要的功能是什麼;TCP/IP則更強調在計算機上實現協議應該開發哪種協議、程式。程式設計師在進行網路程式設計的時候也上在應用層和傳輸層上進行操作。

網路通訊層

網路介面層和硬體層統稱為網路通訊層,它定義了資料在在乙太網(區域網)中應該遵循什麼協議,比如wifi需要遵循IEEE。802.11b或802.11g協議。體現在硬體上就是交換機、網絡卡等,交換機支援乙太網協議,並根據mac地址進行分組轉發。mac地址一般被燒入到了ROM中,所以基本上唯一,地址長6個位元組,48個位元。

網路層

這一層主要協議有:IP、ICMP、ARP等,實現基於IP地址的資料分包轉發。其中還提供了ICMP、ARP等一些輔助協議,ICMP用來發送異常資訊,ARP則是從分包資料的IP地址中解析出一種實體地址的協議。IP大致分為3個模組:IP定址、路由、分包與組包。

目前我們常說的IP地址,一般都是IPv4地址,由4個位元組組成。 所以你會經常看到這樣的IPv4地址:172.20.6.50,共分為段,用3個英文圓點區分,每段一個位元組,這樣表示的數字有:2的32次方,大約是42億。假設每個人都分配一個IP,那麼IPv4是不滿足所有人的需求的。因此出現了IPv6地址,由16個位元組組成,共分為8段,用英文圓點區分,兩個位元組一段。2的128次方是足以滿足所有人對IP地址的需求的。

網路層中的資料格式為“幀”,具體格式分Ip的版本IPv4首部格式如下:

IPv6首部格式如下:

傳輸層

主要協議為TCP、UDP,其中TCP是一種面向有連線的傳輸層協議,保證資料的可達性;其中UDP是一種面向無連線的傳輸層協議,不關注對端是否真的收到了傳過去的資料。

TCP的連線過程如下:通過TCP3次握手建立連線,然後開始通訊,通訊過程中採用一些通訊策略優化傳輸速度和質量,如:視窗控制(多組資料一起發)、擁塞控制等,當需要斷開連線的時候,通過TCP4次揮手結束通訊。

TCP的3次握手如下圖所示(seq表示序列號,ack表示應答號):

為什麼需要3次握手呢?假設只有兩次握手,A向B發起連線請求,B迴應請求,此時A、B之間建立了全雙工通訊通道(A和B可以互相主動傳送訊息)。存在如下兩種情況:1、如果B的迴應正確到達A,那麼A已經知道它們之間是建立了通訊連線的,然而B不確定:到底是否有建立連線。所以此時B可能再次發起迴應,嘗試建立連線。造成資料錯亂;2、B的迴應沒有正確到達A,此時B嘗試向A傳送資料,會造成資料的不可達性。因此A向B發起請求,B迴應請求,A再確認請求,共3次握手能夠確保的正確性。

TCP的4次揮手如下圖所示:

為什麼需要4次揮手呢?假設只有3次握手,A向B發起斷開連線的請求,B迴應請求,A再確認。由於通訊通道是全雙共的,B再回應斷開請求的時候,可能有資料在半路上,還沒有到達對端,那麼此時到底要不要等呢?所以B作為響應斷開連線的一方,是需要做出“決斷”的:傳送一個FIN訊號,表示我不會再發送資訊給你,你也不要傳送資訊給我了。

TCP首部:

UDP首部

注:socket是傳輸層協議的具體承載體,一般socket程式設計,就是直接在傳輸層進行通訊。為了傳送請求,一般是需要解析TCP/UDP的輸入/輸出流的,這一點比較麻煩,具體可參考okhttp的解析socket流的過程。

應用層

將OSI參考模型中的應用層、表示層、會話層集中到了應用程式中實現,在日常的開發工作中碰到最多的就是http/https協議。

http協議:

主要有3個版本1.0,1.1,2.0:

1.0是短連線,完成一次請求後,就會斷開TCP連線;

1.1是長連線,快取處理;

2.0是在1.x的基礎上引進了:多路複用、二進位制分幀、首部壓縮、支援伺服器推送;

連線過程如下:域名解析 -> TCP三次握手 ->發起http請求 ->伺服器響應請求,並返回資料 ->得到反饋資料->完成。本質上是一個單工通訊,除非客戶端請求,否則服務端不能主動給客戶端傳送資料。因此推送、IM等需要長連線的模組,一般會選擇socket通訊(全雙工通訊)。

http請求行格式如下:

POST .../index.js HTTP/1.1 //請求行

Connection:keep-alive //請求頭

host:www.baidu.com

...

Accept:xxx //請求頭

xxxx //請求體

http響應行格式:

Http1.1 200 Ok //響應行

host:www.baidu.com //響應頭

...

Content-Length:134 //響應頭

xxxx //響應體

對比TCP/UDP的資料格式可以看出,其實Http協議對TCP/UDP資料進行更小粒度的細化。也就是說應用層資料對傳輸層資料進行了一次“格式化”的解析。

https協議

在http的基礎上引入了TLS/SSL協議,在傳輸資料前需要進行一次握手。連線過程:需要7次通訊

1. 將自己支援的加密演算法傳送給伺服器;

2. 伺服器根據演算法選定合適的演算法;

3. 伺服器傳送證書給客戶端;

4. 客戶端驗證證書的合法性;

5. 並利用證書中的公鑰將對稱加密進行加密後,傳給伺服器;

6. 伺服器利用私鑰解密出對稱祕鑰,並加密資料;

7. 客戶端解密資料,開始通訊;

總結

希望你瞭解:1)為什麼要有網路分層?各層的功能?2)TCP的連線過程?為什麼要3次握手,4次揮手?2)HTTP/HTTPs的連線過程?

歡迎關注微信公眾號:“小工說”

掃碼關注:

http://weixin.qq.com/r/XilOVmjEzjWxrSw193xM (二維碼自動識別)