国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

13. 從零用Rust編寫正反向代理, HTTP中的壓縮gzip,deflate,brotli算法

這篇具有很好參考價值的文章主要介紹了13. 從零用Rust編寫正反向代理, HTTP中的壓縮gzip,deflate,brotli算法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

wmproxy

wmproxy是由Rust編寫,已實現(xiàn)http/https代理,socks5代理, 反向代理,靜態(tài)文件服務(wù)器,內(nèi)網(wǎng)穿透,配置熱更新等, 后續(xù)將實現(xiàn)websocket代理等,同時會將實現(xiàn)過程分享出來, 感興趣的可以一起造個輪子法

項目 ++wmproxy++

gite: https://gitee.com/tickbh/wmproxy

github: https://github.com/tickbh/wmproxy

HTTP中壓縮的意義

HTTP中壓縮的意義在于降低了網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量,從而提高客戶端瀏覽器的訪問速度。當(dāng)然,同時也會增加一點服務(wù)器的負(fù)擔(dān)。
HTTP/1.1協(xié)議中壓縮主要包括gzip壓縮和deflate壓縮兩種方法。其中g(shù)zip壓縮使用的是LZ77和哈夫曼編碼,而deflate壓縮使用的是LZ77和哈夫曼編碼以及霍夫曼編碼。
此外在2015年由Google公司開發(fā)的Brotli算法是也基本全面普及開來,Brotli算法的核心原理包括兩個部分:預(yù)定義的字典和無損壓縮算法。預(yù)定義的字典是Brotli算法中的一項關(guān)鍵技術(shù),它包含了一些常見的字符序列,例如Web標(biāo)記、HTML、CSS和JavaScript代碼等。Brotli算法的無損壓縮算法采用了一種基于模式匹配的壓縮方法。它通過預(yù)測數(shù)據(jù)中出現(xiàn)的重復(fù)模式,對數(shù)據(jù)進行壓縮。
在HTTP的壓縮協(xié)議中,這三種壓縮算法基本上可以全部被支持。

gzip,deflate,brotli的優(yōu)劣勢

gzip、deflate和brotli這三種壓縮算法都有各自的優(yōu)勢和劣勢,具體如下:

  1. gzip
  • 優(yōu)勢:是Web上最常見的壓縮算法之一,具有較高的壓縮效率和廣泛的支持程度,可以被幾乎所有的瀏覽器和服務(wù)器支持。
  • 劣勢:算法的壓縮比相對較低,可能會增加文件的大小。
  1. deflate
  • 優(yōu)勢:具有較高的壓縮效率和廣泛的支持程度,同時算法的實現(xiàn)在不同的瀏覽器和服務(wù)器之間非常一致。
  • 劣勢:由于某些實現(xiàn)上的缺陷,可能會導(dǎo)致一些瀏覽器和服務(wù)器無法正常解壓縮。
  1. brotli
  • 優(yōu)勢:具有更高的壓縮效率和更快的壓縮速度,可以進一步減少傳輸數(shù)據(jù)的大小,從而提高頁面加載速度,并且被較新版本的瀏覽器和服務(wù)器支持。
  • 劣勢:由于算法目前僅被較新版本的瀏覽器和服務(wù)器支持,因此需要根據(jù)實際情況進行選擇。

以下是壓縮解壓的數(shù)率圖:
13. 從零用Rust編寫正反向代理, HTTP中的壓縮gzip,deflate,brotli算法,rust,http,算法

13. 從零用Rust編寫正反向代理, HTTP中的壓縮gzip,deflate,brotli算法,rust,http,算法
13. 從零用Rust編寫正反向代理, HTTP中的壓縮gzip,deflate,brotli算法,rust,http,算法

數(shù)據(jù)來源src

可以看出brotli的壓縮比大概在9左右,gzip大概在7左右,deflate也大概在7左右,壓縮比brotli最高,適應(yīng)網(wǎng)絡(luò)傳輸慢的情況,壓縮速度gzip和deflate相對較快,解壓縮deflate較快,brotli和gzip差不多。

rust中三種壓縮方式庫的選擇

通常尋找rust中的第三方庫的時候,可以通過https://crates.io/進行選擇,這里公開的第三方庫都會在這里顯示,包括使用次數(shù),流行熱度,最近下載量,最近更新時間等,可以從多維度的知道該庫的好與壞再進行相應(yīng)的選擇。

  • flate2
    13. 從零用Rust編寫正反向代理, HTTP中的壓縮gzip,deflate,brotli算法,rust,http,算法

