android進階3step2:Android App通訊 ——埠號IP等網路基礎知識掃盲
網路操作基礎知識
一、IP 地址和埠號
- 1) IP 地址用於在網路中唯一標識一臺機器(通訊實體),是一個 32 位整數,通常 用 4 個 0-255 的十進位制數標識;
- 2) 埠號用於唯一標識通訊實體上進行網路通訊的程式,同一臺機器上不能有兩個程式佔用同一個埠的情況;
埠號是一個 16 位整數,共有 3 類;
-
公認埠:0-1023,它們緊密繫結一些特定的服務(比如 TCP/IP 通訊協 議程式的埠);
-
註冊埠:1024-49151,它們鬆散繫結一些特定服務,其餘可以隨意使 用,應用程式用的最多埠號來自於這個範圍;
-
動態/私有埠:49152-65535,這些埠一般是應用程式執行時臨時地、 動態地佔用,可以說是一種競爭資源吧,應用程式本身不會和這些埠綁 定,一般會將其作為資源利用;
- 3)真正參與網路通訊的物件是計算機上的程式(網路通訊程式),IP 地址是它的街 道門牌,而埠是它的房間號;
二、阻塞(blocking)與非阻塞(non-blocking)IO
IO 的阻塞、非阻塞主要表現在一個 IO 操作過程中,如果有些操作很慢,比如讀操 作時需要準備資料,那麼當前 IO 程序是否等待操作完成,還是得知暫時不能操作後先 去做別的事情?
一直等待下去,什麼事也不做直到完成,這就是阻塞。
抽空做些別的事情,這是非阻塞。
非阻塞 IO 會在發出 IO 請求後立即得到迴應,即使資料包沒有準備好,也會返回 一個錯誤標識,使得操作程序不會阻塞在那裡。操作程序會通過多次請求的方式直到數
據準備好,返回成功的標識。
想象一下下面兩種場景:
情景A 小明和小剛兩個人都很耿直內向,一天小明來找小剛借書:“小剛啊,你那本XXX 借我看看”。 於是小剛就去找書,小明就等著,找了半天找到了,把書給了小明。
情景B 小明和小剛兩個人都很活潑外向,一天小明來找小剛借書:“嘿小剛,你那本 XXX
借我看看”。 小剛說:“我得找一會”,小明就去打球去了。過會又來,這次書找到了, 把書給了小明。
結論:A 是阻塞的,B 是非阻塞的。
從 CPU 角度可以看出非阻塞明顯提高了 CPU 的利用率,程序不會一直在那等待。 但是同樣也帶來了執行緒切換的增加。增加的 CPU 使用時間能不能補償系統的切換成 本需要好好評估。
三、同步(synchronous)與非同步(asynchronous)IO
判斷同步和非同步的標準在於:
一個 IO 操作直到完成,是否導致程式程序的阻塞。 如果阻塞就是同步的,沒有阻塞就是非同步的。
這裡的 IO 操作指的是真實的 IO 操作, 也就是資料從核心拷貝到系統程序(讀)的過程。
繼續前面借書的例子,非同步借書是這樣的:
情景C 小明很懶,一天小明來找小剛借書:“嘿小剛,你那本 XXX 借我看看”。 小剛 說:“我得找一會”,小明就出去打球了並且讓小剛如果找到了就把書拿給他。小剛是個負責任的人,找到了書送到了小明手上。
A 和 B 的借書方式都是同步的,有人要問了 B 不是非阻塞嘛,怎麼還是同步?
前面說了 IO 操作的 2 個步驟:準備資料和把資料從核心中拷貝到程式程序。
對映到這個 例子,書即是準備的資料,小剛是核心,小明是程式程序,小剛把書給小明這是拷貝資料。
在 B 方式中,小剛找書這段時間小明的確是沒閒著,該幹嘛幹嘛,但是小剛找到 書把書給小明的這個過程也就是拷貝資料這個步驟,小明還是得乖乖的回來候著小剛把 書遞手上。所以這裡就阻塞了,根據上面的定義,所以是同步。
在涉及到 IO 處理時通常都會遇到一個是同步還是非同步的處理方式的選擇問題。
同步能夠保證程式的可靠性,而非同步可以提升程式的效能。
小明自己去取書不管等著不 等著遲早拿到書,指望小剛找到了送來,萬一小剛忘了或者有急事忙別的了,那書就沒 了。