一、網(wǎng)絡(luò)協(xié)議
國(guó)際標(biāo)準(zhǔn)化組織(International Standard Organization,ISO)公布了開放系統(tǒng)互連參考模型(OSI/RM)。OSI/RM是一種分層的體系結(jié)構(gòu),參考模型共有7層。
TCP/IP(Transmission Control Protocol/Internet Protocol)作為Internet的核心協(xié)議。

二、TCP(Transmission Control Protocol,傳輸控制協(xié)議)
TCP是一種面向連接(連接導(dǎo)向)的、可靠的基于字節(jié)流的傳輸層通信協(xié)議。TCP將用戶數(shù)據(jù)打包成報(bào)文段,它發(fā)送后啟動(dòng)一個(gè)定時(shí)器,另一端收到的數(shù)據(jù)進(jìn)行確認(rèn)、對(duì)失序的數(shù)據(jù)重新排序、丟棄重復(fù)數(shù)據(jù)。
TCP的特點(diǎn)有:
TCP是面向連接的運(yùn)輸層協(xié)議
每一條TCP連接只能有兩個(gè)端點(diǎn),每一條TCP連接只能是點(diǎn)對(duì)點(diǎn)的
TCP提供可靠交付的服務(wù)
TCP提供全雙工通信。數(shù)據(jù)在兩個(gè)方向上獨(dú)立的進(jìn)行傳輸。因此,連接的每一端必須保持每個(gè)方向上的傳輸數(shù)據(jù)序號(hào)。
面向字節(jié)流。面向字節(jié)流的含義:雖然應(yīng)用程序和TCP交互是一次一個(gè)數(shù)據(jù)塊,但TCP把應(yīng)用程序交下來的數(shù)據(jù)僅僅是一連串的無結(jié)構(gòu)的字節(jié)流。
1、TCP頭格式

(1)?? Source Port(源端口號(hào)):數(shù)據(jù)發(fā)起者的端口號(hào),16bit。
(2)?? Destination Port(目的端口號(hào)):數(shù)據(jù)接收者的端口號(hào),16bit。
(3)?? Sequence Number(順序號(hào)碼,Seq):用于在數(shù)據(jù)通信中解決網(wǎng)絡(luò)包亂序(reordering)問題,以保證應(yīng)用層接收到的數(shù)據(jù)不會(huì)因?yàn)榫W(wǎng)絡(luò)上的傳輸問題而亂序(TCP會(huì)用這個(gè)順序號(hào)碼來拼接數(shù)據(jù)),32bit。
(4)?? Acknowledgment Number(確認(rèn)號(hào)碼,ack):是數(shù)據(jù)接收方期望收到發(fā)送方在下一個(gè)報(bào)文段的順序號(hào)碼(Seq),因此確認(rèn)號(hào)碼應(yīng)當(dāng)是上次已成功收到順序號(hào)碼(Seq)加1,32bit。
(5)?? Offset(TCP報(bào)文頭長(zhǎng)度):用于存儲(chǔ)報(bào)文頭中有多少個(gè)32bit(上圖的一行),存儲(chǔ)長(zhǎng)度為4bit,最大可表示(2^3+2^2+2^1+1)*32bit=60bytes的報(bào)文頭。最小取值5,5*32bit=20bytes。
(6)?? Reserved(保留):6bit, 均為0
(7)?? TCP Flags(TCP標(biāo)志位)每個(gè)長(zhǎng)度均為1bit
CWR:壓縮,TCP Flags值0x80。
ECE:擁塞,0x40。
URG:緊急,0x20。當(dāng)URG=1時(shí),表示報(bào)文段中有緊急數(shù)據(jù),應(yīng)盡快傳送。
ACK:確認(rèn),0x10。當(dāng)ACK = 1時(shí),代表這是一個(gè)確認(rèn)的TCP包,取值0則不是確認(rèn)包。
PSH:推送,0x08。當(dāng)發(fā)送端PSH=1時(shí),接收端盡快的交付給應(yīng)用進(jìn)程。
RST:復(fù)位,0x04。當(dāng)RST=1時(shí),表明TCP連接中出現(xiàn)嚴(yán)重差錯(cuò),必須釋放連接,再重新建立連接。
SYN:同步,0x02。在建立連接是用來同步序號(hào)。SYN=1, ACK=0表示一個(gè)連接請(qǐng)求報(bào)文段。SYN=1,ACK=1表示同意建立連接。
FIN:終止,0x01。當(dāng)FIN=1時(shí),表明此報(bào)文段的發(fā)送端的數(shù)據(jù)已經(jīng)發(fā)送完畢,并要求釋放傳輸連接。
(8)?? 窗口:用來控制對(duì)方發(fā)送的數(shù)據(jù)量,通知發(fā)放已確定的發(fā)送窗口上限。
(9)?? 檢驗(yàn)和:該字段檢驗(yàn)的范圍包括頭部和數(shù)據(jù)這兩部分。由發(fā)端計(jì)算和存儲(chǔ),并由收端進(jìn)行驗(yàn)證。
(10) 緊急指針:緊急指針在URG=1時(shí)才有效,它指出本報(bào)文段中的緊急數(shù)據(jù)的字節(jié)數(shù)。
(11) TCP選項(xiàng):長(zhǎng)度可變,最長(zhǎng)可達(dá)40字節(jié)
備注:ISN(Inital Sequence Number):初始化Sequence Number,發(fā)生在建立連接時(shí)。
2、TCP協(xié)議中的三次握手和四次揮手

