web通訊協議

不太聪明的大鹅發表於2024-03-17

正式進入網站部署的學習

web通訊流程


client工作流程

TCP/IP協議

OSI七層網路模型


抓包工具,檢視TCP/IP的三次握手

經典的問題,你瞭解TCP/IP的三次握手
四次揮手嗎
具體資料包的報文格式,暫時不用過多去琢磨;

什麼時候需要琢磨資料包的序列號,只有當你在生產環境下,遇見的及其棘手的問題,比如一些資料不同步,交易資料丟失等極端情況,需要去抓取資料包,逐個分析,資料包的完整性,序列號。

目前只需要大致瞭解資料包的型別,以及作用即可;


1. 抓取ssh登入的資料包,檢視 tcp/ip協議基礎之上的 SSH應用層協議
登入web-7機器
windows(192.168.xx.xx)  
↓
vmnet8(nat虛擬網路卡,10.0.0.1)    
↓
web-7(nat 10.0.0.7)



兩個ip:port的資料包互動
10.0.0.1:隨機埠      >   10.0.0.7:22

wireshark大鯊魚抓包工具檢視ssh登入資料包收發情況

在window去登入 web-7


ssh遠端連線,也是建立的tcp/ip的三次握手之上




2. 檢視網站訪問的資料包,基於 tcp/ip 基礎之上的 HTTP應用層協議
由於捕捉的是 vmnet8的網路卡流量,檢測http協議,只能給這個網段內的機器,發http請求

這裡需要注意,如果你多次訪問nginx,你可能會抓不到預設的tcp三次握手
tcp三次握手,是用於首次連線的
訪問nginx頁面的請求,第一次以及建立好連線,預設會有一個保持連線
你後續的請求,。就不會再繼續tcp三次握手,而是直接傳送http請求
你和nginx伺服器已經建立好tcp連線了。

使用firefox另一個瀏覽器,重新去建立tcp連線





抓包工具,檢視四次揮手

1.先建立ssh連線,然後退出ssh會話,檢視是否發出tcp/ip 的四次揮手,四個資料包

常見埠號

常用的熟知埠號

什麼是socket套接字

任何,兩個機器的連線,指的是tcp/ip協議的連線,本質上是兩個socket的通訊

socket套接字就是 ip+port的具象化

比如部署nginx服務,執行在 10.0.0.7:80 埠,這就是一個socket
透過本地去訪問這個socket,瀏覽器隨機指定的埠,發出請求

10.0.0.1:61145   這個也是一個socket

本地套接字

比如單機LNMP,應用程式在機器內部記憶體之間資料互動

========================================
套接字存在的意義,在於讓兩端進行資料互動,資料傳輸

php
10.0.0.7:9000

mysql(10.0.0.7:3306  這是一個ip:port形式的 socket)

mysql -uroot -p -h10.0.0.7



================================================================================
另一個形式是,也就是檔案形式的本地socket
(因為本地記憶體檔案socket形式,比網路socket傳輸效率更高,)
在後面高階部分,我教大家企業常用的python後端部署

socket的都是具象化證明服務的確執行了,可以對外提供訪問了,可以互動了
mysql執行在 /tmp/mysql.sock

這個檔案存在,則表示mysql執行
你可以透過這個/tmp/mysql.sock去登入mysql資料庫


咱們暫時部署形式都是 網路socket形式,將程式部署在 ip:port的形式。。

網路套接字

部署LNMP,這是不同機器之間的遠端訪問,就是遠端socket

比如 http協議的互動

10.0.0.1:61145  >   10.0.0.7:80

馬上學習nginx反向代理,遠端部署

lb-5
10.0.0.5:80      

↓

web-7
10.0.0.7:9000 (php-fpm)

叫做遠端的socket通訊


簡單說就是你部署 10.0.0.5:80   這個服務,還會和遠端的另一個服務透過網路通訊 
10.0.0.7:9000
兩端進行資料互動



