1. 程式人生 > >Android面試題----Android開發也需要了解的TCP\IP和Http知識

Android面試題----Android開發也需要了解的TCP\IP和Http知識

歡迎掃描二維碼關注公眾號《Android面試專欄》,不定期釋出面試題乾貨分析!!

下面這張圖大家一定很熟悉,但面試時卻經常想不起來!

左邊是標準的OSI參考模型,共7層;右邊是TCP/IP參考模型,分為4層。實際使用中更多的是右邊的TCP/IP參考模型。對於TCP/IP的4層模型可以簡單地理解為:

  • 網路接入層:將需要相互連線的節點接入網路中,從而為資料傳輸提供條件。
  • 網路互聯層:找到要傳輸資料的目標節點。(IP協議)
  • 傳輸層:實際傳輸資料。(TCP 、UDP協議)
  • 應用層:使用接收到的資料。(HTTP、HTTPS、DNS協議)

一、TCP/IP協議

TCP/IP協議通常放在一起來說,不過它們是兩個不同的協議,所起的作用也不一樣。IP協議是用來查詢地址的,對應著網際互聯層,TCP協議是用來規範傳輸規則的,對應著傳輸層。IP只負責找到地址,具體傳輸工作交給TCP來完成。

TCP在傳輸之前會進行三次溝通,一般稱為“三次握手”,傳完資料斷開的時候,要進行四次溝通,一般稱為“四次揮手”。要理解這個過程首先需要理解TCP中的兩個序號和三個標誌位的含義:

seq:sequence number的縮寫,表示所傳資料的序號。TCP傳輸時每一個位元組都有一個序號,傳送資料時會將資料的第一個序號傳送給對方,接收方會按序號檢查是否接收完整了,如果沒有接收完整就需要重新傳送,這樣就可以保證資料的完整性。

ack:asknoledgement number的縮寫,表示確認號。接收端用它來給傳送端反饋已經成功接收到的資料資訊,它的值為希望接收的下一個資料包起始序號,也就是ack值所代表的序號前面資料已經成功接收到了。

ACK:確認位,只有ACK=1的時候ack才起作用。正常通訊時ACK為1,第一次發起請求時因為沒有需要確認接收的資料所以ACK為0。

SYN:同步位,用於在建立連線時同時序號。剛開始建立連線時並沒有歷史接收資料,所以ack也就沒辦法設定,這時按照正常的就無法運行了,SYN的作用就是來解決這個問題的,當接收端接收到SYN=1的報文時就會直接將ack設定為接收到的seq+1的值,注意這裡面的值並不是校驗後設置的,而是根據SYN直接設定的,這樣正常的機制就可以運行了,所以SYN叫同步位。需要注意的是,SYN會在前面再次握手時都為1,這是因為通訊的雙方的ack都需要設定一個初始值。

FIN:終止位,用來在資料傳輸完畢後釋放連線。

整個傳輸過程如圖

圖中上部分為三次握手,下部分為四次揮手。TCP的傳輸是雙全工模式,也就是說傳輸的雙方是對等的,可以同時傳輸資料,所以無論連線還是關閉都需要對雙方同時進行。

三次握手和四次揮手保證了連線的可靠性,不過凡事有利就有弊,這種模式也有它的缺點,首先是在傳輸效率上會比較低,另外三次握手的過程中客戶端需要傳送兩次資料才可以建立連線,容易被DDOS攻擊(SYN Flood攻擊)。

UDP也是用於傳輸層的協議,和TCP的主要區別是,TCP是有連線的,UDP是沒有連線的。UDP協議拿到地址後就傳了,因此TCP協議傳輸的資料更可靠,而UDP協議傳輸的速度更快。

HTTP協議的底層傳輸預設使用的是可靠的TCP協議,不過它對網際網路的高速發展帶來了很大的制約,Google制定了一套基於UDP和QUIC(Quick UDP Intent Connection)協議,這種協議基於TCP和UDP之間的,但未廣泛使用。

TCP/IP協議只是一套規則,並不能具體工作,而Socket是TCP/IP協議的一個具體的實現。

二、HTTP協議

HTTP是應用層的協議,在TCP/IP協議接收到資料之後需要通過HTTP協議來解析才可以使用。

HTTP協議中的報文結構很重要。HTTP中報文分為請求報文(request messaget)和響應報文(response message)兩種型別,這兩種型別都包括三部分:首行、頭部和主體。

請求報文的首行是請求行,包括方法(請求型別)、URL和HTTP版本三項內容,響應請求的首行是狀態行,包括HTTP版本、狀態碼和簡短原因三項內容,其中原因可有可無。

頭部儲存一些鍵值對的屬性,用冒號“:”分割。

主體儲存具體內容,請求報文中主要儲存POST型別的資料,響應報文中儲存頁面要顯示的結果。首行、頭部和主體以及頭部的各項內容用回車換行(\r\n)分割,另外頭部和主體之間多一個空行,也就是有兩個連續的回車換行。

請求報文中的方法指GET、HEAD、POST、PUT、DELETE等型別。

響應報文中的狀態碼是reponse中的status,一共可以分為5類:

1xx:資訊性狀態碼;

2xx:成功狀態碼,如200表示成功;

3xx:重定向狀態碼,如301表示重定向;

4xx:客戶端錯誤狀態碼,如404表示沒有找到請求的資源;

5xx:服務端錯誤狀態碼,如500表示內部錯誤。

另外,DNS協議的作用是將域名解析為IP。它作用在應用層。

-------------------------------------------------------------------------------------------

本文原創釋出於公眾號《Android面試專欄》,歡迎搜尋關注!也歡迎大家留言投稿!