1. TCP連接
手機能夠使用連網功能是因為手機底層實現了TCP/IP協定,使手機終端透過無線網路建立TCP連接。 TCP協定可以對上層網路提供接口,使上層網路數據的傳輸建立在“無差別”的網路之上。
建立起一個TCP連接需要經過"三次握手":
- 第一次握手:客戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,待伺服器確認後。
- 第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態。
- 第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
握手過程中傳送的包裡不包含數據,三次握手完畢後,客戶端與伺服器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接會一直保持下去。斷開連接時伺服器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過"四次握手"(與連線時雷同,最終是確定斷開)。
2. HTTP連接
HTTP協定,即超文本傳送協定(Hypertext Transfer Protocol ),是Web連網的基礎,也是手機連網常用的協定之一,HTTP協定是建立在TCP協定之上的一種應用。
HTTP連接最顯著的特點是客戶端發送的每次請求都需要伺服器回傳回應,在請求結束後,會主動釋放連接。從建立連接到關閉連接的過程稱為"一次連接"。
- 在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求後,就自動釋放連接。
- 在HTTP 1.1中則可以在一次連接中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。
由於HTTP在每次請求結束後都會主動釋放連接,因此HTTP連接是一種"短連接",要保持客戶端的在線狀態,須要不斷地向伺服器發起連接請求。通常的做法是即使不需獲得任何數據,客戶端也保持每隔一段固定的時間向伺服器發送一次“保持連接”的請求,伺服器在收到該請求後對客戶端進行回覆,表明知道客戶端“在線”。若伺服器長時間無法收到客戶端的請求,則認為客戶端"下線",若客戶端長時間無法收到伺服器的回覆,則認為網路已經斷開。
3. Socket原理
3.1 插口(Socket)概念
插口(Socket)是通訊的基礎,是支援TCP/IP協定的網路通信的基本操作單元。它是網路通信過程中端點的抽象表示,包含進行網路通信必須的五種信息:
- 連接使用的協定,本地主機的IP地址,本地的協定端口;遠地主機的IP地址,遠地的協定端口。
- 應用層透過傳輸層進行數據通信時,TCP會遇到同時為多個應用程式過程提供並發服務的問題。
- 多個TCP連接或多個應用程式過程可能需要透過同一個TCP協定端口傳輸數據。
- 為了區別不同的應用程式和連接,許多計算機操作系統為應用程式與TCP/IP協定交互提供了套接字(Socket)接口。
- 應用層可以和傳輸層透過Socket接口,區分來自不同應用程式或網路連接的通信,實現數據傳輸的並發服務。
3.2 建立Socket連接
建立Socket連接至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket ,另一個運行於伺服器端,稱為ServerSocket 。
套接字之間的連接過程分為三個步驟:伺服器監聽,客戶端請求,連接確認。
- 伺服器監聽:伺服器器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網路狀態,等待客戶端的連接請求。
- 客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連接的伺服器的套接字,指出伺服器端套接字的地址和端口號,然後就向伺服器端套接字提出連接請求。
- 連接確認:當伺服器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就回應客戶端套接字的請求,建立一個新的線程,把伺服器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。
4. Socket連接與TCP連接
建立Socket連接時,可指定使用的傳輸層協定,Socket可以支援不同的傳輸層協定(TCP或UDP),當使用TCP協定進行連接時,該Socket連接就是一個TCP連接。
5. Socket連接與HTTP連接
由於通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開始相互發送數據內容,直到雙方連接斷開。但在實際網路應用中,客戶端到伺服器之間的通信往往需要穿越多個中間節點,例如路由器、網關、防火牆等,大部分防火牆默認會關閉長時間處於非活躍狀態的連接而導致Socket 連接斷連,因此需要經過不斷告訴網路,該連接處於活躍狀態。
HTTP連接使用是"請求和回應"的方式,不僅在請求時需要先建立連接,而且需要客戶端向伺服器發出請求後,伺服器端才能回傳數據。
很多情況下,需要伺服器端主動向客戶端發送數據,保持客戶端與伺服器數據的實時與同步。此時若雙方建立的是Socket連接,伺服器就可以直接將數據傳送給客戶端;若雙方建立的是HTTP連接,則伺服器需要等到客戶端發送一次請求後才能將數據傳回給客戶端,因此,客戶端定時向伺服器端發送連接請求,不僅可以保持在線,同時也是在"詢問"伺服器是否有新的數據,若有新數據即可傳給客戶端。
參考出處:
沒有留言:
張貼留言