玩轉iOS開發:iOS中的Socket編程(二)

文章分享至個人我的技術博客: https://cainluo.github.io/14987134210457.htmlhtml


接着講

在以前的那篇文章, 咱們瞭解了一些關於Socket的基礎知識, 若是沒有去看的朋友, 能夠去看看玩轉iOS開發:iOS中的Socket編程(一).git

那麼如今咱們繼續來說講剩下的一丟丟知識, 而後就開始來寫咱們的代碼~github


創建TCP鏈接

上一講也說了, Socket是基於TCP/IP上的封裝, 若是要了解Socket的鏈接, 就要從TPC/IP的鏈接入手.編程

咱們日夜不分離的手機之因此能聯網, 也是由於手機的底層實現了TCP/IP協議, 可讓手機經過WiFi, 4G等無線網絡進行通訊.安全

創建起一個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狀態, 完成了三次握手

大概的狀況就是醬紫:微信

1

這裏注意一下, 在進行握手的時候, 所傳送的包並不包含數據.網絡

只有在完成三次握手以後, 客戶端和服務器纔會正式開始傳輸數據, 通常在TCP鏈接創建成功後, 除非有一方主動關閉鏈接以前, TCP鏈接是會一直保持下去的, 好比咱們的微信, QQ這些即時聊天App.性能


關閉TCP鏈接

剛剛說完了如何創建起TCP的鏈接, 如今咱們來看看怎麼關閉.優化

客戶端和服務器均可以發起關閉TCP鏈接的請求, 可是須要經過四次驗證, 咱們這裏稱爲四次揮手, 這裏咱們演示由客戶端發起關閉TCP鏈接:

  • 第一次揮手: 客戶端會發送一個FIN的報文給服務器以後就會進入等待服務器的響應.
  • 第二次揮手: 服務器接收到了FIN以後, 並確認是由客戶端發起的, 同時也會發送一條ACK=X+1的報文.
  • 第三次揮手: 等到客戶端接受到ACK報文以後, 服務器關閉了與客戶端的鏈接, 會發送一條FIN的報文給客戶端.
  • 第四次揮手: 客戶端接收到了由服務器發送過來的FIN報文, 就會關閉與服務端的鏈接, 而且發送ACK給服務器.

關係圖:

2

有人或許有疑問說爲啥TCP創建鏈接的時候是三次握手, 而斷開鏈接的時候倒是四次揮手呢?

由於鏈接時服務端收到了客戶端的SYN鏈接請求的報文後, 能夠直接發送SYN+ACK報文, 其中的ACK報文是用來響應, SYN報文是用來同步的.

而當關閉鏈接時, 服務端收到FIN報文後, 極可能並不會立刻就關閉Socket鏈接, 因此只能先回復一個ACK報文, 告訴客戶端, 你發的FIN報文我收到了, 只有等到服務器的全部報文發送完了, 服務端纔會發送FIN報文, 因此才須要四次揮手.


HTTP鏈接

原本並不打算把HTTP/HTTPS也講了, 但既然都說到這, 仍是補上吧.

HTTP是一個超文本傳輸協議, 全名叫作Hyper Text Transfer Protocol, 是Web互聯網的基礎, 也是咱們手機聯網經常使用的協議之一, 順便說說, HTTP協議是創建在TCP協議之上的一種應用.

用過HTTP請求的都知道, HTTP最顯著的一個特色就是客戶端每次發送的網絡請求都須要服務端的響應, 在請求結束後, 會主動的關閉鏈接.

因爲創建鏈接到關閉鏈接是一次性鏈接, 因此HTTP/HTTPS會被稱爲短鏈接, 若是要保持長期在線的話, 須要不停的像服務器發送請求, 若是服務器長時間沒有接收到客戶端的請求, 就會認爲客戶端下線了, 反過來, 若是客戶端長時間沒有接收到服務器的響應, 則認爲網絡斷開.

HTTP 1.0中, 客戶端的每次請求都要求創建一次單獨的鏈接, 在處理完本次請求後, 就自動釋放鏈接. 而HTTP 1.1中則能夠在一次鏈接中處理多個請求,而且多個請求能夠重疊進行, 不須要等待一個請求結束後再發送下一個請求, 如今最新的HTTP 2.0是兼容HTTP 1.1的, 雖說是新版, 但我我的感受好像是優化版本, 只是提升了Web的性能.


HTTPS鏈接

HTTPS全名叫作Hyper Text Transfer Protocol over Secure Socket Layer, 是HTTP的安全版本, 主要是在HTTP加了一層SSL, 因此加密的時候就要用到SSL加密.

HTTPS存在於HTTPTCP之間, HTTP是以明文發送的, 不提供任何方式的數據加密, 因此很是容易受到攻擊, 由於HTTP協議不方便用來傳輸敏感信息, 但HTTPS比較麻煩, 由於須要去申請一個CA證書.

HTTPHTTPS的區別:

  • HTTP是超文本傳輸協議, 信息是明文傳輸, HTTPS則是具備安全性的SSL加密傳輸協議.
  • HTTPHTTPS使用的是徹底不一樣的鏈接方式, 用的端口也不同, 前者是80, 後者是443.
  • HTTP的鏈接很簡單, 是無狀態的, HTTPS協議是由HTTP + SSL協議構建的可進行加密傳輸、身份認證的網絡協議.

3


Socket與HTTP的區別

雖說SocketHTTP都是基於TCP, 但一般狀況下Socket鏈接就是TCP鏈接, 一旦創建了Socket鏈接, 雙方就能夠相互發送數據, 直到雙方鏈接斷開爲止.

但在實際應用中,客戶端到服務器之間的通訊防火牆默認會關閉長時間處於非活躍狀態的鏈接, 從而而致使Socket鏈接斷連,所以須要經過輪詢告訴網絡,該Socket鏈接處於活躍狀態。

HTTP剛剛也說了, 它的鏈接方式是請求 -> 響應, 不只要在請求的時候須要先創建好鏈接, 並且須要客戶端向服務器發送請求後, 服務器才能回覆數據.


最後

碼字很費腦, 看官賞點飯錢可好

微信

支付寶
相關文章
相關標籤/搜索