iOS Socket(1) —— 簡介

什麼是Socket

  • Socket的定義

Socket,也稱「套接字」,用於描述IP地址和端口,是一個通訊鏈的句柄,能夠用來實現不一樣虛擬機或不一樣計算機之間的通訊。咱們知道不一樣的程序之間的網絡通信是要經過端口來區分的。簡單來講,網絡上的兩個程序經過一個雙向的通訊鏈接實現數據的交換,這個鏈接的一端稱爲一個socket,而創建網絡通訊鏈接至少要一對端口號(socket)。服務器

  • Socket和TCP/IP的關係

Socket本質是對TCP/IP的封裝,是一套用來實現TCP或UDP通信的API。 根據網絡通信的OSI參考模型的定義,IP位於網絡層,TCP/UDP位於傳輸層,HTTP位於應用層,而Socket位於傳輸層和應用層之間,是它們以前的橋樑。網絡

Socket是怎樣通信的

  • TCP傳輸協議:TCP是面向鏈接的,須要「三次握手,四次揮手」,是可靠的傳輸,用來傳輸大的數據,可是,創建時間要花費時間和資源,相對於UDP速度較慢。socket

  • UDP:UDP是面向無鏈接的,發送端不會關心數據是否到達目標端,簡單高效。常常用於如下幾方面:函數

    • 總量較小的通信(DNS,SNMP等)
    • 視頻、音頻等多媒體通信(即時通信)
    • 限定於LAN等特定網絡中的應用通信
    • 廣播通信(廣播、多播)
  • Socket的TCP通信流程圖: 3d

    image

  1. 服務端:經過socket()初始化一個socket,bing()綁定端口號,listen()監聽端口,accept()阻塞直到有客戶端鏈接。
  2. 客服端:經過socket()初始化一個socket,connect() 與服務端創建鏈接
  3. 若是鏈接成功,即可互相發送接受數據
  • Socket的TCP的「三次握手,四次揮手」圖:

image

  1. 當客戶端調用connect時,觸發了鏈接請求,向服務器發送了SYNJ包,這時connect進入阻塞狀態;
  2. 服務器監聽到鏈接請求,即收到SYN J包,調用accept函數接收請求向客戶端發送SYN K ,ACK J+1,這時accept進入阻塞狀態
  3. 客戶端收到服務器的SYN K ,ACK J+1以後,這時connect返回,並對SYN K進行確認;服務器收到ACK K+1時,accept返回,至此三次握手完畢,鏈接創建

image

  1. 某個應用進程首先調用 close 主動關閉鏈接,這時 TCP 發送一個 FIN M
  2. 另外一端接收到 FIN M 以後,執行被動關閉,對這個 FIN 進行確認。它的接收也做爲文件結束符傳遞給應用進程,由於 FIN 的接收意味着應用進程在相應的鏈接上再也接收不到額外數據
  3. 一段時間以後,接收到文件結束符的應用進程調用 close 關閉它的 socket。這致使它的 TCP 也發送一個 FIN N
  4. 接收到這個 FIN 的源發送端 TCP 對它進行確認。這樣每一個方向上都有一個 FIN 和 ACK
  • Socket的UDP通信流程圖:

image

相對TCP,UDP少了connect()的創建鏈接,也沒有三次握手和四次揮手cdn

相關文章
相關標籤/搜索