Socket,也稱「套接字」,用於描述IP地址和端口,是一個通訊鏈的句柄,能夠用來實現不一樣虛擬機或不一樣計算機之間的通訊。咱們知道不一樣的程序之間的網絡通信是要經過端口來區分的。簡單來講,網絡上的兩個程序經過一個雙向的通訊鏈接實現數據的交換,這個鏈接的一端稱爲一個socket,而創建網絡通訊鏈接至少要一對端口號(socket)。服務器
Socket本質是對TCP/IP的封裝,是一套用來實現TCP或UDP通信的API。 根據網絡通信的OSI參考模型的定義,IP位於網絡層,TCP/UDP位於傳輸層,HTTP位於應用層,而Socket位於傳輸層和應用層之間,是它們以前的橋樑。網絡
TCP傳輸協議:TCP是面向鏈接的,須要「三次握手,四次揮手」,是可靠的傳輸,用來傳輸大的數據,可是,創建時間要花費時間和資源,相對於UDP速度較慢。socket
UDP:UDP是面向無鏈接的,發送端不會關心數據是否到達目標端,簡單高效。常常用於如下幾方面:函數
Socket的TCP通信流程圖: 3d
- 服務端:經過socket()初始化一個socket,bing()綁定端口號,listen()監聽端口,accept()阻塞直到有客戶端鏈接。
- 客服端:經過socket()初始化一個socket,connect() 與服務端創建鏈接
- 若是鏈接成功,即可互相發送接受數據
- 當客戶端調用connect時,觸發了鏈接請求,向服務器發送了SYNJ包,這時connect進入阻塞狀態;
- 服務器監聽到鏈接請求,即收到SYN J包,調用accept函數接收請求向客戶端發送SYN K ,ACK J+1,這時accept進入阻塞狀態
- 客戶端收到服務器的SYN K ,ACK J+1以後,這時connect返回,並對SYN K進行確認;服務器收到ACK K+1時,accept返回,至此三次握手完畢,鏈接創建
- 某個應用進程首先調用 close 主動關閉鏈接,這時 TCP 發送一個 FIN M
- 另外一端接收到 FIN M 以後,執行被動關閉,對這個 FIN 進行確認。它的接收也做爲文件結束符傳遞給應用進程,由於 FIN 的接收意味着應用進程在相應的鏈接上再也接收不到額外數據
- 一段時間以後,接收到文件結束符的應用進程調用 close 關閉它的 socket。這致使它的 TCP 也發送一個 FIN N
- 接收到這個 FIN 的源發送端 TCP 對它進行確認。這樣每一個方向上都有一個 FIN 和 ACK
相對TCP,UDP少了connect()的創建鏈接,也沒有三次握手和四次揮手cdn