Seq:是發(fā)送方當(dāng)前報(bào)文的順序號(hào)碼。
ack:是發(fā)送方期望對(duì)方在下次返回報(bào)文中給回的Seq。
建立連接需要三次握手
第一次握手:客戶端向服務(wù)端發(fā)送連接請(qǐng)求包,標(biāo)志位SYN(同步序號(hào))置為1,順序號(hào)碼為X=0。
第二次握手:服務(wù)端收到客戶端發(fā)過來報(bào)文,由SYN=1知道客戶端要求建立聯(lián)機(jī),則為這次連接分配資源。并向客戶端發(fā)送一個(gè)SYN和ACK都置為1的TCP報(bào)文,設(shè)置初始順序號(hào)碼Y=0,將確認(rèn)序號(hào)(ack)設(shè)置為上一次客戶端發(fā)送過來的順序號(hào)(Seq)加1,即X+1 = 0+1=1。
第三次握手:客戶端收到服務(wù)端發(fā)來的包后檢查確認(rèn)號(hào)碼(ack)是否正確,即第一次發(fā)送的Seq加1(X+1=1)。以及標(biāo)志位ACK是否為1。若正確,服務(wù)端再次發(fā)送確認(rèn)包,ACK標(biāo)志位為1,SYN標(biāo)志位為0。確認(rèn)號(hào)碼(ack)=Y+1=0+1=1,發(fā)送順序號(hào)碼(Seq)為X+1=1。Server收到后確認(rèn)號(hào)碼值與ACK=1則連接建立成功,可以傳送數(shù)據(jù)了。
斷開連接需要四次揮手
提醒:中斷連接端可以是Client端,也可以是Server端。只要將下面兩角色互換即可。
第一次揮手:客戶端給服務(wù)端發(fā)送FIN報(bào)文,用來關(guān)閉客戶端到服務(wù)端的數(shù)據(jù)傳送。將標(biāo)志位FIN和ACK置為1,順序號(hào)碼為X=1,確認(rèn)號(hào)碼為Z=1。意思是說”我Client端沒有數(shù)據(jù)要發(fā)給你了,但是如果你還有數(shù)據(jù)沒有發(fā)送完成,則不必急著關(guān)閉Socket,可以繼續(xù)發(fā)送數(shù)據(jù)。所以你先發(fā)送ACK過來?!?/p>
第二次揮手:服務(wù)端收到FIN后,發(fā)回一個(gè)ACK(標(biāo)志位ACK=1),確認(rèn)號(hào)碼為收到的順序號(hào)碼加1,即X=X+1=2。順序號(hào)碼為收到的確認(rèn)號(hào)碼=Z。意思是說“你的FIN請(qǐng)求我收到了,但是我還沒準(zhǔn)備好,請(qǐng)繼續(xù)你等我的消息" 這個(gè)時(shí)候客戶端就進(jìn)入FIN_WAIT狀態(tài),繼續(xù)等待服務(wù)端的FIN報(bào)文。
第三次揮手:當(dāng)服務(wù)端確定數(shù)據(jù)已發(fā)送完成,則向客戶端發(fā)送FIN報(bào)文,關(guān)閉與客戶端的連接。標(biāo)志位FIN和ACK置為1,順序號(hào)碼為Y=1,確認(rèn)號(hào)碼為X=2。意思是告訴Client端“好了,我這邊數(shù)據(jù)發(fā)完了,準(zhǔn)備好關(guān)閉連接了?!?/p>
第四次揮手:客戶端收到服務(wù)器發(fā)送的FIN之后,發(fā)回ACK確認(rèn)(標(biāo)志位ACK=1),確認(rèn)號(hào)碼為收到的順序號(hào)碼加1,即Y+1=2。順序號(hào)碼為收到的確認(rèn)號(hào)碼X=2。意思是“我Client端知道可以關(guān)閉連接了,但是我還是不相信網(wǎng)絡(luò),怕 Server端不知道要關(guān)閉,所以發(fā)送ACK后進(jìn)入TIME_WAIT狀態(tài),如果Server端沒有收到ACK則可以重傳。Client端等待了2MSL后依然沒有收到回復(fù),則證明Server端已正常關(guān)閉,那好,我Client端也可以關(guān)閉連接了。“(在TIME_WAIT狀態(tài)中,如果TCP client端最后一次發(fā)送的ACK丟失了,它將重新發(fā)送。TIME_WAIT狀態(tài)中所需要的時(shí)間是依賴于實(shí)現(xiàn)方法的。典型的值為30秒、1分鐘和2分鐘。等待之后連接正式關(guān)閉,并且所有的資源(包括端口號(hào))都被釋放。)
3、TCP報(bào)文抓取工具:Wireshark
捕獲過濾器中填入表達(dá)式:host www.cnblogs.com and port 80(80等效于http)
有多個(gè)TCP流時(shí)在顯示過濾器中填入表達(dá)式:tcp.stream eq 0 篩選出第一個(gè)TCP流(包含完整的一次TCP連接:三次握手和四次揮手)

