標籤:android http tcp
背景我們在網路編程(1)中知道:電腦之間的通訊可以利用URL手段來定位資源。這種手段是基於TCP/IP協議族來實現的。所謂基於TCP/IP協議族,其實(1)中擷取網路資源定位來理解比較好,從IP和連接埠來理解:
- IP協議是電腦用來相互識別的通訊的一種機制,每台電腦都有一個IP.用來在網際網路上標識這台電腦。IP協議僅僅是允許電腦相互發訊息,但它並不檢查訊息是否以發送的次序到達而且沒有損壞(只檢查關鍵的頭資料)。為了提供訊息檢驗功能,直接在IP協議上設計了傳輸控制通訊協定TCP協議。
- TCP協議確保資料包以正確的次序到達,並且嘗試確認資料包的內容沒有改變。TCP在IP地址之上引連接埠(port),它允許電腦通過網路提供各種服務。一些連接埠號碼為不同的服務保留,而且這些連接埠號碼是眾所周知。
一般地,這兩個協議是一起工作的。TCP 負責應用軟體(瀏覽器)和網路軟體(服務端上的)之間的通訊。IP 負責電腦之間的通訊。TCP 負責將資料分割並裝入 IP 包,IP 負責將包發送至接受者,傳輸過程要經IP路由器負責根據通訊量、網路中的錯誤或者其他參數來進行正確地定址,然後在它們到達的時候重新組合它們。
HTTP協議(HyperText Transfer Protocol,超文字傳輸通訊協定 (HTTP))是用於從WWW伺服器傳輸超文本到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證電腦正確快速地傳輸超文字文件,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示(如文本先於圖形)等。HTTP是基於TCP協議之上(藉助網上的圖片)網路模型
響應模型
由於HTTP是一個無狀態的協議。無狀態是指客戶機(Web瀏覽器)和伺服器之間不需要建立持久的串連,這意味著當一個用戶端向伺服器端發出請求,然後伺服器返迴響應(response),串連就被關閉了,在伺服器端不保留串連的有關資訊.HTTP遵循請求(Request)/應答(Response)模型。客戶機(瀏覽器)向伺服器發送請求,伺服器處理請求並返回適當的應答。所有HTTP串連都被構造成一套請求和應答。工作流程一下測試資料全部使用抓包工具Wireshark 點擊下載抓包工具
(1)網域名稱解析地址
從網路編程(1)看到,我們訪問www.baidu.com只是一個網域名稱,需要一個“網域名稱系統”幫我們找到真實的IP地址。一般的,會從我們的瀏覽器DNS緩衝中,查看我們之前是否有訪問過這個網站,如果有就找到對應的IP條目進行訪問;如果沒有則預設會從自己的主機host檔案(位於C:\Windows\System32\drivers\etc)中尋找,如果有就直接存取;如果沒有這時就需要請求我們本地配置的DNS伺服器(這個一般是我們的網路供應商提供的),發起網域名稱解析請求(通過的是UDP協議向DNS的53連接埠發起請求,這個請求是遞迴的請求),電訊廠商的DNS伺服器首先尋找自身的緩衝,找到對應的條目,且沒有到期,則解析成功。如果沒有找到對應的條目,則有電訊廠商的DNS代我們的瀏覽器發起迭代DNS解析請求。首先先從根域的DNS的IP地址(A),問A“www.baidu.com的IP地址是多少?”A一看發現不知道這個的IP地址是多少,不過他知道B管“com”這類頂級域的IP地址,於是告訴讓我去找B。找到B後問他“www.baidu.com的IP地址是什嗎?”然而B只知道“baidu.com”這類許可權網域名稱歸C管,讓我去找C。於是又跑到C那裡問“www.baidu.com的IP地址是什嗎?”,最後C在自己的伺服器上一查發現有對應的IP條目,就返回告訴了我們。並返回給Windows系統核心,核心又把結果返回給瀏覽器,終於瀏覽器拿到了並緩衝起來。
(2)發起TCP的3次握手
那麼我們進過(1)步驟解析出IP地址之後,我們需要在兩個主機之間建立串連,分為3次握手。
- Client首先發送一個串連試探,ACK=0 表示確認號無效,SYN = 1 表示這是一個串連請求或串連接受報文,同時表示這個資料報不能攜帶資料,seq = x 表示Client自己的初始序號(seq = 0 就代表這是第0號包),這時候Client進入syn_sent狀態,表示用戶端等待伺服器的回複
- Server監聽到串連請求報文後,如同意建立串連,則向Client發送確認。TCP報文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到對方下一個報文段的第一個資料位元組序號是x+1,同時表明x為止的所有資料都已正確收到(ack=1其實是ack=0+1,也就是期望用戶端的第1個包),seq = y 表示Server 自己的初始序號(seq=0就代表這是伺服器這邊發出的第0號包)。這時伺服器進入syn_rcvd,表示伺服器已經收到Client的串連請求,等待client的確認。
- Client收到確認後還需再次發送確認,同時攜帶要發送給Server的資料。ACK 置1 表示確認號ack= y + 1 有效(代表期望收到伺服器的第1個包),Client自己的序號seq= x + 1(表示這就是我的第1個包,相對於第0個包來說的),一旦收到Client的確認之後,這個TCP串連就進入Established狀態,就可以發起http請求了。
(3)建立TCP串連後發起http請求
查看http請求內容(紅框分別為請求行和請求前序)
(4)伺服器響應http請求,瀏覽器得到html代碼
經過(1)-(4)之後 瀏覽器解析html代碼,並請求html代碼中的資源(圖片等)並對頁面進行渲染呈現給使用者。我們從請求前序裡面看到Connection:keep-alive。一般來說一個串連請求完畢後會釋放TCP串連。由於與伺服器頻繁的互動,所以keep-alive能夠保持與伺服器的“串連”,無需每次都斷開,減少開銷。
傳輸模型
從我們可以看到,依次從高層對資料進行分裝知道最底層鏈路層,其傳輸路徑為
用戶端將請求封裝成http資料包-->封裝成Tcp資料包-->封裝成Ip資料包--->封裝成資料幀--->硬體將幀資料轉換成bit流(位元據)-->最後通過物理硬體(網卡晶片)發送到指定地點;伺服器硬體首先收到bit流,然後轉換成ip資料包。於是通過ip協議解析Ip資料包,然後又發現裡面是tcp資料包,就通過tcp協議解析Tcp資料包,接著發現是http資料包通過http協議再解析http資料包得到資料。
總結特點
- 模式:支援客戶/伺服器。(用戶端←→服務端)
- 簡單靈活:客戶向伺服器請求服務時,只需傳送要求方法和路徑。要求方法常用的有GET、POST等方法,方法規定了客戶與伺服器聯絡的類型不同。同時HTTP允許傳輸任意類型的資料對象。正在傳輸的類型由Content-Type加以標記。
- 無串連:不需連線的含義是限制每次串連只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即中斷連線。
- 無狀態:無狀態是指協議對於交易處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳。
網路編程(3)——初探HTTP協議