該庫支持三種壓縮格式的算法,deflate, zlib, gzip,我們選擇用它來做deflate, gzip的支持。

  • brotli
    13. 從零用Rust編寫正反向代理, HTTP中的壓縮gzip,deflate,brotli算法,rust,http,算法

該庫如庫名一般,只支持brotli算法,相對熱度較高,算是支持brolti里最好的一個,我們進行選擇。

三種方式的壓縮實現(xiàn)

三種方式均可實現(xiàn)流式的壓縮,即邊寫入數(shù)據(jù),邊讀出壓縮數(shù)據(jù),不用完全的寫入所有數(shù)據(jù),完整的實現(xiàn)方法在 RecvStream里,將壓縮的數(shù)據(jù)緩存到self.cache_body_data

定義壓縮方法值

pub const COMPRESS_METHOD_NONE: i8 = 0;
pub const COMPRESS_METHOD_GZIP: i8 = 1;
pub const COMPRESS_METHOD_DEFLATE: i8 = 2;
pub const COMPRESS_METHOD_BROTLI: i8 = 3;
  • gzip

此處利用的是類use flate2::write::GzEncoder,定義為GzEncoder<BinaryMut>,其中BinaryMut為壓縮后的數(shù)據(jù),需要具備std::io::Write方法。

Consts::COMPRESS_METHOD_GZIP => {
    // 數(shù)據(jù)結(jié)束,需要主動調(diào)用結(jié)束以導(dǎo)出全部結(jié)果
    if data.len() == 0 {
        self.compress.open_write_gz();
        let gz = self.compress.write_gz.take().unwrap();
        let value = gz.finish().unwrap();
        if value.remaining() > 0 {
            Self::inner_encode_data(&mut self.cache_body_data, &value, self.is_chunked)?;
        }
        if self.is_chunked {
            Helper::encode_chunk_data(&mut self.cache_body_data, data)
        } else {
            Ok(0)
        }
    } else {
        self.compress.open_write_gz();
        let gz = self.compress.write_gz.as_mut().unwrap();
        gz.write_all(data).unwrap();
        // 每次寫入,在嘗試讀取出數(shù)據(jù)
        if gz.get_mut().remaining() > 0 {
            let s =
                Self::inner_encode_data(&mut self.cache_body_data, &gz.get_mut().chunk(), self.is_chunked);
            gz.get_mut().clear();
            s
        } else {
            Ok(0)
        }
    }
}
  • deflate

此處利用的是類use flate2::write::DeflateEncoder,定義為DeflateEncoder<BinaryMut>,其中BinaryMut為壓縮后的數(shù)據(jù),需要具備std::io::Write方法。

Consts::COMPRESS_METHOD_DEFLATE => {
    // 數(shù)據(jù)結(jié)束,需要主動調(diào)用結(jié)束以導(dǎo)出全部結(jié)果
    if data.len() == 0 {
        self.compress.open_write_de();
        let de = self.compress.write_de.take().unwrap();
        let value = de.finish().unwrap();
        if value.remaining() > 0 {
            Self::inner_encode_data(&mut self.cache_body_data, &value, self.is_chunked)?;
        }
        if self.is_chunked {
            Helper::encode_chunk_data(&mut self.cache_body_data, data)
        } else {
            Ok(0)
        }
    } else {
        self.compress.open_write_de();
        let de = self.compress.write_de.as_mut().unwrap();
        de.write_all(data).unwrap();
        // 每次寫入,在嘗試讀取出數(shù)據(jù)
        if de.get_mut().remaining() > 0 {
            let s =
                Self::inner_encode_data(&mut self.cache_body_data, &de.get_mut().chunk(), self.is_chunked);
            de.get_mut().clear();
            s
        } else {
            Ok(0)
        }
    }
}
  • brotli

此處利用的是類use brotli::CompressorWriter;,定義為CompressorWriter<BinaryMut>,其中BinaryMut為壓縮后的數(shù)據(jù),需要具備std::io::Write方法。

Consts::COMPRESS_METHOD_BROTLI => {
    // 數(shù)據(jù)結(jié)束,需要主動調(diào)用結(jié)束以導(dǎo)出全部結(jié)果
    if data.len() == 0 {
        self.compress.open_write_br();
        let mut de = self.compress.write_br.take().unwrap();
        de.flush()?;
        let value = de.into_inner();
        if value.remaining() > 0 {
            Self::inner_encode_data(&mut self.cache_body_data, &value, self.is_chunked)?;
        }
        if self.is_chunked {
            Helper::encode_chunk_data(&mut self.cache_body_data, data)
        } else {
            Ok(0)
        }
    } else {
        self.compress.open_write_br();
        let de = self.compress.write_br.as_mut().unwrap();
        de.write_all(data).unwrap();
        // 每次寫入,在嘗試讀取出數(shù)據(jù)
        if de.get_mut().remaining() > 0 {
            let s =
                Self::inner_encode_data(&mut self.cache_body_data, &de.get_mut().chunk(), self.is_chunked);
            de.get_mut().clear();
            s
        } else {
            Ok(0)
        }
    }
}

