-1 web Client 向servlet服務(wù)器,發(fā)出Http請(qǐng)求
-2 servlet接受web Client的請(qǐng)求
-3 servlet容器創(chuàng)建一個(gè)HttpRequest 對(duì)象,將Web Client請(qǐng)求的信息封裝到這個(gè)對(duì)象中
-4 servlet容器創(chuàng)建一個(gè)HttpResponset對(duì)象
-5 servlet容器調(diào)用HttpServlet對(duì)象的service方法,把HttpRequest對(duì)象與HttpResponse對(duì)象作為參數(shù)傳給HttpServlet對(duì)象
-6 HttpServlet調(diào)用HttpRequest對(duì)象的有關(guān)方法,獲取Http請(qǐng)求信息
-7 HttpServlet調(diào)用HttpResponst 對(duì)象的有關(guān)方法,生成響應(yīng)數(shù)據(jù)
-8 Servlet容器把 HttpServlet的響應(yīng)結(jié)果給Web Client
簡(jiǎn)單的說(shuō):init service destroy
Servlet不是線(xiàn)程安全的,多線(xiàn)程并發(fā)的讀寫(xiě)會(huì)導(dǎo)致數(shù)據(jù)不同步的問(wèn)題。
解決的辦法是盡量不要在實(shí)現(xiàn)servlet接口的類(lèi)中定義實(shí)例變量,而是要把變量分別定義在doGet()和doPost()方法內(nèi)。雖然使用synchronized(name){}語(yǔ)句塊可以解決問(wèn)題,但是會(huì)造成線(xiàn)程的等待,不是很科學(xué)的辦法。
注意:多線(xiàn)程的并發(fā)的讀寫(xiě)Servlet類(lèi)屬性會(huì)導(dǎo)致數(shù)據(jù)不同步。但是如果只是并發(fā)地讀取屬性而不寫(xiě)入,則不存在數(shù)據(jù)不同步的問(wèn)題。因此Servlet里的只讀屬性最好定義為final類(lèi)型的。
<%@ page isThreadSafe=”false”%>
①get請(qǐng)求用來(lái)從服務(wù)器上獲得資源,而post是用來(lái)向服務(wù)器提交數(shù)據(jù);
②get將表單中數(shù)據(jù)按照name=value的形式,添加到action 所指向的URL 后面,并且兩者使用"?"連接,而各個(gè)變量之間使用"&"連接;post是將表單中的數(shù)據(jù)放在HTTP協(xié)議的請(qǐng)求頭或消息體中,傳遞到action所指向URL;
③get傳輸?shù)臄?shù)據(jù)要受到URL長(zhǎng)度限制(1024字節(jié));而post可以傳輸大量的數(shù)據(jù),上傳文件通常要使用post方式;
④使用get時(shí)參數(shù)會(huì)顯示在地址欄上,如果這些數(shù)據(jù)不是敏感數(shù)據(jù),那么可以使用get;對(duì)于敏感數(shù)據(jù)還是應(yīng)用使用post;
⑤get使用MIME類(lèi)型application/x-www-form-urlencoded的URL編碼(也叫百分號(hào)編碼)文本的格式傳遞參數(shù),保證被傳送的參數(shù)由遵循規(guī)范的文本組成,例如一個(gè)空格的編碼是"%20"。
1.重定向訪(fǎng)問(wèn)服務(wù)器兩次,轉(zhuǎn)發(fā)只訪(fǎng)問(wèn)服務(wù)器一次。
2.轉(zhuǎn)發(fā)頁(yè)面的URL不會(huì)改變,而重定向地址會(huì)改變
3.轉(zhuǎn)發(fā)只能轉(zhuǎn)發(fā)到自己的web應(yīng)用內(nèi),重定向可以重定義到任意資源路徑。
4.轉(zhuǎn)發(fā)相當(dāng)于服務(wù)器跳轉(zhuǎn),相當(dāng)于方法調(diào)用,在執(zhí)行當(dāng)前文件的過(guò)程中轉(zhuǎn)向執(zhí)行目標(biāo)文件,兩個(gè)文件(當(dāng)前文件和目標(biāo)文件)屬于同一次請(qǐng)求,前后頁(yè) 共用一個(gè)request,可以通過(guò)此來(lái)傳遞一些數(shù)據(jù)或者session信息,request.setAttribute()和 request.getAttribute()。而重定向會(huì)產(chǎn)生一個(gè)新的request,不能共享request域信息與請(qǐng)求參數(shù)。
5.由于轉(zhuǎn)發(fā)相當(dāng)于服務(wù)器內(nèi)部方法調(diào)用,所以轉(zhuǎn)發(fā)后面的代碼仍然會(huì)執(zhí)行(轉(zhuǎn)發(fā)之后記得return);重定向代碼執(zhí)行之后是方法執(zhí)行完成之后進(jìn)行重定向操作,也就是訪(fǎng)問(wèn)第二個(gè)請(qǐng)求,如果是方法的最后一行進(jìn)行重定向那就會(huì)馬上進(jìn)行重定向(重定向也需要return)。
6.無(wú)論是RequestDispatcher.forward方法,還是HttpServletResponse.sendRedirect方法,在調(diào)用它們之前,都不能有內(nèi)容已經(jīng)被實(shí)際輸出到了客戶(hù)端。如果緩沖區(qū)中已經(jīng)有了一些內(nèi)容,這些內(nèi)容將被從緩沖區(qū)中移除。
可以這么理解:轉(zhuǎn)發(fā)相當(dāng)于,張三向你借錢(qián),但是你兜里沒(méi)錢(qián),所以你去找李四借到錢(qián)之后借給張三。對(duì)于張三而言并不知道你的錢(qián)是和李四借的;重定向相當(dāng)于,張三向你借錢(qián),你兜里沒(méi)錢(qián),你告訴他李四有錢(qián),所以張三再次去找李四借錢(qián)。
request:封裝客戶(hù)端的請(qǐng)求,其中包含來(lái)自GET或POST請(qǐng)求的參數(shù);
response:封裝服務(wù)器對(duì)客戶(hù)端的響應(yīng);
pageContext:通過(guò)該對(duì)象可以獲取其他對(duì)象;
session:封裝用戶(hù)會(huì)話(huà)的對(duì)象;
application:封裝服務(wù)器運(yùn)行環(huán)境的對(duì)象;
out:輸出服務(wù)器響應(yīng)的輸出流對(duì)象;
config:Web應(yīng)用的配置對(duì)象;
page:JSP頁(yè)面本身(相當(dāng)于Java程序中的this);
exception:封裝頁(yè)面拋出異常的對(duì)象。
JSP中的四種作用域包括page、request、session和application,具體來(lái)說(shuō):
page代表與一個(gè)頁(yè)面相關(guān)的對(duì)象和屬性。
request代表與Web客戶(hù)機(jī)發(fā)出的一個(gè)請(qǐng)求相關(guān)的對(duì)象和屬性。一個(gè)請(qǐng)求可能跨越多個(gè)頁(yè)面,涉及多個(gè)Web組件;需要在頁(yè)面顯示的臨時(shí)數(shù)據(jù)可以置于此作用域。
session代表與某個(gè)用戶(hù)與服務(wù)器建立的一次會(huì)話(huà)相關(guān)的對(duì)象和屬性。跟某個(gè)用戶(hù)相關(guān)的數(shù)據(jù)應(yīng)該放在用戶(hù)自己的session中。
application代表與整個(gè)Web應(yīng)用程序相關(guān)的對(duì)象和屬性,它實(shí)質(zhì)上是跨越整個(gè)Web應(yīng)用程序,包括多個(gè)頁(yè)面、請(qǐng)求和會(huì)話(huà)的一個(gè)全局作用域。
靜態(tài)包含是通過(guò)JSP的include指令包含頁(yè)面,動(dòng)態(tài)包含是通過(guò)JSP標(biāo)準(zhǔn)動(dòng)作<jsp:forward>包含頁(yè)面。靜態(tài)包含是編譯時(shí)包含,如果包含的頁(yè)面不存在則會(huì)產(chǎn)生編譯錯(cuò)誤,而且兩個(gè)頁(yè)面的"contentType"屬性應(yīng)保持一致,因?yàn)閮蓚€(gè)頁(yè)面會(huì)合二為一,只產(chǎn)生一個(gè)class文件,因此被包含頁(yè)面發(fā)生的變動(dòng)再包含它的頁(yè)面更新前不會(huì)得到更新。動(dòng)態(tài)包含是運(yùn)行時(shí)包含,可以向被包含的頁(yè)面?zhèn)鬟f參數(shù),包含頁(yè)面和被包含頁(yè)面是獨(dú)立的,會(huì)編譯出兩個(gè)class文件,如果被包含的頁(yè)面不存在,不會(huì)產(chǎn)生編譯錯(cuò)誤,也不影響頁(yè)面其他部分的執(zhí)行。
瀏覽器首先要請(qǐng)求一個(gè)以.jsp擴(kuò)展名結(jié)尾的頁(yè)面,發(fā)起JSP請(qǐng)求,然后,Web服務(wù)器讀取這個(gè)請(qǐng)求,使用JSP編譯器把JSP頁(yè)面轉(zhuǎn)化成一個(gè)Servlet類(lèi)。需要注意的是,只有當(dāng)?shù)谝淮握?qǐng)求頁(yè)面或者是JSP文件發(fā)生改變的時(shí)候JSP文件才會(huì)被編譯,然后服務(wù)器調(diào)用servlet類(lèi),處理瀏覽器的請(qǐng)求。一旦請(qǐng)求執(zhí)行結(jié)束,servlet會(huì)把響應(yīng)發(fā)送給客戶(hù)端。這里看下如何在JSP中獲取請(qǐng)求參數(shù)。
1.jsp的本質(zhì)是Servlet ,jvm只能識(shí)別java的類(lèi),不能識(shí)別jsp的代碼;
2 jsp更擅長(zhǎng)表現(xiàn)與頁(yè)面顯示,Servlet更擅長(zhǎng)與邏輯控制;
3 servlet中沒(méi)有內(nèi)置對(duì)象,jsp中有九大內(nèi)置對(duì)象;
過(guò)濾器是一個(gè)對(duì)象,可以傳輸請(qǐng)求或修改響應(yīng)。它可以在請(qǐng)求到達(dá)Servlet/JSP之前對(duì)其進(jìn)行預(yù)處理,而且能夠在響應(yīng)離開(kāi)Servlet/JSP之后對(duì)其進(jìn)行后處理。所以如果你有幾個(gè)Servlet/JSP需要執(zhí)行同樣的數(shù)據(jù)轉(zhuǎn)換或頁(yè)面處理的話(huà),你就可以寫(xiě)一個(gè)過(guò)濾器類(lèi),然后在部署描述文件(web.xml)中把該過(guò)濾器與對(duì)應(yīng)的Servlet/JSP聯(lián)系起來(lái)。你可以一個(gè)過(guò)濾器以作用于一個(gè)或一組servlet,零個(gè)或多個(gè)過(guò)濾器能過(guò)濾一個(gè)或多個(gè)servlet。一個(gè)過(guò)濾器實(shí)現(xiàn)java.servlet.Filter接口并定義它的三個(gè)方法:
1.void init(FilterConfig config) throws ServletException:在過(guò)濾器執(zhí)行service前被調(diào)用,以設(shè)置過(guò)濾器的配置對(duì)象。
2.void destroy();在過(guò)濾器執(zhí)行service后被調(diào)用。
3.void doFilter(ServletRequest req,ServletResponse res,F(xiàn)ilterChain chain) throws IOException,ServletException;
<c:if>、<c:item>、<c:foreach>、<c:out>、<c:set>
XML 即可擴(kuò)展標(biāo)記語(yǔ)言(Extensible Markup language),你可以根據(jù)自己的需要擴(kuò)展 XML。XML 中可以輕松定義<books>, <orders>等自定義標(biāo)簽,而在 HTML 等其他標(biāo)記語(yǔ)言中必須使用預(yù)定義的標(biāo)簽,比如<p>,而不能使用用戶(hù)定義的標(biāo)簽。使用 DTD 和 XML Schema 標(biāo)準(zhǔn)化XML 結(jié)構(gòu)。XML 主要用于從一個(gè)系統(tǒng)到另一系統(tǒng)的數(shù)據(jù)傳輸,比如企級(jí)應(yīng)用的客戶(hù)端與服務(wù)端。
XPath 是用于從 XML 文檔檢索元素的 XML 技術(shù)。XML 文檔是結(jié)構(gòu)化的,因此 XPath 可以從 XML 文件定位和檢索元素、屬性或值。從數(shù)據(jù)檢索方面來(lái)說(shuō),XPath與 SQL 很相似,但是它有自己的語(yǔ)法和規(guī)則。了解更多查看怎樣使用 XPath 從XML文檔中檢索數(shù)據(jù)。
XML 命名空間與 Java 的 package 類(lèi)似,用來(lái)避免不同來(lái)源名稱(chēng)相同的標(biāo)簽發(fā)生沖突。XML 命名空間在 XML 文檔頂部使用 xmlns 屬性定義,語(yǔ)法為 xmlns:prefix=’URI’。prefix 與XML 文檔中實(shí)際標(biāo)簽一起使用。下面例子為 XML 命名空間的使用。
<root xmlns:inst="http://instruments.com/inst"
<inst:phone>
<inst:number>837363223</inst:number>
</inst:phone>
</root>
解析方式:有 DOM,SAX,STAX 等:
● DOM:處理大型文件時(shí)其性能下降的非常厲害。這個(gè)問(wèn)題是由 DOM 的樹(shù)結(jié)構(gòu)所造成的,這種結(jié)構(gòu)占用的內(nèi)存較多,而且 DOM 必須在解析文件之前把整個(gè)文檔裝入內(nèi)存,適合對(duì) XML 的隨機(jī)訪(fǎng)問(wèn);
● SAX:不同于 DOM,SAX 是事件驅(qū)動(dòng)型的 XML 解析方式。它順序讀取 XML 文件,不需要一次全部裝載整個(gè)文件。當(dāng)遇到像文件開(kāi)頭,文檔結(jié)束,或者標(biāo)簽開(kāi)頭與標(biāo)簽結(jié)束時(shí),它會(huì)觸發(fā)一個(gè)事件,用戶(hù)通過(guò)在其回調(diào)事件中寫(xiě)入處理代碼來(lái)處理 XML 文件,適合對(duì) XML 的順序訪(fǎng)問(wèn);
● STAX:Streaming API for XML (StAX)。
1)在做數(shù)據(jù)交換平臺(tái)時(shí),將不能數(shù)據(jù)源的數(shù)據(jù)組裝成 XML 文件,然后將 XML 文件壓縮打包加密后通過(guò)網(wǎng)絡(luò)傳送給接收者,接收解密與解壓縮后再同 XML 文件中還原相關(guān)信息進(jìn)行處理。
2)在做軟件配置時(shí),利用 XML 可以很方便的進(jìn)行,軟件的各種配置參數(shù)都存貯在 XML 文件中。
JSON是一種取代XML的數(shù)據(jù)結(jié)構(gòu),和xml相比,它更小巧但描述能力不差,網(wǎng)絡(luò)傳輸數(shù)據(jù)將減少更多的流量從而加快速度,是一種輕量級(jí)的數(shù)據(jù)交換格式。
1.JSON是JavaScript Object Notation;XML是可擴(kuò)展標(biāo)記語(yǔ)言。
2.JSON是基于JavaScript語(yǔ)言;XML源自SGML。
3.JSON是一種表示對(duì)象的方式;XML是一種標(biāo)記語(yǔ)言,使用標(biāo)記結(jié)構(gòu)來(lái)表示數(shù)據(jù)項(xiàng)。
4.JSON不提供對(duì)命名空間的任何支持;XML支持名稱(chēng)空間。
5.JSON支持?jǐn)?shù)組;XML不支持?jǐn)?shù)組。
6.XML的文件相對(duì)難以閱讀和解釋?zhuān)慌cXML相比,JSON的文件非常易于閱讀。
7.JSON不使用結(jié)束標(biāo)記;XML有開(kāi)始和結(jié)束標(biāo)簽。
8.JSON的安全性較低;XML比JSON更安全。
9.JSON不支持注釋?zhuān)籜ML支持注釋。
10.JSON僅支持UTF-8編碼;XML支持各種編碼。
HTTP是一個(gè)基于TCP/IP通信協(xié)議來(lái)傳遞數(shù)據(jù),包括html文件、圖像、結(jié)果等,即是一個(gè)客戶(hù)端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)?;旧嫌玫降木褪荊ET和POST,充其量再遇到個(gè)option請(qǐng)求。
(1)https有ca證書(shū),http一般沒(méi)有;
(2)http是超文本傳輸協(xié)議,信息是明文傳輸。https則是具有安全性的ssl加密傳輸協(xié);
(3)http默認(rèn)80端口,https默認(rèn)443端口。
(1)http無(wú)連接:限制每次連接只處理一個(gè)請(qǐng)求,服務(wù)端完成客戶(hù)端的請(qǐng)求后,即斷開(kāi)連接。(傳輸速度快,減少不必要的連接,但也意味著每一次訪(fǎng)問(wèn)都要建立一次連接,效率降低);
(2)http無(wú)狀態(tài):對(duì)于事務(wù)處理沒(méi)有記憶能力。每一次請(qǐng)求都是獨(dú)立的,不記錄客戶(hù)端任何行為;
(3)客戶(hù)端/服務(wù)端模型:客戶(hù)端支持web瀏覽器或其他任何客戶(hù)端;
(4)簡(jiǎn)單快速\靈活:可以傳輸任何類(lèi)型的數(shù)據(jù)。
無(wú)狀態(tài)協(xié)議對(duì)于事務(wù)處理沒(méi)有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息。
狀態(tài)協(xié)議解決辦法:1、cookie 2、通過(guò)session會(huì)話(huà)保存。
http協(xié)議中,返回狀態(tài)碼302表示重定向。這種情況下,服務(wù)器返回的頭部信息中會(huì)包含一個(gè)Location字段,內(nèi)容是重定向到的url。
請(qǐng)求報(bào)文包含三部分:請(qǐng)求行:包含請(qǐng)求方法、URI、HTTP版本信息;請(qǐng)求首部字段;請(qǐng)求內(nèi)容實(shí)體。
響應(yīng)報(bào)文包含三部分:狀態(tài)行:包含HTTP版本、狀態(tài)碼、狀態(tài)碼的原因短語(yǔ);響應(yīng)首部字段;響應(yīng)內(nèi)容實(shí)體。
GET:用于請(qǐng)求訪(fǎng)問(wèn)已經(jīng)被URI(統(tǒng)一資源標(biāo)識(shí)符)識(shí)別的資源,可以通過(guò)URL傳參給服務(wù)器。
POST:用于傳輸信息給服務(wù)器,主要功能與GET方法類(lèi)似,但一般推薦使用POST方式。
PUT: 傳輸文件,報(bào)文主體中包含文件內(nèi)容,保存到對(duì)應(yīng)URI位置。
HEAD: 獲得報(bào)文首部,與GET方法類(lèi)似,只是不返回報(bào)文主體,一般用于驗(yàn)證URI是否有效。
DELETE:刪除文件,與PUT方法相反,刪除對(duì)應(yīng)URI位置的文件。
OPTIONS:查詢(xún)相應(yīng)URI支持的HTTP方法。
TCP(Transmission Control Protocol,傳輸控制協(xié)議)是基于連接的協(xié)議,也就是說(shuō),在正式收發(fā)數(shù)據(jù)前,必須和對(duì)方建立可靠的連接。一個(gè)TCP連接必須要經(jīng)過(guò)三次“對(duì)話(huà)”才能建立起來(lái)。
UDP(User Data Protocol,用戶(hù)數(shù)據(jù)報(bào)協(xié)議)是與TCP相對(duì)應(yīng)的協(xié)議。它是面向非連接的協(xié)議,它不與對(duì)方建立連接,而是直接就把數(shù)據(jù)包發(fā)送過(guò)去,UDP適用于一次只傳送少量數(shù)據(jù)、對(duì)可靠性要求不高的應(yīng)用環(huán)境。
HTTP協(xié)議有HTTP/1.0版本和HTTP/1.1版本。HTTP1.1默認(rèn)保持長(zhǎng)連接(HTTP persistent connection,也翻譯為持久連接),數(shù)據(jù)傳輸完成了保持TCP連接不斷開(kāi)(不發(fā)RST包、不四次握手),等待在同域名下繼續(xù)用這個(gè)通道傳輸數(shù)據(jù);相反的就是短連接。
在 HTTP/1.0 中,默認(rèn)使用的是短連接。也就是說(shuō),瀏覽器和服務(wù)器每進(jìn)行一次HTTP操作,就建立一次連接,任務(wù)結(jié)束就中斷連接。從HTTP/1.1起,默認(rèn)使用的是長(zhǎng)連接,用以保持連接特性。
CSRF(Cross-site request forgery)也被稱(chēng)為 one-click attack或者 session riding,中文全稱(chēng)是叫跨站請(qǐng)求偽造。一般來(lái)說(shuō),攻擊者通過(guò)偽造用戶(hù)的瀏覽器的請(qǐng)求,向訪(fǎng)問(wèn)一個(gè)用戶(hù)自己曾經(jīng)認(rèn)證訪(fǎng)問(wèn)過(guò)的網(wǎng)站發(fā)送出去,使目標(biāo)網(wǎng)站接收并誤以為是用戶(hù)的真實(shí)操作而去執(zhí)行命令。常用于盜取賬號(hào)、轉(zhuǎn)賬、發(fā)送虛假消息等。攻擊者利用網(wǎng)站對(duì)請(qǐng)求的驗(yàn)證漏洞而實(shí)現(xiàn)這樣的攻擊行為,網(wǎng)站能夠確認(rèn)請(qǐng)求來(lái)源于用戶(hù)的瀏覽器,卻不能驗(yàn)證請(qǐng)求是否源于用戶(hù)的真實(shí)意愿下的操作行為。
XSS攻擊又稱(chēng)CSS,全稱(chēng)Cross Site Script (跨站腳本攻擊),其原理是攻擊者向有XSS漏洞的網(wǎng)站中輸入惡意的 HTML 代碼,當(dāng)用戶(hù)瀏覽該網(wǎng)站時(shí),這段 HTML 代碼會(huì)自動(dòng)執(zhí)行,從而達(dá)到攻擊的目的。XSS 攻擊類(lèi)似于 SQL 注入攻擊,SQL注入攻擊中以SQL語(yǔ)句作為用戶(hù)輸入,從而達(dá)到查詢(xún)/修改/刪除數(shù)據(jù)的目的,而在xss攻擊中,通過(guò)插入惡意腳本,實(shí)現(xiàn)對(duì)用戶(hù)游覽器的控制,獲取用戶(hù)的一些信息。 XSS是 Web 程序中常見(jiàn)的漏洞,XSS 屬于被動(dòng)式且用于客戶(hù)端的攻擊方式。
XSS防范的總體思路是:對(duì)輸入(和URL參數(shù))進(jìn)行過(guò)濾,對(duì)輸出進(jìn)行編碼。
網(wǎng)絡(luò)的七層架構(gòu)從下到上主要包括物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話(huà)層、表示層和應(yīng)用層。
①物理層:物理層主要定義物理設(shè)備標(biāo)準(zhǔn),主要作用是傳輸比特流,具體做法是在發(fā)送端將1、0轉(zhuǎn)化為電流強(qiáng)弱來(lái)進(jìn)行傳輸,在到達(dá)目的地之后再將電流強(qiáng)弱轉(zhuǎn)化為1、0,也就是我們常說(shuō)的模數(shù)轉(zhuǎn)換與數(shù)模轉(zhuǎn)換,這一層的數(shù)據(jù)叫做比特。
②數(shù)據(jù)鏈路層:數(shù)據(jù)鏈路層主要用于對(duì)數(shù)據(jù)包中的MAC地址進(jìn)行解析和封裝。這一層的數(shù)據(jù)叫做幀,在這一層工作的設(shè)備是網(wǎng)卡、網(wǎng)橋、交換機(jī)。
③網(wǎng)絡(luò)層:網(wǎng)絡(luò)層主要用于對(duì)數(shù)據(jù)包中的IP地址進(jìn)行封裝和解析,這一層的數(shù)據(jù)叫做數(shù)據(jù)包。在這一層工作的設(shè)備有路由器、交換機(jī)、防火墻等。
④傳輸層:傳輸層定義了傳輸數(shù)據(jù)的協(xié)議和端口號(hào),主要用于數(shù)據(jù)的分段、傳輸和重組。在這一層工作的協(xié)議有TCP和UDP等。TCP是傳輸控制協(xié)議,傳輸效率低,可靠性強(qiáng),用于傳輸對(duì)可靠性要求高,數(shù)據(jù)量大的數(shù)據(jù),比如支付寶轉(zhuǎn)賬業(yè)務(wù);UDP是用戶(hù)數(shù)據(jù)報(bào)協(xié)議,用于傳輸可靠性要求不高,數(shù)據(jù)量小的數(shù)據(jù),例如抖音等視頻服務(wù)。
⑤會(huì)話(huà)層:會(huì)話(huà)層在傳輸層的基礎(chǔ)上建立連接和管理會(huì)話(huà),具體包括登陸驗(yàn)證、斷點(diǎn)續(xù)傳、數(shù)據(jù)粘包與分包等。在設(shè)備之間需要互相識(shí)別的可以是IP,也可以是MAC或者主機(jī)名。
⑥表示層:表示層主要對(duì)接收的數(shù)據(jù)進(jìn)行解釋、加密、解密、壓縮、解壓縮等,即把計(jì)算機(jī)能夠識(shí)別的內(nèi)容轉(zhuǎn)換成人能夠識(shí)別的內(nèi)容(圖片、聲音、文字等)。
⑦應(yīng)用層:基于網(wǎng)絡(luò)構(gòu)建具體應(yīng)用,例如FTP上傳文件下載服務(wù)、Telnet服務(wù)、HTTP服務(wù)、DNS服務(wù)、SNMP郵件服務(wù)等。
TCP/IP不是指TCP和IP這兩個(gè)協(xié)議的合稱(chēng),而是指因特網(wǎng)的整個(gè)TCP/IP協(xié)議簇。從協(xié)議分層模型方面來(lái)講,TCP/IP由4個(gè)層次組成:網(wǎng)絡(luò)接口層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層。
①網(wǎng)絡(luò)接口層:定義了主機(jī)間網(wǎng)絡(luò)連通的協(xié)議,具體包括Echernet、FDDI、ATM等通信協(xié)議。
②網(wǎng)絡(luò)層:主要用于數(shù)據(jù)的傳輸、路由及地址的解析,以保障主機(jī)可以把數(shù)據(jù)發(fā)送給任何網(wǎng)絡(luò)上的目標(biāo)。數(shù)據(jù)經(jīng)過(guò)網(wǎng)絡(luò)傳輸,發(fā)送的順序和到達(dá)的順序可能發(fā)生變化。在網(wǎng)絡(luò)層使用IP協(xié)議和ARP地址解析協(xié)議。
③傳輸層:使源端和目的端的機(jī)器上的對(duì)等實(shí)體可以基于會(huì)話(huà)相互通信。在這一層定義了兩個(gè)端到端的協(xié)議TCP和UDP。TCP是面向連接的協(xié)議,提供可靠的報(bào)文傳輸和對(duì)上層應(yīng)用的連接服務(wù),除了基本的數(shù)據(jù)傳輸,它還有可靠性保證、流量控制、多路復(fù)用、優(yōu)先權(quán)和安全性控制等功能。UDP是面向無(wú)連接的不可靠傳輸?shù)膮f(xié)議,主要用于不需要TCP的排序和流量控制等功能的應(yīng)用程序。
④應(yīng)用層:負(fù)責(zé)具體應(yīng)用層協(xié)議的定義,包括Telnet虛擬終端協(xié)議、FTP文件傳輸協(xié)議、SMTP簡(jiǎn)單電子郵件傳輸協(xié)議、DNS域名解析服務(wù)、NNTP網(wǎng)上新聞傳輸協(xié)議和HTTP超文本傳輸協(xié)議等。
①服務(wù)端創(chuàng)建傳輸控制塊TCB,進(jìn)入LISTEN狀態(tài),準(zhǔn)備接收客戶(hù)端的請(qǐng)求??蛻?hù)端同樣先創(chuàng)建TCB,然后當(dāng)準(zhǔn)備建立連接時(shí)向服務(wù)端發(fā)送連接請(qǐng)求報(bào)文(SYN=1,seq=x),然后進(jìn)入SYN-SENT狀態(tài)。
②服務(wù)端收到后向客戶(hù)端發(fā)送確認(rèn)報(bào)文(SYN=1,ACK=1,ack=x+1,seq=y),進(jìn)入SYN-RCVD狀態(tài)。
③客戶(hù)端接收到確認(rèn)后,再向服務(wù)端發(fā)送一個(gè)確認(rèn)報(bào)文(ACK=1,ack=y+1,seq=x+1),然后進(jìn)入ESTABLISHED狀態(tài),服務(wù)端接收后也進(jìn)入ESTABLISHED狀態(tài)。
④不是兩次的原因是為了避免無(wú)效的連接請(qǐng)求突然發(fā)送到服務(wù)端,而此時(shí)客戶(hù)端已關(guān)閉,服務(wù)端誤以為客戶(hù)端將要發(fā)送數(shù)據(jù)會(huì)白白浪費(fèi)資源。
⑤不是四次的原因是將服務(wù)端的SYN和ACK報(bào)文拆分成兩次發(fā)送和一次的效果是相同的,沒(méi)有意義。
①當(dāng)客戶(hù)端準(zhǔn)備關(guān)閉連接時(shí),向服務(wù)端發(fā)送連接終止報(bào)文(FIN=1,seq=u),進(jìn)入FIN-WAIT-1狀態(tài)。
②服務(wù)端接收后向客戶(hù)端發(fā)送確認(rèn)報(bào)文(ACK=1,ack=u+1,seq=v),進(jìn)入CLOSE-WAIT狀態(tài),客戶(hù)端收到后進(jìn)入FIN-WAIT-2狀態(tài),此時(shí)TCP連接處于半關(guān)閉狀態(tài)。
③當(dāng)服務(wù)端也發(fā)送完全部數(shù)據(jù)準(zhǔn)備斷開(kāi)連接時(shí),向客戶(hù)發(fā)送連接終止報(bào)文(FIN=1,ACK=1,ack=u+1,seq=w),進(jìn)入LAST-ACK狀態(tài)。
④客戶(hù)端接收到該報(bào)文后,發(fā)送一個(gè)確認(rèn)報(bào)文(ACK=w+1,ack=1,seq=u+1),進(jìn)入TIME-WAIT狀態(tài),然后等待2MSL時(shí)間后關(guān)閉。服務(wù)端收到后關(guān)閉,時(shí)間將略早于客戶(hù)端。
⑤不是三次的原因第一是為了保證客戶(hù)端發(fā)送的最后一個(gè)報(bào)文可以到達(dá)服務(wù)端,如果該報(bào)文丟失那么服務(wù)端會(huì)超時(shí)重傳之前的FIN+ACK報(bào)文,客戶(hù)端可以在2MSL內(nèi)收到,第二是防止已失效的報(bào)文發(fā)送到客戶(hù)端,在2MSL后客戶(hù)端在本連接時(shí)間內(nèi)發(fā)出的所有報(bào)文都將從網(wǎng)絡(luò)中消失。
會(huì)話(huà):客戶(hù)端打開(kāi)與服務(wù)器的連接發(fā)出請(qǐng)求到服務(wù)器響應(yīng)客戶(hù)端請(qǐng)求的全過(guò)程稱(chēng)之為會(huì)話(huà)。
http協(xié)議是“無(wú)狀態(tài)”協(xié)議,不能保存用戶(hù)信息,需要判斷是否是同一個(gè)用戶(hù),需要會(huì)話(huà)跟蹤。cookies和session都是用來(lái)跟蹤瀏覽器用戶(hù)身份的會(huì)話(huà)方式,但兩者應(yīng)用場(chǎng)景不一樣。
Cookie 是Web 服務(wù)器發(fā)送給客戶(hù)端(瀏覽器)的一小段信息,客戶(hù)端請(qǐng)求時(shí)可以讀取該信息發(fā)送到服務(wù)器端,進(jìn)而進(jìn)行用戶(hù)的識(shí)別。對(duì)于客戶(hù)端的每次請(qǐng)求,服務(wù)器都會(huì)將 Cookie 發(fā)送到客戶(hù)端,在客戶(hù)端可以進(jìn)行保存,以便下次使用。
Session 代表著服務(wù)器和客戶(hù)端一次會(huì)話(huà)的過(guò)程。每一個(gè)用戶(hù)都有一個(gè)不同的 session,各個(gè)用戶(hù)之間是不能共享的,是每個(gè)用戶(hù)所獨(dú)享的,在 session 中可以存放信息。Session 的實(shí)現(xiàn)依賴(lài)于 Cookie,如果 Cookie 被禁用,那么 session 也將失效。
(1)瀏覽器端第一次發(fā)送請(qǐng)求到服務(wù)器端
(2)服務(wù)器端創(chuàng)建Cookie,該Cookie中包含用戶(hù)的信息,然后將該Cookie發(fā)送到瀏覽器端
(3)瀏覽器端再次訪(fǎng)問(wèn)服務(wù)器端時(shí)會(huì)攜帶服務(wù)器端創(chuàng)建的Cookie
(4)服務(wù)器端通過(guò)Cookie中攜帶的數(shù)據(jù)區(qū)分不同的用戶(hù)
(1)瀏覽器端第一次發(fā)送請(qǐng)求到服務(wù)器端,服務(wù)器端創(chuàng)建一個(gè)Session,同時(shí)會(huì)創(chuàng)建一個(gè)特殊的Cookie(name為JSESSIONID的固定值,value為session對(duì)象的ID),然后將該Cookie發(fā)送至瀏覽器端
(2)瀏覽器端發(fā)送第N(N>1)次請(qǐng)求到服務(wù)器端,瀏覽器端訪(fǎng)問(wèn)服務(wù)器端時(shí)就會(huì)攜帶該name為JSESSIONID的Cookie對(duì)象
(3)服務(wù)器端根據(jù)name為JSESSIONID的Cookie的value(sessionId),去查詢(xún)Session對(duì)象,從而區(qū)分不同用戶(hù)。
第一種,在每次請(qǐng)求中都攜帶一個(gè) SessionID 的參數(shù)放入U(xiǎn)RL
第二種,Token 機(jī)制。Token 的意思是“令牌”,是服務(wù)端生成的一串字符串,作為客戶(hù)端進(jìn)行請(qǐng)求的一個(gè)標(biāo)識(shí)。隨機(jī)且無(wú)狀態(tài),用戶(hù)信息都被加密到token中,服務(wù)器收到token后解密就可知道是哪個(gè)用戶(hù)。需要開(kāi)發(fā)者手動(dòng)添加。
Cookie在生成時(shí)就會(huì)被指定一個(gè)Expire值,這就是Cookie的生存周期,在這個(gè)周期內(nèi)Cookie有效,超出周期Cookie就會(huì)被清除。有些頁(yè)面將Cookie的生存周期設(shè)置為“0”或負(fù)值,這樣在關(guān)閉瀏覽器時(shí),就馬上清除Cookie,不會(huì)記錄用戶(hù)信息,更加安全。
①存在的位置:
Cookie存在于客戶(hù)端,臨時(shí)文件夾中; Session存在于服務(wù)器的內(nèi)存中,一個(gè)Session域?qū)ο鬄橐粋€(gè)用戶(hù)瀏覽器服務(wù)
②安全性
Cookie是以明文的方式存放在客戶(hù)端的,安全性低,可以通過(guò)一個(gè)加密算法進(jìn)行加密后存放; Session存放于服務(wù)器的內(nèi)存中,所以安全性好
③網(wǎng)絡(luò)傳輸量
Cookie會(huì)傳遞消息給服務(wù)器; Session本身存放于服務(wù)器,不會(huì)有傳送流量
④生命周期(以20分鐘為例)
Cookie的生命周期是累計(jì)的,從創(chuàng)建時(shí),就開(kāi)始計(jì)時(shí),20分鐘后,Cookie生命周期結(jié)束;
session的生命周期是間隔的,從創(chuàng)建時(shí),開(kāi)始計(jì)時(shí)如在20分鐘,沒(méi)有訪(fǎng)問(wèn)Session,那么Session生命周期被銷(xiāo)毀。但是,如果在20分鐘內(nèi)(如在第19分鐘時(shí))訪(fǎng)問(wèn)過(guò)Session,那么,將重新計(jì)算Session的生命周期。關(guān)機(jī)會(huì)造成Session生命周期的結(jié)束,但是對(duì)Cookie沒(méi)有影響
⑤訪(fǎng)問(wèn)范圍
Cookie為多個(gè)用戶(hù)瀏覽器共享; Session為一個(gè)用戶(hù)瀏覽器獨(dú)享