文章分享至個人我的技術博客: https://cainluo.github.io/14987134210457.htmlhtml
在以前的那篇文章, 咱們瞭解了一些關於Socket
的基礎知識, 若是沒有去看的朋友, 能夠去看看玩轉iOS開發:iOS中的Socket編程(一).git
那麼如今咱們繼續來說講剩下的一丟丟知識, 而後就開始來寫咱們的代碼~github
上一講也說了, 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
狀態, 完成了三次握手大概的狀況就是醬紫:微信
這裏注意一下, 在進行握手的時候, 所傳送的包並不包含數據.網絡
只有在完成三次握手以後, 客戶端和服務器纔會正式開始傳輸數據, 通常在TCP
鏈接創建成功後, 除非有一方主動關閉鏈接以前, TCP
鏈接是會一直保持下去的, 好比咱們的微信
, QQ
這些即時聊天App
.性能
剛剛說完了如何創建起TCP
的鏈接, 如今咱們來看看怎麼關閉.優化
客戶端和服務器均可以發起關閉TCP
鏈接的請求, 可是須要經過四次驗證, 咱們這裏稱爲四次揮手
, 這裏咱們演示由客戶端發起關閉TCP
鏈接:
FIN
的報文給服務器以後就會進入等待服務器的響應.FIN
以後, 並確認是由客戶端發起的, 同時也會發送一條ACK=X+1
的報文.ACK
報文以後, 服務器關閉了與客戶端的鏈接, 會發送一條FIN
的報文給客戶端.FIN
報文, 就會關閉與服務端的鏈接, 而且發送ACK
給服務器.關係圖:
有人或許有疑問說爲啥TCP
創建鏈接的時候是三次握手, 而斷開鏈接的時候倒是四次揮手呢?
由於鏈接時服務端收到了客戶端的SYN
鏈接請求的報文後, 能夠直接發送SYN+ACK
報文, 其中的ACK
報文是用來響應, SYN
報文是用來同步的.
而當關閉鏈接時, 服務端收到FIN
報文後, 極可能並不會立刻就關閉Socket
鏈接, 因此只能先回復一個ACK
報文, 告訴客戶端, 你發的FIN
報文我收到了, 只有等到服務器的全部報文發送完了, 服務端纔會發送FIN
報文, 因此才須要四次揮手.
原本並不打算把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
全名叫作Hyper Text Transfer Protocol over Secure Socket Layer
, 是HTTP
的安全版本, 主要是在HTTP
加了一層SSL
, 因此加密的時候就要用到SSL
加密.
HTTPS
存在於HTTP
與TCP
之間, HTTP
是以明文發送的, 不提供任何方式的數據加密, 因此很是容易受到攻擊, 由於HTTP
協議不方便用來傳輸敏感信息, 但HTTPS
比較麻煩, 由於須要去申請一個CA
證書.
HTTP
和HTTPS
的區別:
HTTP
是超文本傳輸協議, 信息是明文傳輸, HTTPS
則是具備安全性的SSL
加密傳輸協議.HTTP
和HTTPS
使用的是徹底不一樣的鏈接方式, 用的端口也不同, 前者是80, 後者是443.HTTP
的鏈接很簡單, 是無狀態的, HTTPS
協議是由HTTP + SSL
協議構建的可進行加密傳輸、身份認證的網絡協議.雖說Socket
和HTTP
都是基於TCP
, 但一般狀況下Socket
鏈接就是TCP
鏈接, 一旦創建了Socket
鏈接, 雙方就能夠相互發送數據, 直到雙方鏈接斷開爲止.
但在實際應用中,客戶端到服務器之間的通訊防火牆默認會關閉長時間處於非活躍狀態的鏈接, 從而而致使Socket
鏈接斷連,所以須要經過輪詢告訴網絡,該Socket
鏈接處於活躍狀態。
而HTTP
剛剛也說了, 它的鏈接方式是請求 -> 響應
, 不只要在請求的時候須要先創建好鏈接, 並且須要客戶端向服務器發送請求後, 服務器才能回覆數據.