三種方式的解壓實現(xiàn)

和壓縮不同的是,解壓的時候必須將完整的數(shù)據(jù)進行解壓,所以需要收到全部的數(shù)據(jù)的時候才嘗試進行解壓,可能我的理解有誤,歡迎指出,當(dāng)下的實現(xiàn)方式可能會占用大量的內(nèi)存,非我所愿。主要源碼在 SendStream中實現(xiàn)。

三種方式均類似,以下

// 收到數(shù)據(jù)進行緩存,只有到結(jié)束時才進行解壓縮
match self.compress_method {
    Consts::COMPRESS_METHOD_GZIP => {
        self.cache_body_data.put_slice(data);
        if self.is_end {
            self.compress.open_reader_gz(self.cache_body_data.clone());
            let gz = self.compress.reader_gz.as_mut().unwrap();
            let s = Self::read_all_data(&mut self.cache_buf, &mut self.real_read_buf, gz);
            self.cache_body_data.clear();
            s
        } else {
            Ok(0)
        }
    }
    Consts::COMPRESS_METHOD_DEFLATE => {
        self.cache_body_data.put_slice(data);
        if self.is_end {
            self.compress.open_reader_de(self.cache_body_data.clone());
            let de = self.compress.reader_de.as_mut().unwrap();
            let s = Self::read_all_data(&mut self.cache_buf, &mut self.real_read_buf, de);
            self.cache_body_data.clear();
            s
        } else {
            Ok(0)
        }
    }
    Consts::COMPRESS_METHOD_BROTLI => {
        self.cache_body_data.put_slice(data);
        if self.is_end {
            self.compress.open_reader_br(self.cache_body_data.clone());
            let br = self.compress.reader_br.as_mut().unwrap();
            let s = Self::read_all_data(&mut self.cache_buf, &mut self.real_read_buf, br);
            self.cache_body_data.clear();
            s
        } else {
            Ok(0)
        }
    }
    _ => {
        self.real_read_buf.put_slice(data);
        Ok(data.len())
    },
}

如果數(shù)據(jù)包非常的巨大的時候,可能需要將內(nèi)存內(nèi)容寫入緩存文件來緩解內(nèi)存的壓力。

結(jié)語

壓縮為了可以更好的存儲,也可以更好的傳輸,是我們?nèi)粘I钪斜夭豢缮俚拇嬖?,雖然現(xiàn)在比以前帶寬更高,存儲比之前的更便宜,但是現(xiàn)在的數(shù)據(jù)更多,傳輸延時要求更少,所以高壓縮的能力依然非常受歡迎。文章來源地址http://www.zghlxwxcb.cn/news/detail-787094.html