每條記錄都有如下協(xié)議層
(1) Frame:?? 物理層的數(shù)據(jù)幀概況
(2)Ethernet II: 數(shù)據(jù)鏈路層以太網(wǎng)幀頭部信息
(3) Internet Protocol Version 4: 互聯(lián)網(wǎng)層IP包頭部信息
(4)Transmission Control Protocol:? 傳輸層的數(shù)據(jù)段頭部信息,此處是TCP
(5) Hypertext Transfer Protocol:? 應(yīng)用層的信息,此處是HTTP協(xié)議
三、HTTP(HyperText Transfer Protocol,超文本傳輸協(xié)議)
HTTP是一個(gè)應(yīng)用層協(xié)議,雖然在2015年已推出HTTP/2版本,并被主要的web瀏覽器和web服務(wù)器支持。但目前使用最廣泛的還是HTTP/1.1版本。
它的主要特點(diǎn)可概括如下:
支持客戶/服務(wù)器模式。
簡(jiǎn)單快速:客戶向服務(wù)器請(qǐng)求服務(wù)時(shí),只需傳送請(qǐng)求方法和路徑。由于HTTP協(xié)議簡(jiǎn)單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。
靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對(duì)象。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。
無連接:無連接的含義是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。
無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。為了解決這個(gè)問題, Web程序引入了Cookie機(jī)制來維護(hù)狀態(tài)。
另外,HTTP請(qǐng)求報(bào)文和響應(yīng)報(bào)文都是由開始行(對(duì)于請(qǐng)求消息,開始行就是請(qǐng)求行,對(duì)于響應(yīng)消息,開始行就是狀態(tài)行),消息報(bào)頭(可選),空行(只有CRLF的行),消息正文(可選)組成。將在下面詳細(xì)講解。
報(bào)文中的數(shù)據(jù)都使用ASCII編碼,各個(gè)字段的長(zhǎng)度是不確定的(除了作為結(jié)尾的CRLF外,不允許出現(xiàn)單獨(dú)的CR或LF字符)。

