iOS隨筆_網絡(Socket/MQTT)

常見協議


  • IP (Internet Protocol) 網絡層協議,網絡之間互聯的協議。

  • FTP (File Transfer Protocol) 文本傳輸協議

  • TCP (Transmission Control Protocol) 傳輸控制器協議

  • UDP (User Datagram Protocol) 用戶數據報協議

  • HTTP (HyperText Transfer Protocol) 超文本傳輸協議


國際標準化組織(ISO)定義了網絡協議的基本框架,被稱爲OSI模型。

要制定通訊規則,內容會很多,比如要考慮A電腦如何找到B電腦,A電腦在發送信息 給B電腦時是否需要B電腦進行反饋,A電腦傳送給B電腦的數據的格式又是怎樣的?

內容太多太雜,所以OSI模型將這些通訊標準進行層次劃分,每一層次解決 一個類別的問題,這樣就使得標準的制定沒那麼複雜。

OSI模型制定的七層標準模型,分別是:應用層,表示層,會話層,傳輸層,網絡層,數據鏈路層,物理層。

雖然國際標準化組織制定了這樣一個網絡協議的模型,但是實際上互聯網通訊使用的網絡協議是TCP/IP網絡協議。


TCP/IP 是一個協議族,也是按照層次劃分。共四層:應用層,傳輸層,互連網絡層,網絡接口層。

那麼TCP/IP協議和OSI模型有什麼區別呢?OSI網絡協議模型,是一個參考模型,而TCP/IP協議是事實上的標準。

TCP/IP協議參考了OSI 模型,但是並沒有嚴格按照OSI規定的七層去劃分標準,而只劃分了四層,個人覺得這樣會更簡單點,當劃分太多層次時,你很難區分某個協議是屬於哪個層次 的。

TCP/IP協議和OSI模型也並不衝突,TCP/IP協議中的應用層協議,就對應於OSI中的應用層,表示層,會話層。就像以前有工業部和信息產業 部,現在實行大部制後只有工業和信息化部一個部門,但是這個部門還是要做以前兩個部門一樣多的事情,本質上沒有多大的差別。

TCP/IP中有兩個重要的協 議,傳輸層的TCP協議和互連網絡層的IP協議,因此就拿這兩個協議做代表,來命名整個協議族了,在說TCP/IP協議時,是指整個協議族。

TCP/IP協議分爲四個層次,但我們並不需要了解所有層次的協議,我覺得主要關注應用層和傳輸層的協議就可以了。

拿寄送郵件舉例, A寄郵件給B,A關心的是用什麼格式寫什麼內容給B(應用層內容),是寄掛號信還是寄平信(傳輸層內容),但是A是不會去關注郵件傳送過程中採用了那條路 線,郵遞員是如何把信件遞送到B手裏的(互連網絡層,網絡接口層)。


傳輸層有多個協議,但最主要的是TCP和UDP協議。兩則的區別在於TCP協議需要接收方反饋,UDP協議不需要接收方反饋。

它們卻有一個顯著的不同:TCP提供有保證的數據傳輸,而UDP不提供。這意味着TCP有一個特殊的機制來確保數據安全的不出錯的從一個端點傳到另一個端點,而UDP不提供任何這樣的保證。

TCP就像掛號信,A電腦發信息給B電腦後,需要得到B電腦的反饋,這樣A電腦就能知道B電腦是否已經收到信息。UDP就像平信,A電腦發信息給B電腦後,B電腦並不給A電腦發聵,A電腦發送信息出去後並不知道B電腦是否已經收到。

因此,TCP傳輸比UDP傳送更可靠,但是TCP傳輸的效率就不如UDP了。至於,在傳送過程中具體選擇哪種傳送方式,需要具體問題具體分析。在不可靠的 網絡傳送過程中一般選擇TCP傳送方式。在講求效率,或者不在乎傳送失誤的情況下可以選擇UDP方式來提高傳輸速率。


小結TCP與UDP的區別:
1.基於連接與無連接;
2.對系統資源的要求(TCP較多,UDP少);
3.UDP程序結構較簡單;
4.流模式與數據報模式 ;
5.TCP保證數據正確性,UDP可能丟包,TCP保證數據順序,UDP不保證。

應用層的協議有很多,每一個協議代表一種類型的服務。HTTP協議,萬維網服務。FTP協議,文件傳送服務。POP3,郵件服務,SOAP協議webService服務。


Socket

    我在搜索關於socket的資料時,發現有的說socket是指一個連接,有的說 socket是一指一個端點。拿打電話做比喻,A電話機和B電話機正在通話,那麼socket是指的A和B之間的連接線呢,還是指電話機(端點)?
    我現在的理解是,socket就是一個連接中的一個端點,一次通訊(連接)a,b端都會有一個socket。一個socket對應一個連接。
    socket(套接字)是通信的基石,是支持TCP/IP協議的網絡通信的基本操作單元,包含進行網絡通信必須的五種信息:連接使用的協議,本地主機的IP地址,本地進程的協議端口,遠地主機的IP地址,遠地進程的協議端口。

    多個TCP連接或多個應用程序進程可能需要通過同一個TCP協議端口傳輸數據。爲了區別不同的應用程序進程和連接,計算機操作系統爲應用程序與TCP/IP協議交互提供了套接字(Socket)接口。應用層可以和傳輸層通過Socket接口,區分來自不同應用程序進程或網絡連接的通信,實現數據傳輸的併發服務。

    建立Socket連接至少需要一對套接字,其中一個運行於客戶端,稱爲ClientSocket,另一個運行於服務器端,稱爲ServerSocket。套接字之間的連接過程分爲三個步驟:服務器監聽,客戶端請求,連接確認。

    Socket可以支持不同的傳輸層協議(TCP或UDP),當使用TCP協議進行連接時,該Socket連接就是一個TCP連接,UDP連接同理。

