Socket與http的區別

2021-10-07 13:53:29 字數 3351 閱讀 6933

目錄

一、socket簡介

二、socket通訊流程

三、socket和http

3.1 socket和http的區別

3.2 socket和http的應用場景有哪些

埠(port)是伴隨著傳輸層誕生的概念。它可以將網路層的ip通訊分送到各個通訊通道。udp協議和tcp協議儘管在工作方式上有很大的不同,但它們都建立了從乙個埠到另乙個埠的通訊。

隨著我們進入傳輸層,我們也可以呼叫作業系統中的api,來構建socket(套接字)。

socket是作業系統提供的乙個程式設計介面,它用來代表某個網路通訊。應用程式通過socket來呼叫系統核心中處理網路協議的模組,而這些核心模組會負責具體的網路協議的實施。這樣,我們可以讓核心來接收網路協議的細節,而我們只需要提供所要傳輸的內容就可以了,核心會幫我們控制格式,並進一步向底層封裝。

socket可以看成在兩個程式進行通訊連線中的乙個端點,乙個程式將一段資訊寫入socket中,該socket將這段資訊傳送給另外乙個socket中,使這段資訊能傳送到其他程式中。例如伺服器和客戶端通過socket進行互動。伺服器需要繫結在本機的某個埠號上,客戶端需要宣告自己連線哪個位址的哪個埠,這樣伺服器和客戶端就能連線了。

生成套接字,主要有3個引數:通訊的目的ip位址、使用的傳輸層協議(tcp或udp)和使用的埠號。socket原意是「插座」。通過將這3個引數結合起來,與乙個「插座」socket繫結,應用層就可以和傳輸 層通過套接字介面,區分來自不同應用程式程序或網路連線的通訊,實現資料傳輸的併發服務。

因此,在實際應用中,我們並不需要知道具體怎麼構成乙個udp包,而只需要提供相關資訊(ip位址,埠號,所要傳輸的資訊等)來建立socket,然後socket就會借助作業系統核心在傳輸之前會根據我們提供的相關資訊構成乙個合格的udp包(以及下層的包和幀)。

host a上的程式a將一段資訊寫入socket中,socket的內容被host a的網路管理軟體訪問,並將這段資訊通過host a的網路介面卡傳送到host b,host b的網路介面卡接收到這段資訊後,傳送給host b的網路管理軟體,網路管理軟體將這段資訊儲存在host b的socket中,然後程式b才能在socket中閱讀這段資訊。

要通過網際網路進行通訊,至少需要一對套接字,乙個套接字執行在客戶機端,稱之為clientsocket,另乙個套接字執行在伺服器端,稱之為serversocket。     

根據連線啟動的方式以及本地套接字要連線的目標,套接字之間的連線過程可以分為三個步驟:伺服器監聽,客戶端請求,連線確認。     

伺服器監聽:是伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連線的狀態,實時監控網路狀態。

客戶端請求:是指由客戶端的套接字提出連線請求,要連線的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連線的伺服器的套接字,指出伺服器端套接字的位址和埠號,然後就向伺服器端套接字提出連線請求。

連線確認:是指當伺服器端套接字監聽到或者說接收到客戶端套接字的連線請求,它就響應客戶端套接字的請求,建立乙個新的執行緒,把伺服器端套接字的描述發給客 戶端,一旦客戶端確認了此描述,連線就建立好了。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連線請求。

socket通訊步驟:

伺服器根據位址型別(ipv4,ipv6)、socket型別、協議型別(udp/tcp)來建立socket

伺服器為socket繫結ip位址和埠號

伺服器socket監聽埠號請求,隨時準備接收客戶端發來的連線,這時候伺服器的socket並沒有被開啟

客戶端建立socket

客戶端開啟socket,根據伺服器ip位址和埠號使用connexct()方法試圖連線伺服器socket

伺服器socket接收到客戶端socket請求,被動開啟,開始接收客戶端請求,直到客戶端返回連線資訊。這時候伺服器socket進入阻塞狀態,所謂阻塞即accept()方法一直到客戶端返回連線資訊後才返回,開始接收下乙個客戶端連線請求

客戶端連線成功,向伺服器傳送連線狀態資訊

伺服器accept()方法返回,連線成功

客戶端send()方法向socket寫入資訊

伺服器recv()方法讀取資訊

客戶端關閉

伺服器端關閉

由上面的過程我們可以發現,socket就是對tcp/ip協議的封裝和應用。在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不屬於協議範疇,而是乙個呼叫介面(api),是對tcp/ip協議的封裝。實現伺服器與客戶端之間的物理連線,並進行資料傳輸。socket處於網路協議的傳輸層,主要有tcp/udp兩個協議(當然也有tcp/ip協議族中其他的協議)。

socket連線是長連線,理論上客戶端和伺服器端一旦建立起連線將不會主動斷掉;但是由於各種環境因素可能會使連線斷開,比如:伺服器端或客戶端主機宕機了、網路故障,或者兩者之間長時間沒有資料傳輸,網路防火牆可能會斷開該連線以釋放網路資源。所以當乙個socket連線中沒有資料的傳輸,那麼為了維持連線需要傳送心跳訊息。

socket傳輸的資料可自定義,為位元組級,資料量小,可以加密,資料安全性高,適合client/server之間資訊實時互動。

http連線:

http是基於tcp/ip協議的應用層協議,定義的是傳輸資料的內容的規範。

http是基於請求-響應形式並且是短連線,即客戶端向伺服器端傳送一次請求,伺服器端響應後連線即會斷掉。

http是無狀態的協議,針對其無狀態特性,在實際應用中又需要有狀態的形式,因此一般會通過session/cookie技術來解決此問題。

http的傳輸速度慢,資料報大,資料傳輸安全性差,如實現實時互動,伺服器效能壓力大。

socket一般用於比較即時的通訊和實時性較高的情況,比如推送,聊天,保持心跳長連線等;

http一般用於實時性要求不那麼高的情況,比如資訊反饋,上傳,獲取新聞資訊等。

某些場合使用http不使用socket的原因是socket一旦連線上了,就一直保持連線,就會造成阻塞io,與此相對的的,還有非阻塞io。

阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。

非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。

HTTP 與 Socket的區別

http 與 socket 區別 http 超文字傳輸協議,首先它是乙個協議,並且是基於tcp ip協議基礎之上的應用層協議。tcp ip協議是傳輸層協議,主要解決資料如何在網路中傳輸,http是應用層協議,主要解決如何包裝資料。http協議詳細規定了瀏覽器與伺服器之間相互通訊的規則,是全球資訊網交...

HTTP與Socket的區別

要弄明白 http 和 socket 首先要熟悉網路七層 物 數 網 傳 會 表 應,如圖1 如圖1http 協議 超文字傳輸協議,對應於應用層,用於如何封裝資料.tcp udp 協議 傳輸控制協議,對應於傳輸層,主要解決資料在網路中的傳輸。ip 協議 對應於網路層,同樣解決資料在網路中的傳輸。傳輸...

Socket與HTTP的區別

socket與http的區別 1 tcp連線 手機能夠使用聯網功能是因為手機底層實現了tcp ip協議,可以使手機終端通過無線網路建立tcp連線。tcp協議可以對上層網路提供介面,使上層網路資料的傳輸建立在 無差別 的網路之上。建立起乙個tcp連線需要經過 三次握手 第一次握手 客戶端傳送syn包 ...