當(dāng)前位置:首頁(yè) > IT技術(shù) > Web編程 > 正文

HTTP相關(guān)--知識(shí)點(diǎn)
2021-09-30 17:00:59

一、輸入url到網(wǎng)頁(yè)顯示出來(lái)中間的過(guò)程

  1. 首先,在瀏覽器地址欄中輸入url
  2. 瀏覽器先查看瀏覽器緩存-系統(tǒng)緩存-路由器緩存,如果緩存中有,會(huì)直接在屏幕中顯示頁(yè)面內(nèi)容。若沒(méi)有,則跳到第三步操作。
  3. 在發(fā)送http請(qǐng)求前,需要域名解析(DNS解析)(DNS(域名系統(tǒng),Domain Name System)是互聯(lián)網(wǎng)的一項(xiàng)核心服務(wù),它作為可以將域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù),能夠使人更方便的訪(fǎng)問(wèn)互聯(lián)網(wǎng),而不用去記住IP地址。),解析獲取相應(yīng)的IP地址。
  4. 瀏覽器向服務(wù)器發(fā)起tcp連接,與瀏覽器建立tcp三次握手。(TCP即傳輸控制協(xié)議。TCP連接是互聯(lián)網(wǎng)連接協(xié)議集的一種。)
  5. 握手成功后,瀏覽器向服務(wù)器發(fā)送http請(qǐng)求,請(qǐng)求數(shù)據(jù)包。
  6. 服務(wù)器處理收到的請(qǐng)求,將數(shù)據(jù)返回至瀏覽器
  7. 瀏覽器收到HTTP響應(yīng)
  8. 讀取頁(yè)面內(nèi)容,瀏覽器渲染,解析html源碼
  9. 生成Dom樹(shù)、解析css樣式、js交互
  10. 客戶(hù)端和服務(wù)器交互
  11. ajax查詢(xún)

二、HTTP和HTTPS的基本概念

  HTTP:是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,是一個(gè)客戶(hù)端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)(TCP),用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議,它可以使瀏覽器更加高效,使網(wǎng)絡(luò)傳輸減少。

  HTTPS:是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL。

  HTTPS協(xié)議的主要作用可以分為兩種:一種是建立一個(gè)信息安全通道,來(lái)保證數(shù)據(jù)傳輸?shù)陌踩?;另一種就是確認(rèn)網(wǎng)站的真實(shí)性。

三、HTTP與HTTPS有什么區(qū)別?

  HTTP協(xié)議傳輸?shù)臄?shù)據(jù)都是未加密的,也就是明文的,因此使用HTTP協(xié)議傳輸隱私信息非常不安全,為了保證這些隱私數(shù)據(jù)能加密傳輸,于是網(wǎng)景公司設(shè)計(jì)了SSL(Secure Sockets Layer)協(xié)議用于對(duì)HTTP協(xié)議傳輸?shù)臄?shù)據(jù)進(jìn)行加密,從而就誕生了HTTPS。簡(jiǎn)單來(lái)說(shuō),HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,要比http協(xié)議安全。

  HTTPS和HTTP的區(qū)別主要如下:

  1. https協(xié)議需要到ca申請(qǐng)證書(shū),一般免費(fèi)證書(shū)較少,因而需要一定費(fèi)用。
  2. http是超文本傳輸協(xié)議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協(xié)議。
  3. http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
  4. http的連接很簡(jiǎn)單,是無(wú)狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全。

四、一個(gè)HTTP請(qǐng)求報(bào)文是什么樣的?(GET舉例)

? ? ?http的請(qǐng)求報(bào)文和響應(yīng)報(bào)文的格式基本一樣,主要分為三部分:

  1. 起始行(start line): 描述請(qǐng)求或響應(yīng)的狀態(tài)
  2. 頭部字段(header): 以 key:value 的形式展示
  3. 數(shù)據(jù)實(shí)體(entity/ body) :實(shí)際要傳輸?shù)臄?shù)據(jù),可以是文本,也可以是圖片、文件、視頻等二進(jìn)制數(shù)據(jù)

五、常見(jiàn)的請(qǐng)求 Header 頭

