在以前的文章中有說到,經過端口(Port)能夠惟一的標識不一樣的網絡進程。若是有一個進程在使用網絡的話,那確定是會佔用一個端口的,計算機就是經過這個端口來區分不通的網絡進程的編程
端口(Port)使用16比特位表示(0~65535)。由端口以及IP就能夠指定網絡中某一臺主機的具體進程是哪個「IP:Port」。關於IP和端口的組合,有一個名字叫:套接字(Socket)網絡
套接字(Socket)是抽象的概念,表示TCP鏈接的一端(咱們知道TCP是端到端(點到點)的通訊,兩個端點之間會有一個TCP鏈接來進行通訊,這個套接字就能夠表示通訊的一端)架構
經過套接字能夠進行數據發送或接收。不少時候對網絡編程的時候,實際上就是對套接字的編程,經過套接字來進行數據的發送和接收spa
由於TCP鏈接是由兩端所組成的,所以就能夠表示爲兩個套接字,經過這兩個套接字就能夠指定惟一的一個TCP鏈接,而套接字又能夠表示爲IP和端口的組合(一個IP能夠有多個套接字,由於它可能會有不一樣的端口)code
TCP ={Socket1:Socket2} ={{IP:Port}:{IP:Port}}
若是平時對套接字進行編程的話,不少時候都是將這個架構看作是C/S架構。客戶端和服務端經過TCP鏈接鏈接起來,無論是客戶端仍是服務端,都會使用一個Socket來進行數據的發送和接收blog
C/S架構的TCP通訊過程(左邊爲服務端、右邊爲客戶端)進程
對於網絡套接字,無論是跨計算機仍是在同一臺計算機,若是使用網絡套接字的話,數據都會通過網絡中的協議棧rem
域套接字主要是經過域套接字文件來進行通訊的。若是經過域套接字來進行通訊的話,數據就不須要通過協議棧。因此,若是是單機的通訊,推薦使用域套接字進行通訊,由於它處理流程簡單,並且不通過協議棧,對系統的消耗比較小。若是是跨機器或跨網絡的通訊,就必須得使用網絡套接字進行通訊網絡編程