TCP
TCP((Transmission Control Protocol)傳輸控制協(xié)議,是一個面向連接的協(xié)議。TCP是主機對主機層的傳輸控制協(xié)議,提供可靠的連接服務,采用三次握手確認建立一個連接。位碼即tcp標志位,有6種標示:
- SYN(synchronous建立聯(lián)機)
- ACK(acknowledgement 確認)
- PSH(push傳送)
- FIN(finish結(jié)束)
- RST(reset重置)
- URG(urgent緊急)
- Sequence number(順序號碼)
- Acknowledge number(確認號碼)
三次握手過程:
第一次握手:host1發(fā)送一個TCP標志位SYN=1、ACK=0的數(shù)據(jù)包給host2,并隨機會產(chǎn)生一個Sequence number=3233.當host2接收到這個數(shù)據(jù)后,host2由SYN=1可知客戶端是想要建立連接;
第二次握手:host2要對客戶端的聯(lián)機請求進行確認,向host1發(fā)送應答號ACK=1、SYN=1、確認號Acknowledge number=3234(3233+1),此值是host1的序列號加1,還會產(chǎn)生一個隨機的序列號Sequence number=36457,這樣就告訴host1可以進行連接;
第三次握手:host1收到數(shù)據(jù)后檢查Acknowledge number是否是3233+1的值,以及ACK的值是否為1,若為1,host1會發(fā)送ACK=1、確認號碼Acknowledge number=36457,告訴host2,你的請求連接被確認,連接可以建立。
四次揮手過程:
第一次揮手:當傳輸?shù)臄?shù)據(jù)到達尾部時,host1向host2發(fā)送FIN=1標志位;可理解成,host1向host2說,我這邊的數(shù)據(jù)傳送完成了,我準備斷開了連接;
第二次揮手:因TCP的連接是全雙工的雙向連接,關(guān)閉也是要從兩邊關(guān)閉;當host2收到host1發(fā)來的FIN=1的標志位后,host2不會立刻向host1發(fā)送FIND=1的請求關(guān)閉信息,而是先向host1發(fā)送一個ACK=1的應答信息,表示:你請求關(guān)閉的請求我已經(jīng)收到,但我可能還有數(shù)據(jù)沒有完成傳送,你再等下,等我數(shù)據(jù)傳輸完成了我就告訴你;
第三次揮手:host2數(shù)據(jù)傳輸完成,向host1發(fā)送FIN=1,host1收到請求關(guān)閉連接的請求后,host1就明白host2的數(shù)據(jù)已傳輸完成,現(xiàn)在可以斷開連接了,
第四次揮手:host1收到FIND=1后,host1還是怕由于網(wǎng)絡不穩(wěn)定的原因,怕host2不知道他要斷開連接,于是向host2發(fā)送ACK=1確認信息進行確認,把自己設置成TIME_WAIT狀態(tài)并啟動定時器(如果host2沒有收到ACK,host2端TCP的定時器到達后,會要求host1重新發(fā)送ACK),當host2收到ACK后,host2就斷開連接;當host1等待2MLS(2倍報文最大生存時間)后,沒有收到host2的重傳請求后,他就知道host2已收到了ACK,所以host1此時才關(guān)閉自己的連接。這一點我覺得設計得非常巧妙!
HTTP:
TCP協(xié)議對應于傳輸層,而HTTP協(xié)議對應于應用層。Http協(xié)議是建立在TCP協(xié)議基礎之上的,當瀏覽器需要從服務器獲取網(wǎng)頁數(shù)據(jù)的時候,會發(fā)出一次Http請求。Http會通過TCP建立起一個到服務器的連接通道,當本次請求需要的數(shù)據(jù)完畢后,Http會立即將TCP連接斷開,這個過程是很短的。
所以Http連接是一種短連接,是一種無狀態(tài)的連接。所謂的無狀態(tài),是指瀏覽器每次向服務器發(fā)起請求的時候,不是通過一個連接,而是每次都建立一個新的連接。每次請求結(jié)束后,連接就關(guān)閉,相關(guān)的內(nèi)容就釋放了,所以記不住任何狀態(tài),成為無狀態(tài)連接。
HTTP之請求消息Request:
請求行以一個方法符號開頭,以空格分開,后面跟著請求的URI和協(xié)議的版本。
Get請求例子:
第一部分:請求行,用來說明請求類型,要訪問的資源以及所使用的HTTP版本.GET說明請求類型為GET,[/562f25980001b1b106000338.jpg]為要訪問的資源,該行的最后一部分說明使用的是HTTP1.1版本。
第二部分:請求頭部,緊接著請求行(即第一行)之后的部分,用來說明服務器要使用的附加信息
第三部分:空行,請求頭部后面的空行是必須的,即使第四部分的請求數(shù)據(jù)為空,也必須有空行。
第四部分:請求數(shù)據(jù)也叫主體,可以添加任意的其他數(shù)據(jù)。
POST請求例子
第一部分:請求行,第一行明了是post請求,以及http1.1版本。
第二部分:請求頭部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:請求數(shù)據(jù),第八行。
HTTP之響應消息Response:
HTTP響應也由四個部分組成,分別是:狀態(tài)行、消息報頭、空行和響應正文。
第一部分:狀態(tài)行,由HTTP協(xié)議版本號, 狀態(tài)碼, 狀態(tài)消息 三部分組成。
第一行為狀態(tài)行,(HTTP/1.1)表明HTTP版本為1.1版本,狀態(tài)碼為200,狀態(tài)消息為(ok)
第二部分:消息報頭,用來說明客戶端要使用的一些附加信息
第二行和第三行為消息報頭,Date:生成響應的日期和時間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8
第三部分:空行,消息報頭后面的空行是必須的
第四部分:響應正文,服務器返回給客戶端的文本信息。空行后面的html部分為響應正文。
HTTP之狀態(tài)碼:
狀態(tài)代碼有三位數(shù)字組成,第一個數(shù)字定義了響應的類別,共分五種類別:
1xx:指示信息--表示請求已接收,繼續(xù)處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現(xiàn)
5xx:服務器端錯誤--服務器未能實現(xiàn)合法的請求
常見狀態(tài)碼:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經(jīng)授權(quán),這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //服務器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發(fā)生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
HTTP請求方法:
根據(jù)HTTP標準,HTTP請求可以使用多種請求方法。
HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
GET 請求指定的頁面信息,并返回實體主體。
HEAD 類似于get請求,只不過返回的響應中沒有具體的內(nèi)容,用于獲取報頭
POST 向指定資源提交數(shù)據(jù)進行處理請求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
PUT 從客戶端向服務器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容。
DELETE 請求服務器刪除指定的頁面。
CONNECT HTTP/1.1協(xié)議中預留給能夠?qū)⑦B接改為管道方式的代理服務器。
OPTIONS 允許客戶端查看服務器的性能。
TRACE 回顯服務器收到的請求,主要用于測試或診斷。