Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 日韩中文在线播放,亚洲国产一区在线二区三区,免费国产成人高清在线观看视频

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          你知道 HTTP 是如何使用 TCP 連接的嗎?今天我就來告訴你

          、HTTP 是如何使用 TCP 連接的;

          世界上幾乎所有的 HTTP 通信都是由 TCP/IP 承載的,TCP/IP 是全球計算機及網絡設備都 在使用的一種常用的分組交換網絡分層協(xié)議集??蛻舳藨贸绦蚩梢源蜷_一條 TCP/IP 連 接,連接到可能運行在世界任何地方的服務器應用程序。一旦連接建立起來了,在客戶端 和服務器的計算機之間交換的報文就永遠不會丟失、受損或失序。

          盡管報文不會丟失或受損,但如果計算機或網絡崩潰了,客戶端和服務器之間的通信仍然會被斷開。在這種情況下, 會通知客戶端和服務器通信中斷了。

          當瀏覽器收到一個 URL 的時候,會執(zhí)行幾個相對應的步驟,如下

          1. 瀏覽器解析出主機名;
          2. 瀏覽器查詢主機名的 IP 地址;
          3. 瀏覽器獲得端口號;
          4. 瀏覽器發(fā)起對該 IP 地址對應端口號的鏈接;
          5. 瀏覽器向服務器發(fā)送一條 HTTP GET報文;
          6. 瀏覽器從服務器讀取 HTTP 相應報文;
          7. 瀏覽器關閉連接;

          1.1、TCP 連接的基本知識

          TCP 是可靠的數據管道

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

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

          TCP 的數據是通過名為 IP 分組(或 IP 數據報)的小數據塊來發(fā)送的。

          這樣的話,如圖 HTTP 就是 “HTTP over TCP over IP” 這個“協(xié)議?!敝械淖铐攲恿?。其安全版本 HTTPS 就是在 HTTP 和 TCP 之間插入了一個(稱為 TLS 或 SSL 的)密碼加密層(安全層),就是在圖中的右半部分。

          HTTP 要傳送一條報文時,會以流的形式將報文數據的內容通過一條打開的 TCP 連接按 序傳輸。TCP 收到數據流之后,會將數據流砍成被稱作段的小數據塊,并將段封裝在 IP 分組中,通過因特網進行傳輸,如下圖中大家看到的內容:

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

          而每個 IP 分組中都包括:

          • 一個 IP 分組首部(通常為 20 字節(jié));
          • 一個 TCP 段首部(通常為 20 字節(jié));
          • 一個 TCP 數據塊(0 個或多個字節(jié))。

          IP 首部包含了源和目的 IP 地址、長度和其他一些標記。TCP 段的首部包含了 TCP 端口 號、TCP 控制標記,以及用于數據排序和完整性檢查的一些數字值。

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

          在任意時刻計算機都可以有幾條 TCP 連接處于打開狀態(tài)。TCP 是通過端口號來保持所有 這些連接的正確運行的。端口號和雇員使用的電話分機號很類似。

          這就和我之前舉得例子是一樣的,公司的總機和你自己的座機一樣,公司的總機號碼能將你接到前臺,而分機號 可以將你接到正確的雇員位置一樣,IP 地址可以將你連接到正確的計算機,而端口號則 可以將你連接到正確的應用程序上去。TCP 連接是通過 4 個值來識別的:

          源IP 地址、源端口號、目的IP 地址、目的端口號

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

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

          TCP 套接字

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

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

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

          TCP 客戶端和服務器是如何通過 TCP 套接字接口進行通信的


          上圖中說明了可以怎樣通過套接字 API 來凸顯客戶端和服務器在實現 HTTP 事務時所應執(zhí)行的步驟。

          2、TCP 連接的握手

          TCP 連接握手需要經過以下幾個步驟。如圖所示:

          請求新的 TCP 連接時,客戶端要向服務器發(fā)送一個小的 TCP 分組(通常是 40 ~ 60 個字節(jié))。這個分組中設置了一個特殊的 SYN 標記,說明這是一個連接請求。

          1. 如果服務器接受了連接,就會對一些連接參數進行計算,并向客戶端回送一個 TCP 分組,這個分組中的 SYN 和 ACK 標記都被置位,說明連接請求已被接受。
          2. 最后,客戶端向服務器回送一條確認信息,通知它連接已成功建立

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

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

          TCP 慢啟動

          TCP 數據傳輸的性能還取決于 TCP 連接的使用期(age)。TCP 連接會隨著時間進行自 我“調諧”,起初會限制連接的最大速度,如果數據成功傳輸,會隨著時間的推移提高傳輸 的速度。這種調諧被稱為 TCP 慢啟動(slow start),用于防止因特網的突然過載和擁 塞。

          TCP 慢啟動限制了一個 TCP 端點在任意時刻可以傳輸的分組數。簡單來說,每成功接收 一個分組,發(fā)送端就有了發(fā)送另外兩個分組的權限。如果某個 HTTP 事務有大量數據要發(fā) 送,是不能一次將所有分組都發(fā)送出去的。必須發(fā)送一個分組,等待確認;然后可以發(fā)送 兩個分組,每個分組都必須被確認,這樣就可以發(fā)送四個分組了,以此類推。這種方式被 稱為“打開擁塞窗口”。

          由于存在這種擁塞控制特性,所以新連接的傳輸速度會比已經交換過一定量數據的、“已 調諧”連接慢一些。由于已調諧連接要更快一些,所以 HTTP 中有一些可以重用現存連接 的工具。

          3、HTTP 連接的處理

          前面我們說了 TCP 連接,我們重新來分析一下 HTTP ,之前我也說過在 HTTP 1.0的時候和1.1之后,有 Keep-Alive ,關于 Keep-Alive 不懂的請翻看前面的公眾號的文章內容,接下來我分幾個內容給大家講述 HTTP 對連接上的處理。

          • 并行連接:通過多條 TCP 連接發(fā)起并發(fā)的 HTTP 請求。
          • 持久連接:重用 TCP 連接,以消除連接及關閉時延。
          • 管道化連接:通過共享的 TCP 連接發(fā)起并發(fā)的 HTTP 請求。

          我們來看一下串行:

          每個事務都需要(串行地建立)一條 新的連接,那么連接時延和慢啟動時延就會疊加起來

          并行連接就是說 HTTP 允許客戶端打開多條連接,并行的去執(zhí)行多個 HTTP 的事務,就會出現多條線路平行的情況。

          其實并行連接并沒有說是頁面的傳輸速度,是因為多個對象同時在進展,所以,他的速度要比疊加起來,讓你在感覺上快不少。

          持久連接

          HTTP 1.1 允許 HTTP 設備在事務處理結束之后 將 TCP 連接保持在打開狀態(tài),以便為未來的 HTTP 請求重用現存的連接。在事務處理結束之后仍然保持在打開狀態(tài)的 TCP 連接被稱為持久連接。非持久連接會在每個事務結束之后關閉。持久連接會在不同事務之間保持打開狀態(tài),直到客戶端或服務器決定將其關閉為止。

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

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

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

          關注我,后續(xù)更多干貨奉上!

          Modbus由MODICON公司于1979年開發(fā),是一種工業(yè)現場總線協(xié)議標準。1996年施耐德公司推出基于以太網TCP/IP的Modbus協(xié)議:ModbusTCP。

          Modbus協(xié)議是一項應用層報文傳輸協(xié)議,包括ASCII、RTU、TCP三種報文類型。

          標準的Modbus協(xié)議物理層接口有RS232、RS422、RS485和以太網接口,采用master/slave方式通信。


          ModbusTCP數據幀

          ModbusTCP的數據幀可分為兩部分:MBAP+PDU。


          報文頭MBAP

          MBAP為報文頭,長度為7字節(jié),組成如下:

          事務處理標識

          協(xié)議標識

          長度

          單元標識符

          2字節(jié)

          2字節(jié)

          2字節(jié)

          1字節(jié)


          內容

          解釋

          事務處理標識

          可以理解為報文的序列號,一般每次通信之后就要加1以區(qū)別不同的通信數據報文。

          協(xié)議標識符

          00 00表示ModbusTCP協(xié)議。

          長度

          表示接下來的數據長度,單位為字節(jié)。

          單元標識符

          可以理解為設備地址。


          幀結構PDU

          PDU由功能碼+數據組成。功能碼為1字節(jié),數據長度不定,由具體功能決定。

          功能碼

          Modbus的操作對象有四種:線圈、離散輸入、保持寄存器、輸入寄存器。

          對象

          含義

          線圈

          PLC的輸出位,開關量,在Modbus中可讀可寫

          離散量

          PLC的輸入位,開關量,在Modbus中只讀

          輸入寄存器

          PLC中只能從模擬量輸入端改變的寄存器,在Modbus中只讀

          保持寄存器

          PLC中用于輸出模擬量信號的寄存器,在Modbus中可讀可寫

          根據對象的不同,Modbus的功能碼有:

          功能碼

          含義

          0x01

          讀線圈

          0x05

          寫單個線圈

          0x0F

          寫多個線圈

          0x02

          讀離散量輸入

          0x04

          讀輸入寄存器

          0x03

          讀保持寄存器

          0x06

          寫單個保持寄存器

          0x10

          寫多個保持寄存器

          說明更詳細的表

          代碼

          中文名稱

          英文名

          位操作/字操作

          操作數量

          01

          讀線圈狀態(tài)

          READ COIL STATUS

          位操作

          單個或多個

          02

          讀離散輸入狀態(tài)

          READ INPUT STATUS

          位操作

          單個或多個

          03

          讀保持寄存器

          READ HOLDING REGISTER

          字操作

          單個或多個

          04

          讀輸入寄存器

          READ INPUT REGISTER

          字操作

          單個或多個

          05

          寫線圈狀態(tài)

          WRITE SINGLE COIL

          位操作

          單個

          06

          寫單個保持寄存器

          WRITE SINGLE REGISTER

          字操作

          單個

          15

          寫多個線圈

          WRITE MULTIPLE COIL

          位操作

          多個

          16

          寫多個保持寄存器

          WRITE MULTIPLE REGISTER

          字操作

          多個


          PDU詳細結構

          0x01:讀線圈

          在從站中讀1~2000個連續(xù)線圈狀態(tài),ON=1,OFF=0

          • 請求:MBAP 功能碼 起始地址H 起始地址L 數量H 數量L(共12字節(jié))
          • 響應:MBAP 功能碼 數據長度 數據(一個地址的數據為1位)
          • 如:在從站0x01中,讀取開始地址為0x0002的線圈數據,讀0x0008位
            00 01 00 00 00 06 01 01 00 02 00 08
          • 回:數據長度為0x01個字節(jié),數據為0x01,第一個線圈為ON,其余為OFF
            00 01 00 00 00 04 01 01 01 01

          0x05:寫單個線圈

          將從站中的一個輸出寫成ON或OFF,0xFF00請求輸出為ON,0x000請求輸出為OFF

          • 請求:MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節(jié))
          • 響應:MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節(jié))
          • 如:將地址為0x0003的線圈設為ON
            00 01 00 00 00 06 01 05 00 03 FF 00
          • 回:寫入成功
            00 01 00 00 00 06 01 05 00 03 FF 00

          0x0F:寫多個線圈

          將一個從站中的一個線圈序列的每個線圈都強制為ON或OFF,數據域中置1的位請求相應輸出位ON,置0的位請求響應輸出為OFF

          • 請求:MBAP 功能碼 起始地址H 起始地址L 輸出數量H 輸出數量L 字節(jié)長度 輸出值H 輸出值L
          • 響應:MBAP 功能碼 起始地址H 起始地址L 輸出數量H 輸出數量L

          0x02:讀離散量輸入

          從一個從站中讀1~2000個連續(xù)的離散量輸入狀態(tài)

          • 請求:MBAP 功能碼 起始地址H 起始地址L 數量H 數量L(共12字節(jié))
          • 響應:MBAP 功能碼 數據長度 數據(長度:9+ceil(數量/8))
          • 如:從地址0x0000開始讀0x0012個離散量輸入
            00 01 00 00 00 06 01 02 00 00 00 12
          • 回:數據長度為0x03個字節(jié),數據為0x01 04 00,表示第一個離散量輸入和第11個離散量輸入為ON,其余為OFF
            00 01 00 00 00 06 01 02 03 01 04 00

          0x04:讀輸入寄存器

          從一個遠程設備中讀1~2000個連續(xù)輸入寄存器

          • 請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L(共12字節(jié))
          • 響應:MBAP 功能碼 數據長度 寄存器數據(長度:9+寄存器數量×2)
          • 如:讀起始地址為0x0002,數量為0x0005的寄存器數據
            00 01 00 00 00 06 01 04 00 02 00 05
          • 回:數據長度為0x0A,第一個寄存器的數據為0x0c,其余為0x00
            00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00

          0x03:讀保持寄存器

          從遠程設備中讀保持寄存器連續(xù)塊的內容

          • 請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L(共12字節(jié))
          • 響應:MBAP 功能碼 數據長度 寄存器數據(長度:9+寄存器數量×2)
          • 如:起始地址是0x0000,寄存器數量是 0x0003
            00 01 00 00 00 06 01 03 00 00 00 03
          • 回:數據長度為0x06,第一個寄存器的數據為0x21,其余為0x00
            00 01 00 00 00 09 01 03 06 00 21 00 00 00 00

          0x06:寫單個保持寄存器

          在一個遠程設備中寫一個保持寄存器

          • 請求:MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節(jié))
          • 響應:MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節(jié))
          • 如:向地址是0x0000的寄存器寫入數據0x000A
            00 01 00 00 00 06 01 06 00 00 00 0A
          • 回:寫入成功
            00 01 00 00 00 06 01 06 00 00 00 0A

          0x10:寫多個保持寄存器

          在一個遠程設備中寫連續(xù)寄存器塊(1~123個寄存器)

          • 請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L 字節(jié)長度 寄存器值(13+寄存器數量×2)
          • 響應:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L(共12字節(jié))
          • 如:向起始地址為0x0000,數量為0x0001的寄存器寫入數據,數據長度為0x02,數據為0x000F
            00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F
          • 回:寫入成功
            00 01 00 00 00 06 01 10 00 00 00 01


          Modbus TCP 示例報文

          ModBusTcp與串行鏈路Modbus的數據域是一致的,具體數據域可以參考串行Modbus。這里給出幾個ModbusTcp的鏈路解析說明,輔助新人分析報文。

          功能碼 0x10:寫多個保持寄存器,上面2個圖片都寫錯了


          ModbusTCP通信

          通信方式

          Modbus設備可分為主站(poll)和從站(slave)。主站只有一個,從站有多個,主站向各從站發(fā)送請求幀,從站給予響應。在使用TCP通信時,主站為client端,主動建立連接;從站為server端,等待連接。

          • 主站請求:功能碼+數據
          • 從站正常響應:請求功能碼+響應數據
          • 從站異常響應:異常功能碼+異常碼,其中異常功能碼即將請求功能碼的最高有效位置1,異常碼指示差錯類型
          • 注意:需要超時管理機制,避免無期限的等待可能不出現的應答

          IANA(Internet Assigned Numbers Authority,互聯(lián)網編號分配管理機構)給Modbus協(xié)議賦予TCP端口號為502,這是目前在儀表與自動化行業(yè)中唯一分配到的端口號。

          通信過程

          1. connect 建立TCP連接
          2. 準備Modbus報文
          3. 使用send命令發(fā)送報文
          4. 在同一連接下等待應答
          5. 使用recv命令讀取報文,完成一次數據交換
          6. 通信任務結束時,關閉TCP連接


          仿真軟件

          • Modbus poll 和Modbus slave是一組Modbus仿真軟件,可以實現Modbus RTU、TCP、串口仿真等。
          • 仿真軟件網址:https://modbustools.com/download.html
          • 在ModbusTCP中,Modbus poll 作為客戶端請求數據,Modbus slave 作為服務器端處理請求。
          • 使用c語言編寫客戶端連接Modbus slave時,注意數據格式,一條指令一次性發(fā)出,否則連接會出錯。
          • 使用軟件時,需要指定功能碼,在setup->slave definition或者poll definition中進行設置。
            – slave ID:從站編號(事務標識符)
            – function:功能碼,0x01對應線圈操作,0x02對應離散量操作,0x03對應保持寄存器操作,0x04對應輸入寄存器操作
            – address:開始地址
            – quantity:寄存器/線圈/離散量 的數量


          一些概念

          在工業(yè)自動化控制中,經常會遇到開關量,數字量,模擬量,離散量,脈沖量等各種概念,而人們在實際應用中,對于這些概念又很容易混淆?,F將各種概念羅列如下:

          1.開關量:

          一般指的是觸點的“開”與“關”的狀態(tài),一般在計算機設備中也會用“0”或“1”來表示開關量的狀態(tài)。開關量分為有源開關量信號和無源開關量信號,有源開關量信號指的是“開”與“關”的狀態(tài)是帶電源的信號,專業(yè)叫法為躍階信號,可以理解為脈沖量,一般的都有220VAC,?110VAC,24VDC,12VDC等信號,無源開關量信號指的是“開”和“關”的狀態(tài)時不帶電源的信號,一般又稱之為干接點。電阻測試法為電阻0或無窮大。

          2.數字量:

          很多人會將數字量與開關量混淆,也將其與模擬量混淆。數字量在時間和數量上都是離散的物理量,其表示的信號則為數字信號。數字量是由0和1組成的信號,經過編碼形成有規(guī)律的信號,量化后的模擬量就是數字量。

          3.模擬量:

          模擬量的概念與數字量相對應,但是經過量化之后又可以轉化為數字量。模擬量是在時間和數量上都是連續(xù)的物理量,其表示的信號則為模擬信號。模擬量在連續(xù)的變化過程中任何一個取值都是一個具體有意義的物理量,如溫度,電壓,電流等。

          4.離散量:

          離散量是將模擬量離散化之后得到的物理量。即任何儀器設備對于模擬量都不可能有個完全精確的表示,因為他們都有一個采樣周期,在該采樣周期內,其物理量的數值都是不變的,而實際上的模擬量則是變化的。這樣就將模擬量離散化,成為了離散量。

          5.脈沖量:

          脈沖量就是瞬間電壓或電流由某一值躍變到另一值的信號量。在量化后,其變化持續(xù)有規(guī)律就是數字量,如果其由0變成某一固定值并保持不變,其就是開關量。

          綜上所述,模擬量就是在某個過程中時間和數量連續(xù)變化的物理量,由于在實際的應用中,所有的儀器設備對于外界數據的采集都有一個采樣周期,其采集的數據只有在下一個采樣周期開始時才有變動,采樣周期內其數值并不隨模擬量的變化而變動。

          這樣就將模擬量離散化了,例如:某設備的采樣周期為1秒,其在第五秒的時間采集的溫度為35度,而第六秒的溫度為36度,該設備就只能標稱第五秒時間溫度35度,第六秒時間溫度36度,而第五點五秒的時間其標稱也只是35度,但是其實際的模擬量是35.5度。這樣就將模擬信號離散化。其采集的數據就是離散化了,不再是連續(xù)的模擬量信號。

          由于計算機只識別0和1兩個信號,即開關量信號,用其來表示數值都是使用數字串來表示,由于計算能力的問題,其數字串不能無限長,即其表達的精度也是有限的,同樣的以溫度為例,由于數字串限制,其表達溫度的精度只能達到0.1度,小于該單位的數值則不能被標稱,這樣就必須將離散量進行量化,將其變?yōu)閿底至?。?5.68度的溫度則表示為35.6度。

          免責聲明:本文轉自網絡,版權歸原作者所有,如涉及作品版權問題,請及時與我們聯(lián)系刪除,謝謝!

          16款電工仿真軟件


          者公眾號:org_yijiaoqian

          從一個HTTP請求來看網絡分層原理


          兩臺主機間會通過非常多網絡設備,不管哪個網絡設備都會發(fā)生數據丟失,如果發(fā)生數據丟失的話,會發(fā)生數據重傳,會出現數據重復(之前丟失的包并不是丟失而是產生了延時)。數據傳輸的介質也可能多樣,如內網里通過網線進行傳輸,連接到公網的話會通過光纖進行連接,所以要實現不同介質間信號的轉換,還有從光纖到路由器無線脈沖轉換,距離遠的話還有信號衰減問題。所以在網絡傳輸過程中有非常多的問題需要解決,把問題分組分層,不同層次間解決不同問題,不同層次間定義標準化接口讓它們間可以進行數據的通信。


          復雜的網絡

          為了簡化網絡的復雜度,網絡通信的不同方面被分解為多層次結構,每一層只與緊挨著的上層或者下層進行交互,將網絡分層,這樣就可以修改,甚至替換某一層的軟件,只要層與層之間的接口保持不變,就不會影響到其他層。

            • OSI( Open System Interconnection Reference Model): 開放系統(tǒng)互聯(lián)參考模型
            • TCP/IP 協(xié)議族


          OSI七層理論體系結構

          1. 物理層:解決兩臺主機的通信問題—A往B發(fā)送比特流(0101),B能接收到這些比特流。定義了物理設備的標準如網線的類型,光纖的接口類型以及傳輸介質的傳輸速率等。
          2. 數據鏈路層:由于物理層上的傳輸的比特流可能會出現錯傳、誤傳等,所以數據鏈路層定義了如何格式化數據即將比特流封裝成,提供了錯誤檢測。
          3. 網絡層:隨著節(jié)點的增加,點對點通信是需要經過多個節(jié)點的,如何找到目標節(jié)點,如何找到最優(yōu)路徑變成為了首要需求。所以出現了網絡層,主要目的是將網絡地址翻譯成對應的物理地址,分組傳輸、路由選擇,本層的傳輸單位是數據報(分組),本層需要注意的TCP/IP協(xié)議中的TCP協(xié)議。
          4. 傳輸層:隨著網絡需要的進一步擴大,通信過程中需要傳輸大量的數據,網絡可能會發(fā)生中斷,為了保證傳輸大量文件時的準確性,需要對發(fā)送的數據進行切分,切分成一個個的segment進行發(fā)送,考慮如何在接受方拼接切分的segment組成完整的數據,以及發(fā)現丟失segment時該如何處理,需要注意的協(xié)議TCP、UDP。
          5. 會話層:不同機器上的用戶之間建立以及管理會話。用于保證應用程序自動收發(fā)包和尋址。
          6. 表示層:信息的語義語法,加密解密,轉換翻譯,壓縮解壓縮。
          7. 應用層:規(guī)定雙方必須使用固定長度的消息頭,且消息頭必須記錄消息長度等信息。需要注意的是TCP/IP協(xié)議中的HTTP協(xié)議。


          TCP/IP四層模型


          是OSI的一種實現,包括應用層、運輸層、網際層和網絡接口層。



          一個HTTP請求的分層解析流程

          如上圖右邊一個服務器部署了一個靜態(tài)頁面,通過nginx部署在公網上,瀏覽器通過域名對它進行訪問,瀏覽器輸入域名點回車后是怎么工作的呢?

          http://www.dumain.com

          服務端只認ip地址,瀏覽器將域名解析出來,看下瀏覽器里有沒有域名對應DNS的緩存,有的話直接拿到服務端的ip地址,沒有的話去本地的host文件看有沒有配置,沒有配置的話才會發(fā)起一個DNS請求用來獲取服務器ip地址。


          DNS也是臺服務器也有自己的ip地址,這時候應用層會構造一個DNS請求報文,應用層會去調用傳輸層的接口一個socket的API,DNS默認使用UDP實現數據傳輸,即應用層調用傳輸層的API,傳輸層會在DNS請求報文基礎上加一個UDP的請求頭,傳輸層將數據交給網絡層,網絡層同樣在UDP請求報文基礎上加IP的請求頭,網絡層會將IP請求報文交給數據鏈路層,數據鏈路層會將自己的mac頭加上去并把對應的請求報文交給下一個機器的mac地址也會加上去,下一個機器的mac地址通過網絡層ARP協(xié)議找到,ARP會發(fā)送一些請求看下你對應的ip地址的mac地址是多少,最后通過物理層物理介質傳出去,通常傳到路由器上.


          路由器是三層設備(從下向上)從物理層開始連接,物理層交給數據鏈路層,數據鏈路層看下地址是不是給我的,是給我的進行解析,不是給我的就丟棄,報文再傳給上面一層網絡層,網絡層把數據傳到下一個路由器的地址是多少,會通過運營商的網絡接口傳到運營商的路由器上,運營商有自己的DNS服務器,如果配置的是運營商自己的DNS服務器的話會直接在這個DNS服務器里找自己對應的域名拿到對應的ip地址,也就是剛請求DNS報文地址,然后原路返回解析直到應用層拿到剛域名對應的ip地址,這樣就可以進行HTTP請求報文的發(fā)送,再調用傳輸層協(xié)議是TCP參數,同樣每到一層加頭。


          HTTP

          什么是HTTP?

          超文本傳輸協(xié)議,是一個基于請求與響應,無狀態(tài)的,應用層的協(xié)議,?;赥CP/IP協(xié)議傳輸數據,互聯(lián)網上應用最為廣泛的一種網絡協(xié)議,所有的WWW文件都必須遵守這個標準。設計HTTP的初衷是為了提供一種發(fā)布和接收HTML頁面的方法。


          HTTP特點

          1. 無狀態(tài):協(xié)議對客戶端沒有狀態(tài)存儲,對事物處理沒有“記憶”能力,比如訪問一個網站需要反復進行登錄操作。
          2. 無連接:HTTP/1.1之前,由于無狀態(tài)特點,每次請求需要通過TCP三次握手四次揮手,和服務器重新建立連接。比如某個客戶機在短時間多次請求同一個資源,服務器并不能區(qū)別是否已經響應過用戶的請求,所以每次需要重新響應請求,需要耗費不必要的時間和流量。
          3. 基于請求和響應:基本的特性,由客戶端發(fā)起請求,服務端響應。
          4. 簡單快速、靈活。
          5. 通信使用明文、請求和響應不會對通信方進行確認、無法保護數據的完整性。


          HTTP協(xié)議版本已經演化到3.0版本,關于協(xié)議版本可以查看 快速掌握HTTP1.0 1.1 2.0 3.0的特點及其區(qū)別


          HTTP報文格式


          HTTP 協(xié)議的請求報文和響應報文的結構基本相同,由三大部分組成:

          • 起始行(start line):描述請求或響應的基本信息
          • 頭部字段集合(header):使用 key-value 形式更詳細地說明報文
          • 消息正文(entity):實際傳輸的數據,它不一定是純文本,可以是圖片、視頻等二進制數據


          其中起始行和頭部的字段并成為 請求頭 或者 響應頭,統(tǒng)稱為 Header;消息正文也叫實體,稱為 body。HTTP 協(xié)議規(guī)定每次發(fā)送的報文必須要有 Header,但是可以沒有 body,也就是說頭信息是必須的,實體信息可以沒有。而且在 header 和 body 之間必須要有一個空行(CRLF)。

          請求行報文格式

          • 請求方法:如 GET/HEAD/PUT/POST,表示對資源的操作;
          • 請求目標:通常是一個 URI,標記了請求方法要操作的資源;
          • 版本號:表示報文使用的 HTTP 協(xié)議版本。


          響應報文格式

          • 版本號:表示報文使用的 HTTP 協(xié)議版本;
          • 狀態(tài)碼:一個三位數,用代碼的形式表示處理的結果,比如 200 是成功,500 是服務器錯誤;
          • 原因:作為數字狀態(tài)碼補充,是更詳細的解釋文字,幫助人理解原因。


          請求及響應報文格式對比


          HTTP 頭字段


          頭部字段是 key-value 的形式,key 和 value 之間用“:”分隔,最后用 CRLF 換行表示字

          段結束。比如前后分離時經常遇到的要與后端協(xié)商傳輸數據的類型“Content-type: application/json”,這里 key 就是“Content-type”,value 就 是“application/json”。HTTP 頭字段非常靈活,不僅可以使用標準里的 Host、 Connection 等已有頭,也可以任意添加自定義頭,這就給 HTTP 協(xié)議帶來了無限的擴展可能。


          頭字段注意事項

          • 字段名不區(qū)分大小寫,字段名里不允許出現空格,可以使用連字符“-”,但不
          • 能使用下劃線“_”(有的服務器不會解析帶“_”的頭字段)。字段名后面必須緊接 著“:”,不能有空格,而“:”后的字段值前可以有多個空格;
          • 字段的順序是沒有意義的,可以任意排列不影響語義;
          • 字段原則上不能重復,除非這個字段本身的語義允許,例如 Set-Cookie。

          HTTP 協(xié)議中有非常多的頭字段,但基本上可以分為四大類:通用標頭、實體標頭、請求標頭響應標頭。

          HTTP 頭字段更多內容請查看《深入掌握HTTP四種標頭基本概念 》


          TCP 協(xié)議


          TCP(Transmission Control Protocol),傳輸控制協(xié)議:面向連接的,可靠的,基于字節(jié)流的傳輸層通信協(xié)議。它能幫助你確定計算機連接到 Internet 以及它們之間的數據傳輸。通過三次握手來建立 TCP 連接,三次握手就是用來啟動和確認 TCP 連接的過程。一旦連接建立后,就可以發(fā)送數據了,當數據傳輸完成后,會通過關閉虛擬電路來斷開連接。


          TCP特點


          • 基于連接的:數據傳輸之前需要建立連接
            全雙工的:雙向傳輸
          • 字節(jié)流:不限制數據大小,打包成報文段,保證有序接收,重復報文自動丟棄
          • 流量緩沖:解決雙方處理能力的不匹配
          • 可靠的傳輸服務:保證可達,丟包時通過重發(fā)機制實現可靠性
          • 擁塞控制:防止網絡出現惡性擁塞


          TCP報文格式



          • 16位源端口/16位目的端口:負責實現應用程序之間的數據傳輸
          • 32位序號/32位確認序號:用于實現tcp在傳輸層的包序管理——tcp有序交付數據
          • 4位頭部長度:以4個字節(jié)為單位;4位保存的最大數字是15;因此tcp報頭最大長度是15*4=60個字節(jié)
          • 6位保留位;
          • 6位標志
            • URG——緊急指針標志
            • ACK——確認回復標志
            • PSH——提示立即接受位
            • RST——重置連接位
            • SYN——連接建立請求位
            • FIN——斷開連接請求位
          • 16位窗口大小:滑動窗口機制–>流量控制–>告訴對端所能發(fā)送的最大數據量
          • 校驗和:二進制反碼求和–>校驗數據一致性
          • 緊急指針:指明哪些數據是緊急數據
          • 選項數據:三次握手時,協(xié)商MSS大小的數據


          TCP連接:四元組[ 源地址, 源端口, 目的地址, 目的端口 ]


          TCP三次握手


          • 同步通信雙方初始序列號( ISN, initial sequence number )
          • 協(xié)商TCP通信參數(MSS, 窗口信息,指定校驗和算法)


          在了解具體流程之前,我們先認識幾個概念


          最初兩端的TCP進程都處于CLOSED關閉狀態(tài),A主動打開連接,而B被動打開連接。

          A、B關閉狀態(tài)CLOSED — B收聽狀態(tài)LISTEN — A同步已發(fā)送狀態(tài)SYN-SENT — B同步收到狀態(tài)SYN-RCVD— A、B連接已建立狀態(tài)ESTABLISHED

          B的TCP服務器進程先創(chuàng)建傳輸控制塊TCB,準備接受客戶進程的連接請求。然后服務器進程就處于LISTEN(收聽)狀態(tài),等待客戶的連接請求。若有,則作出響應。


          • SYN:它的全稱是 Synchronize Sequence Numbers ,同步序列編號。是 TCP/IP 建立連接時使用的握手信號。在客戶機和服務器之間建立 TCP 連接時,首先會發(fā)送的一個信號??蛻舳嗽诎l(fā)送 SYN 消息時,就會在自己的段內生成一個隨機值 X
          • SYN-ACK:服務器收到 SYN 后,應答客戶端連接,發(fā)送一個 SYN-ACK作為答復。確認號設置為比接收到的序列號多一個,即 X + 1,服務器為數據包選擇的序列號是另一個隨機數 Y
          • ACK: Ackowledge character ,確認字符,表示發(fā)來的數據已確認接收無誤。最后客戶端將 ACK 發(fā)送給服務器。序列號被設置為所接收的確認值即 Y+ 1


          下面通過一個案例看三次握手是怎么進行的

          • 在Nginx服務器部署一個靜態(tài)頁面(我的端口為:8000)

          • tcpdump指定網卡進行監(jiān)聽抓取報文
          tcpdump -i en0 -S -c 3 port 8000
          • 在客戶端使用nc網絡工具發(fā)送一個請求
          nc 192.168.109.200 8000
          • 三次握手監(jiān)聽結果如下:


          • 內核在三次握手做的一些事情,如下:

          • 連接狀態(tài)查看
          netstat -tpn # t:TCP連接裝,p:進程顯示 ,n:數字形式
          # 每秒查看一次
          netstat -tpn -c 1


          TCP四次揮手


          • A: 發(fā)送FIN數據包,代表A不再發(fā)送數據
          • B: 收到請求,開始應答 ,避免了A重新發(fā)送FIN重試(應答機制)
          • B: 處理完數據之后關閉,關閉連接,及發(fā)送FIN請求
          • A: 收到請求后發(fā)送ACK應答,B服務可以釋放連接


          等待 2MSL后釋放連接

          1. 防止報文丟失,導致B重復發(fā)送FIN
          2. 防止滯留在網絡中的報文,對新建立的連接造成數據擾亂


          字節(jié)流的協(xié)議


          TCP把應用交付的數據僅僅看成是一連串的無結構的字節(jié)流,TCP并不 知道字節(jié)流的含義,TCP并不關心應用程序一次將多大的報文發(fā)送到 TCP的緩存中,而是根據對方給出的窗口值和當前網絡擁堵的程度來決 定一個報文段應該包含多少個字節(jié)。

          MSS: Max Segment Size, 默認 536byte 實際數據

          在網絡傳輸過程中可能會出現以下的一些情況:

          • 客戶端一段時間沒有收到 ack 消息則重傳
          • 如果緩沖區(qū)滿了則可能丟包或延時都需要重傳
          • 根據報文 sequeence number 字段重排序,還需要丟棄重復包。


          數據傳輸的可靠性


          停止等待協(xié)議如下:

          停止等待協(xié)議,效率比較低


          重傳機制如下:

          • ack 報文丟失

          • 請求報文丟失


          滑動窗口協(xié)議與累計確認(延時ack)

          如上效率低,所以tcp提出了新的協(xié)議-滑動窗口協(xié)議與累計確認(延時ack)。

          滑動窗口大小同通過tcp三次握手和對端協(xié)商,且受網絡狀況影響。

          上面是一個一個報文,實際可發(fā)一批報文,服務器并不是挨個去確認,上面回一個ack浪費資源,單獨響應一個報文時,tcp本身一個報文至少20個字節(jié)再加上ip頭報文20字節(jié),所以一個ack至少40字節(jié)。

          所以延時ack的發(fā)送,如下圖確認最后一個報文如5就可以,但這樣也有一個問題如3的報文丟了,這時只能確認1和2連續(xù)報文,從3以后的報文全要重傳,已確認的報文在緩沖區(qū)丟棄掉。


          文章持續(xù)更新,可以公眾號搜一搜「 一角錢技術 」第一時間閱讀, 本文 GitHub org_hejianhui/JavaStudy 已經收錄,歡迎 Star。


          主站蜘蛛池模板: 亚洲日韩一区二区三区| 高清一区二区三区免费视频| 尤物精品视频一区二区三区| 精品国产亚洲一区二区在线观看| 一区二区三区日韩| 爆乳熟妇一区二区三区| 亚洲AV成人精品日韩一区| 国产AV午夜精品一区二区三区| 亚洲国产精品一区二区第四页| 亚洲综合色一区二区三区| 日产亚洲一区二区三区| 国产一区二区中文字幕| 久久精品人妻一区二区三区| 一区二区三区在线|日本| 精品一区狼人国产在线| 夜夜精品视频一区二区| 无码少妇A片一区二区三区 | 无码视频一区二区三区在线观看| 久久成人国产精品一区二区 | 变态拳头交视频一区二区| 久久精品无码一区二区三区免费| 精品一区二区三区四区在线播放| 无码人妻久久一区二区三区免费| 久久久精品人妻一区二区三区 | 国内自拍视频一区二区三区 | 一区二区三区人妻无码| 亚洲夜夜欢A∨一区二区三区| 成人国内精品久久久久一区 | 亚洲国产成人久久一区WWW | 日韩一区二区三区精品| 日本高清天码一区在线播放| 国产伦理一区二区三区| 国产一区二区三区小向美奈子| 国产AV一区二区精品凹凸 | 国产伦精品一区二区三区| 亚洲国产美国国产综合一区二区| 欧洲无码一区二区三区在线观看| 中文字幕一区日韩精品| 日韩精品久久一区二区三区| 亚洲成av人片一区二区三区| 无码人妻精品一区二区三区久久|