說道TCP協(xié)議就要先了解一下HTTP網絡協(xié)議棧:
縮寫 | 層 |
---|---|
HTTP | 應用層 |
(TLS or SSL) | 安全層 |
TCP | 傳輸層 |
IP | 網絡層 |
網絡特有的鏈路接口 | 數據鏈路層 |
物理網絡硬件 | 物理層 |
世界上絕大多說的HTTP通信都是由TCP/IP承載的律想。HTTP連接實際上就是TCP連接及其使用規(guī)則。HTTP要傳送一條報文時匆瓜,會以流的形式將報文數據的內容通過
一條打開的TCP連接按序傳輸。
在了解三次握手之前先說一下在握手中用到的名詞:
兩個序號和三個標志位:
- 序號:seq序號,占32位驮吱,用來標識從TCP源端向目的端發(fā)送的字節(jié)流茧妒,發(fā)起方發(fā)送數據對此進行標記。
- 確認序號:ack序號左冬,占32位桐筏,只有ack標志位為1時,確認序號字段才有效拇砰,ack=seq+1
- 標志位:共6個概龄,即URG,ACK,PSH,RST,SYN,FIN等
1. URG(urgent):緊急指針有效
2. ACK(acknowledgement:確認序號有效
3. PSH(push):接收方應該盡快將這個報文交給應用層
4. RST(reset):重置連接
5. SYN(synchronous) :發(fā)起一個新連接
6. FIN(finish):釋放一個連接
需要注意的是:
(A)不要將確認序號ack與標志位中的ACK搞混了胃惜。
(B)確認方ack=發(fā)起方req+1伤柄,兩端配對象泵。
建立一條新的TCP連接時捂手需要經過以下步驟:
- 第一次握手:客戶端會發(fā)送一個SYN(eg:SYN=1)標記還有一個隨機產生的seq number到服務器端,并進入SYN_SENT狀態(tài)瑰枫,等待服務器確認踱葛。
- 第二次握手:服務器端收到了客戶端發(fā)送的SYN標記,如果接受了連接光坝,就會向客戶端返回自己的SYN(eg:SYN=1)標記尸诽,還多一個ACK標記,即SYN+ACK,還有個隨機的seq number盯另,以及ack number=(第一次握手客戶端的seq+1)此時服務器端進入SYN_RECV狀態(tài)
- 第三次握手:客戶端收到服務器端發(fā)送的SYN+ACK,檢查ack number是否正確(即第一次發(fā)送的seq number+1)性含,然后向服務器端返回一條ACK確認信息,以及seq = (第一次客戶端產生的seq+1)ack = (第二次握手服務器端的seq+1)鸳惯,此時客戶端和服務器段進入TCP連接成功狀態(tài)(ESTABLISHED)商蕴,三次握手完畢,然后客戶端跟服務器端就可以開始數據傳輸了悲敷。
在傳輸完數據以后就要開始進行關閉客戶端跟服務器端的連接了,這時候就要用到四次揮手俭令,由于TCP連接是雙向都在工作后德,因此關閉的時候要兩邊同時關閉,這個原則是抄腔,一方完成詩句發(fā)送任務后瓢湃,發(fā)送一個FIN來終止這一方的連接。
收到FIN意味著這個方向不會再有數據流動了赫蛇,但是在這個TCP連接上仍然能夠發(fā)送數據绵患,直到這一方也發(fā)送了FIN。
四次揮手的具體過程:
- 客戶端發(fā)送一個FIN悟耘,用來關閉客戶端到服務器端的數據傳送落蝙,客戶端進入FIN_WAIT_1狀態(tài)
- 服務器端收到FIN后,發(fā)送一個ACK給客戶端,確認序號為收到序號+1筏勒,服務器端進入CLOSE_WAIT狀態(tài)移迫。
- 服務器端發(fā)送一個FIN,用來關閉服務器端和客戶端的數據傳送管行,服務器端進入LAST_ACK狀態(tài)厨埋。
- 客戶端收到FIN后,進入TIME_WAIT狀態(tài)捐顷,接著發(fā)送一個ACK給服務器端荡陷,確認序號為收到序號+1,服務器端進入CLOSED狀態(tài)迅涮,完成四次揮手废赞。