OSI七層模型「物理層」 首先解決兩臺物理機之間的通信需求,具體就是機器A往機器B發(fā)送比特流,機器B能收到比特流。 物理層主要定義了物理設備的標準,如網線的類型,光纖的接口類型,各種傳輸介質的傳輸速率。 主要作用是傳輸比特流( 這層數(shù)據(jù)叫做比特。「網卡工作在這層」。 物理層是OSI七層模型的物理基礎,沒有它就談不上數(shù)據(jù)傳輸了 物理層就是由實物所承載的,所以作比喻的話,公路、汽車和飛機等承載貨物(數(shù)據(jù))的交通工具,就是物理層的象征 「數(shù)據(jù)鏈路層」 在傳輸比特流的過程中,會產生錯傳、數(shù)據(jù)傳輸不完整的可能。 數(shù)據(jù)鏈路層定義了「如何格式化數(shù)據(jù)進行傳輸」,以及如何控制對物理介質的訪問。通常提供錯誤檢測和糾正,以確保數(shù)據(jù)傳輸?shù)臏蚀_性。 本層將比特數(shù)據(jù)組成幀,交換機工作在這層,對幀解碼,并根據(jù)幀中包含的信息把數(shù)據(jù)發(fā)送到正確的接收方。 該層負責物理層面上互連的節(jié)點之間的通信傳輸。例如與1個以太網相連的兩個節(jié)點間的通訊。 常見的協(xié)議有 數(shù)據(jù)鏈路層會將 「網絡層」 隨著網絡節(jié)點的不斷增加,點對點通訊需要通過多個節(jié)點,如何找到目標節(jié)點,如何選擇最佳路徑成為首要需求。 網絡層主要功能是將網絡地址轉化為對應的物理地址,并決定如何將數(shù)據(jù)從發(fā)送方路由到接收方。 網絡層通過綜合考慮發(fā)送優(yōu)先權、網絡擁塞程度、服務質量以及可選路由的花費來決定從一個網絡中節(jié)點A到另一個網絡中節(jié)點B的最佳路徑。 由于網絡層處理并智能指導數(shù)據(jù)傳送,路由器連接網絡隔斷,所以路由器屬于網絡層。 此層的數(shù)據(jù)稱之為數(shù)據(jù)包。本層需要關注的協(xié)議 網絡層負責將數(shù)據(jù)傳輸?shù)侥繕说刂?。目標地址可以使多個網絡通過路由器連接而成的某一個地址。因此這一層主要負責「尋址和路由選擇」。主要由 網絡層將數(shù)據(jù)從發(fā)送端的主機發(fā)送到接收端的主機,兩臺主機間可能會存在很多數(shù)據(jù)鏈路,但網絡層就是負責找出一條相對順暢的通路將數(shù)據(jù)傳遞過去。傳輸?shù)牡刂肥褂玫氖荌P地址。IP地址通過不斷轉發(fā)到更近的IP地址,最終可以到達目標地址 「傳輸層」 隨著網絡通信需求的進一步擴大,通信過程中需要發(fā)送大量的數(shù)據(jù),如海量文件傳輸,可能需要很長時間,網絡在通信的過程中會中斷很多次,此時為了保證傳輸大量文件時的準確性,需要對發(fā)送出去的數(shù)據(jù)進行切分,切割為一個一個的段落( 傳輸層解決了主機間的數(shù)據(jù)傳輸,數(shù)據(jù)間的傳輸可以是不同網絡,并且傳輸層解決了「傳輸質量」的問題。 傳輸層需要關注的協(xié)議有TCP/IP協(xié)議中的 「會話層」 自動收發(fā)包,自動尋址。 會話層作用是「負責建立和斷開通信連接」,何時建立,斷開連接以及保持多久的連接。常見的協(xié)議有 「表示層」 Linux給WIndows發(fā)包,不同系統(tǒng)語法不一致,如exe不能在 解決「不同系統(tǒng)之間通信語法問題」,在表示層數(shù)據(jù)將按照網絡能理解的方案進行格式化,格式化因所使用網絡的不同而不同。 它主要負責數(shù)據(jù)格式的轉換。具體來說,就是講設備固有的數(shù)據(jù)格式轉換為網絡標準格式。常見的協(xié)議有 「應用層」 規(guī)定發(fā)送方和接收方必須使用一個固定長度的消息頭,消息頭必須使用某種固定的組成,消息頭中必須記錄消息體的長度等信息,方便接收方正確解析發(fā)送方發(fā)送的數(shù)據(jù)。 應用層旨在更「方便應用從網絡中接收的數(shù)據(jù)」,重點關注 四層傳輸層數(shù)據(jù)被稱作「段」(Segments); 三層網絡層數(shù)據(jù)被稱做「包」(Packages); 二層數(shù)據(jù)鏈路層時數(shù)據(jù)被稱為「幀」(Frames); 一層物理層時數(shù)據(jù)被稱為「比特流」(Bits)。 TCP和IP模型OSI模型注重通信協(xié)議必要的功能;TCP/IP更強調在計算機上實現(xiàn)協(xié)議應該開發(fā)哪種程序 「TCP/IP劃分了四層網絡模型」
「四層網絡協(xié)議的作用」
「舉個例子:」 我們需要發(fā)送一個「index.html」。 兩臺電腦在應用層都使用HTTP協(xié)議(即都使用瀏覽器)。 在傳輸層,TCP協(xié)議會將HTTP協(xié)議發(fā)送的數(shù)據(jù)看作一個數(shù)據(jù)包,并在這個數(shù)據(jù)包前面加上TCP包的一部分信息(部首) 在網絡層,IP協(xié)議會將TCP協(xié)議要發(fā)送的數(shù)據(jù)看作一個數(shù)據(jù)包,同樣的在這個數(shù)據(jù)包前端加上IP協(xié)議的部首 在數(shù)據(jù)鏈路層,對應的協(xié)議也會在IP數(shù)據(jù)包前端加上以太網的部首。 源設備和目標設備通過網線連接,就可以通過物理層的二進制傳輸數(shù)據(jù)。 數(shù)據(jù)鏈路層,會使用對應的協(xié)議找到物理層的二進制數(shù)據(jù),解碼得到以太網的部首信息和對應的IP數(shù)據(jù)包,再將IP數(shù)據(jù)包傳給上層的網絡層。 數(shù)據(jù)鏈路層>網絡層>傳輸層>應用層,一層層的解碼,最后就可以在瀏覽器中得到目標設備傳送過來的「index.html」。 「TCP/IP協(xié)議族」 從字面意義上來講,TCP/IP是指「傳輸層」的TCP協(xié)議和「網絡層」的IP協(xié)議。 實際上,TCP/IP只是利用 IP 進行通信時所必須用到的協(xié)議群的統(tǒng)稱。 具體來說,在網絡層是IP/ICMP協(xié)議、在傳輸層是TCP/UDP協(xié)議、在應用層是SMTP、FTP、以及 HTTP 等。他們都屬于 TCP/IP 協(xié)議。 網絡設備交換機交換機可以接入多臺電腦 每個電腦網卡的 「MAC 地址」都是不一樣的,電腦發(fā)送數(shù)據(jù)時,數(shù)據(jù)頭部攜帶網卡的 MAC 地址,用 MAC 地址標識來不同的電腦 交換機就可以識別數(shù)據(jù)頭部的 MAC 地址來區(qū)分不同的電腦 交換機除了能識別不同的電腦,還需要找到電腦連接的「交換機端口」,才能順利的把數(shù)據(jù)從相應端口發(fā)送出去 交換機通過「自學機制」,把學習到的設備 MAC 地址和交換機端口號添加到 「MAC 地址表」,并根據(jù) MAC 地址表進行數(shù)據(jù)「轉發(fā)」 路由器交換機需要記錄的 MAC 地址表也越來越多,需要的交換機也越來越多 但是交換機的「容量和性能有限」,MAC 地址表無法記錄全世界電腦的 MAC 地址和對應的端口號,MAC 地址表太大也無法快速查找到對應的 MAC 地址表項 于是就有了三層網絡設備「路由器」,路由器可以把全世界的網絡連接起來 局域網內的網絡連接可以使用「交換機」,例如一個公司內的網絡或者一個校園內的網絡通過交換機連接 不同區(qū)域的局域網互聯(lián)使用「路由器」 ? 路由器有多個端口,分別連接不同的網絡區(qū)域,不同網絡區(qū)域的 IP 地址「網絡號不同」 它通過識別目的 IP 地址的「網絡號」,再根據(jù)「路由表」進行數(shù)據(jù)轉發(fā) HTTP「請求方法」 HTTP1.0 定義了三種請求方法:GET, POST 和 HEAD方法。 HTTP1.1 新增了六種請求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
「GET請求和POST請求的區(qū)別」
狀態(tài)碼「狀態(tài)碼由3位數(shù)字組成,第一位定義響應的類別」 1XX:指示信息,表示請求以接收,繼續(xù)處理 2XX:成功,表示請求已經被成功接收、理解、接受
3XX:狀態(tài)碼表示客戶端請求的資源發(fā)送了變動,需要客戶端用新的 URL 重新發(fā)送請求獲取資源,也就是「重定向」。
301 和 302 都會在響應頭里使用字段 Location,指明后續(xù)要跳轉的 URL,瀏覽器會自動重定向新的 URL。
4XX:狀態(tài)碼表示客戶端發(fā)送的「報文有誤」,服務器無法處理,也就是錯誤碼的含義。
5XX:狀態(tài)碼表示客戶端請求報文正確,但是「服務器處理時內部發(fā)生了錯誤」,屬于服務器端的錯誤碼。
「301和302的區(qū)別」 301重定向,指頁面永久性轉移,表示為資源或頁面永久性地轉移到了另一個位置。 301是HTTP協(xié)議中的一種狀態(tài)碼,當用戶或搜索引擎向服務器發(fā)出瀏覽請求時,服務器返回的HTTP數(shù)據(jù)流中頭信息中包含狀態(tài)碼 301 ,表示該資源已經永久改變了位置。 302重定向是頁面暫時性轉移,搜索引擎會抓取新的內容而保存舊的網址并認為新的網址只是暫時的。 HTTP1.1「長連接」 HTTP 1.1支持長連接 HTTP 1.0規(guī)定瀏覽器與服務器只保持短暫的連接,瀏覽器的每次請求都需要與服務器建立一個TCP連接,服務器完成請求處理后立即斷開TCP連接,服務器不跟蹤每個客戶也不記錄過去的請求。 HTTP 1.1則支持持久連接Persistent Connection,并且默認使用,在同一個TCP的連接中可以傳送多個HTTP請求和響應,多個請求和響應可以重疊,多個請求和響應可以同時進行,更加多的請求頭和響應頭 HTTP 1.1的持續(xù)連接,也需要增加新的請求頭來幫助實現(xiàn),例如,Connection請求頭的值為Keep-Alive時,客戶端通知服務器返回本次請求結果后保持連接;Connection請求頭的值為Close時,客戶端通知服務器返回本次請求結果后關閉連接。 「管道網絡傳輸」 HTTP/1.1 采用了長連接的方式,這使得管道網絡傳輸成為了可能。 即可在同一個 TCP 連接里面,客戶端可以發(fā)起多個請求,只要第一個請求發(fā)出去了,不必等其回來,就可以發(fā)第二個請求出去,可以「減少整體的響應時間?!?/strong> 舉例來說,客戶端需要請求兩個資源。以前的做法是,在同一個TCP連接里面,先發(fā)送 A 請求,然后等待服務器做出回應,收到后再發(fā)出 B 請求,管道機制則是允許瀏覽器同時發(fā)出 A 請求和 B 請求。 但是服務器還是按照「順序」,先回應 A 請求,完成后再回應 B 請求,要是 前面的回應特別慢,后面就會有許多請求排隊等著。 「Host字段」 在HTTP1.0中認為每臺服務器都綁定一個唯一的IP地址,因此,請求消息中的URL并沒有傳遞主機名,但隨著虛擬主機技術的發(fā)展,在一臺物理服務器上可以存在多個虛擬主機,并且它們共享一個IP地址。 HTTP1.1的請求消息和響應消息都應支持Host頭域,且請求消息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)。 此外,服務器應該接受以絕對路徑標記的資源請求。 「100Status」 HTTP/1.1加入了一個新的狀態(tài)碼100。 客戶端事先發(fā)送一個只帶頭域的請求,如果服務器因為權限拒絕了請求,就回送響應碼401(Unauthorized); 如果服務器接收此請求就回送響應碼100,客戶端就可以繼續(xù)發(fā)送帶實體的完整請求了。 100狀態(tài)代碼的使用,允許客戶端在發(fā)request消息body之前先用request header試探一下server,看server要不要接收request body,再決定要不要發(fā)request body。 「Chunked Transfer Coding」 HTTP/1.1將發(fā)送方將消息分割成若干個任意大小的數(shù)據(jù)塊,每個數(shù)據(jù)塊在發(fā)送時都會附上塊的長度,最后用一個零長度的塊作為消息結束的標志。 這種方法允許發(fā)送方只緩沖消息的一個片段,避免緩沖整個消息帶來的過載。 「Cache」 HTTP/1.1在1.0的基礎上加入了一些Cache的新特性,當緩存對象的Age超過Expire時變?yōu)镾table對象,Cache不需要直接拋棄Stable對象,而是與源服務器進行重新激活。 HTTP2.0「HTTP2.0和HTTP1.X相比的新特性」
HTTP/2 還在一定程度上改善了傳統(tǒng)的請求 - 應答工作模式,服務不再是被動地響應,也可以「主動」向客戶端發(fā)送消息。 舉例來說,在瀏覽器剛請求 HTML 的時候,就提前把可能會用到的 JS、CSS 文件等靜態(tài)資源主動發(fā)給客戶端,「減少延時的等待」,也就是服務器推送。 「數(shù)據(jù)流」 HTTP/2 的數(shù)據(jù)包不是按順序發(fā)送的,同一個連接里面連續(xù)的數(shù)據(jù)包,可能屬于不同的回應。 因此,必須要對數(shù)據(jù)包做標記,指出它屬于哪個回應。 每個請求或回應的所有數(shù)據(jù)包,稱為一個數(shù)據(jù)流(Stream)。 每個數(shù)據(jù)流都標記著一個獨一無二的編號,其中規(guī)定客戶端發(fā)出的數(shù)據(jù)流編號為奇數(shù), 服務器發(fā)出的數(shù)據(jù)流編號為偶數(shù) 客戶端還可以「指定數(shù)據(jù)流的優(yōu)先級」。優(yōu)先級高的請求,服務器就先響應該請求。 「HTTP2.0的多路復用和HTTP1.X中的長連接復用有什么區(qū)別」
HTTP3.0「使用UDP協(xié)議」 HTTP/2 主要的問題在于:多個 HTTP 請求在復用一個 TCP 連接,下層的 TCP 協(xié)議是不知道有多少個 HTTP 請求的。 所以一旦發(fā)生了丟包現(xiàn)象,就會觸發(fā) TCP 的重傳機制,這樣在一個 TCP 連接中的「所有的 HTTP 請求都必須等待這個丟了的包被重傳回來」。
這都是基于 TCP 傳輸層的問題,所以 「HTTP/3 把 HTTP 下層的 TCP 協(xié)議改成了 UDP!」 HTTPS「HTTP與HTTPS的區(qū)別」 HTTP 是明文傳輸協(xié)議,HTTPS 協(xié)議是由 SSL+HTTP 協(xié)議構建的可進行加密傳輸、身份認證的網絡協(xié)議,比 HTTP 協(xié)議安全
「工作原理」 HTTPS 協(xié)議會對傳輸?shù)臄?shù)據(jù)進行加密,而加密過程是使用了非對稱加密實現(xiàn) HTTPS的整體過程分為證書驗證和數(shù)據(jù)傳輸階段,具體的交互過程如下:
數(shù)字證書客戶端先向服務器端索要公鑰,然后用公鑰加密信息,服務器收到密文后,用自己的私鑰解密。 ? 所以這里就需要借助第三方權威機構 CA (數(shù)字證書認證機構),將「服務器公鑰放在數(shù)字證書」(由數(shù)字證書認證機構頒發(fā))中,只要證書是可信的,公鑰就是可信的。 通過數(shù)字證書的方式保證服務器公鑰的身份,解決冒充的風險。 請求報文「請求頭」 HTTP 請求報文由3部分組成(請求行+請求頭+請求體) 「常見的HTTP報文頭屬性」
決定當前事務(三次握手和四次揮手)完成后,是否關閉網絡連接。
響應報文響應報文與請求報文一樣,由三個部分組成(響應行,響應頭,響應體) 「HTTP響應報文屬性」
TCPTCP是一個傳輸層協(xié)議,提供可靠傳輸,支持全雙工,是一個連接導向的協(xié)議。 「雙工/單工」 在任何一個時刻,如果數(shù)據(jù)只能單向發(fā)送,就是單工。 如果在某個時刻數(shù)據(jù)可以向一個方向傳輸,也可以向另一個方向反方向傳輸,而且交替進行,叫作半雙工;半雙工需要至少 1 條線路。 如果任何時刻數(shù)據(jù)都可以雙向收發(fā),這就是全雙工,全雙工需要大于 1 條線路。 TCP 是一個雙工協(xié)議,數(shù)據(jù)任何時候都可以雙向傳輸。 這就意味著客戶端和服務端可以平等地發(fā)送、接收信息。 「TCP協(xié)議的主要特點」
「TCP的可靠性原理」 可靠傳輸有如下兩個特點:
首先,采用三次握手來建立TCP連接,四次握手來釋放TCP連接,從而保證建立的傳輸信道是可靠的。 其次,TCP采用了連續(xù)ARQ協(xié)議(回退N(Go-back-N);超時自動重傳)來保證數(shù)據(jù)傳輸?shù)恼_性,使用滑動窗口協(xié)議來保證接方能夠及時處理所接收到的數(shù)據(jù),進行流量控制。 最后,TCP使用慢開始、擁塞避免、快重傳和快恢復來進行擁塞控制,避免網絡擁塞。 報文段TCP雖面向字節(jié)流,但傳送的數(shù)據(jù)單元為報文段 報文段 = 首部 + 數(shù)據(jù)2部分 TCP的全部功能體現(xiàn)在它首部中各字段的作用 ? 「端口」: 源端口號和目地端口各占16位兩個字節(jié),也就是端口的范圍是 另外1024以下是系統(tǒng)保留的,從1024-65535是用戶使用的端口范圍 「seq序號」:占4字節(jié),TCP連接中傳送的字節(jié)流中的每個字節(jié)都按順序編號。 例如:一段報文的序號字段值是107,攜帶的數(shù)據(jù)是100個字段,下一個報文段序號從107+100=207開始。 「ack確認號」:4個字節(jié),是期望收到對方下一個報文段的第一個數(shù)據(jù)字節(jié)的序號。 例如:B收到A發(fā)送的報文,其序號字段是301,數(shù)據(jù)長度是200字節(jié),表明B正確收到A發(fā)送的到序號500為止的數(shù)據(jù)(301+200-1=500),B期望收到A下一個數(shù)據(jù)序號是501,B發(fā)送給A的確認報文段中把ack確認號置為501。 「數(shù)據(jù)偏移」:頭部有可選字段,長度不固定,指出TCP報文段的數(shù)據(jù)起始處距離報文段的起始處有多遠。 「保留」:保留今后使用的,被標為1。 「控制位」:由8個標志位組成。每個標志位表示一個控制功能。 其中主要的6個:
「窗口」:滑動窗口大小,用來告知發(fā)送端接收端緩存大小,以此控制發(fā)送端發(fā)送數(shù)據(jù)的速率,從而達到流量控制。 「校驗和」:奇偶校驗,此校驗和是對整個的TCP報文段(包括TCP頭部和TCP數(shù)據(jù)),以16位進行計算所得,由發(fā)送端計算和存儲,接收端進行驗證。 「緊急指針」:只有控制位中的URG為1時才有效,指出本報文段中的緊急數(shù)據(jù)的字節(jié)數(shù)。 「選項」:其長度可變,定義其他的可選參數(shù)。 粘包與拆包TCP是面向字節(jié)流的協(xié)議,把上層應用層的數(shù)據(jù)看成字節(jié)流,所以它發(fā)送的不是固定大小的數(shù)據(jù)包,TCP協(xié)議也沒有字段說明發(fā)送數(shù)據(jù)包的大小。 而且TCP不保證接受方應用程序收到的數(shù)據(jù)塊和發(fā)送應用程序發(fā)送的數(shù)據(jù)塊具有對應的大小關系 比如發(fā)送方應用程序交給發(fā)送方 TCP底層并不了解上層業(yè)務數(shù)據(jù)的具體含義,它會根據(jù)TCP緩沖區(qū)的實際情況進行包的劃分,所以在業(yè)務上認為,一個完整的包可能會被TCP拆分成多個包進行發(fā)送,也有可能把多個小的包封裝成一個大的數(shù)據(jù)包發(fā)送,這就是所謂的TCP粘包和拆包問題 「TCP粘包/拆包解決策略」 由于TCP無法理解上一層的業(yè)務數(shù)據(jù)特點,所以TCP是無法保證發(fā)送的數(shù)據(jù)包不發(fā)生粘包和拆包,這個問題只能通過上層的協(xié)議棧設計來解決,解決思路有一下幾種:
三次握手「第一次握手」: 客戶端將TCP報文標志位 「第二次握手」: 服務器端收到數(shù)據(jù)包后由標志位 「第三次握手」: 客戶端收到確認后,檢查ack是否為 「上面寫的ack和ACK,不是同一個概念:」
「TCP為什么三次握手而不是兩次握手」
「《計算機網絡》中是這樣說的:」 為了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤。 ? 假如 于是就向client發(fā)出確認報文段,同意建立連接,假設不采用「三次握手」,那么只要server發(fā)出確認,新的連接就建立了,由于現(xiàn)在client并沒有發(fā)出建立連接的請求,因此不會理睬server的確認,也不會向server發(fā)送數(shù)據(jù)。 但server卻以為新的連接已經建立,并一直等待 采用「三次握手」的辦法可以防止上述現(xiàn)象發(fā)生,例如剛才那種情況,client不會向 「什么是半連接隊列」 服務器第一次收到客戶端的 SYN 之后,就會處于 當然還有一個「全連接隊列」,就是已經完成三次握手,建立起連接的就會放在全連接隊列中。如果隊列滿了就有可能會出現(xiàn)丟包現(xiàn)象。 補充一點關于「SYN-ACK 重傳次數(shù)」的問題: 服務器發(fā)送完SYN-ACK包,如果未收到客戶確認包,服務器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數(shù)超過系統(tǒng)規(guī)定的最大重傳次數(shù),系統(tǒng)將該連接信息從半連接隊列中刪除。 「三次握手過程中可以攜帶數(shù)據(jù)嗎」 其實第三次握手的時候,是可以攜帶數(shù)據(jù)的,也就是說,第一次、第二次握手不可以攜帶數(shù)據(jù),而第三次握手是可以攜帶數(shù)據(jù)的。 假如第一次握手可以攜帶數(shù)據(jù)的話,如果有人要惡意攻擊服務器,那他每次都在第一次握手中的 SYN 報文中放入大量的數(shù)據(jù),因為攻擊者根本就不理服務器的接收、發(fā)送能力是否正常,然后瘋狂著重復發(fā) SYN 報文的話,這會讓服務器花費很多時間、內存空間來接收這些報文。也就是說,第一次握手可以放數(shù)據(jù)的話,其中一個簡單的原因就是會讓服務器更加容易受到攻擊了。 而對于第三次的話,此時客戶端已經處于 established 狀態(tài),也就是說,對于客戶端來說,他已經建立起連接了,并且也已經知道服務器的接收、發(fā)送能力是正常的了,所以能攜帶數(shù)據(jù)沒啥毛病。 四次揮手![]() 揮手請求可以是Client端,也可以是Server端發(fā)起的,我們假設是Client端發(fā)起:
「為什么連接的時候是三次握手,關閉的時候卻是四次握手?」 建立連接時因為當Server端收到Client端的SYN連接請求報文后,可以直接發(fā)送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。所以建立連接只需要三次握手。 由于TCP協(xié)議是一種面向連接的、可靠的、基于字節(jié)流的運輸層通信協(xié)議,TCP是全雙工模式。 這就意味著,關閉連接時,當Client端發(fā)出FIN報文段時,只是表示Client端告訴Server端數(shù)據(jù)已經發(fā)送完畢了。當Server端收到FIN報文并返回ACK報文段,表示它已經知道Client端沒有數(shù)據(jù)發(fā)送了,但是Server端還是可以發(fā)送數(shù)據(jù)到Client端的,所以Server很可能并不會立即關閉SOCKET,直到Server端把數(shù)據(jù)也發(fā)送完畢。 當Server端也發(fā)送了FIN報文段時,這個時候就表示Server端也沒有數(shù)據(jù)要發(fā)送了,就會告訴Client端,我也沒有數(shù)據(jù)要發(fā)送了,之后彼此就會愉快的中斷這次TCP連接。 「為什么TIME_WAIT要等待2MSL?」 MSL:報文段最大生存時間,它是任何報文段被丟棄前在網絡內的最長時間。 有以下兩個原因:
流量控制「RTT和RTO」 RTT:發(fā)送一個數(shù)據(jù)包到收到對應的ACK,所花費的時間 RTO:重傳時間間隔(TCP在發(fā)送一個數(shù)據(jù)包后會啟動一個重傳定時器,RTO即定時器的重傳時間) 開始預先算一個定時器時間,如果回復ACK,重傳定時器就自動失效,即不需要重傳;如果沒有回復ACK,RTO定時器時間就到了,重傳。 RTO是本次發(fā)送當前數(shù)據(jù)包所預估的超時時間,RTO不是固定寫死的配置,是經過RTT計算出來的。 「滑動窗口」 TCP的滑動窗口主要有兩個作用:
TCP報文頭有個字段叫Window,用于接收方通知發(fā)送方自己還有多少緩存區(qū)可以接收數(shù)據(jù),發(fā)送方根據(jù)接收方的處理能力來發(fā)送數(shù)據(jù),不會導致接收方處理不過來,這便是流量控制。 發(fā)送方都維持了一個連續(xù)的允許發(fā)送的幀的序號,稱為發(fā)送窗口;同時,接收方也維持了一個連續(xù)的允許接收的幀的序號,稱為接收窗口。 發(fā)送窗口和接收窗口的序號的上下界不一定要一樣,甚至大小也可以不同。 不同的滑動窗口協(xié)議窗口大小一般不同。 發(fā)送方窗口內的序列號代表了那些已經被發(fā)送,但是還沒有被確認的幀,或者是那些可以被發(fā)送的幀 ![]() 滑動窗口由四部分組成每個字節(jié)的數(shù)據(jù)都有唯一順序的編碼,隨著時間發(fā)展,未確認部分與可以發(fā)送數(shù)據(jù)包編碼部分向右移動,形式滑動窗口
接收窗口的大小就是滑動窗口的最大值,數(shù)據(jù)傳輸過程中滑動窗口的可用大小是動態(tài)變化的。 但是還有這么一點,滑動窗口的設計僅僅是考慮到了處理方的處理能力,但是沒有考慮到道路的通暢問題 就好像服務端可以處理100M數(shù)據(jù),但是傳輸?shù)臄?shù)據(jù)99M都堵在路上了,這不就是導致道路阻塞了么?這就需要另外一個設計「擁塞避免」 「流量控制的目的」 如果發(fā)送者發(fā)送數(shù)據(jù)過快,接收者來不及接收,那么就會有分組丟失。 為了避免分組丟失,控制發(fā)送者的發(fā)送速度,使得接收者來得及接收,這就是流量控制。 流量控制根本目的是防止分組丟失,它是構成TCP可靠性的一方面。 「如何實現(xiàn)流量控制」 由滑動窗口協(xié)議(連續(xù)ARQ協(xié)議)實現(xiàn)?;瑒哟翱趨f(xié)議既保證了分組無差錯、有序接收,也實現(xiàn)了流量控制。 主要的方式就是接收方返回的 ACK 中會包含自己的接收窗口的大小,并且利用大小來控制發(fā)送方的數(shù)據(jù)發(fā)送。 ![]() 「流量控制引發(fā)的死鎖」 當發(fā)送者收到了一個窗口為0的應答,發(fā)送者便停止發(fā)送,等待接收者的下一個應答。 但是如果這個窗口不為0的應答在傳輸過程丟失,發(fā)送者一直等待下去,而接收者以為發(fā)送者已經收到該應答,等待接收新數(shù)據(jù),這樣雙方就相互等待,從而產生死鎖。 為了避免流量控制引發(fā)的死鎖,TCP使用了「持續(xù)計時器」。每當發(fā)送者收到一個零窗口的應答后就啟動該計時器。時間一到便主動發(fā)送報文詢問接收者的窗口大小。若接收者仍然返回零窗口,則重置該計時器繼續(xù)等待;若窗口不為0,則表示應答報文丟失了,此時重置發(fā)送窗口后開始發(fā)送,這樣就避免了死鎖的產生。 擁塞控制「為什么要進行擁塞控制」 假設網絡已經出現(xiàn)擁塞,如果不處理擁塞,那么延時增加,出現(xiàn)更多丟包,觸發(fā)發(fā)送方重傳數(shù)據(jù),加劇擁塞情況,繼續(xù)惡性循環(huán)直至網絡癱瘓。 擁塞控制與流量控制的適應場景和目的均不同。 擁塞發(fā)生前,可避免流量過快增長拖垮網絡;擁塞發(fā)生時,唯一的選擇就是降低流量。 主要使用4種算法完成擁塞控制:
算法1、2適用于擁塞發(fā)生前,算法3適用于擁塞發(fā)生時,算法4適用于擁塞解決后(相當于擁塞發(fā)生前)。 「rwnd與cwnd」
同時考慮流量控制與擁塞處理,則發(fā)送方窗口的大小不超過 「慢啟動算法」 慢開始算法的思路就是,不要一開始就發(fā)送大量的數(shù)據(jù),先探測一下網絡的擁塞程度,也就是說由小到大逐漸增加擁塞窗口的大小。 這里用報文段的個數(shù)作為擁塞窗口的大小舉例說明慢開始算法,實際的擁塞窗口大小是以字節(jié)為單位的。 一個傳輸輪次所經歷的時間其實就是往返時間RTT,而且每經過一個傳輸輪次,擁塞窗口cwnd就加倍。 為了防止cwnd增長過大引起網絡擁塞,還需設置一個慢開始門限ssthresh狀態(tài)變量。 ?
注意,這里的慢并不是指cwnd的增長速率慢,而是指在TCP開始發(fā)送報文段時先設置cwnd=1,然后逐漸增大,這當然比按照大的cwnd一下子把許多報文段突然注入到網絡中要慢得多。 「擁塞避免算法」 讓擁塞窗口cwnd緩慢地增大,即每經過一個往返時間RTT就把發(fā)送方的擁塞窗口cwnd加1,而不是加倍。 這樣擁塞窗口cwnd按線性規(guī)律緩慢增長,比慢開始算法的擁塞窗口增長速率緩慢得多 無論是在慢開始階段還是在擁塞避免階段,只要發(fā)送方判斷網絡出現(xiàn)擁塞(其根據(jù)就是沒有按時收到確認,雖然沒有收到確認可能是其他原因的分組丟失,但是因為無法判定,所以都當做擁塞來處理),就把慢開始門限ssthresh設置為出現(xiàn)擁塞時的發(fā)送窗口大小的一半(但不能小于2)。 然后把擁塞窗口cwnd重新設置為1,執(zhí)行慢開始算法。 這樣做的目的就是要迅速減少主機發(fā)送到網絡中的分組數(shù),使得發(fā)生擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢。 「整個擁塞控制的流程:」 假定cwnd=24時,網絡出現(xiàn)超時(擁塞),則更新后的ssthresh=12,cwnd重新設置為1,并執(zhí)行慢開始算法。 當cwnd=12=ssthresh時,改為執(zhí)行擁塞避免算法 注意:擁塞避免并非完全能夠避免了阻塞,而是使網絡比較不容易出現(xiàn)擁塞。 ![]() 「快重傳算法」 快重傳要求接收方在收到一個失序的報文段后就立即發(fā)出重復確認(為的是使發(fā)送方及早知道有報文段沒有到達對方,可提高網絡吞吐量約20%)而不要等到自己發(fā)送數(shù)據(jù)時捎帶確認。 快重傳算法規(guī)定,發(fā)送方只要一連收到三個重復確認就應當立即重傳對方尚未收到的報文段,而不必繼續(xù)等待設置的重傳計時器時間到期 「快恢復算法」 快重傳配合使用的還有快恢復算法,有以下兩個要點:
考慮到如果網絡出現(xiàn)擁塞的話就不會收到好幾個重復的確認,所以發(fā)送方現(xiàn)在認為網絡可能沒有出現(xiàn)擁塞。 所以此時不執(zhí)行慢開始算法,而是將cwnd設置為ssthresh減半后的值,然后執(zhí)行擁塞避免算法,使cwnd緩慢增大。 ![]() Socket即套接字,是應用層 與 ![]()
對用戶來說,只需調用Socket去組織數(shù)據(jù),以符合指定的協(xié)議,即可通信 UDP「UDP協(xié)議特點」
「TCP和UDP的區(qū)別」
「基于TCP和UDP的常用協(xié)議」 HTTP、HTTPS、FTP、TELNET、SMTP(簡單郵件傳輸協(xié)議)協(xié)議基于可靠的TCP協(xié)議。 TFTP、DNS、DHCP、TFTP、SNMP(簡單網絡管理協(xié)議)、RIP基于不可靠的UDP協(xié)議 報文段UDP的報文段共有2個字段:數(shù)據(jù)字段 + 首部字段 ![]() 「UDP報文中每個字段的含義如下:」
網絡層MAC地址MAC稱為物理地址,也叫硬件地址,用來定義網絡設備的位置,MAC地址是網卡出廠時設定的,是固定的(但可以通過在設備管理器中或注冊表等方式修改,同一網段內的MAC地址必須唯一)。 MAC地址采用十六進制數(shù)表示,長度是6個字節(jié)(48位),分為前24位和后24位。 ? IP地址常見的IP地址分為IPv4與IPv6兩大類,當前廣泛應用的是IPv4,目前IPv4幾乎耗盡,下一階段必然會進行版本升級到IPv6; IP地址是以網絡號和主機號來標示網絡上的主機的,我們把網絡號相同的主機稱之為本地網絡,網絡號不相同的主機稱之為遠程網絡主機 本地網絡中的主機可以直接相互通信;遠程網絡中的主機要相互通信必須通過本地網關(Gateway)來傳遞轉發(fā)數(shù)據(jù)。 IP地址對應于OSI參考模型的第三層網絡層,工作在網絡層的路由器根據(jù)目標IP和源IP來判斷是否屬于同一網段,如果是不同網段,則轉發(fā)數(shù)據(jù)包。 「IP地址格式和表示」 IP地址(IPv4)由32位二進制數(shù)組成,分為4段(4個字節(jié)),每一段為8位二進制數(shù)(1個字節(jié)) 每一段8位二進制,中間使用英文的標點符號 由于二進制數(shù)太長,為了便于記憶和識別,把每一段8位二進制數(shù)轉成十進制,大小為0至255。 IP地址的這種表示法叫做「點分十進制表示法」。 IP地址表示為: 舉個栗子: 計算機的IP地址由兩部分組成,一部分為網絡標識,一部分為主機標識,同一網段內的計算機網絡部分相同,主機部分不能同時重復出現(xiàn)。 「路由器」連接不同網段,負責不同網段之間的數(shù)據(jù)轉發(fā),「交換機」連接的是同一網段的計算機。 通過設置網絡地址和主機地址,在互相連接的整個網絡中保證每臺主機的IP地址不會互相重疊,即IP地址具有了唯一性。 「IP地址分類詳解」 IP地址分A、B、C、D、E五類,其中A、B、C這三類是比較常用的IP地址,D、E類為特殊地址。 ![]() 子網掩碼「子網掩碼的概念及作用」 通過子網掩碼,才能表明一臺主機所在的子網與其他子網的關系,使網絡正常工作。 子網掩碼和IP地址做與運算,分離出IP地址中的網絡地址和主機地址,用于判斷該IP地址是在本地網絡上,還是在遠程網絡網上。 子網掩碼還用于將網絡進一步劃分為若干子網,以避免主機過多而擁堵或過少而IP浪費。 「子網掩碼的組成」 同IP地址一樣,子網掩碼是由長度為32位二進制數(shù)組成的一個地址。 子網掩碼32位與IP地址32位相對應,IP地址如果某位是網絡地址,則子網掩碼為1,否則為0。 舉個栗子:如: ? 「為什么要使用子網掩碼」 兩臺主機要通信,首先要判斷是否處于同一網段,即網絡地址是否相同。 如果相同,那么可以把數(shù)據(jù)包直接發(fā)送到目標主機,否則就需要路由網關將數(shù)據(jù)包轉發(fā)送到目的地。 ? ? 在如下拓撲圖示例中,A與B,C與D,都可以直接相互通信(都是屬于各自同一網段,不用經過路由器) 但是A與C,A與D,B與C,B與D它們之間不屬于同一網段,所以它們通信是要經過本地網關,然后路由器根據(jù)對方IP地址,在路由表中查找恰好有匹配到對方IP地址的直連路由,于是從另一邊網關接口轉發(fā)出去實現(xiàn)互連 ![]() 「子網掩碼和IP地址的關系」 子網掩碼是用來判斷任意兩臺主機的IP地址是否屬于同一網絡的依據(jù) 拿雙方主機的IP地址和自己主機的子網掩碼做與運算,如結果為同一網絡,就可以直接通信 「如何根據(jù)IP地址和子網掩碼,計算網絡地址:」 將IP地址與子網掩碼轉換成二進制數(shù)。 將二進制形式的 IP 地址與子網掩碼做與運算。 將得出的結果轉化為十進制,便得到網絡地址。 ![]() 網關網關實質上是一個網絡通向其他網絡的IP地址。 比如有網絡A和網絡B,網絡A的IP地址范圍為 網絡B的IP地址范圍為 在沒有路由器的情況下,兩個網絡之間是不能進行TCP/IP通信的,即使是兩個網絡連接在同一臺交換機(或集線器)上,TCP/IP協(xié)議也會根據(jù)子網掩碼( 而要實現(xiàn)這兩個網絡之間的通信,則必須通過網關。 如果網絡A中的主機發(fā)現(xiàn)數(shù)據(jù)包的目的主機不在本地網絡中,就把數(shù)據(jù)包轉發(fā)給它自己的網關,再由網關轉發(fā)給網絡B的網關,網絡B的網關再轉發(fā)給網絡B的某個主機。網絡B向網絡A轉發(fā)數(shù)據(jù)包的過程。 「所以說,只有設置好網關的IP地址,TCP/IP協(xié)議才能實現(xiàn)不同網絡之間的相互通信?!?/strong> ? 網關的IP地址是具有路由功能的設備的IP地址,具有路由功能的設備有路由器、啟用了路由協(xié)議的服務器(實質上相當于一臺路由器)、代理服務器(也相當于一臺路由器)。 PingPing是我們測試網絡連接的常用指令。 它利用ICMP報文檢測網絡連接。 「假設A ping B」
?
符合,接受,接收后檢查該數(shù)據(jù)幀,將IP數(shù)據(jù)包從幀中提取出來,交給本機的的IP地址協(xié)議層協(xié)議,IP協(xié)議層檢查之后,將有用的信息提取給ICMP協(xié)議,后者處理,馬上構建一個ICMP應答包,發(fā)送給A,其過程和主機A發(fā)送ICMP請求包到B的過程類似,但不用ARP廣播收取A的信息,因為請求包中已經有足夠的信息用于B回應A。 若不符合,丟棄。 可以知道PING的過程即一段發(fā)送報文和接受確認報文的過程,在來回直接可以計算時延。 DNSDNS通過主機名,最終得到該主機名對應的IP地址的過程叫做域名解析(或主機名解析)。 「通俗的講」,我們更習慣于記住一個網站的名字,www.baidu.com,而不是記住它的ip地址,比如:167.23.10.2 「工作原理」 將主機域名轉換為ip地址,屬于應用層協(xié)議,使用UDP傳輸。 ![]() ![]() 第一步,客戶端向本地DNS服務器發(fā)送解析請求 第二步,本地DNS如有相應記錄會直接返回結果給客戶端,如沒有就向DNS根服務器發(fā)送請求 第三步,DSN根服務器接收到請求,返回給本地服務器一個所查詢域的主域名服務器的地址 第四步,本地dns服務器再向返回的主域名服務器地址發(fā)送查詢請求 第五步,主域名服務器如有記錄就返回結果,沒有的話返回相關的下級域名服務器地址 第六步,本地DNS服務器繼續(xù)向接收到的地址進行查詢請求 第七步,下級域名服務器有相應記錄,返回結果 第八步,本地dns服務器將收到的返回地址發(fā)給客戶端,同時寫入自己的緩存,以便下次查詢 DNS域名查詢實際上就是個不斷遞歸查詢的過程,直到查找到相應結果,需要注意的時,當找不到相應記錄,會返回空結果,而不是超時信息 DNS記錄? 定義www.example.com的ip地址上面的就是一條 DNS 記錄,純文本即可。
A 是記錄的類型,A 記錄代表著這是一條用于解析 IPv4 地址的記錄。 從這條記錄可知, ? CNAME用于定義域名的別名,如下面這條 DNS 記錄: 這條 DNS 記錄定義了 用戶在瀏覽器中輸入 當你想把一個網站遷移到新域名,舊域名仍然保留的時候;還有當你想將自己的靜態(tài)資源放到 CDN 上的時候,CNAME 就非常有用。 ? A 記錄是域名和 IPv4 地址的映射關系。和 A 記錄類似,AAAA 記錄則是域名和 IPv6 地址的映射關系。 ? MX 記錄是郵件記錄,用來描述郵件服務器的域名。 在工作中,我們經常會發(fā)郵件到某個同事的郵箱。 比如說,發(fā)送一封郵件到 這個時候就可以用到下面這條 MX 記錄: IN MX mail.xiaoflyfish.com
? NS記錄是描述 DNS 服務器網址。從 DNS 的存儲結構上說,Name Server 中含有權威 DNS 服務的目錄。 也就是說,NS 記錄指定哪臺 Server 是回答 DNS 查詢的權威域名服務器。 當一個 DNS 查詢看到 NS 記錄的時候,會再去 NS 記錄配置的 DNS 服務器查詢,得到最終的記錄。如下面這個例子: 當解析 從設計上看,ns1 和 ns2 是網站 比如當一個北京的用戶想要訪問 上面代碼中 通常 NS 不會只有一個,這是為了保證高可用,一個掛了另一個還能繼續(xù)服務。 通常數(shù)字小的 NS 記錄優(yōu)先級更高,也就是 ns1 會優(yōu)先于 ns2 響應。 配置了上面的 NS 記錄后,如果還配置了 ARP協(xié)議ARP即地址解析協(xié)議, 用于實現(xiàn)從 IP 地址到 MAC 地址的映射,即詢問目標IP對應的MAC地址。 「ARP協(xié)議的工作過程」 首先,每個主機都會有自己的ARP緩存區(qū)中建立一個ARP列表,以表示IP地址和MAC地址之間的對應關系 當源主機要發(fā)送數(shù)據(jù)時,首先檢測ARP列表中是否對應IP地址的目的主機的MAC地址,如果有,則直接發(fā)送數(shù)據(jù),如果沒有,就向本網段的所有主機發(fā)送ARP數(shù)據(jù)包 當本網絡的所有主機收到該ARP數(shù)據(jù)包時,首先檢查數(shù)據(jù)包中的IP地址是否是自己的IP地址,如果不是,則忽略該數(shù)據(jù)包,如果是,則首先從數(shù)據(jù)包中取出源主機的IP和MAC地址寫入到ARP列表中,如果存在,則覆蓋然后將自己的MAC地址寫入ARP響應包中,告訴源主機自己是它想要找的MAC地址 源主機收到ARP響應包后,將目的主機的IP和MAC地址寫入ARP列表,并利用此信息發(fā)送數(shù)據(jù),如果源主機一直沒有收到ARP響應數(shù)據(jù)包,表示ARP查詢失敗。 數(shù)字簽名網絡傳輸過程中需要經過很多中間節(jié)點,雖然數(shù)據(jù)無法被解密,但可能被篡改 數(shù)字簽名校驗數(shù)據(jù)的完整性 「數(shù)字簽名有兩種功效」:
將一段文本先用Hash函數(shù)生成消息摘要,然后用發(fā)送者的私鑰加密生成數(shù)字簽名,與原文文一起傳送給接收者 接收者只有用發(fā)送者的公鑰才能解密被加密的摘要信息,然后用HASH函數(shù)對收到的原文產生一個摘要信息,與上一步得到的摘要信息對比。 如果相同,則說明收到的信息是完整的,在傳輸過程中沒有被修改,否則說明信息被修改過,因此數(shù)字簽名能夠驗證信息的完整性。 SQL注入SQL注入的原理是將SQL代碼偽裝到輸入參數(shù)中,傳遞到服務器解析并執(zhí)行的一種攻擊手法。 「SQL注入攻擊實例」 比如,在一個登錄界面,要求輸入用戶名和密碼,可以這樣輸入實現(xiàn)免賬號登錄: 用戶名: 'or 1 = 1 --用戶一旦點擊登錄,如若沒有做特殊處理,那么這個非法用戶就很得意的登陸進去了。 下面我們分析一下:從理論上說,后臺認證程序中會有如下的SQL語句: 因此,當輸入了上面的用戶名和密碼,上面的SQL語句變成: SELECT * FROM user_table WHERE username=’’or 1 = 1 –- and password=’’分析上述SQL語句我們知道, 「應對方法」 ? 使用預編譯手段,綁定參數(shù)是最好的防SQL注入的方法。 目前許多的ORM框架及JDBC等都實現(xiàn)了SQL預編譯和參數(shù)綁定功能,攻擊者的惡意SQL會被當做SQL的參數(shù)而不是SQL命令被執(zhí)行。 在mybatis的mapper文件中,對于傳遞的參數(shù)我們一般是使用 # 和 當使用#時,變量是占位符,就是一般我們使用java的jdbc的PrepareStatement時的占位符,所有可以防止sql注入; 當使用 ? ? 加密算法加密算法分「對稱加密」 和 「非對稱加密」,其中對稱加密算法的加密與解密密鑰相同,非對稱加密算法的加密密鑰與解密密鑰不同,此外,還有一類不需要密鑰的「散列算法」。 常見的 「對稱加密」 算法主要有 對稱加密在 「對稱加密算法」 中,使用的密鑰只有一個,發(fā)送和接收雙方都使用這個密鑰對數(shù)據(jù)進行 「加密」 和 「解密」。
非對稱加密「非對稱加密算法」,它需要兩個密鑰,一個稱為 「公開密鑰」 ( 因為 「加密」 和 「解密」 使用的是兩個不同的密鑰,所以這種算法稱為 「非對稱加密算法」。
「例子」:甲方生成 「一對密鑰」 并將其中的一把作為 「公鑰」 向其它人公開,得到該公鑰的 「乙方」 使用該密鑰對機密信息 「進行加密」 后再發(fā)送給甲方,甲方再使用自己保存的另一把 「專用密鑰」 (「私鑰」),對 「加密」 后的信息 「進行解密」。 網絡攻擊CSRF和XSS「XSS:」 跨站腳本是一種網站應用程序的安全漏洞攻擊,是代碼注入的一種。 它允許惡意用戶將代碼注入到網頁上,其他用戶在觀看網頁時就會受到影響,這類攻擊通常包含了HTML以及用戶端腳本語言。 比如通過客戶端腳本語言(最常見如:JavaScript) 在一個論壇發(fā)帖中發(fā)布一段惡意的JavaScript代碼就是腳本注入,如果這個代碼內容有請求外部服務器,那么就叫做XSS 「XSS攻擊分類」 ? 例如,正常發(fā)送消息: 接收者將會接收信息并顯示HelloWorld;但是,非正常發(fā)送消息: http://www./message.php?send=<script>alert('foolish!’)</script>!接收者接收消息顯示的時候將會彈出警告窗口! ? 一般指XSS攻擊代碼存儲在網站數(shù)據(jù)庫,當一個頁面被用戶打開的時候執(zhí)行。 也就是說,每當用戶使用瀏覽器打開指定頁面時,腳本便執(zhí)行。 與非持久性XSS攻擊相比,持久性XSS攻擊危害性更大。 從名字就可以了解到,持久性XSS攻擊就是將攻擊代碼存入數(shù)據(jù)庫中,然后客戶端打開時就執(zhí)行這些攻擊代碼。 例如,留言板表單中的表單域: 正常操作流程是:用戶是提交相應留言信息 — 將數(shù)據(jù)存儲到數(shù)據(jù)庫 — 其他用戶訪問留言板,應用去數(shù)據(jù)并顯示; 而非正常操作流程是攻擊者在value填寫: <script>alert('foolish!’);</script> <!--或者html其他標簽(破壞樣式。。。)、一段攻擊型代碼-->并將數(shù)據(jù)提交、存儲到數(shù)據(jù)庫中;當其他用戶取出數(shù)據(jù)顯示的時候,將會執(zhí)行這些攻擊性代碼 「CSRF:」 跨站請求偽造,是一種挾制用戶在當前已登錄的Web應用程序上執(zhí)行非本意的操作的攻擊方法。 比如冒充用戶發(fā)起請求(在用戶不知情的情況下),完成一些違背用戶意愿的請求(如惡意發(fā)帖,刪帖,改密碼,發(fā)郵件等)。 DOS攻擊DOS:中文名稱是拒絕服務,該攻擊的效果是使得計算機或網絡無法提供正常的服務 「DOS攻擊的原理:」 首先攻擊者向被攻擊的服務器發(fā)送大量的虛假IP請求,被攻擊者在收到請求后返回確認信息,等待攻擊者進行確認,該過程需要TCP的三次握手,由于攻擊者發(fā)送的請求信息是虛假的,所以服務器接收不到返回的確認信息,在一段時間內服務器會處與等待狀態(tài),而分配給這次請求的資源卻被有被釋放 當被攻擊者等待一定的時間后,會因連接超時而斷開,這時攻擊者在次發(fā)送新的虛假信息請求,這樣最終服務器資源被耗盡,直到癱瘓 「DDOS:中文名稱是分布式拒絕服務攻擊」 指的是攻擊者控制多臺主機同時向同一主機或網絡發(fā)起 DRDoS分布反射式拒絕服務攻擊這是 「DDOS究竟如何攻擊」 目前最流行也是最好用的攻擊方法就是使用 SYN-Flood不會完成TCP三次握手的第三步,也就是不發(fā)送確認連接的信息給服務器,這樣,服務器無法完成第三次握手,但服務器不會立即放棄,服務器會不停的重試并等待一定的時間后放棄這個未完成的連接,這段時間叫做 若是一個用戶在連接時出現(xiàn)問題導致服務器的一個線程等待1分鐘并不是什么大不了的問題,但是若有人用特殊的軟件大量模擬這種情況,那后果就可想而知了。一個服務器若是處理這些大量的半連接信息而消耗大量的系統(tǒng)資源和網絡帶寬,這樣服務器就不會再有空余去處理普通用戶的正常請求(因為客戶的正常請求比率很小),這樣這個服務器就無法工作了,這種攻擊就叫做 到目前為止,進行DDoS攻擊的防御還是比較困難的 首先,這種攻擊的特點是它利用了TCP/IP協(xié)議的漏洞,除非你不用TCP/IP,才有可能完全抵御住DDoS攻擊 不過這不等于我們就沒有辦法阻擋DDoS攻擊,我們可以盡力來減少DDoS的攻擊 「下面就是一些防御方法:」
Cookie和SessionSession 是「基于Cookie 實現(xiàn)」的另一種記錄服務端和客戶端會話狀態(tài)的機制。 Session 是存儲在服務端,而 SessionId 會被存儲在客戶端的 Cookie 中。 Session 的「認證過程」:
「Cookie和Session的區(qū)別」
常見面試題「在瀏覽器地址欄鍵入URL」 1.DNS解析:瀏覽器會依據(jù)URL逐層查詢DNS服務器緩存,解析URL中的域名對應的IP地址,DNS緩存從近到遠依次是瀏覽器緩存、系統(tǒng)緩存、路由器緩存、IPS服務器緩存、域名服務器緩存、頂級域名服務器緩存。 從哪個緩存找到對應的IP直接返回,不再查詢后面的緩存。 2.TCP連接:結合三次握手 3.發(fā)送HTTP請求:瀏覽器發(fā)出讀取文件的HTTP請求,該請求發(fā)送給服務器 4.服務器處理請求并返回HTTP報文:服務器對瀏覽器請求做出響應,把對應的帶有HTML文本的HTTP響應報文發(fā)送給瀏覽器 5.瀏覽器解析渲染頁面 6.連接結束:瀏覽器釋放TCP連接,該步驟即四次揮手。 第5步和第6步可以認為是同時發(fā)生的,哪一步在前沒有特別的要求 |
|
|