0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用TCP連接HTTP詳細(xì)資料說(shuō)明

Wildesbeast ? 來(lái)源:網(wǎng)絡(luò)整理 ? 作者:佚名 ? 2020-04-06 14:05 ? 次閱讀

1. HTTP 是如何使用 TCP 連接的;

世界上幾乎所有的 HTTP 通信都是由 TCP/IP 承載的,TCP/IP 是全球計(jì)算機(jī)及網(wǎng)絡(luò)設(shè)備都 在使用的一種常用的分組交換網(wǎng)絡(luò)分層協(xié)議集。客戶端應(yīng)用程序可以打開(kāi)一條 TCP/IP 連 接,連接到可能運(yùn)行在世界任何地方的服務(wù)器應(yīng)用程序。一旦連接建立起來(lái)了,在客戶端 和服務(wù)器的計(jì)算機(jī)之間交換的報(bào)文就永遠(yuǎn)不會(huì)丟失、受損或失序。

盡管報(bào)文不會(huì)丟失或受損,但如果計(jì)算機(jī)或網(wǎng)絡(luò)崩潰了,客戶端和服務(wù)器之間的通信仍然會(huì)被斷開(kāi)。在這種情況下, 會(huì)通知客戶端和服務(wù)器通信中斷了。

當(dāng)瀏覽器收到一個(gè) URL 的時(shí)候,會(huì)執(zhí)行幾個(gè)相對(duì)應(yīng)的步驟,如下

瀏覽器解析出主機(jī)名;

瀏覽器查詢主機(jī)名的 IP 地址;

瀏覽器獲得端口號(hào);

瀏覽器發(fā)起對(duì)該 IP 地址對(duì)應(yīng)端口號(hào)的鏈接;

瀏覽器向服務(wù)器發(fā)送一條 HTTP GET報(bào)文;

瀏覽器從服務(wù)器讀取 HTTP 相應(yīng)報(bào)文;

瀏覽器關(guān)閉連接;

1.1 TCP 連接的基本知識(shí)

TCP 是可靠的數(shù)據(jù)管道

TCP 會(huì)按序、無(wú)差錯(cuò)地承載 HTTP 數(shù)據(jù),TCP 為 HTTP 提供了一條可靠的比特傳輸管道。從 TCP 連接一端填入的字節(jié)會(huì)從另一端 以原有的順序、正確地傳送出來(lái)。

TCP 流是分段的、由 IP 分組傳送

TCP 的數(shù)據(jù)是通過(guò)名為 IP 分組(或 IP 數(shù)據(jù)報(bào))的小數(shù)據(jù)塊來(lái)發(fā)送的。

這樣的話,如圖HTTP 就是“HTTP over TCP over IP”這個(gè)“協(xié)議棧”中的最頂層了。其安全版本 HTTPS 就是在 HTTP 和 TCP 之間插入了一個(gè)(稱為 TLS 或 SSL 的)密碼加密層(安全層),就是在圖中的右半部分。

HTTP 要傳送一條報(bào)文時(shí),會(huì)以流的形式將報(bào)文數(shù)據(jù)的內(nèi)容通過(guò)一條打開(kāi)的 TCP 連接按 序傳輸。TCP 收到數(shù)據(jù)流之后,會(huì)將數(shù)據(jù)流砍成被稱作段的小數(shù)據(jù)塊,并將段封裝在 IP 分組中,通過(guò)因特網(wǎng)進(jìn)行傳輸,如下圖中大家看到的內(nèi)容:

每個(gè) TCP 段都是由 IP 分組承載,從一個(gè) IP 地址發(fā)送到另一個(gè) IP 地址的。

而每個(gè) IP 分組中都包括:

一個(gè) IP 分組首部(通常為 20 字節(jié));

一個(gè) TCP 段首部(通常為 20 字節(jié));

一個(gè) TCP 數(shù)據(jù)塊(0 個(gè)或多個(gè)字節(jié))。

IP 首部包含了源和目的 IP 地址、長(zhǎng)度和其他一些標(biāo)記。TCP 段的首部包含了 TCP 端口 號(hào)、TCP 控制標(biāo)記,以及用于數(shù)據(jù)排序和完整性檢查的一些數(shù)字值。