2、請(qǐng)求報(bào)文樣例

3、請(qǐng)求報(bào)文參數(shù)詳解
請(qǐng)求方法
所有請(qǐng)求方法名稱全為大寫,目前有9種:

請(qǐng)求報(bào)頭域
報(bào)頭域指頭部中的Key,且不分大小寫。

4、響應(yīng)報(bào)文結(jié)構(gòu)
如所見,響應(yīng)報(bào)文結(jié)構(gòu)與請(qǐng)求報(bào)文結(jié)構(gòu)唯一真正的區(qū)別在于第一行中用狀態(tài)信息代替了請(qǐng)求信息。狀態(tài)行(status line)通過提供一個(gè)狀態(tài)碼來說明所請(qǐng)求的資源情況。

5、響應(yīng)報(bào)文樣例

6、響應(yīng)報(bào)文參數(shù)詳解
響應(yīng)狀態(tài)碼
狀態(tài)代碼由三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類別,且有五種可能取值。
1xx:指示信息--表示請(qǐng)求已接收,繼續(xù)處理。
2xx:成功--表示請(qǐng)求已被成功接收、理解、接受。
3xx:重定向--要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作。
4xx:客戶端錯(cuò)誤--請(qǐng)求有語法錯(cuò)誤或請(qǐng)求無法實(shí)現(xiàn)。
5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求。
常用狀態(tài)碼:
200 OK:成功返回狀態(tài),對(duì)應(yīng),GET,PUT,PATCH,DELETE。
201 created? - 成功創(chuàng)建。
302 Found:重定向,新的URL會(huì)在response中的Location中返回,瀏覽器將會(huì)使用新的URL發(fā)出新的Request。
例如在IE中輸入http://www.google.com. HTTP服務(wù)器會(huì)返回304, IE取到Response中Location header的新URL, 又重新發(fā)送了一?個(gè)?Request.
304 Not Modified:代表上次的文檔已經(jīng)被緩存了, 還可以繼續(xù)使用。
400 bad request?? - 請(qǐng)求格式錯(cuò)誤。
401 unauthorized?? - 未授權(quán)。
403 forbidden?? - 鑒權(quán)成功,但是該用戶沒有權(quán)限。
404 not found - 請(qǐng)求的資源不存在。
405 method not allowed - 該http方法不被允許。
410 gone - 這個(gè)url對(duì)應(yīng)的資源現(xiàn)在不可用。
415 unsupported media type - 請(qǐng)求類型錯(cuò)誤。
422 unprocessable entity - 校驗(yàn)錯(cuò)誤時(shí)用。
429 too many request - 請(qǐng)求過多。
500 Internal Server Error:服務(wù)器發(fā)生了不可預(yù)期的錯(cuò)誤。
503 Server Unavailable:服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求,一段時(shí)間后可能恢復(fù)正常。
其它狀態(tài)碼請(qǐng)查閱:?https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
響應(yīng)報(bào)頭域
報(bào)頭域指頭部中的Key,且不分大小寫。

7、HTTP報(bào)文抓取工具
Wireshark、Fiddler、HttpWatch(需結(jié)合IE)、Telnet
Wireshark:
在顯示過濾器中填入表達(dá)式:http and ip.addr == 42.121.252.58 and tcp.port == 80 過濾出http的響應(yīng)和請(qǐng)求流程