Socket使用

一, 服務器監聽
     sudo python server.py

二, 建立連接準備
    1)  CFReadStreamRef  CFWriteStreamRef(創建C的讀/寫流)
    2)  建立和localhost的連接: CFStreamCreatePairWithSocketToHost
    3)  將CFStream的讀/ 寫流轉換成NSStream的輸入和輸出流
    self.inputStream = (__bridge NSInputStream *)readStream;
    self.outputStream = (__bridge NSOutputStream *)writeStream;
    4)  設置代理
        self.inputStream.delegate = self;
        self.outputStream.delegate = self;
    5)  將輸入和輸出流添加/註冊到runloop中
        [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    6) 打開輸入和輸出流
        [self.inputStream open];
        [self.outputStream open];

三,  發送消息
    1)  實現NSStreamDelegate協議方法
    - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
    2)  在上面的方法中處理下面的事件類型
    3) 再實現tableview的data source方法
    —> 可變數組的個數即是table view的行數
    —> 可變數組中的對象即是每行顯示的文本
- - -備註- - -
    Stream打開完畢:
    NSStreamEventOpenCompleted
    此時stream中有新數據:
    NSStreamEventHasBytesAvailable
    —> 讀取來自服務器返回的數據,即在客戶端處理inputStream中的數據
    —> 將上面讀取的數據添加到一個可變數組中
    —> 刷新table view
    此時stream中有空間可以發送數據:
    NSStreamEventHasSpaceAvailable
    此時steam事件有錯誤產生:
    NSStreamEventErrorOccurred
    此時stream事件處理完畢:
    NSStreamEventEndEncountered

隨筆資料來源:

1.TCP、UDP、HTTP、SOCKET之間的區別

2.TCP協議與UDP協議的區別

3.Socket

4.TCP/IP 網絡協議


MQTT

Message Queuing Telemetry Transport 消息隊列遙測傳輸


    MQTT 是IBM開發的一個即時通訊協議,有可能成爲物聯網的重要組成部分。該協議支持所有平臺,幾乎可以把所有聯網物品和外部連接起來,被用來當做傳感器和致動器(比如通過Twitter讓房屋聯網)的通信協議 ----------------------百度詞條解釋

MQTT 特點

    MQTT 協議是爲大量計算能力有限,且工作在低帶寬、不可靠的網絡的遠程傳感器和控制設備通訊而設計的協議,它具有以下主要的幾項特性:
    1.使用發佈/訂閱消息模式,提供一對多的消息發佈,解除應用程序耦合。

    這一點很類似於 XMPP,但是 MQTT 的信息冗餘遠小於 XMPP(XMPP 使用的是 XML格式傳遞數據)。
    2.對負載內容屏蔽的消息傳輸。
    3.使用 TCP/IP 提供網絡連接。
    主流的 MQTT 是基於 TCP 連接進行數據推送的,但是同樣有基於 UDP 的版本,叫做 MQTT-SN 。這兩種版本由於基於不同的連接方式,優缺點自然也就各有不同了。
    4.有三種消息發佈服務質量:

    “至多一次”,消息發佈完全依賴底層 TCP/IP 網絡。會發生消息丟失或重複。這一級別可用於如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因爲不久後還會有第二次發送。

    這一種方式主要普通 APP 的推送,倘若你的智能設備在消息推送時未聯網,推送過去沒收到,再次聯網也就收不到了。

“至少一次”,確保消息到達,但消息重複可能會發生。
這一種方式比較雞肋,在我的想象中沒能想到這種質量的發送在常規的 APP 開發中有什麼用處。

    “只有一次”,確保消息到達一次。這一級別可用於如下情況,在計費系統中,消息重複或丟失會導致不正確的結果。
這種最高質量的消息發佈服務還可以用於即時通訊類的 APP 的推送,確保用戶收到且只會收到一次。

    5.小型傳輸,開銷很小(固定長度的頭部是2字節),協議交換最小化,以降低網絡流量。

    這就是爲什麼在介紹裏說它非常適合“在物聯網領域,傳感器與服務器的通信,信息的收集”,要知道嵌入式設備的運算能力和帶寬都相對薄弱,使用這種協議來傳遞消息再適合不過了。

    6.使用 Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制。

    Last Will:即遺言機制,用於通知同一主題下的其他設備發送遺言的設備已經斷開了連接。

    Testament:遺囑機制,功能類似於 Last Will 。

隨筆資料來源:

MQTT協議及通訊的解決方案(一)

MQTTClient實戰(二)

MQTTClient實戰(三)


MQTTClient使用記錄

[MQTTSession] mqttTransport didFailWithError Error Domain=NSPOSIXErrorDomain Code=61 "Connection refused" UserInfo={_kCFStreamErrorCodeKey=61, _kCFStreamErrorDomainKey=1}

host應該用MQTT服務器地址而不是Localhost字符串。

XMPP

      XMPP(Extensible Messaging and Presence Protocol, 前稱)是一種以XML爲基礎的開放式實時通信協議,是由互聯網工程工作小組(TETF)通過的互聯網標準。簡單的說,XMPP就是一種協議,一種規定。就是說,在網路上傳東西,要建立連接,TCP/IP連接,建立後再傳東西, 而XMPP就是規定你傳的東西的格式。XMPP是基於XML的協議。

優點:
      XMPP協議是自由、開放、公開的、並且易於瞭解。而且在客戶端、服務器、組件、源碼庫等方面,都已經各自多種實現。

缺點:
數據負載太重, 沒有二進制數據

發佈了40 篇原創文章 · 獲贊 20 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章