HTTP的三次握手and websocket的原理


HTTP的三次握手

 

在講三次握手之前,希望大家理解一個概念,什么概念呢?
就是在我們的客戶端和我們的服務器之間進行http請求,發送和返回的過程當中,我們是需要去創建一個tcp connection的東西,因為 http是不存在連接這么一個概念的,它只有一個請求和響應這么一個概念,那么請求和響應都是一個數據包,它們之間是需要一個傳輸的通道的,那么這個傳輸的通道在哪里呢?就在tcp里面,去創建了這么一個從客戶端發起,服務端接收的這么一個連接,這個連接呢,是可以一直保持在那邊,然后我們的http請求是在連接這個基礎上面去發送的,那這里就有一個概念,就是在tcp連接上面,是可以發送多個http請求的,在不同的版本里面,這個模式是不一樣的

 

在http/1.0里面,這個連接是在http請求創建的時候,就去創建這個tcp連接,然后連接創建完之后,然后請求發送過去,然后服務器響應之后呢,這個tcp連接它就關閉了
然后在http/1.1里面,這個連接我們可以通過某種方式去申明這個連接可以一直保持在那邊,然后保持在那邊是什么意思呢?就是我們這個請求,第一個請求發送之后,這個連接沒有關,然后第二個請求進來的時候,它還可以在這個連接上面進行發送,這有什么好處呢?就是因為tcp連接,我們這節課要講的,在創建過程當中,是有三次握手這么一個消耗的,三次握手就是代表着有三次網絡傳輸,客戶端發送一次,然后服務端返回一次,然后客戶端再發送一次,這個時候才創建了tcp連接,然后才能去發送http請求,所以如果把連接一直保持在那邊,那么第二個http請求就沒有三次握手的開銷
在http2里面還有一個好處就是,http2里面tcp連接上面的http請求是可以並發的,這就導致什么呢,就是說我們同一個用戶對同一個服務器發起一個網頁請求的時候,它只需要一個tcp連接,那么具體什么含義呢,我們后期課程會詳細的講,現在要清楚tcp連接和http請求之間的關系


 

 

在http的三次握手當中,首先客戶端發起一個我要發送一個數據包的請求,發送到服務端,這里面呢會有一個標志SYN=1,Seq=X,syn是一個標識,就是我這是一個創建請求的數據包,然后seq等於一個數字,一般來說都是1,然后服務端接收之后,知道了我有一個客戶要跟我創建連接了,那創建這個連接之后呢,服務端就會開啟一個tcp,socket的一個端口,然后這個端口開啟了之后,它返回給客戶端,它返回的數據里面也是一個SYN=1,ACK=X+1,Seq=Y,然后它會返回一個ACK,ACK就等於第一次發送過來的Seq,就是X,然后+1,然后它再發送一個Seq,這個是服務器端的一個Seq,然后客戶端拿到之后,服務端允許我們打開創建這個連接,然后客戶端再去發送它的ACK=Y+1,Seq=Z,它再發送一個Seq,等於一個新的數字Z,這就是tcp去創建的一個過程

 

為什么要進行這樣一個三次握手呢,這是為了防止服務端這邊開啟一些無用的連接,因為我們知道網絡傳輸是有延遲的,因為我們之間可能隔着非常遠的距離,要通過一個光纖,然后各種中間的代理服務器來進行一個傳輸,在傳輸的過程當中,比如客戶端發送一個SYN=1,創建連接的請求,如果服務端就直接創建了這個連接,然后返回內容給客戶端,但是這個數據包因為網絡傳輸的原因,它丟了,丟了以后,客戶端就一直沒有接收到服務器返回到這個東西,然后客戶端可能設置了一個超時時間,關閉了,關閉了之后才發現一個新的創建連接的請求,這個時候服務端是不知道的,如果沒有第三次握手,服務端根本不知道客戶端有沒有接收到我返回到信息,並且沒有說要去創建還是關閉這個請求,服務端就開在那邊,等着客戶端發送實際到請求數據,那么這個時候服務端這個開銷就浪費了,因為它不知道這個連接已經創建失敗了,可能客戶端已經創建新到連接去了,所以呢,我們需要三次握手,讓客戶端和服務端察覺到我們因為網絡原因端一些問題導致數據沒有查到,這個端口,這個連接已經關閉了,我們需要一直等在那邊的情況, 三次握手主要是規避網絡傳輸當中延遲而導致服務器開銷的一些問題

 

接下來看下三次握手數據包的相信內容,Wireshark抓包工具

13789是本機的一個端口,80是服務器端的一個端口,因為有三次握手,客戶端和服務器之間有三個來回,只要找到同一個端口的來回,就可以找到這三次握手

如圖,這三次是完整的三次握手的過程,第一次握手可以看到發送了一個SYN標示位,為了簡單演示,說SYN=1,其實,就是SYN占據了第一個標識位,用圖片只是為了更形象的展示這三個過程,返回的時候是一個SYN,再加上一個ACK。最后客戶端再發送一個ACK給服務端,作為第一個標識位,這樣一個過程就完成了一個三次握手

