網(wǎng)絡(luò)七層模型及TCP、UDP,一次HTTP請(qǐng)求都發(fā)生了什么
一、七層網(wǎng)絡(luò)模型
http協(xié)議運(yùn)行在應(yīng)用層
二、TCP-UDP
1.TCP、UDP協(xié)議的區(qū)別
2.一次Http 請(qǐng)求,這個(gè)過(guò)程都發(fā)生了什么
3.TCP 協(xié)議如何保證可靠傳輸
4.HTTP和HTTPS的區(qū)別
5.TCP三次握手和四次揮手、
6.常見(jiàn)的狀態(tài)碼。
2.1 TCP-UDP 區(qū)別
- UDP及UDP使用場(chǎng)景
傳送數(shù)據(jù)之前不需要先建立連接,直接向目標(biāo)機(jī)器發(fā)送數(shù)據(jù)。遠(yuǎn)地主機(jī)在收到 UDP 報(bào)文后,不需要給出任何確認(rèn)。UDP 報(bào)文可能丟失,但是在視頻流、直播流 等場(chǎng)景下 UDP 工作非常有效率(即時(shí)通信,不在乎數(shù)據(jù)丟失,和安全)如 視頻 、直播等。
- TCP 及TCP 使用場(chǎng)景
面向連接的服務(wù)。先連接再傳數(shù)據(jù),數(shù)據(jù)傳送結(jié)束后要釋放連接。 TCP 不提供廣播或多播服務(wù)。由于 TCP 要提供可靠的,面向連接的運(yùn)輸服務(wù)(TCP的可靠體現(xiàn)在TCP在傳遞數(shù)據(jù)之前,會(huì)有三次握手來(lái)建立連接,而且在數(shù)據(jù)傳遞時(shí),有確認(rèn)、窗口、重傳、擁塞控制機(jī)制,在數(shù)據(jù)傳完后,還會(huì)斷開連接用來(lái)節(jié)約系統(tǒng)資源),這一難以避免增加了許多開銷,如確認(rèn),流量控制,計(jì)時(shí)器以及連接管理等。這不僅使協(xié)議數(shù)據(jù)單元的首部增大很多,還要占用許多處理機(jī)資源。TCP 一般用于文件傳輸、發(fā)送和接收郵件、遠(yuǎn)程登錄等場(chǎng)景。(信息安全比較重要的數(shù)據(jù)傳輸)。
2.2 一次Http請(qǐng)求都發(fā)生了什么
1.用戶瀏覽器輸入網(wǎng)址
2.瀏覽器拿到網(wǎng)址去請(qǐng)求IP
3.向目標(biāo)IP 發(fā)送TCP連接 3次握手
4.服務(wù)器解析請(qǐng)求,并返回處理好的 html 頁(yè)面(字符串)
5.瀏覽器按照規(guī)則解析渲染畫面
6.連接結(jié)束
***點(diǎn):無(wú)
第二點(diǎn):瀏覽器解析用戶輸入網(wǎng)址的過(guò)程順序?yàn)椋?/p>
先檢查本地是否有對(duì)應(yīng)的IP地址,找到就返回。找不到向上一級(jí)DNS服務(wù)器請(qǐng)求,直到找到或 根節(jié)點(diǎn)。
瀏覽器緩存--> 系統(tǒng)緩存--> 路由器緩存--> ISP DNS緩存--> 從根域名服務(wù)器遞歸搜索
都沒(méi)找到就返回錯(cuò)誤
第三點(diǎn):三次握手
***次握手:發(fā)送端先發(fā)送一個(gè)帶SYN (synchronize) 同步標(biāo)志的數(shù)據(jù)包給 Server,在一定時(shí)間內(nèi)等待接收回復(fù)
第二次握手:服務(wù)端接收到SYN數(shù)據(jù)包后,返回一個(gè)帶 SYN/ACK (acknowledgement charactor) 確認(rèn)字符 標(biāo)志的數(shù)據(jù)包來(lái)表示確認(rèn)收到消息。
第三次握手:接收方接收到Server的確認(rèn)消息后,再發(fā)送一個(gè)帶ACK標(biāo)志的數(shù)據(jù)包給接收端,表示握手成功
注意:上述過(guò)程都有一個(gè)等待時(shí)間,如果在等待時(shí)間內(nèi)Server、或者Client 沒(méi)有回復(fù),本次請(qǐng)求視作失敗,再次請(qǐng)求。Server沒(méi)有回復(fù)的原因可能是棧滿了
- 建立連接成功后,瀏覽器向WEB服務(wù)器發(fā)送一個(gè)HTTP請(qǐng)求
三次握手的作用:
- 目的是建立可靠的通信信道,說(shuō)到通訊,簡(jiǎn)單來(lái)說(shuō)就是數(shù)據(jù)的發(fā)送與接收,而三次握手最主要的目的就是雙方確認(rèn)自己與對(duì)方的發(fā)送與接收是正常的。
- ***次握手:Client 什么都不能確認(rèn);Server 確認(rèn)了對(duì)方發(fā)送正常
- 第二次握手:Client 確認(rèn)了:自己發(fā)送、接收正常,對(duì)方發(fā)送、接收正常;Server 確認(rèn)了:自己接收正常,對(duì)方發(fā)送正常
- 第三次握手:Client 確認(rèn)了:自己發(fā)送、接收正常,對(duì)方發(fā)送、接收正常;Server 確認(rèn)了:自己發(fā)送、接收正常,對(duì)方發(fā)送接收正常
- Server傳回發(fā)送端所發(fā)送的 SYN 是為了告訴發(fā)送端,接收到的信息確實(shí)就是你發(fā)送的信號(hào)。
- 雙方通信無(wú)誤必須是兩者互相發(fā)送信息都無(wú)誤。傳了 SYN,證明發(fā)送方到Server的通道沒(méi)有問(wèn)題,Server到發(fā)送方的通道就通過(guò) ACK 信號(hào)來(lái)進(jìn)行驗(yàn)證。
第四步:ngimx + uwsgi (Django) 為列 (未完成)
1.Nginx 部分(未完成)
2.Django部分:
- 根據(jù)請(qǐng)求的 URL。來(lái)到Django 的路由關(guān)系映射,
- 然后通過(guò)一系列 Middleware 中間件(process_request(request,))如CSRF IP黑名單過(guò)濾,爬蟲過(guò)濾等中間件驗(yàn)證
- 來(lái)到url 對(duì)應(yīng)的 Views 視圖函數(shù)處理。根據(jù)請(qǐng)求內(nèi)容。去數(shù)據(jù)庫(kù)、Templates 拿到數(shù)據(jù)回來(lái)進(jìn)行渲染,并返回 response 結(jié)果
- response 再次通過(guò)一系列中間件驗(yàn)證。(process_response(request, response))***返回給Client
第五步:瀏覽器渲染
瀏覽器拿到結(jié)果按照HTML CSS JS 進(jìn)行渲染
第六步:四次揮手,斷開連接
- 客戶端-發(fā)送一個(gè) FIN,用來(lái)關(guān)閉客戶端到服務(wù)器的數(shù)據(jù)傳送
- 服務(wù)器-收到這個(gè) FIN,它發(fā)回一 個(gè) ACK,確認(rèn)序號(hào)為收到的序號(hào)加1 。和 SYN 一樣,一個(gè) FIN 將占用一個(gè)序號(hào)
- 服務(wù)器-關(guān)閉與客戶端的連接,發(fā)送一個(gè)FIN給客戶端
- 客戶端-發(fā)回 ACK 報(bào)文確認(rèn),并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1