8、Session和Cookie
說到HTTP,就不得不提Session和Cookie。但嚴(yán)格來說,Session和Cookie并不是http協(xié)議的一部分。由于HTTP協(xié)議設(shè)計(jì)原則是無狀態(tài)的,但是近年來出現(xiàn)了種種需求,其中cookie的作用就是為了解決HTTP協(xié)議無狀態(tài)的缺陷所作出的努力。后來出現(xiàn)的session機(jī)制則是又一種在客戶端與服務(wù)器之間保持狀態(tài)的解決方案。 具體來說cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案,而session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案。同時(shí)我們也看到,由于采用服務(wù)器端保持狀態(tài)的方案在客戶端也需要保存一個(gè)標(biāo)識(shí),所以session機(jī)制可能需要借助于cookie機(jī)制來達(dá)到保存標(biāo)識(shí)的目的,但實(shí)際上它還有其他選擇。
Session
Session是可以存儲(chǔ)針對(duì)于某一個(gè)用戶的瀏覽器以及通過其當(dāng)前窗口打開的任何窗口具有針對(duì)性的用戶信息存儲(chǔ)機(jī)制。
通常大家認(rèn)為,只要關(guān)閉瀏覽器,session就消失,其實(shí)這是錯(cuò)誤的理解。對(duì)session來說也是一樣的,除非程序通知服務(wù)器刪除一個(gè)session,否則服務(wù)器會(huì)一直保留。由于關(guān)閉瀏覽器不會(huì)導(dǎo)致session被刪除,迫使服務(wù)器為seesion設(shè)置了一個(gè)失效時(shí)間,當(dāng)距離客戶端上一次使用session的時(shí)間超過這個(gè)失效時(shí)間時(shí),服務(wù)器就可以認(rèn)為客戶端已經(jīng)停止了活動(dòng),才會(huì)把session刪除以節(jié)省存儲(chǔ)空間.
(1)第一次訪問某個(gè)web站點(diǎn)資源時(shí),客戶端提交沒有帶SessionID的請(qǐng)求(請(qǐng)求報(bào)文頭沒有Cookie頭域信息)。
而web服務(wù)器會(huì)檢查是否有SessionID過來,沒有則創(chuàng)建SessionID,并根據(jù)web程序自身定義在請(qǐng)求哪個(gè)資源時(shí)添加屬于當(dāng)前會(huì)話的信息(也可為空),這個(gè)信息列表以SessionID作為標(biāo)識(shí)。然后將SessionID返回給客戶端(通過響應(yīng)報(bào)文頭的Set-Cookie頭域)。
(2 )客戶端再次訪問同個(gè)web站點(diǎn)時(shí),提交帶有SessionID的請(qǐng)求(通過Cookie頭域存儲(chǔ)SessionID)。由服務(wù)端判斷session是否失效,如果未失效,可查詢屬于當(dāng)前會(huì)話的信息列表。如果失效,則創(chuàng)建新的session(產(chǎn)生新的SessionID),而原先的session(包含session帶的信息列表)則丟失,無法訪問。

Cookie
保存SessionID的方式可以采用Cookie,這樣在交互過程中瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)SessionID發(fā)回給服務(wù)器。Cookie的命名方式類似于SessionID。有時(shí)Cookie被人為的禁止,所以出現(xiàn)了其他機(jī)制以便在Cookie被禁止時(shí)仍然能夠把SessionID傳遞回服務(wù)器。這種技術(shù)叫做URL重寫,就是把SessionID直接附加在URL路徑的后面,附加方式也有兩種,一種是作為URL路徑的附加信息,表現(xiàn)形式為http://www.wantsoft.com/index.asp;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 。
另一種是作為查詢字符串附加在URL后面,表現(xiàn)形式為http://www.wantsoft.com/index?js ... 99zWpBng!-145788764
聲明:轉(zhuǎn)載于別處,做記錄的搬運(yùn)工。