? ? ? ? Request header:Host: www.test.com/ //請(qǐng)求的目標(biāo)域名和端口號(hào)
? ? ? ??Origin: http://localhost:8081/ //請(qǐng)求的來(lái)源域名和端口號(hào) (跨域請(qǐng)求時(shí),瀏覽器會(huì)自動(dòng)帶上這個(gè)頭信息)
? ? ? ??Referer: https:/localhost:8081/link?query=xxxxx //請(qǐng)求資源的完整
? ? ? ??URI User-Agent //瀏覽器信息
? ? ? ??Cookie: //當(dāng)前域名下的
? ? ? ??Cookie Accept: text/html,image/apng //代表客戶(hù)端希望接受的數(shù)據(jù)類(lèi)型是html或者是png圖片類(lèi)型
? ? ? ??Accept-Encoding: gzip, deflate //代表客戶(hù)端能支持gzip和deflate格式的壓縮 Accept-Language: zh-CN,zh;q=0.9 //代表客戶(hù)端可以支持語(yǔ)言zh-CN或者zh(值得一提的是q(0~1)是優(yōu)先級(jí)權(quán)重的意思,不寫(xiě)默認(rèn)為1,這里zh-CN是1,zh是0.9)
? ? ? ??Connection: keep-alive //告訴服務(wù)器,客戶(hù)端需要的tcp連接是一個(gè)長(zhǎng)連接
? ? ? ??If-None-Match //如果內(nèi)容未改變返回304代碼,對(duì)應(yīng)Etag
? ? ? ??If-Modified-Since //對(duì)應(yīng)last-midified,未被修改則返回304代碼
? ? ? ??Response header:
? ? ? ??Date: //服務(wù)端發(fā)送資源時(shí)的服務(wù)器時(shí)間
? ? ? ??Expires: //緩存過(guò)期時(shí)間
? ? ? ??Cache-Control: no-cache // 緩存方式
? ? ? ??Etag // 文件內(nèi)容
? ? ? ??hash Last-Modified //最近一次文件修改時(shí)間
? ? ? ??Content-Type: text/html; charset=utf-8 //編碼格式
? ? ? ??Content-Encoding: gzip //采用gzip對(duì)資源進(jìn)行解碼
? ? ? ??Connection: keep-alive //tcp是長(zhǎng)連接
? ? ? ??Set-Cookie //設(shè)置Http Cookie

六、tcp三次握手,四次揮手

? ? ? ? 第一次握手:建立連接時(shí),客戶(hù)端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SENT狀態(tài),等待服務(wù)器確認(rèn);SYN:同步序列編號(hào)(Synchronize Sequence Numbers)。
? ? ? ? 第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶(hù)的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);
? ? ? ? 第三次握手:客戶(hù)端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶(hù)端和服務(wù)器進(jìn)入ESTABLISHED(TCP連接成功)狀態(tài),完成三次握手。

? ? ? ?為什么連接的時(shí)候是三次握手,關(guān)閉的時(shí)候卻是四次握手?

? ? ? ?因?yàn)楫?dāng)Server端收到Client端的SYN連接請(qǐng)求報(bào)文后,可以直接發(fā)送SYN+ACK報(bào)文。其中ACK報(bào)文是用來(lái)應(yīng)答的,SYN報(bào)文是用來(lái)同步的。但是關(guān)閉連接時(shí),當(dāng)Server端收到FIN報(bào)文時(shí),很可能并不會(huì)立即關(guān)閉SOCKET,所以只能先回復(fù)一個(gè)ACK報(bào)文,告訴Client端,"你發(fā)的FIN報(bào)文我收到了"。只有等到我Server端所有的報(bào)文都發(fā)送完了,我才能發(fā)送FIN報(bào)文,因此不能一起發(fā)送。故需要四步握手。

? ? ? ?為什么不能用兩次握手進(jìn)行連接?