專業名詞就叫做socket通訊

HTTP協議工作原理

HTTP協議定義Web客戶端如何從Web伺服器請求Web頁面,以及伺服器如何把Web頁面傳送給客戶端。

HTTP協議採用了請求/響應模型。

客戶端向伺服器傳送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求資料。伺服器以一個狀態行作為響應,響應的內容包括協議的版本、成功或者錯誤程式碼、伺服器資訊、響應頭部和響應資料。

HTTP 請求/響應的步驟

1. 客戶端連線到Web伺服器
一個HTTP客戶端,通常是瀏覽器,與Web伺服器的HTTP埠(預設為80)建立一個TCP套接字連線。例如,http://www.yuchaoit.cn

2. 傳送HTTP請求
透過TCP套接字,客戶端向Web伺服器傳送一個文字的請求報文,一個請求報文由請求行、請求頭部、空行和請求資料4部分組成。

3. 伺服器接受請求並返回HTTP響應
Web伺服器解析請求,定位請求資源。伺服器將資源複本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應資料4部分組成。


4. 客戶端瀏覽器解析HTML內容
客戶端瀏覽器首先解析狀態行,檢視錶明請求是否成功的狀態程式碼。然後解析每一個響應頭,響應頭告知以下為若干位元組的HTML文件和文件的字符集。
客戶端瀏覽器讀取響應資料HTML,根據HTML的語法對其進行格式化,並在瀏覽器視窗中顯示。

5. 釋放連線TCP連線
若connection 模式為close,則伺服器主動關閉TCP連線,客戶端被動關閉連線,釋放TCP連線;若connection 模式為keepalive,則該連線會保持一段時間,在該時間內可以繼續接收請求;

例如:在瀏覽器位址列鍵入URL,按下回車之後會經歷以下流程:

1.瀏覽器向 DNS 伺服器請求解析該 URL 中的域名所對應的 IP 地址;
2.解析出 IP 地址後,根據該 IP 地址和預設埠 80,和伺服器建立TCP連線;
3.瀏覽器發出讀取檔案(URL 中域名後面部分對應的檔案)的HTTP 請求,該請求報文作為 TCP 三次握手的第三個報文的資料傳送給伺服器;
4.伺服器對瀏覽器請求作出響應,並把對應的 html 文字傳送給瀏覽器;
5.瀏覽器將該 html 文字並顯示內容;  
6.釋放 TCP連線;

無狀態

http預設不會記住每一次連線的狀態資訊,下一次都會認為是一個新的客戶端連線

但是如果HTTP完全無狀態,你登入到淘寶網後,點選電子產品的跳轉連結,它又提示你需要登入了,這就是一個無狀態的實際效果。

因此此類需要保持使用者身份資訊的業務,必須要儲存使用者的狀態。

於是引入了Cookie技術,能夠保持使用者的身份資訊,下一次客戶端發出請求,服務端能記憶客戶端的身份。

沒有cookie

有cookie

請求方法

HTTP/1.1協議中共定義了八種方法(也叫“動作”)來以不同方式操作指定的資源:

GET
向指定的資源發出“顯示”請求。使用GET方法應該只用在讀取資料

HEAD
與GET方法一樣,都是向伺服器發出指定資源的請求。
只請求響應報文中的HTTP頭部。
它的好處在於,使用這個方法可以在不必傳輸全部內容的情況下,就可以獲取其中“關於該資源的資訊”(元資訊或稱後設資料)。

POST
向指定資源提交資料,請求伺服器進行處理(例如提交表單或者上傳檔案)。資料被包含在請求本文中。這個請求可能會建立新的資源或修改現有資源,或二者皆有。
如註冊、登入等請求。

PUT
向指定資源位置上傳其最新內容。
如更新使用者資訊


DELETE
請求伺服器刪除Request-URI所標識的資源。

TRACE
回顯伺服器收到的請求,主要用於測試或診斷。

