1. 程式人生 > 程式設計 >Android儲存App異常資訊到本地

Android儲存App異常資訊到本地

套接字底層原理

TCP套接字

TPC的服務端要先監聽一個埠,一般是先呼叫bind函式,給這個Soket賦予一個IP地址和埠。

當服務端有了IP和埠號,就可以呼叫listen函式進行監聽。這時候客戶端就可以發起連線了。

在作業系統中,為每個Socket維護兩個佇列。一個是已經建立了連線的佇列,三次握手已完畢,處於established狀態。一個是還沒有完全建立連線的,沒有完成三次握手,處於syn_rcv的狀態。

在服務端等待的時候,客戶端可以通過connect函式發起連線。先在引數中指明要連線的IP地址和埠號,然後開始三次握手,作業系統會給客戶端分配一個臨時的埠。一旦握手成功,服務端的accept

就會返回另一個用於傳輸資料的Socket。

連線建立成功之後,雙發開始通過readwrite函式來讀寫資料,就像往一個檔案流裡面寫東西一樣。

UDP套接字

因為UDP通訊無需建立連線看,所以也不需要三次握手,也就不需要呼叫listenconnect函式函式,但是,UPD的互動仍然需要IP地址和埠號,因而需要bind。UDP是沒有維護連線狀態的,因而不需要對沒對連線建立一組Socket,而是隻要有一個Socket,就能夠和多個客戶端通訊。也正是因為沒有連線狀態,每次通訊的時候,呼叫sendtorecvfrom,都可以傳入IP地址和埠。

伺服器如何提高併發量

Web請求一般都是HTTP請求,而HTTP協議又是基於TCP的,所以,我們主要探索如何讓伺服器同時處理更多TCP連線請求。

  1. 多程序

    當有新的請求進來,fork出一個子程序,讓子程序處理該請求,提高併發量

  2. 多執行緒

    程序開銷太大,執行緒則輕量級的多,所以我們還可以通過在程序中建立新的執行緒來處理請求。

    上面基於程序或執行緒的模型還是有問題,因為每新進來一個 TCP 連線請求,就需要分配一個程序或執行緒,從而引發著名的 C10K 問題(一臺機器要維護 1 萬個連線,就要建立 1 萬個程序或者執行緒,作業系統是無法承受的。如果維持 1 億使用者線上需要 10 萬臺伺服器,成本也太高了),為此,又誕生了一種新的技術 —— 多路 IO 複用。

  3. 多路IO複用

    所謂多路IO複用可以簡單理解為一個執行緒維護多個Socket(前面多程序多執行緒說的都是一個程序或執行緒維護一個Socket),這也有兩種實現方式:輪詢和事件通知。

    因為 Socket 在 Linux 系統中以檔案描述符形式存在,所以我們把一個執行緒維護的所有 Socket 叫做檔案描述符集合,所謂輪詢就是呼叫核心的 select 函式監聽檔案描述符集合是否有變化,一旦有變化,就會依次檢視每個檔案描述符,對那些發生變化的檔案描述符進行讀寫操作,然後再呼叫 select 函式監聽下一輪的變化。

    顯然,輪詢的效率有點低,因為每次檔案描述符集合有變化,都要將全部 Socket 輪詢一遍,這大大影響了系統能夠支撐的最大連線數。如果改成事件通知的方式,情況要好很多。所謂事件通知,就是某個檔案描述符發生變化,呼叫 epoll 函式主動通知。這種方式使得監聽的 Socket 資料增加的時候,效率不會大幅度降低,能夠同時監聽的 Socket 的數目也非常多。上限就為系統定義的、程序開啟的最大檔案描述符個數。

    因此,epoll 被稱為解決 C10K 問題的利器。