1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        面試官:說說 WebSocket 和 Socket 及 Http 的區(qū)別?

        共 2955字,需瀏覽 6分鐘

         ·

        2022-04-18 06:31

        程序員的成長之路
        互聯(lián)網(wǎng)/程序員/技術/資料共享?
        關注


        閱讀本文大概需要 4.5 分鐘。

        來自:juejin.cn/post/6942358900171603975

        Socket是什么?

        • TPC/IP協(xié)議是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡中傳輸;
        • Socket是對TCP/IP協(xié)議的封裝和應用(程序員層面上);
        • 而HTTP是應用層協(xié)議,主要解決如何包裝數(shù)據(jù)。
        TCP/IP和HTTP協(xié)議的關系是:?“我們在傳輸數(shù)據(jù)時,可以只使用(傳輸層)TCP/IP協(xié)議,但是那樣的話,如果沒有應用層,便無法識別數(shù)據(jù)內容。如果想要使傳輸?shù)臄?shù)據(jù)有意義,則必須使用到應用層協(xié)議。應用層協(xié)議有很多,比如HTTP、FTP、TELNET等,也可以自己定義應用層協(xié)議。WEB使用HTTP協(xié)議作應用層協(xié)議,以封裝HTTP文本信息,然后使用TCP/IP做傳輸層協(xié)議將它發(fā)到網(wǎng)絡上?!?/section>
        Socket是什么呢,實際上socket是對TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個調用接口(API)。通過Socket,我們才能使用TCP/IP協(xié)議。
        Socket跟TCP/IP協(xié)議關系是:?“TCP/IP只是一個協(xié)議棧,就像操作系統(tǒng)的運行機制一樣,必須要具體實現(xiàn),同時還要提供對外的操作接口。這個就像操作系統(tǒng)會提供標準的編程接口,比如win32編程接口一樣,TCP/IP也要提供可供程序員做網(wǎng)絡開發(fā)所用的接口,這就是Socket編程接口。”
        從上圖中可以看到,HTTP是基于傳輸層的TCP協(xié)議的,而Socket API也是,所以只是從使用上說,可以認為Socket和HTTP類似(但一個是成文的互聯(lián)網(wǎng)協(xié)議,一個是一直沿用的一種編程概念),是對于傳輸層協(xié)議的另一種直接使用,因為按照設計,網(wǎng)絡對用戶的接口都應該在應用層。
        WebSocket協(xié)議的來源:
        WebSocket屬于WHATWG發(fā)布的Web Application的一部分(即HTML5)的產物。大約在08年的時候,WG的工程師在討論網(wǎng)絡環(huán)境中需要一種全雙工的連接形式,剛開始一直叫做「TCPConnection」,并討論了這種協(xié)議需要支持的功能,大致已經和我們今天看到的WebSocket差不多了。他們認為基于現(xiàn)有的HTTP之上的一些技術(如長輪詢、Comet)并滿足不了這種需求,有必要定義一個全新的協(xié)議。
        WebSocket協(xié)議的開篇就說,本協(xié)議的目的是為了解決基于瀏覽器的程序需要拉取資源時必須發(fā)起多個HTTP請求和長時間的輪訓的問題……而創(chuàng)建的。

        WebSocket和Socket的區(qū)別?

        兩者沒什么關系,就像雷鋒跟雷鋒塔一樣。

        為什么要使用Websocket?

        WebSocket的目的就是解決網(wǎng)絡傳輸中的雙向通信的問題,HTTP1.1默認使用持久連接(persistent connection),在一個TCP連接上也可以傳輸多個Request/Response消息對,但是HTTP的基本模型還是一個Request對應一個Response。
        這在雙向通信(客戶端要向服務器傳送數(shù)據(jù),同時服務器也需要實時的向客戶端傳送信息,一個聊天系統(tǒng)就是典型的雙向通信)時一般會使用這樣幾種解決方案:
        • 輪詢(polling),輪詢就會造成對網(wǎng)絡和通信雙方的資源的浪費,且非實時。
        • 長輪詢,客戶端發(fā)送一個超時時間很長的Request,服務器hold住這個連接,在有新數(shù)據(jù)到達時返回Response,相比#1,占用的網(wǎng)絡帶寬少了,其他類似。
        • 長連接,其實有些人對長連接的概念是模糊不清的,我這里講的其實是HTTP的長連接(1)。如果你使用Socket來建立TCP的長連接(2),那么,這個長連接(2)跟我們這里要討論的WebSocket是一樣的,實際上TCP長連接就是WebSocket的基礎,但是如果是HTTP的長連接,本質上還是Request/Response消息對,仍然會造成資源的浪費、實時性不強等問題。

        Websocket協(xié)議內容

        WebSocket的目的是取代HTTP在雙向通信場景下的使用,而且它的實現(xiàn)方式有些也是基于HTTP的(WS的默認端口是80和443)?,F(xiàn)有的網(wǎng)絡環(huán)境(客戶端、服務器、網(wǎng)絡中間人、代理等)對HTTP都有很好的支持,所以這樣做可以充分利用現(xiàn)有的HTTP的基礎設施,有點向下兼容的意味。
        WS協(xié)議有兩部分組成:握手和數(shù)據(jù)傳輸。
        握手
        使用Http進行實現(xiàn)。由客戶端使用http的方式發(fā)起握手請求,服務端接請求后,將當前正在使用的連接(TCP)的協(xié)議,由http協(xié)議切換為websocket協(xié)議。
        握手請求頭會帶有Upgrade參數(shù)用于升級協(xié)議類型:
        Upgrade:?upgrade是HTTP1.1中用于定義轉換協(xié)議的header域。它表示,如果服務器支持的話,客戶端希望使用現(xiàn)有的「網(wǎng)絡層」已經建立好的這個「連接(此處是TCP連接)」,切換到另外一個「應用層」(此處是WebSocket)協(xié)議。
        Upgrade擴展:Upgrade是HTTP中用來進行協(xié)議升級的頭域,在擴展的協(xié)議內容中,客戶端發(fā)起的協(xié)議轉換的方式更多,同時服務器也可以選擇不接受客戶端的協(xié)議升級請求;服務端也可以發(fā)起協(xié)議升級。
        請求uri格式:
        ??ws-URI?=?"ws:"?"http://"?host?[?":"?port?]?path?[?"?"?query?]
        ??wss-URI?=?"wss:"?"http://"?host?[?":"?port?]?path?[?"?"?query?]

        ??host?=?
        ??port?=?
        ??path?=?
        ??query?=?
        數(shù)據(jù)傳輸
        服務端接收握手請求后,回復response消息,一旦這個握手回復發(fā)出去,服務端就認為此WebSocket連接已經建立成功,處于OPEN狀態(tài)。它就可以開始發(fā)送數(shù)據(jù)了。
        WebSocket中所有發(fā)送的數(shù)據(jù)使用幀的形式發(fā)送??蛻舳税l(fā)送的數(shù)據(jù)幀都要經過掩碼處理,服務端發(fā)送的所有數(shù)據(jù)幀都不能經過掩碼處理。否則對方需要發(fā)送關閉幀。
        一個幀包含一個幀類型的標識碼,一個負載長度,和負載。負載包括擴展內容和應用內容。

        WebSocket和HTTP的對比

        相同點
        • 都是基于TCP的應用層協(xié)議。
        • 都使用Request/Response模型進行連接的建立。
        • 在連接的建立過程中對錯誤的處理方式相同,在這個階段WS可能返回和HTTP相同的返回碼。
        • 都可以在網(wǎng)絡中傳輸數(shù)據(jù)。
        不同點
        • WS使用HTTP來建立連接,但是定義了一系列新的header域,這些域在HTTP中并不會使用。
        • WS的連接不能通過中間人來轉發(fā),它必須是一個直接連接。
        • WS連接建立之后,通信雙方都可以在任何時刻向另一方發(fā)送數(shù)據(jù)。
        • WS連接建立之后,數(shù)據(jù)的傳輸使用幀來傳遞,不再需要Request消息。
        • WS的數(shù)據(jù)幀有序。

        推薦閱讀:

        真相,為什么大廠們一邊裁員,一邊招人?!

        Java常用類,這一次幫你總結好!

        互聯(lián)網(wǎng)初中高級大廠面試題(9個G)

        內容包含Java基礎、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊列、高性能緩存、反射、Spring全家桶原理、微服務、Zookeeper......等技術棧!

        ?戳閱讀原文領??!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??朕已閱?

        瀏覽 82
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            男女做爰猛烈吃奶摸馒头的照片 | 青青免费精品一区 | 精品秘 一区二三区在线男奴 | 亚洲午夜一区二区三区 | 女同av网站 | 插骚逼视频 | 一区无码精品 | 啊啊啊啊轻点视频 | 激情性爱av | 五月激情综合 |