? ? ? ?3次握手完成兩個(gè)重要的功能,既要雙方做好發(fā)送數(shù)據(jù)的準(zhǔn)備工作(雙方都知道彼此已準(zhǔn)備好),也要允許雙方就初始序列號(hào)進(jìn)行協(xié)商,這個(gè)序列號(hào)在握手過(guò)程中被發(fā)送和確認(rèn)。
如果已經(jīng)建立了連接,但是客戶(hù)端突然出現(xiàn)故障了怎么辦?
TCP還設(shè)有一個(gè)?;钣?jì)時(shí)器,顯然,客戶(hù)端如果出現(xiàn)故障,服務(wù)器不能一直等下去,白白浪費(fèi)資源。服務(wù)器每收到一次客戶(hù)端的請(qǐng)求后都會(huì)重新復(fù)位這個(gè)計(jì)時(shí)器,時(shí)間通常是設(shè)置為2小時(shí),若兩小時(shí)還沒(méi)有收到客戶(hù)端的任何數(shù)據(jù),服務(wù)器就會(huì)發(fā)送一個(gè)探測(cè)報(bào)文段,以后每隔75秒鐘發(fā)送一次。若一連發(fā)送10個(gè)探測(cè)報(bào)文仍然沒(méi)反應(yīng),服務(wù)器就認(rèn)為客戶(hù)端出了故障,接著就關(guān)閉連接。

七、Get和post的區(qū)別

? ? ? ? GET在瀏覽器回退時(shí)是無(wú)害的,而POST會(huì)再次提交請(qǐng)求。
? ? ? ??GET產(chǎn)生的URL地址可以被Bookmark,而POST不可以。
? ? ? ??GET請(qǐng)求會(huì)被瀏覽器主動(dòng)cache,而POST不會(huì),除非手動(dòng)設(shè)置。
? ? ? ??GET請(qǐng)求只能進(jìn)行url編碼,而POST支持多種編碼方式。
? ? ? ??GET請(qǐng)求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里,而POST中的參數(shù)不會(huì)被保留。
? ? ? ??GET請(qǐng)求在URL中傳送的參數(shù)是有長(zhǎng)度限制的,而POST么有。
? ? ? ??對(duì)參數(shù)的數(shù)據(jù)類(lèi)型,GET只接受ASCII字符,而POST沒(méi)有限制。
? ? ? ??GET比POST更不安全,因?yàn)閰?shù)直接暴露在URL上,所以不能用來(lái)傳遞敏感信息。
? ? ? ??GET參數(shù)通過(guò)URL傳遞,POST放在Request body中。

? ? ? ??GET和POST還有一個(gè)重大區(qū)別,簡(jiǎn)單的說(shuō):
? ? ? ??GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包;POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包。
? ? ? ??長(zhǎng)的說(shuō):
? ? ? ??對(duì)于GET方式的請(qǐng)求,瀏覽器會(huì)把http header和data一并發(fā)送出去,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù));
? ? ? ??而對(duì)于POST,瀏覽器先發(fā)送header,服務(wù)器響應(yīng)100 continue,瀏覽器再發(fā)送data,服務(wù)器響應(yīng)200 ok(返回?cái)?shù)據(jù))。
? ? ? ??應(yīng)用的區(qū)別:
? ? ? ??如下情況使用GET方法:客戶(hù)端與服務(wù)端的交互像是一個(gè)提問(wèn)(如查詢(xún)操作、搜索操作、讀操作)
? ? ? ??如下情況使用POST方法:
? ? ? ??1.交互是一個(gè)命令或訂單(order),比提問(wèn)包含更多信息
? ? ? ??2.交互改變了服務(wù)器端的資源并被用戶(hù)察覺(jué),例如訂閱某項(xiàng)服務(wù)
? ? ? ??3.用戶(hù)需要對(duì)交互產(chǎn)生的結(jié)果負(fù)責(zé)

八、Cookie和Session的區(qū)別