保持 TCP 連接的持續(xù)不間斷地運(yùn)行

在任意時(shí)刻計(jì)算機(jī)都可以有幾條 TCP 連接處于打開(kāi)狀態(tài)。TCP 是通過(guò)端口號(hào)來(lái)保持所有 這些連接的正確運(yùn)行的。 端口號(hào)和雇員使用的電話分機(jī)號(hào)很類似。

這就和我之前舉得例子是一樣的,公司的總機(jī)和你自己的座機(jī)一樣,公司的總機(jī)號(hào)碼能將你接到前臺(tái),而分機(jī)號(hào) 可以將你接到正確的雇員位置一樣,IP 地址可以將你連接到正確的計(jì)算機(jī),而端口號(hào)則 可以將你連接到正確的應(yīng)用程序上去。TCP 連接是通過(guò) 4 個(gè)值來(lái)識(shí)別的:

源IP 地址、源端口號(hào)、目的IP 地址、目的端口號(hào)

這 4 個(gè)值一起唯一地定義了一條連接。兩條不同的 TCP 連接不能擁有 4 個(gè)完全相同的地 址組件值(但不同連接的部分組件可以擁有相同的值)。

這里需要我們注意的是,有些連接共享了相同的目的端口號(hào),有些連接使用了相同的源 IP 地址,有些使用了相同的目的 IP 地址,但沒(méi)有兩個(gè)不同連接所有的 4 個(gè)值都一樣。

TCP 套接字

操作系統(tǒng)提供了一些操縱其 TCP 連接的工具。為了更具體地說(shuō)明問(wèn)題,我們來(lái)看一個(gè) TCP 編程接口,這些套接字我就不一一介紹了,我給大家一個(gè)表格,大家可以理解一下

套接字API調(diào)用描 述s = socket()創(chuàng)建一個(gè)新的、未命名、未關(guān)聯(lián)的套接字bind(s,)向套接字賦一個(gè)本地端口號(hào)和接口connect(s, )創(chuàng)建一條連接本地套接字與遠(yuǎn)程主機(jī)及端口的連接listen(s,…)標(biāo)識(shí)一個(gè)本地套接字,使其可以合法接受連接s2 = accept(s)等待某人建立一條到本地端口的連接

套接字 API 允許用戶創(chuàng)建 TCP 的端點(diǎn)數(shù)據(jù)結(jié)構(gòu),將這些端點(diǎn)與遠(yuǎn)程服務(wù)器的 TCP 端點(diǎn)進(jìn) 行連接,并對(duì)數(shù)據(jù)流進(jìn)行讀寫(xiě)。TCP API 隱藏了所有底層網(wǎng)絡(luò)協(xié)議的握手細(xì)節(jié),以及 TCP 數(shù)據(jù)流與 IP 分組之間的分段和重裝細(xì)節(jié)。

TCP 客戶端和服務(wù)器是如何通過(guò) TCP 套接字接口進(jìn)行通信的

上圖中說(shuō)明了可以怎樣通過(guò)套接字 API 來(lái)凸顯客戶端和服務(wù)器在實(shí)現(xiàn) HTTP 事務(wù)時(shí)所應(yīng)執(zhí)行的步驟。

2. TCP 連接的握手

TCP 連接握手需要經(jīng)過(guò)以下幾個(gè)步驟。 如圖所示:

請(qǐng)求新的 TCP 連接時(shí),客戶端要向服務(wù)器發(fā)送一個(gè)小的 TCP 分組(通常是 40 ~ 60 個(gè)字節(jié))。這個(gè)分組中設(shè)置了一個(gè)特殊的 SYN 標(biāo)記,說(shuō)明這是一個(gè)連接請(qǐng)求。

如果服務(wù)器接受了連接,就會(huì)對(duì)一些連接參數(shù)進(jìn)行計(jì)算,并向客戶端回送一個(gè) TCP 分組,這個(gè)分組中的 SYN 和 ACK 標(biāo)記都被置位,說(shuō)明連接請(qǐng)求已被接受。

