正式進入網站部署的學習
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預設不會記住每一次連線的狀態資訊,下一次都會認為是一個新的客戶端連線
cookie
但是如果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