天天看點

RESTful與網絡請求過程

最近想好好總結一下網絡請求的一些相關的内容,随便深入去探讨一下内部是如何實作的。

一.RESTful

這個名詞可能經常被提到過,這裡也順便簡單過一遍。

RESTful與網絡請求過程

簡單看看它常用的行為

RESTful與網絡請求過程

簡單看看請求的狀态碼

RESTful與網絡請求過程

就簡單了解下就好,可以把它當成一個規範。

二.網絡請求的過程

我建議可以去看這兩篇文章,寫得都比較清楚

http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html http://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html
1.網絡OSI模型

常說的網絡七層模型(最好還是能記住)

(1)應用層

(2)表示層

(3)會話層

(4)傳輸層

(5)網絡層

(6)資料鍊路層

(7)實體層

當然一般都可以把最上邊的三層當成一個應用層的整體。

2.每層的工作

我是要照着文章的來說

這篇文章感覺寫得很特别,别人都是從上層往下層寫,他是從下層往上層寫。

實體層就不說了

(1)資料鍊路層

這層有個以太網協定,把資料包稱為幀,幀的結構如下

RESTful與網絡請求過程

每一幀最短為64位元組,最長1518位元組

(2)網絡層

網絡層就是IP協定所在的層。它的幀結構如下

RESTful與網絡請求過程

(3)傳輸層

傳輸層就是TCP/DUP協定所在的層。它的幀結構如下

RESTful與網絡請求過程

而在應用層的資料就是這裡的data,上面是從下層到上層的分析,那麼如果從上層到下層的分析呢。

其實網絡中資料的傳輸就是傳包,也就是最上面說的幀,而這個包可以看成是自上而下每經過一層到會封裝一層變成一個新包,然後接收端自下而上一層層拆包,最終拿到請求的資料。

3.整個過程涉及到的名詞

上面的流程我不想講得太相信,免得會感覺亂,反正記住他們間的通信是傳包就行,這裡也總結下這個過程中涉及到的一些名詞。

(1)MAC位址

每塊網卡出廠的時候,都有一個全世界獨一無二的MAC位址,長度是48個二進制位,通常用12個十六進制數表示。通過自身的MAC位址和對方的MAC位址,可以找到互相通信的兩個端

(2)IP位址

MAC位址不能通過跨網域找到另一端的MAC位址。這時就需要ip位址。IP協定第四版,簡稱IPv4,規定ip位址由32個二進制組成,ip位址用于辨別在網絡中的計算機。

(3)子網路遮罩

什麼是子網路遮罩,就是表示子網絡特征的一個參數。它用來判斷兩個ip位址是否屬于同一個網絡中。比如說你兩個端都連同一個路由器,那他們就屬于同個網絡。

子網路遮罩判斷的方法是與IP位址做AND運算,如果結果相同說明兩個ip處于同一網絡。

(4)DNS

DNS是什麼,簡單的說,通信是需要兩端的ip位址,但是有時候我們請求網絡是“

www.baidu.com

”,這時候就可以通過DNS協定擷取這個位址的ip位址。

三.socket

上面講的整個流程中并沒有提到socket,而我們開發時經常能聽到http是建立在socket上,那這個socket是什麼呢。

socket起源于Unix,它不屬于任何一層,它是應用層與傳輸層之間的一個抽象層,是抽象層,這個抽象很重要。為什麼要有這樣的一個抽象層呢,因為底層的操作過于煩雜,是以就需要一個東西來幫你做底層的操作,是以socket也是一個門面模式的展現,你隻需要調用socket的方法,socket來幫你做下層的操作。(别人的圖)

RESTful與網絡請求過程

關于socket我也不是很了解,不知道要怎麼講好,要注意的是socket有個緩沖區,資料的傳輸過程不是直接發送,而是先發送到緩沖隊列,再發送給服務端。

RESTful與網絡請求過程

四.HTTP

HTTP屬于應用層的協定,關于http可能講得比較多的就是封包

(1)請求封包

RESTful與網絡請求過程

(2)響應封包

RESTful與網絡請求過程

封包的詳解網上很多,我就不copy了,需要注意的是請求頭中Content-Type這個key,這個Mime所對應的值其實還是很多的

http://tool.oschina.net/commons/

其中比較常用的幾個類型可以參考這篇文章最終形成的封包的形式

https://blog.csdn.net/jekxi/article/details/54342789
RESTful與網絡請求過程
RESTful與網絡請求過程

這些還是要注意一下,類型不正确的話有可能會導緻服務端接收不到資料。

然後就是資料的傳輸,資料傳輸用POST請求的multipart/form-data類型進行資料的傳輸。

對這個傳輸過程其實我是比較迷惑,我看過一句話,應用層主要做包裝資料的工作,傳輸層做傳輸資料的操作。

網上很多介紹HTTP的一些基礎的内容,我這不想重複去寫。那麼我就想問一個問題:http請求,資料是在應用層包裝然後用流寫到緩沖隊列的嗎?

普通的請求看是這樣的說法合理,封包所占的空間肯定是占用記憶體空間。但是傳大檔案的話就不太合理了,因為如果是要拼接成封包,那麼檔案就會寫入到記憶體中,這就很不合理。

很可惜的是我在網上找了很久都沒找到這個問題,于是我就問了一個寫底層代碼的朋友,他告訴我。

普通請求就是在應用層拼接完整的封包,然後以流的形式給socket的SendQ,傳檔案的話就是拼接頭把頭給SendQ,然後檔案直接從檔案目錄直接給SendQ

繼續閱讀