最后,客戶端向服務(wù)器回送一條確認(rèn)信息,通知它連接已成功建立

我們永遠(yuǎn)不會(huì)看到這些分組——這些分組都由 TCP/IP 軟件管理,對(duì)其是不可見(jiàn) 的。HTTP 程序員看到的只是創(chuàng)建 TCP 連接時(shí)存在的時(shí)延。

在這里我們需要注意的就是 TCP 連接的握手時(shí)延,通常 HTTP 事務(wù)都不會(huì)交換太多數(shù)據(jù),此時(shí),SYN/SYN+ACK 握手(參見(jiàn)圖中的 a 段 和圖中的 b 段)會(huì)產(chǎn)生一個(gè)可測(cè)量的時(shí)延。TCP 連接的 ACK 分組(參見(jiàn)圖中的 c 段)通常都足夠大,可以承載整個(gè) HTTP 請(qǐng)求報(bào)文,而且很多 HTTP 服務(wù)器響應(yīng)報(bào)文都可 以放入一個(gè) IP 分組 中去(比如,響應(yīng)是包含了裝飾性圖片的小型 HTML 文件,或者是對(duì)瀏覽器高速緩存請(qǐng)求產(chǎn)生的 304 Not Modified 響應(yīng))。

TCP 慢啟動(dòng)

TCP 數(shù)據(jù)傳輸?shù)男阅苓€取決于 TCP 連接的使用期(age)。TCP 連接會(huì)隨著時(shí)間進(jìn)行自 我“調(diào)諧”,起初會(huì)限制連接的最大速度,如果數(shù)據(jù)成功傳輸,會(huì)隨著時(shí)間的推移提高傳輸 的速度。這種調(diào)諧被稱為 TCP 慢啟動(dòng)(slow start),用于防止因特網(wǎng)的突然過(guò)載和擁 塞。

TCP 慢啟動(dòng)限制了一個(gè) TCP 端點(diǎn)在任意時(shí)刻可以傳輸?shù)姆纸M數(shù)。簡(jiǎn)單來(lái)說(shuō),每成功接收 一個(gè)分組,發(fā)送端就有了發(fā)送另外兩個(gè)分組的權(quán)限。如果某個(gè) HTTP 事務(wù)有大量數(shù)據(jù)要發(fā) 送,是不能一次將所有分組都發(fā)送出去的。必須發(fā)送一個(gè)分組,等待確認(rèn);然后可以發(fā)送 兩個(gè)分組,每個(gè)分組都必須被確認(rèn),這樣就可以發(fā)送四個(gè)分組了,以此類推。這種方式被 稱為“打開(kāi)擁塞窗口”。

由于存在這種擁塞控制特性,所以新連接的傳輸速度會(huì)比已經(jīng)交換過(guò)一定量數(shù)據(jù)的、“已 調(diào)諧”連接慢一些。由于已調(diào)諧連接要更快一些,所以 HTTP 中有一些可以重用現(xiàn)存連接 的工具。

3. HTTP 連接的處理

前面我們說(shuō)了 TCP 連接,我們重新來(lái)分析一下 HTTP ,之前我也說(shuō)過(guò)在 HTTP 1.0的時(shí)候和1.1之后,有 Keep-Alive ,關(guān)于 Keep-Alive 不懂的請(qǐng)翻看前面的公眾號(hào)的文章內(nèi)容,接下來(lái)我分幾個(gè)內(nèi)容給大家講述 HTTP 對(duì)連接上的處理。

并行連接1 通過(guò)多條 TCP 連接發(fā)起并發(fā)的 HTTP 請(qǐng)求。

持久連接1 重用 TCP 連接,以消除連接及關(guān)閉時(shí)延。

管道化連接1 通過(guò)共享的 TCP 連接發(fā)起并發(fā)的 HTTP 請(qǐng)求。

我們來(lái)看一下串行:

每個(gè)事務(wù)都需要(串行地建立)一條 新的連接,那么連接時(shí)延和慢啟動(dòng)時(shí)延就會(huì)疊加起來(lái)