? ? ? ? 1.存儲(chǔ)位置不同
? ? ? ? ? ?cookie的數(shù)據(jù)信息存放在客戶(hù)端瀏覽器上。
? ? ? ? ? ?session的數(shù)據(jù)信息存放在服務(wù)器上。
? ? ? ??2.存儲(chǔ)容量不同
? ? ? ? ? ?單個(gè)cookie保存的數(shù)據(jù)<=4KB,一個(gè)站點(diǎn)最多保存20個(gè)Cookie。
? ? ? ? ? ?對(duì)于session來(lái)說(shuō)并沒(méi)有上限,但出于對(duì)服務(wù)器端的性能考慮,session內(nèi)不要存放過(guò)多的東西,并且設(shè)置session刪除機(jī)制。
? ? ? ??3.存儲(chǔ)方式不同
? ? ? ? ? ?cookie中只能保管ASCII字符串,并需要通過(guò)編碼方式存儲(chǔ)為Unicode字符或者二進(jìn)制數(shù)據(jù)。
? ? ? ? ? ?session中能夠存儲(chǔ)任何類(lèi)型的數(shù)據(jù),包括且不限于string,integer,list,map等。
? ? ? ??4.隱私策略不同
? ? ? ? ? ?cookie對(duì)客戶(hù)端是可見(jiàn)的,別有用心的人可以分析存放在本地的cookie并進(jìn)行cookie欺騙,所以它是不安全的。
? ? ? ? ? ?session存儲(chǔ)在服務(wù)器上,對(duì)客戶(hù)端是透明對(duì),不存在敏感信息泄漏的風(fēng)險(xiǎn)。
? ? ? ??5.有效期上不同
? ? ? ? ? ?開(kāi)發(fā)可以通過(guò)設(shè)置cookie的屬性,達(dá)到使cookie長(zhǎng)期有效的效果。
? ? ? ? ? ?session依賴(lài)于名為JSESSIONID的cookie,而cookie JSESSIONID的過(guò)期時(shí)間默認(rèn)為-1,只需關(guān)閉窗口該session就會(huì)失效,因而session不能達(dá)到長(zhǎng)期有效的效果。
? ? ? ??6.服務(wù)器壓力不同
? ? ? ? ? ?cookie保管在客戶(hù)端,不占用服務(wù)器資源。對(duì)于并發(fā)用戶(hù)十分多的網(wǎng)站,cookie是很好的選擇。
? ? ? ? ? ?session是保管在服務(wù)器端的,每個(gè)用戶(hù)都會(huì)產(chǎn)生一個(gè)session。假如并發(fā)訪(fǎng)問(wèn)的用戶(hù)十分多,會(huì)產(chǎn)生十分多的session,耗費(fèi)大量的內(nèi)存。
? ? ? ??7.瀏覽器支持不同
? ? ? ? ? ?假如客戶(hù)端瀏覽器不支持cookie:
? ? ? ? ? ?cookie是需要客戶(hù)端瀏覽器支持的,假如客戶(hù)端禁用了cookie,或者不支持cookie,則會(huì)話(huà)跟蹤會(huì)失效。關(guān)于WAP上的應(yīng)用,常規(guī)的cookie就派不上用場(chǎng)了。
? ? ? ? ? ?運(yùn)用session需要使用URL地址重寫(xiě)的方式。一切用到session程序的URL都要進(jìn)行URL地址重寫(xiě),否則session會(huì)話(huà)跟蹤還會(huì)失效。
? ? ? ? ? ?假如客戶(hù)端支持cookie:
? ? ? ? ? ?cookie既能夠設(shè)為本瀏覽器窗口以及子窗口內(nèi)有效,也能夠設(shè)為一切窗口內(nèi)有效。
? ? ? ? ? ?session只能在本窗口以及子窗口內(nèi)有效。
? ? ? ??8.跨域支持上不同
? ? ? ? ? ?cookie支持跨域名訪(fǎng)問(wèn)。
? ? ? ? ? ?session不支持跨域名訪(fǎng)問(wèn)。

九、Session的儲(chǔ)存

? ? ? ??1.files
? ? ? ? ? ?文件存儲(chǔ),默認(rèn)存儲(chǔ)方式
? ? ? ? ? ?可通過(guò)設(shè)置session.save_path指定session存儲(chǔ)位置,此方式常見(jiàn),默認(rèn)即可使用。
? ? ? ? 2.redis
? ? ? ? ? ?redis存儲(chǔ),需要安裝redis擴(kuò)展
? ? ? ? ? ?在redis-cli中查看key
? ? ? ? 3.memcached
? ? ? ? ? ?memcached存儲(chǔ),需要安裝memcached擴(kuò)展,此擴(kuò)展再phpinfo中查看名稱(chēng)為memcache

?

本文摘自 :https://www.cnblogs.com/

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >