天天看點

Http和Socket詳解

這不是同一層的協定

socket是一個針對tcp和udp程式設計的借口,你可以借助它建立tcp連接配接等等。而tcp和udp協定屬于傳輸層

而http是個應用層的協定,它實際上也建立在tcp協定之上。

1、tcp連接配接

要想明白socket連接配接,先要明白tcp連接配接。手機能夠使用聯網功能是因為手機底層實作了tcp/ip協定,可以使手機終端通過無線網絡建立tcp連接配接。tcp協定可以對上層網絡提供接口,使上層網絡資料的傳輸建立在“無差别”的網絡之上。

建立起一個tcp連接配接需要經過“三次握手”:

第一次握手:用戶端發送syn包(syn=j)到伺服器,并進入syn_send狀态,等待伺服器确認;

第二次握手:伺服器收到syn包,必須确認客戶的syn(ack=j+1),同時自己也發送一個syn包(syn=k),即syn+ack包,此時伺服器進入syn_recv狀态;

第三次握手:用戶端收到伺服器的syn+ack包,向伺服器發送确認包ack(ack=k+1),此包發送完畢,用戶端和伺服器進入established狀态,完成三次握手。

握手過程中傳送的包裡不包含資料,三次握手完畢後,用戶端與伺服器才正式開始傳送資料。理想狀态下,tcp連接配接一旦建立,在通信雙方中的任何一方主動關閉連接配接之前,tcp 連接配接都将被一直保持下去。斷開連接配接時伺服器和用戶端均可以主動發起斷開tcp連接配接的請求,斷開過程需要經過“四次握手”(過程就不細寫了,就是伺服器和用戶端互動,最終确定斷開)

2、http連接配接

http協定即超文本傳送協定(hypertext transfer protocol ),是web聯網的基礎,也是手機聯網常用的協定之一,http協定是建立在tcp協定之上的一種應用。

http連接配接最顯著的特點是用戶端發送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連接配接。從建立連接配接到關閉連接配接的過程稱為“一次連接配接”。

1)在http 1.0中,用戶端的每次請求都要求建立一次單獨的連接配接,在處理完本次請求後,就自動釋放連接配接。

2)在http 1.1中則可以在一次連接配接中處理多個請求,并且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。

由于http在每次請求結束後都會主動釋放連接配接,是以http連接配接是一種“短連接配接”,要保持用戶端程式的線上狀态,需要不斷地向伺服器發起連接配接請求。通常的做法是即時不需要獲得任何資料,用戶端也保持每隔一段固定的時間向伺服器發送一次“保持連接配接”的請求,伺服器在收到該請求後對用戶端進行回複,表明知道用戶端“線上”。若伺服器長時間無法收到用戶端的請求,則認為用戶端“下線”,若用戶端長時間無法收到伺服器的回複,則認為網絡已經斷開。

3、socket原理

3.1套接字(socket)概念

套接字(socket)是通信的基石,是支援tcp/ip協定的網絡通信的基本操作單元。它是網絡通信過程中端點的抽象表示,包含進行網絡通信必須的五種資訊:連接配接使用的協定,本地主機的ip位址,本地程序的協定端口,遠地主機的ip位址,遠地程序的協定端口。

應用層通過傳輸層進行資料通信時,tcp會遇到同時為多個應用程式程序提供并發服務的問題。多個tcp連接配接或多個應用程式程序可能需要通過同一個 tcp協定端口傳輸資料。為了差別不同的應用程式程序和連接配接,許多計算機作業系統為應用程式與tcp/ip協定互動提供了套接字(socket)接口。應用層可以和傳輸層通過socket接口,區分來自不同應用程式程序或網絡連接配接的通信,實作資料傳輸的并發服務。

3.2 建立socket連接配接

建立socket連接配接至少需要一對套接字,其中一個運作于用戶端,稱為clientsocket ,另一個運作于伺服器端,稱為serversocket 。

套接字之間的連接配接過程分為三個步驟:伺服器監聽,用戶端請求,連接配接确認。

伺服器監聽:伺服器端套接字并不定位具體的用戶端套接字,而是處于等待連接配接的狀态,實時監控網絡狀态,等待用戶端的連接配接請求。

用戶端請求:指用戶端的套接字提出連接配接請求,要連接配接的目标是伺服器端的套接字。為此,用戶端的套接字必須首先描述它要連接配接的伺服器的套接字,指出伺服器端套接字的位址和端口号,然後就向伺服器端套接字提出連接配接請求。

連接配接确認:當伺服器端套接字監聽到或者說接收到用戶端套接字的連接配接請求時,就響應用戶端套接字的請求,建立一個新的線程,把伺服器端套接字的描述發給用戶端,一旦用戶端确認了此描述,雙方就正式建立連接配接。而伺服器端套接字繼續處于監聽狀态,繼續接收其他用戶端套接字的連接配接請求。

4、socket連接配接與tcp連接配接

建立socket連接配接時,可以指定使用的傳輸層協定,socket可以支援不同的傳輸層協定(tcp或udp),當使用tcp協定進行連接配接時,該socket連接配接就是一個tcp連接配接。

5、socket連接配接與http連接配接

由于通常情況下socket連接配接就是tcp連接配接,是以socket連接配接一旦建立,通信雙方即可開始互相發送資料内容,直到雙方連接配接斷開。但在實際網絡應用中,用戶端到伺服器之間的通信往往需要穿越多個中間節點,例如路由器、網關、防火牆等,大部分防火牆預設會關閉長時間處于非活躍狀态的連接配接而導緻 socket 連接配接斷連,是以需要通過輪詢告訴網絡,該連接配接處于活躍狀态。

而http連接配接使用的是“請求—響應”的方式,不僅在請求時需要先建立連接配接,而且需要用戶端向伺服器送出請求後,伺服器端才能回複資料。

很多情況下,需要伺服器端主動向用戶端推送資料,保持用戶端與伺服器資料的實時與同步。此時若雙方建立的是socket連接配接,伺服器就可以直接将資料傳送給用戶端;若雙方建立的是http連接配接,則伺服器需要等到用戶端發送一次請求後才能将資料傳回給用戶端,是以,用戶端定時向伺服器端發送連接配接請求,不僅可以保持線上,同時也是在“詢問”伺服器是否有新的資料,如果有就将資料傳給用戶端。

特别說明:尊重作者的勞動成果,轉載請注明出處哦~~~http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp59

繼續閱讀