并行連接就是說(shuō) HTTP 允許客戶端打開(kāi)多條連接,并行的去執(zhí)行多個(gè)HTTP 的事務(wù),就會(huì)出現(xiàn)多條線路平行的情況。

其實(shí)并行連接并沒(méi)有說(shuō)是頁(yè)面的傳輸速度,是因?yàn)槎鄠€(gè)對(duì)象同時(shí)在進(jìn)展,所以,他的速度要比疊加起來(lái),讓你在感覺(jué)上快不少。

持久連接

HTTP 1.1 允許 HTTP 設(shè)備在事務(wù)處理結(jié)束之后 將 TCP 連接保持在打開(kāi)狀態(tài),以便為未來(lái)的 HTTP 請(qǐng)求重用現(xiàn)存的連接。在事務(wù)處理結(jié)束之后仍然保持在打開(kāi)狀態(tài)的 TCP 連接被稱為持久連接。非持久連接會(huì)在每個(gè)事務(wù)結(jié)束之后關(guān)閉。持久連接會(huì)在不同事務(wù)之間保持打開(kāi)狀態(tài),直到客戶端或服務(wù)器決定將其關(guān)閉為止。

管道化連接(也有人稱之為管線化)

HTTP/1.1 允許在持久連接上可選地使用請(qǐng)求管道。這是相對(duì)于 keep-alive 連接的又一性能優(yōu)化。在響應(yīng)到達(dá)之前,可以將多條請(qǐng)求放入隊(duì)列。當(dāng)?shù)谝粭l請(qǐng)求通過(guò)網(wǎng)絡(luò)流向地球另一端的服務(wù)器時(shí),第二條和第三條請(qǐng)求也可以開(kāi)始發(fā)送了。在高時(shí)延網(wǎng)絡(luò)條件下,這樣做可以降低網(wǎng)絡(luò)的環(huán)回時(shí)間,提高性能。

