計算機網路與JavaWeb簡單筆記
計算機網路與JavaWeb簡單筆記
VUE-》ES6-》JavaScript-》
axios-》Ajax-》HTTP
OSI七層模型和TCP/IP四層模型
參考:https://blog.csdn.net/qq2399431200/article/details/94875176
TCP/IP:
代表傳輸控制協議/網際協議,指的是一系列協議,TCP/IP 模型在 OSI 模型的基礎上進行了簡化,變成了四層,從下到上分別為:網路介面層、網路層、傳輸層、應用層。與 OSI 體系結構對比如下:
TCP/IP的分層
HTTP:應用層協議(貨物)
HTTP(超文字傳輸協議)是利用TCP在兩臺電腦(通常是Web伺服器和客戶端)之間傳輸資訊的協議。客戶端使用Web瀏覽器發起HTTP請求給Web伺服器,Web伺服器傳送被請求的資訊給客戶端。
TCP和UDP:傳輸層協議(卡車)
IP:網路層協議(高速公路)
SOCKET:套接字(港口碼頭/車站)
TCP/IP網路的API。Socket是應用層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面。socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層複雜的操作抽象為幾個簡單的介面供應用層呼叫已實現程序在網路中通訊。
網路核心
分組交換
端系統(應用層)交換報文時,源(運輸層TCP和網路層IP)將長報文劃分為較小的資料塊,稱之為分組(packet)。這些分組都會通過通訊鏈路和分組交換機(路由器和鏈路層交換機)
分組交換機(路由器)中可能存在排隊時延和分組丟失。
TCP/IP學習(待更)
TCP協議簡單概念
T C P / I P協議族分為四層:鏈路層、網路層、運輸層和應用層,每一層各有不同的責任。
在T C P / I P中,網路層和運輸層之間的區別是最為關鍵的:網路層( I P)提供點到點的服務,而運輸層(T C P和U D P)提供端到端的服務。
什麼是 TCP 連線?
我們來看看 RFC 793 是如何定義「連線」的:
簡單來說就是,⽤於保證可靠性和流量控制維護的某些狀態資訊,這些資訊的組合,包括Socket、序列號和窗⼝⼤⼩稱為連線。
- Socket:由 IP 地址和端⼝號組成
- 序列號:⽤來解決亂序問題等
- 窗⼝⼤⼩:⽤來做流量控制
總結:TCP 是面向連線的、可靠的、基於位元組流
TCP重傳
- 超時重傳
- 快速重傳
- SACK
- D-SACK
超時重傳
重傳機制的其中⼀個⽅式,就是在傳送資料時,設定⼀個定時器,當超過指定的時間後,沒有收到對⽅的 ACK 確認應答報⽂,就會重發該資料,也就是我們常說的超時重傳。
TCP 會在以下兩種情況發⽣超時重傳:
- 資料包丟失
- 確認應答丟失
快速重傳機制
如圖,由於接收方未接收到ack2的報文段,故會重新發送ack2的包給傳送端。
快速重傳的⼯作⽅式是當收到三個相同的 ACK 報⽂時,會在定時器過期之前,重傳丟失的報⽂段。
快速重傳機制只解決了⼀個問題,就是超時時間的問題,但是它依然⾯臨著另外⼀個問題。就是重傳的時候,是重傳之前的⼀個,還是重傳所有的問題。
流量控制
TCP 通過讓接收⽅在確認報文中指明希望從傳送⽅接收的資料⼤⼩(窗⼝⼤⼩)來進行流量控制
擁塞控制
當⽹絡傳送擁塞時,TCP 會⾃我犧牲,降低傳送的資料量。於是就有了擁塞控制,控制的⽬的就是避免「傳送⽅」的資料填滿整個⽹絡。
TCP相關問題
什麼是 TCP連線:
⽤於保證可靠性和流量控制維護的某些狀態資訊,這些資訊的組合,包括Socket、序列號和視窗大小稱為連線。
SYN:同步序列編號(Synchronize Sequence Numbers )。是TCP/IP建立連線時使用的握手訊號。在客戶機和伺服器之間建立正常的TCP網路連線時,客戶機首先發出一個SYN訊息,伺服器使用SYN+ACK應答表示接收到了這個訊息,最後客戶機再以ACK訊息響應。這樣在客戶機和伺服器之間才能建立起可靠的TCP連線,資料才可以在客戶機和伺服器之間傳遞。
tcp三次握手建立連線
第一次握手:客戶端傳送syn包(seq序列號=x)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(即傳送ack=x+1),同時自己也傳送一個SYN包(seq=y),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=y+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
握手過程中傳送的包裡不包含資料,三次握手完畢後,客戶端與伺服器才正式開始傳送資料。理想狀態下,TCP連線一旦建立,在通訊雙方中的任何一方主動關閉連線之前,TCP 連線都將被一直保持下去。
形象理解:
主機A向主機B發出連線請求資料包:“我想給你發資料,可以嗎?seq是我的序列號!”,這是第一次對話;
主機B向主機A傳送同意連線和要求同步(同步就是兩臺主機一個在傳送,一個在接收,協調工作)的資料包:“可以,你什麼時候發?這是我的序列號”,這是第二次對話;
主機A再發出一個數據包確認主機B的要求同步:“我現在就發,你接著吧!”,這是第三次對話。
三次“對話”的目的是使資料包的傳送和接收同步,經過三次“對話”之後,主機A才向主機B正式傳送資料。
為什麼是三次握⼿?不是兩次、四次?
- 三次握⼿才可以解決“網路中存在延遲的重複歷史連線”的問題
- 三次握⼿才可以同步雙方的初始序列號
- 三次握⼿才可以避免資源浪費
不使⽤「兩次握⼿」和「四次握⼿」的原因:
「兩次握⼿」:⽆法防⽌歷史連線的建⽴,即伺服器端如果接收到多次同樣的syn包就會建立多個連線,會造成雙⽅資源的浪費,也⽆法可靠的同步雙⽅序列號;
「四次握⼿」:三次握⼿就已經理論上最少可靠連線建⽴,所以不需要使⽤更多的通訊次數。
這個問題的本質是, 通道不可靠, 但是通訊雙發需要就某個問題達成一致. 而要解決這個問題, 無論你在訊息中包含什麼資訊, 三次通訊是理論上的最小值。所以三次握手不是TCP本身的要求, 而是為了滿足"在不可靠通道上可靠地傳輸資訊"這一需求所導致的。
外鏈參考:TCP 為什麼是三次握手,而不是兩次或四次? - wuxinliulei的回答 - 知乎 https://www.zhihu.com/question/24853633/answer/63668444
syn洪泛攻擊
應對方式:SYN cookie
在接收到客戶端的第一次握手後,伺服器先不立刻分配半開連線資源,而是使用一個根據雙方資訊生成的唯一cookie值作為伺服器的初始序列號,打包成SYN+ACK包傳送給客戶端,若客戶端是正常的迴應則會在此cookie值上加一作為自身報文段的ack傳送給伺服器,伺服器接收到則正常分配資源建立連線。
四次揮手
TIME_WAIT(定時等待):主動關閉方在傳送最後一條ACK報文之後會有一段等待時間,稱為 TIME_WAIT。
為什麼需要 TIME_WAIT 狀態?
答:需要 TIME-WAIT 狀態,主要是兩個原因:
- 防⽌具有相同「四元組」的「舊」資料包被收到;
- 保證「被動關閉連線」的⼀⽅能被正確的關閉,即保證最後的 ACK 能讓被動關閉⽅接收,從⽽幫助其正常關閉;
TCP 和 UDP 區別:
1. 連線
TCP 是⾯向連線的傳輸層協議,傳輸資料前先要建⽴連線。
UDP 是不需要連線,即刻傳輸資料。
2. 服務物件
TCP 是⼀對⼀的兩點服務,即⼀條連線只有兩個端點。
UDP ⽀持⼀對⼀、⼀對多、多對多的互動通訊
3. 可靠性
TCP 是可靠交付資料的,資料可以⽆差錯、不丟失、不᯿復、按需到達。
UDP 是盡最⼤努⼒交付,不保證可靠交付資料。
4. 擁塞控制、流ᰁ控制
TCP 有擁塞控制和流ᰁ控制機制,保證資料傳輸的安全性。
UDP 則沒有,即使⽹絡⾮常擁堵了,也不會影響 UDP 的傳送速率。5. ⾸部開銷
TCP ⾸部⻓度較⻓,會有⼀定的開銷,⾸部在沒有使⽤「選項」欄位時是 20 個位元組,如果使⽤了「選項」
欄位則會變⻓的。
UDP ⾸部只有 8 個位元組,並且是固定不變的,開銷較⼩。
6. 傳輸⽅式
TCP 是流式傳輸,沒有邊界,但保證順序和可靠。
UDP 是⼀個包⼀個包的傳送,是有邊界的,但可能會丟包和亂序。
7. 分⽚不同
TCP 的資料⼤⼩如果⼤於 MSS ⼤⼩,則會在傳輸層進⾏分⽚,⽬標主機收到後,也同樣在傳輸層組裝 TCP
資料包,如果中途丟失了⼀個分⽚,只需要傳輸丟失的這個分⽚。
UDP 的資料⼤⼩如果⼤於 MTU ⼤⼩,則會在 IP 層進⾏分⽚,⽬標主機收到後,在 IP 層組裝完資料,接著再
傳給傳輸層,但是如果中途丟了⼀個分⽚,在實現可靠傳輸的 UDP 時則就需要᯿傳所有的資料包,這樣傳輸
效率⾮常差,所以通常 UDP 的報⽂應該⼩於 MTU。
HTTP學習
概念
特點:無連線(TCP短連線)、無狀態
http 為短連線:客戶端傳送請求都需要伺服器端回送響應.請求結束後,主動釋放連結,因此為短連線。
複習推薦參考連結(TCP/HTTP/SOCKET):https://blog.csdn.net/user11223344abc/article/details/83780448
HTTP事務概念
常見方法
報文
起始行(請求行,響應行)
請求行:存放請求型別,url資源路徑,http版本號等
響應行:存放http版本號,響應狀態等
首部欄位(headers)
請求:存放請求體內容的型別,cookie資訊等
主體(body)
請求報文
重點是格式與引數
行 POST /s?ie=utf-8 HTTP/1.1
頭 Host: atguigu.com
Cookie: name=guigu
Content-type: application/x-www-form-urlencoded
User-Agent: chrome 83
空行
體 username=admin&password=admin
響應報文
行 HTTP/1.1 200 OK
頭 Content-Type: text/html;charset=utf-8
Content-length: 2048
Content-encoding: gzip
空行
體 <html>
<head>
</head>
<body>
<h1>尚矽谷</h1>
</body>
</html>
與TCP/IP的關係概念
也可以理解為依賴關係,高層的協議依賴於底層的協議:
HTTP 狀態碼
伺服器返回的 響應報文 中第一行為狀態行,包含了狀態碼以及原因短語,用來告知客戶端請求的結果。
狀態碼 | 類別 | 含義 |
---|---|---|
1XX | Informational(資訊性狀態碼) | 接收的請求正在處理 |
2XX | Success(成功狀態碼) | 請求正常處理完畢 |
3XX | Redirection(重定向狀態碼) | 需要進行附加操作以完成請求 |
4XX | Client Error(客戶端錯誤狀態碼) | 伺服器無法處理請求 |
5XX | Server Error(伺服器錯誤狀態碼) | 伺服器處理請求出錯 |
注:
-
301 Moved Permanently :永久性重定向
-
302 Found :臨時性重定向
-
403 Forbidden :請求被拒絕。
-
404 Not Found
-
500:INTERNAL SERVER ERROR 伺服器發生錯誤。 ...
HTTP 與 HTTPS
HTTP 與 HTTPS 有哪些區別?
-
HTTP 是超⽂本傳輸協議,資訊是明⽂傳輸,存在安全⻛險的問題。HTTPS 則解決 HTTP 不安全的缺陷,在TCP 和 HTTP ⽹絡層之間加⼊了 SSL/TLS 安全協議,它使用安全套接字層([SSL])進行資訊交換,簡單來說它是HTTP的安全版,是使用TLS/SSL加密的HTTP協議。
-
HTTP 連線建⽴相對簡單, TCP 三次握⼿之後便可進⾏ HTTP 的報⽂傳輸。⽽ HTTPS 在 TCP 三次握⼿之後,還需進⾏ SSL/TLS 的握⼿過程,才可進⼊加密報⽂傳輸。
-
HTTP 的端⼝號是 80,HTTPS 的端⼝號是 443。
-
HTTPS 協議需要向 CA(證書權威機構)申請數字證書,來保證伺服器的身份是可信的。
注:
- TLS/SSL全稱安全傳輸層協議Transport Layer Security,是介於TCP和HTTP之間的一層安全協議,不影響原有的TCP協議和HTTP協議,所以使用[HTTPS]基本上不需要對HTTP頁面進行太多的改造。
- 混淆SSH,SSH是連線協議
HTTP 連線和 SOCKET連線 的區別
很多情況下,都是需要伺服器端向客戶端主動推送資料,保持客戶端與服務端的實時同步。
若雙方是 Socket 連線(長連線),建立連線後可以由伺服器直接向客戶端傳送資料,參考Java套接字程式設計。
- Socket是應用層與傳輸層之間的同一個抽象層,它是一套介面,所以Socket連線可以基於TCP連線,也有可能基於UDP;
- 我們知道,TCP協議是可靠的,UDP協議是不可靠的,那麼基於TCP協議的Socket連線同樣是可靠的;
- 基於UDP協議的Socket連線是不可靠的,大多數的即時通訊工具都是基於後者實現的。
若雙方是 HTTP 連線(短連線),則伺服器需要等客戶端傳送請求後,才能將資料回傳給客戶端。
- 在網路分層中,HTTP協議是基於TCP協議的;
- 客戶端向服務端傳送一個HTTP請求時,需要先與服務端建立TCP連線,也就是經典的三次握手(通常對用- 戶來說是很難察覺的),握手成功以後才能進行資料互動;
- HTTP是基於請求響應模式且無狀態的協議,1.1之前只支援短連線,也就是請求響應一次以後連線中斷,下次請求需要重新進行TCP連線,而1.1之後支援持長連線,即進行一次TCP連線以後,客戶端可以傳送多次的HTTP請求給伺服器端。
詳細參考連結:https://www.cnblogs.com/zhuleixiao/p/9218121.html
HTTP-web伺服器(tomcat)接收到client請求後的處理過程(大致流程)
\1. 客戶發起情況到伺服器網絡卡;
\2. 伺服器網絡卡接受到請求後轉交給核心處理;
\3. 核心根據請求對應的套接字,將請求交給工作在使用者空間的Web伺服器程序
\4. Web伺服器程序根據使用者請求,向核心進行系統呼叫,申請獲取相應資源(如index.html)
\5. 核心發現web伺服器程序請求的是一個存放在硬碟上的資源,因此通過驅動程式連線磁碟
\6. 核心排程磁碟,獲取需要的資源
\7. 核心將資源存放在自己的緩衝區中,並通知Web伺服器程序
\8. Web伺服器程序通過系統呼叫取得資源,並將其複製到程序自己的緩衝區中
\9. Web伺服器程序形成響應,通過系統呼叫再次發給核心以響應使用者請求
\10. 核心將響應傳送至網絡卡
\11. 網絡卡傳送響應給使用者
通過這樣的一個複雜過程,一次請求就完成了。
簡單來說就是:使用者請求-->送達到使用者空間-->系統呼叫-->核心空間-->核心到磁碟上讀取網頁資源->返回到使用者空間->響應給使用者。上述簡單的說明了一下,客戶端向Web服務請求過程,在這個過程中,有兩個I/O過程,一個就是客戶端請求的網路I/O,另一個就是Web伺服器請求頁面的磁碟I/O。
參考連結:https://blog.csdn.net/l1394049664/article/details/82313414
常見問題
Get和post的區別是什麼?
- Get是不安全的,因為在傳輸過程,資料被放在請求的URL中;Post的所有操作對使用者來說都是不可見的。
- Get傳送的資料量較小,這主要是因為受URL長度限制;Post傳送的資料量較大,一般被預設為不受限制。
- Get限制Form表單的資料集的值必須為ASCII字元;而Post支援整個ISO10646字符集。
- Get執行效率卻比Post方法好。Get是form提交的預設方法。
Cookie和Session的作用和工作原理
Cookie是由服務端生成的,傳送給客戶端(通常是瀏覽器)的。Cookie總是儲存在客戶端中,按在客戶端中的儲存位置,可分為記憶體Cookie和硬碟Cookie
Session由服務端生成,儲存在伺服器的記憶體、快取、硬碟或資料庫中。
作用
Cookie的根本作用就是在客戶端儲存一些伺服器相關的資訊。典型的應用有:
1、記住密碼,下次自動登入。
2、購物車功能。
3、記錄使用者瀏覽資料,進行商品(廣告)推薦。
(4)缺陷
①Cookie會被附加在每個HTTP請求中,所以無形中增加了流量。
②由於在HTTP請求中的Cookie是明文傳遞的,所以安全性成問題。(除非用HTTPS)
③Cookie的大小限制在4KB左右。對於複雜的儲存需求來說是不夠用的。
Session的根本作用就是在服務端儲存使用者和伺服器會話的一些資訊。
https://www.cnblogs.com/isme-zjh/p/11359557.html
區別
- 存放位置不同
- **對伺服器造成的壓力不同 **
- 安全性(隱私策略)的不同
- 儲存形式的不同(Cookie中只能保管ASCII字串,假如需求存取Unicode字元或者二進位制資料,需求先進行編碼。而Session中能夠存取任何型別的資料,能夠把Session看做是一個Java容器類)
重定向和轉發的區別
1、請求次數
- 重定向是客戶端向伺服器傳送一個請求,伺服器返回一個地址響應客戶端,客戶端收到後需再次向這個新地址發出請求。
- 轉發是伺服器收到請求後為了完成響應跳轉到一個新的地址;
- 重定向至少請求兩次,轉發請求一次;
2、瀏覽器位址列url不同
重定向位址列會發生變化,轉發位址列不會發生變化;
3、是否共享資料
- 重定向兩次請求不共享資料,會丟失第一次的請求資料
- 轉發一次請求共享資料(在request級別使用資訊共享,使用重定向必然出錯);
4、跳轉限制
重定向可以跳轉到任意URL,轉發只能跳轉本站點資源;
注:轉發比重定向快,因為重定向經過客服端,而轉發沒有。但是,又是採用重定向更好,若需要重定向到一個外部網站,則無法使用轉發。
DNS 工作原理
瀏覽器輸入網址
- 檢測瀏覽器的DNS解析器快取,如果有則返回ip解析結束,快取時間由TTL屬性設定
- 瀏覽器未找到則在作業系統的host檔案中查詢
- 繼續到本地DNS伺服器上查詢,這個地址是在本機的IP設定中的DNS值獲取的,也可動態獲取,如學校,小區網際網路應用提供商等
- 本地DNS中如果未找到便會去問它的根域名伺服器,根域名伺服器是最⾼層次的,它不直接⽤於域名解析,但能指明⼀條道路。
- 根域名再返回相應的根域位置給本地DNS,如.com/.cn/.net等等,讓本地DNS再去問它
瀏覽器輸入網址到網頁顯示期間發生了什麼?
HTTP:將請求資訊封裝成http報文
DNS
TCP
IP:在ip頭部加入源ip地址與目標ip地址,協議號等
ARP協議獲取MAC
網絡卡將包傳送出去
什麼是跨域?如何解決跨域問題?
什麼是跨域?
瀏覽器從一個域名的網頁去請求另一個域名的資源時,域名、埠、協議任一不同,都是跨域
域名:
主域名不同 http://www.baidu.com/index.html -->http://www.sina.com/test.js
子域名不同 http://www.666.baidu.com/index.html -->http://www.555.baidu.com/test.js
域名和域名ip http://www.baidu.com/index.html -->http://180.149.132.47/test.js
埠:
http://www.baidu.com:8080/index.html–> http://www.baidu.com:8081/test.js
協議:
http://www.baidu.com:8080/index.html–> https://www.baidu.com:8080/test.js
備註:
1、埠和協議的不同,只能通過後臺來解決
2、localhost和127.0.0.1雖然都指向本機,但也屬於跨域
如何解決?
服務端使用cors
https://www.cnblogs.com/itmacy/p/6958181.html
原文連結:https://blog.csdn.net/tjcjava/article/details/76468225
防火牆技術
防火牆技術一般分為兩類,即: (1)、分組過濾路由器 (2)、應用閘道器也稱為代理伺服器