今天就來說一下socket通訊的基本原理。
要想理解socket首先得熟悉一下tcp/ip協議族, tcp/ip(transmission control protocol/internet protocol)即傳輸控制協議/網間協議,定義了主機如何連入網際網路及資料如何再它們之間傳輸的標準,
從字面意思來看tcp/ip是tcp和ip協議的合稱,但實際上tcp/ip協議是指網際網路整個tcp/ip協議族。不同於iso模型的七個分層,tcp/ip協議參考模型把所有的tcp/ip系列協議歸類到四個抽象層中
應用層:tftp,http,snmp,ftp,smtp,dns,telnet 等等
傳輸層:tcp,udp
網路層:ip,icmp,ospf,eigrp,igmp
資料鏈路層:slip,cslip,ppp,mtu
每一抽象層建立在低一層提供的服務上,並且為高一層提供服務,看起來大概是這樣子的
我們知道兩個程序如果需要進行通訊最基本的乙個前提能能夠唯一的標示乙個程序,在本地程序通訊中我們可以使用pid來唯一標示乙個程序,但pid只在本地唯一,網路中的兩個程序pid衝突機率很大,這時候我們需要另闢它徑了,我們知道ip層的ip位址可以唯一標示主機,而tcp層協議和埠號可以唯一標示主機的乙個程序,這樣我們可以利用ip位址+協議+埠號唯一標示網路中的乙個程序。
能夠唯一標示網路中的程序後,它們就可以利用socket進行通訊了,什麼是socket呢?我們經常把socket翻譯為套接字,socket是在應用層和傳輸層之間的乙個抽象層,它把tcp/ip層複雜的操作抽象為幾個簡單的介面**用層呼叫已實現程序在網路中通訊。
socket是"開啟—讀/寫—關閉"模式的實現,以使用tcp協議通訊的socket為例,其互動流程大概是這樣子的
伺服器根據位址型別(ipv4,ipv6)、socket型別、協議建立socket
伺服器為socket繫結ip位址和埠號
伺服器socket監聽埠號請求,隨時準備接收客戶端發來的連線,這時候伺服器的socket並沒有被開啟
客戶端建立socket
客戶端開啟socket,根據伺服器ip位址和埠號試圖連線伺服器socket
伺服器socket接收到客戶端socket請求,被動開啟,開始接收客戶端請求,直到客戶端返回連線資訊。這時候socket進入阻塞
狀態,所謂阻塞即accept()方法一直到客戶端返回連線資訊後才返回,開始接收下乙個客戶端諒解請求
客戶端連線成功,向伺服器傳送連線狀態資訊
伺服器accept方法返回,連線成功
客戶端向socket寫入資訊
伺服器讀取資訊
客戶端關閉
伺服器端關閉
幾處需要理解的要點,面試中經常出現
在tcp/ip協議中,tcp協議通過三次握手建立乙個可靠的連線
第一次握手:客戶端嘗試連線伺服器,向伺服器傳送syn包(同步序列編號synchronize sequence numbers),syn=j,客戶端進入syn_send狀態等待伺服器確認
第二次握手:伺服器接收客戶端syn包並確認(ack=j+1),同時向客戶端傳送乙個syn包(syn=k),即syn+ack包,此時伺服器進入syn_recv狀態
第三次握手:第三次握手:客戶端收到伺服器的syn+ack包,向伺服器傳送確認包ack(ack=k+1),此包傳送完畢,客戶端和伺服器進入established狀態,完成三次握手
定睛一看,伺服器socket與客戶端socket建立連線的部分其實就是大名鼎鼎的三次握手
二、利用socket建立網路連線的步驟
建立socket連線至少需要一對套接字,其中乙個執行於客戶端,稱為clientsocket ,另乙個執行於伺服器端,稱為serversocket 。
套接字之間的連線過程分為三個步驟:伺服器監聽,客戶端請求,連線確認。
1、伺服器監聽:伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連線的狀態,實時監控網路狀態,等待客戶端的連線請求。
2、客戶端請求:指客戶端的套接字提出連線請求,要連線的目標是伺服器端的套接字。
為此,客戶端的套接字必須首先描述它要連線的伺服器的套接字,指出伺服器端套接字的位址和埠號,然後就向伺服器端套接字提出連線請求。
3、連線確認:當伺服器端套接字監聽到或者說接收到客戶端套接字的連線請求時,就響應客戶端套接字的請求,建立乙個新的執行緒,把伺服器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連線。
而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連線請求。
三、http鏈結的特點
http協議即超文字傳送協議(hypertext transfer protocol ),是web聯網的基礎,也是手機聯網常用的協議之一,http協議是建立在tcp協議之上的一種應用。
http連線最顯著的特點是客戶端傳送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連線。從建立連線到關閉連線的過程稱為「一次連線」。
四、tcp和udp的區別(面試考得最多。。快被考爛了我覺得- -\\)
1、tcp是面向鏈結的,雖然說網路的不安全不穩定特性決定了多少次握手都不能保證連線的可靠性,但tcp的三次握手在最低限度上(實際上也很大程度上保證了)保證了連線的可靠性;
而udp不是面向連線的,udp傳送資料前並不與對方建立連線,對接收到的資料也不傳送確認訊號,傳送端不知道資料是否會正確接收,當然也不用重發,所以說udp是無連線的、不可靠的一種資料傳輸協議。
2、也正由於1所說的特點,使得udp的開銷更小資料傳輸速率更高,因為不必進行收發資料的確認,所以udp的實時性更好。
知道了tcp和udp的區別,就不難理解為何採用tcp傳輸協議的msn比採用udp的qq傳輸檔案慢了,但並不能說qq的通訊是不安全的,
因為程式設計師可以手動對udp的資料收發進行驗證,比如傳送方對每個資料報進行編號然後由接收方進行驗證啊什麼的,
即使是這樣,udp因為在底層協議的封裝上沒有採用類似tcp的「三次握手」而實現了tcp所無法達到的傳輸效率。
Socket原理的簡單理解
最近我在做乙個android小專案用到了socket,今天整理了一下資料總結我對socket的理解。socket的使用就在我們生活中,只是不被我們關注而已,首先看看生活中哪些用到了socket 網路中程序之間如何通訊 當我們開啟瀏覽器瀏覽網頁時,瀏覽器的程序和web伺服器通訊的 當我們用qq聊天時,...
SOCKET 通訊原理
源 基於tcp ip協議的網路程式設計 定義變數 獲得winsock版本 載入winsock庫 初始化 建立套接字 設定套接字選項 關閉套接字 解除安裝winsock庫 釋放所有資源 整個程式架構分為兩大部分,伺服器端客戶端。伺服器socket程式流程 socket bind listen acce...
Socket 通訊原理
socket,又稱 套接字 網路上的兩個程式通過乙個雙向的通訊連線實現資料的交換,這個連線的一端稱為乙個 socket。socket 的英文願意是 孔 或 插座 在 internet 上的主機一般執行了多個服務軟體,同時提供幾種服務。每種服務都開啟乙個 socket,並繫結到乙個埠上,不同的埠對應不...