到了這里,關(guān)于13. 從零用Rust編寫正反向代理, HTTP中的壓縮gzip,deflate,brotli算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • linux中的壓縮解壓命令:gzip,tar,zip,bzip2

    linux中的壓縮解壓命令:gzip,tar,zip,bzip2

    命令名稱:gzip 語法:gzip? 文件 功能:壓縮文件 壓縮后文件格式:.gz 例子1 ?如上圖所示,先用touch命令創(chuàng)建一個新文件file1,然后使用gzip壓縮該文件。 例子2 如上圖所示,先用cp命令將/etc/services文件復(fù)制到/root目錄下并改名為file2,通過ls -l 命令可見該文件的大小為670293B,

    2024年02月05日
    瀏覽(22)
  • 【W(wǎng)eb】HTTP代理和反向代理

    【W(wǎng)eb】HTTP代理和反向代理

    就是從客戶端直接訪問服務(wù)端,相當(dāng)于我直接去廠家買可樂,沒有中間商賺差價 HTTP代理指在客戶端先訪問代理服務(wù)器,然后由代理服務(wù)器去訪問服務(wù)端,代理服務(wù)器收到響應(yīng)后再轉(zhuǎn)發(fā)個客戶端,就像我去商店買可樂的過程 瀏覽器并不知道代理服務(wù)器的位置,所以我們要主動

    2024年02月06日
    瀏覽(26)
  • 深入理解 http 反向代理

    深入理解 http 反向代理

    要理解什么是 反向代理(reverse proxy) , 自然你得先知道什么是 正向代理(forward proxy) . 另外需要說的是, 一般提到反向代理, 通常是指 http 反向代理, 但反向代理的范圍可以更大, 比如 tcp 反向代理, 在這里, 不打算討論 tcp 之類的反向代理, 當(dāng)文中說到反向代理時, 指的就是 http 反向

    2024年02月12日
    瀏覽(21)
  • Caddy反向代理轉(zhuǎn)發(fā)修改http請求路徑

    Caddy是個非常不錯的開源服務(wù)器產(chǎn)品,簡單易用,自帶ssl。只是沒啥詳細(xì)的中文文檔,遇到問題只能看官方文檔。 記錄一下使用Caddy轉(zhuǎn)發(fā)http請求的方法。 問題:將http://192.168.1.10:7077/product/*的請求轉(zhuǎn)發(fā)到http://192.168.1.12:7078/*。這里其實是兩個需求,一個是轉(zhuǎn)發(fā)端口,還有個是去

    2024年02月12日
    瀏覽(25)
  • Nginx HTTP和反向代理服務(wù)器

    Nginx HTTP和反向代理服務(wù)器

    1、概念: Nginx ?(engine x) 是一個高性能的HTTP和反向代理web服務(wù)器。 2、什么是代理服務(wù)器: 概念: 代理服務(wù)器是介于客戶端和Web服務(wù)器之間的另一臺服務(wù)器,有了它之后,瀏覽器不是直接到Web服務(wù)器去取回網(wǎng)頁信息,而是通過向代理服務(wù)器發(fā)送請求,信號會先送到代理服務(wù)

    2024年02月04日
    瀏覽(33)
  • Varnish開源HTTP反向代理緩存服務(wù)器

    Varnish開源HTTP反向代理緩存服務(wù)器

    第三階段基礎(chǔ) 時 ?間:2023年6月13日 參加人:全班人員 內(nèi) ?容: Varnish 目錄 Varnish 端口號:TCP/6081 ?TCP/6082 配置文件:/etc/varnish/default.vcl 安裝部署: 測試功能: Varnish是一個高性能的 開源HTTP反向代理緩存服務(wù)器 ,它可以加速動態(tài)內(nèi)容的交付并降低服務(wù)器的負(fù)載。 Varnish常被

    2024年02月10日
    瀏覽(17)
  • nginx-反向代理是設(shè)置傳輸協(xié)議http/https

    ????????X-Forwarded-Proto?(XFP)?是一個事實上的標(biāo)準(zhǔn)首部,用來確定客戶端與代理服務(wù)器或者負(fù)載均衡服務(wù)器之間的連接所采用的傳輸協(xié)議(HTTP?或?HTTPS)。在服務(wù)器的訪問日志中記錄的是負(fù)載均衡服務(wù)器與服務(wù)器之間的連接所使用的傳輸協(xié)議,而非客戶端與負(fù)載均衡服務(wù)器

    2024年02月14日
    瀏覽(37)
  • nginx 開啟https時反向代理http服務(wù)的問題

    當(dāng)我們用nginx開啟https時,反向代理一個本地的http服務(wù),會遭遇跨域問題,報錯 strict-origin-when-cross-origin ,導(dǎo)致很多資源無法加載。 這時只要在反向代理部分的配置文件中加入這一條語句即可:

    2024年02月14日
    瀏覽(16)
  • Vue 3中的反向代理 和如何在服務(wù)器配置反向代理

    如何在Vue 3項目中配置反向代理,讓前端開發(fā)變得爽到爆!還有個小插曲,Vite為我們提供了更簡單的方式,就像找對象一樣直接。 首先,我們來談?wù)劮聪虼硎鞘裁?。簡單來說,反向代理就像是前端和后端之間的婚姻介紹所。前端需要向后端請求數(shù)據(jù),但由于某些原因(比如

    2024年04月13日
    瀏覽(16)
  • 前端(二十六)——常見的HTTP異常狀態(tài)碼以及正反向代理配置

    前端(二十六)——常見的HTTP異常狀態(tài)碼以及正反向代理配置

    ??博主:小貓娃來啦 ??文章核心: 前端常見的HTTP異常狀態(tài)碼以及正反向代理配置 當(dāng)客戶端發(fā)送了一個請求,但服務(wù)器無法找到對應(yīng)的資源時,會返回404錯誤碼??赡艿脑虬ǎ?請求的URL路徑錯誤,服務(wù)器沒有對應(yīng)的資源。 資源被刪除或者被移動到其他位置。 資源名稱

    2024年01月25日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包