轉載  :  https://www.cnblogs.com/wzndkj/p/10018387.html

 

二,websocket     

 

       1,WebSocket就很好的解決被動性問題,只需要完成一次握手,兩者之間就直接可以創建持久性的連接,並進行雙向數據傳輸。不用再次發起網絡請求,服務端有消息就會自己發過來.它允許服務端主動向客戶端推送數據。比如在app上websocket獲取並展示客戶的時時消費情況.

 

        2,WebSocket同HTTP一樣也是應用層的協議. 都是基於TCP的,可靠性的傳輸協議。但是它是一種雙向通信協議,是建立在TCP之上的,並且Websocket是一個持久化的協議,而HTTP是非持久化的協議。WebSocket protocol 是HTML5一種新的協議,但Websocket是基於HTTP協議的,或者說借用了HTTP的協議來完成一部分握手。一開始的握手需要借助HTTP請求完成。

 

        3,WebSocket在建立握手時,通過 HTTP/1.1 協議的101狀態碼進行握手。但是建立之后,在真正傳輸時候是不需要HTTP協議的,而是使用TCP協議.

 

        4,Websocket使用ws或wss的統一資源標志符,類似於HTTPS,其中wss表示在TLS之上的Websocket

 

       5,Websocket使用和 HTTP 相同的 TCP 端口,可以繞過大多數防火牆的限制。默認情況下,Websocket協議使用80端口;運行在TLS之上時,默認使用443端口。

       6,優點:

    實時性更強,很好的控制開銷(協議的頭部較小),保持連接.

三,socket

    

        1,概念:Socket其實並不是一個協議,而是為了方便使用TCP或UDP而抽象出來的一層,是位於應用層和傳輸控制層之間的一組接口.

         1.1,在程序內部提供了與外界通信的端口,也就是端口通信.它通過建立socket連接,可以為通信雙方的數據傳輸提供一個通道

         1.2,它是應用層與TCP/IP協議族通信的中間軟件抽象層,是一組接口。在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。

       2,當兩台主機通信時,必須通過Socket連接,Socket則利用TCP/IP協議建立TCP連接。TCP連接則更依靠於底層的IP協議,IP協議的連接則依賴於鏈路層等更低層次。

        3,和機頂盒通信可以采用socket(自己決定采用udp的scoket還是tcp的socket,一般采用的是tcp的socket)

        4, Socket的分類
        4.1, 根據不同的的底層協議,Socket的實現是多樣化的.這里只介紹TCP/IP協議族的內容.

        4.2,在這個協議族當中主要的Socket類型為流套接字(streamsocket)和數據報套接字(datagramsocket)。

        4.3,流套接字將TCP作為其端對端協議,提供了一個可信賴的字節流服務。

        4.4,數據報套接字使用UDP協議,提供數據打包發送服務。 下面,

       5,tcp的scoket和udp的socket的區別

       使用UDP方式android端和服務器端接收可以看出,其實android端和服務器端的發送和接收大庭相徑,只要端口號正確了,相互通信就沒有問題,

        TCP使用的是流的方式發送,UDP是以包的形式發送。

         

         

感謝:

   基於android的Socket通信         

 

四,總計:

1,傳輸層的TCP是基於網絡層的IP協議的,
2,而應用層的HTTP協議又是基於傳輸層的TCP協議的,
3,而Socket本身不算是協議,就像上面所說,它只是提供了一個針對TCP或者UDP編程的接口.

(二)websocket 和socket區別   

    1,websocket是應用層的協議,而socket是傳輸控制層的協議.  

    

(三)websocket 和http區別        

 相同點:

   1,都是應用層的協議

   2,都是基於tcp,並且都是可靠的協議

不同點:

    1,websocket是持久連接的協議,而http是非持久連接的協議.

    2,websocket是雙向通信協議,模擬socket協議,可以雙向發送消息,而http是單向的.

    3,websocket的服務端可以主動向客服端發送信息,而http的服務端只有在客戶端發起請求時才能發送數據,無法主動向客戶端發送信息.

 

(四)HTTPS和HTTP的區別主要為以下四點:

1、https協議需要到ca申請證書,一般免費證書很少,需要交費。

2、http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。

3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。

4、http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。

 

五,長連接和短連接

       1,短連接:在HTTP1.0中,客戶端發送請求,服務器接收請求,雙方建立連接,服務器響應資源,請求結束。

       2,長連接:在HTTP 1.1,客戶端發出請求,服務端接收請求,雙方建立連接,在服務端沒有返回之前保持連接,當客戶端再發送請求時,它會使用同一個連接。這一直繼續到客戶端或服務器端認為會話已經結束,其中一方中斷連接。

       優勢:減少了連接請求,降低TCP阻塞,減少了延遲,實時性較好。

       劣勢:可能會影響性能,因為它在文件被請求之后還保持了不必要的連接很長時間。
 
 
原文鏈接:https://blog.csdn.net/qq_38859786/article/details/80523642

 

 

 


免責聲明!

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



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