其實(shí)管道化說(shuō)白了就是 傳送過(guò)程中不需先等待服務(wù)端的回應(yīng),然后又發(fā)了幾條,瀏覽器將 HTTP 要求大批提交可大幅縮短頁(yè)面的加載時(shí)間,特別是在傳輸延遲(lag/latency)較高的情況下(如衛(wèi)星連接)。此技術(shù)之關(guān)鍵在于多個(gè) HTTP 的要求消息可以同時(shí)塞入一個(gè) TCP 分組中,所以只提交一個(gè)分組即可同時(shí)發(fā)出多個(gè)要求,借此可減少網(wǎng)絡(luò)上多余的分組并降低線路負(fù)載。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    499

    瀏覽量

    30978
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1347

    瀏覽量

    78933
  • URL
    URL
    +關(guān)注

    關(guān)注

    0

    文章

    139

    瀏覽量

    15297
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    TCP/IP詳細(xì)資料

    TCP/IP詳細(xì)資料 一.TCP/IP通訊協(xié)定的緣起不滅    話起一九六八年至今已有29個(gè)年頭,TCP/IP(Transmission Control Pr
    發(fā)表于 01-27 10:09 ?725次閱讀

    TCP IP相關(guān)知識(shí)的詳細(xì)資料說(shuō)明免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是TCP IP相關(guān)知識(shí)的詳細(xì)資料說(shuō)明免費(fèi)下載。主要內(nèi)容包括了:TCP報(bào)文格式,
    發(fā)表于 12-05 11:19 ?19次下載
    <b class='flag-5'>TCP</b> IP相關(guān)知識(shí)的<b class='flag-5'>詳細(xì)資料</b><b class='flag-5'>說(shuō)明</b>免費(fèi)下載

    同軸連接器HFSS模擬的詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是同軸連接器HFSS模擬的詳細(xì)資料說(shuō)明免費(fèi)下載。
    發(fā)表于 12-20 16:04 ?86次下載

    CAD電氣制圖的詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是CAD電氣制圖的詳細(xì)資料說(shuō)明。
    發(fā)表于 02-18 08:00 ?42次下載
    CAD電氣制圖的<b class='flag-5'>詳細(xì)資料</b><b class='flag-5'>說(shuō)明</b>

    ADC和DAC的設(shè)計(jì)經(jīng)驗(yàn)詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是ADC和DAC的設(shè)計(jì)經(jīng)驗(yàn)詳細(xì)資料說(shuō)明。
    發(fā)表于 03-12 08:00 ?31次下載
    ADC和DAC的設(shè)計(jì)經(jīng)驗(yàn)<b class='flag-5'>詳細(xì)資料</b><b class='flag-5'>說(shuō)明</b>

    LabVIEW通信編程的詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是LabVIEW通信編程的詳細(xì)資料說(shuō)明包括了:1.串行通信,2.DataSocket通信技術(shù),3.TCP通信
    發(fā)表于 03-26 08:00 ?26次下載
    LabVIEW通信編程的<b class='flag-5'>詳細(xì)資料</b><b class='flag-5'>說(shuō)明</b>

    電機(jī)驅(qū)動(dòng)的詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是電機(jī)驅(qū)動(dòng)的詳細(xì)資料說(shuō)明。
    發(fā)表于 05-06 11:42 ?37次下載
    電機(jī)驅(qū)動(dòng)的<b class='flag-5'>詳細(xì)資料</b><b class='flag-5'>說(shuō)明</b>

    使用LabVIEW設(shè)計(jì)掃雷游戲的詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用LabVIEW設(shè)計(jì)掃雷游戲的詳細(xì)資料說(shuō)明免費(fèi)下載。
    發(fā)表于 05-21 08:00 ?61次下載
    使用LabVIEW設(shè)計(jì)掃雷游戲的<b class='flag-5'>詳細(xì)資料</b><b class='flag-5'>說(shuō)明</b>

    如何使用netbeans連接數(shù)據(jù)庫(kù)并將access數(shù)據(jù)寫(xiě)入的詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何使用netbeans連接數(shù)據(jù)庫(kù)并將access數(shù)據(jù)寫(xiě)入的詳細(xì)資料說(shuō)明
    發(fā)表于 05-24 14:50 ?18次下載
    如何使用netbeans<b class='flag-5'>連接</b>數(shù)據(jù)庫(kù)并將access數(shù)據(jù)寫(xiě)入的<b class='flag-5'>詳細(xì)資料</b><b class='flag-5'>說(shuō)明</b>

    Labview數(shù)據(jù)庫(kù)連接工具VI的詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是Labview數(shù)據(jù)庫(kù)連接工具VI的詳細(xì)資料說(shuō)明
    發(fā)表于 06-03 08:00 ?22次下載
    Labview數(shù)據(jù)庫(kù)<b class='flag-5'>連接</b>工具VI的<b class='flag-5'>詳細(xì)資料</b><b class='flag-5'>說(shuō)明</b>

    AD快捷鍵的詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是AD快捷鍵的詳細(xì)資料說(shuō)明
    發(fā)表于 03-17 08:00 ?0次下載

    TCP如何與UDP命令連接詳細(xì)指南說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是TCP如何與UDP命令連接詳細(xì)指南說(shuō)明。
    發(fā)表于 02-28 08:00 ?6次下載
    <b class='flag-5'>TCP</b>如何與UDP命令<b class='flag-5'>連接</b><b class='flag-5'>詳細(xì)</b>指南<b class='flag-5'>說(shuō)明</b>

    WIFI模塊通過(guò)TCP協(xié)議發(fā)送HTTP詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是WIFI模塊通過(guò)TCP協(xié)議發(fā)送HTTP詳細(xì)資料說(shuō)明
    發(fā)表于 08-14 10:45 ?42次下載

    LabVIEW的程序?qū)嵗?b class='flag-5'>詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是LabVIEW的程序?qū)嵗?b class='flag-5'>詳細(xì)資料說(shuō)明
    發(fā)表于 02-05 14:05 ?142次下載
    LabVIEW的程序?qū)嵗?b class='flag-5'>詳細(xì)資料</b><b class='flag-5'>說(shuō)明</b>

    Bluetooth藍(lán)牙的詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是Bluetooth藍(lán)牙的詳細(xì)資料說(shuō)明
    發(fā)表于 02-26 11:14 ?26次下載