OPTIONS
這個方法可使伺服器傳回該資源所支援的所有HTTP請求方法。用'*'來代替資源名稱,向Web伺服器傳送OPTIONS請求,可以測試伺服器功能是否正常運作。

CONNECT
HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器。通常用於SSL加密伺服器的連結(經由非加密的HTTP代理伺服器)。

注意事項:

方法名稱是區分大小寫的。當某個請求所針對的資源不支援對應的請求方法的時候,伺服器應當返回狀態碼405(Method Not Allowed),當伺服器不認識或者不支援對應的請求方法的時候,應當返回狀態碼501(Not Implemented)。

HTTP伺服器至少應該實現GET和HEAD方法,其他方法都是可選的。

HTTP請求報文

Accept 就是告訴伺服器端,我接受那些MIME型別

Accept-Encoding 這個看起來是接受那些壓縮方式的檔案

Accept-Lanague 告訴伺服器能夠傳送哪些語言

Connection 告訴伺服器支援keep-alive特性

Cookie 每次請求時都會攜帶上Cookie以方便伺服器端識別是否是同一個客戶端

Host 用來標識請求伺服器上的那個虛擬主機,比如Nginx裡面可以定義很多

虛擬主機.那這裡就是用來標識要訪問那個虛擬主機。

User-Agent 使用者代理,一般情況是瀏覽器,也有其他型別,如:wget curl 搜引擎的蜘蛛等

If-Modified-Since 是瀏覽器向伺服器端詢問某個資原始檔如果自從什麼時間修

過,那麼重新發給我,這樣就保證伺服器端資源.檔案更新時,瀏覽器再次去

求,而不是使用快取中的檔案。

If-None-Match:本地快取中儲存的文件的ETag標籤是否與伺服器文件的Etag不匹配;


抓包HTTP請求

HTTP響應報文


抓包HTTP響應

HTTP常見響應狀態碼

1. 當你client  發出 get請求 獲取一個圖片資訊  ,發出requests


2.  server  響應結果,nginx找到這個圖片,返回給使用者,  response
響應資訊,是有對應的狀態碼的。。

學習nginx會遇見的內容
- 20x系列,表示請求,響應正常解析
- 30x系列,表示本次請求,被轉發到另一個伺服器上了。。
- 40x系列,表示client客戶端訪問的url有問題,該資源不存在
- 50x系列,表示網站的服務端出錯了(php-fpm)沒有執行

總結梳理,面試拿出來背即可

1.dns篇
使用者訪問域名www.yuchaoit.cn
↓
瀏覽器跳轉
↓
瀏覽器快取(disk cache)
↓
Hosts檔案
↓
本地DNS伺服器(遞迴查詢 > 迭代查詢)
↓
client 向 server發起查詢(遞迴查詢)
server 向 server發起查詢(迭代查詢)


2.TCP/IP協議篇(三次握手)
client > SYN報文,請求連線 
server > SYN,ACK報文 響應client
client  > ACK,建立連線 


3.客戶端發起http請求
- 請求方法是什麼、get、post、delete
- 請求主機是什麼、www.yuchaoit.cn
- 請求資源是什麼 、 http://yuchaoit.cn:8090/upload/2022/05/Xnip2022-05-01_16-32-30-b82235c9b62c42af8ea25e0313ca42f7.jpg
- 請求埠是什麼、預設http是80、https是443
- 請求引數是什麼、請求頭部資訊(資源型別、是否壓縮、cookie、瀏覽器客戶端等)
- 請求資訊最後的換行

4.服務端響應的內容
- server資訊(web伺服器軟體型別)
- 響應檔案型別
- 響應頭部資訊(是否壓縮,語言編碼,是否保持連線等)

5.客戶端發起TCP四次揮手斷開連線。
client > 發起斷開請求 FIN=1 
server  > 響應斷開   FIN、ACK
server  > 發起斷開請求 FIN=1
client > 確認斷開連線 ACK

相關文章