tcp、http和socket的區別


本文原鏈接:https://www.jianshu.com/p/88d69454bdde

tcp、http和socket的區別

一:tcp協議

tcp協議屬於傳輸層協議(UDP也屬於傳輸層協議,但是UDP協議是無狀態的)。建立一個TCP連接需要三次握手,斷開一個TCP連接需要四次揮手。手機能夠使用聯網功能,是因為手機底層實現了TCP/IP協議,使用手機終端通過無線網就可以與服務端建立一個tcp連接。TCP協議可以對上層網絡提供接口,使上層網絡數據的傳輸建立在“無差別”的網絡之上。

tcp建立連接需要三次握手:

 

 
圖1:tcp連接三次握手示意圖

如圖所示:客戶端要與服務端建立tcp連接,首先向服務端發送一個syn J信號,服務端收到此信號后向客戶端回答一個ACK J+1信號,並額外加了一個syn K信號,客戶端收到ACK J+1信號后就知道,服務端能收到我的信號,后面我客戶端就可以放心的發送數據給你服務端而不用擔心你服務端接收不到我發送的數據了。客戶端收到服務端發送的SYN K信號后,還需要向服務端回一個 ACK K+1信號,這樣服務端收到此信號就知道,我服務端給你客戶端發送的信號,你客戶端能夠收到,這樣我服務端就可以放心的給你客戶端發送數據而不用擔心你客戶端收不到自己發送的數據了。其實從上面的描述可以看到:建立連接完全可以跟斷開TCP連接一樣分四步走,只不過是把服務端的應答信號ACK和客戶端的認證請求信號SYNC這兩步做成一步走了。

tcp連接關閉時需要四次揮手:

 
圖2:tcp連接斷開時四次揮手示意圖

客戶端收到服務端的應答信號ACK M+1后,客戶端就知道:服務端知道我客戶端不會再發送數據包給你服務端了,你可以停止對我的監聽了。但是此時只是客戶端->服務端的單向流動停止了,另一個方向的流動:服務端->客戶端的數據發送還可以正常進行,直到服務端向客戶端發送FIN N揮手信號,客戶端向服務端回應ACK N+1信號,服務端才知道:客戶端知道我服務端不會再發送數據包給你客戶端了,你可以停止對我的監聽了。至此,客戶端->服務端的單向流動和服務端->客戶端的單向流動兩個方向都停止,可以關閉連接了。

二:http協議

http協議,簡稱超文本傳輸協議(Hypertext Transfer Protocol),是web應用程序的基礎,也是手機聯網常用的協議之一。http協議在tcp協議上面,屬於應用層協議。

http協議最顯著的特點就是:客戶端發送的每次請求,都需要服務端返回響應。客戶端收到服務端的響應后,主動關閉連接。一次TCP連接過程完成。

1)在HTTP1.0中,客戶端每發送一次請求都需要新建一個單獨的連接,得到服務端響應后,主動斷開本次連接。

1)在HTTP1.1中,可以在一次連接中處理多次請求(keep Alive,默認開啟),盡管有 Keep-Alive 機制可以復用,但在每個連接上同時只能有一個請求 / 響應,這意味着完成響應之前,這個連接不能用於其他請求。比如某個tcp連接的keep Alive的參數設置為:max=5,time_out=10s(本次連接最長存活時間為10s,最多請求次數為5次),則請求情況像下面這樣:

 
圖3:http1.1一次keep alive連接示意圖

而不是像這樣:

 
圖4:http1.1一次keep alive連接錯誤示意圖

從圖3中可以看到,如果瀏覽器需要向同一個域名發送多個請求,需要在本地維護一個 FIFO 隊列,完成一個再發送下一個。這樣,從服務端完成請求開始回傳,到收到下一個請求之間的這段時間,服務端處於空閑狀態。

后來,人們提出了 HTTP 管道(HTTP Pipelining)的概念,試圖把本地的 FIFO 隊列挪到服務端。它的原理是這樣的:瀏覽器一股腦把請求都發給服務端,然后等着就可以了。這樣服務端就可以在處理完一個請求后,馬上處理下一個,不會有空閑了。甚至服務端還可以利用多線程並行處理多個請求。但是由於一些原因,http1的管道技術使用得並不完美和普及。

http連接下,客戶端保持在線狀態的方法:客戶端每次建立http連接,得到服務端響應后,都會主動斷開連接,所以說http連接是短連接。那怎么保持客戶端的在線狀態呢?答案就是:客戶端需要不斷的向服務端發送連接請求。通常的做法是,客戶端也保持每隔一段固定的時間向服務器發送一次“保持連接”的請求,服務器在收到該請求后對客戶端進行回復,表明知道客戶端“在線”。若服務器長時間無法收到客戶端的請求,則認為客戶端“下線”,若客戶端長時間無法收到服務器的回復,則認為網絡已經斷開。

為什么說http連接是無狀態的?

【無狀態】能在其他資料中查到的說法有:

(1)協議對於事務處理沒有記憶能力,(2)對同一個url請求沒有上下文關系,(3)每次的請求都是獨立的,它的執行情況和結果與前面的請求和之后的請求是無直接關系的,它不會受前面的請求應答情況直接影響,也不會直接影響后面的請求應答情況,(4)服務器中沒有保存客戶端的狀態,客戶端必須每次帶上自己的狀態去請求服務器,(5)人生若只如初見,可以參考:http協議無狀態中的 狀態 到底指的是什么?!,文中經過分析理清了很多概念,以及之間的關系,推測出【狀態】的含義就是:客戶端和服務器在某次會話中產生的數據,從而【無狀態】就意味着,這些數據不會被保留。

三:socket

我們知道兩個進程如果需要進行通訊最基本的一個前提能能夠唯一的標示一個進程,在本地進程通訊中我們可以使用PID來唯一標示一個進程,但PID只在本地唯一,網絡中的兩個進程PID沖突幾率很大,這時候我們需要另辟它徑了,我們知道IP層的ip地址可以唯一標示主機,而TCP層協議和端口號可以唯一標示主機的一個進程,這樣我們可以利用ip地址+協議+端口號唯一標示網絡中的一個進程。

能夠唯一標示網絡中的進程后,它們就可以利用socket進行通信了,什么是socket呢?我們經常把socket翻譯為套接字,socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層復雜的操作抽象為幾個簡單的接口供應用層調用已實現進程在網絡中通信。

 
圖5:socket通信系統模塊示意圖

tcp服務端和tcp客戶端使用socket通信的過程如下。從圖中可以看到,socket連接可以保持長連接。

 

 
圖6:基本socket客戶/服務端通信流程示意圖

注意的是,socket連接可以由客戶端主動關閉,也可以由服務端主動關閉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM