置位概念:根據TCP的包頭字段,存在3個重要的標識ACK、SYN、FIN
ACK:表示驗證字段
SYN:位數置1,表示創建TCP鏈接
FIN:位數置1,表示斷開TCP鏈接服務器
三次握手過程說明:
一、由客戶端發送創建TCP鏈接的請求報文,其中報文中包含seq序列號,是由發送端隨機生成的,而且將報文中的SYN字段置爲1,表示須要創建TCP鏈接。(SYN=1,seq=x,x爲隨機生成數值)
二、由服務端回覆客戶端發送的TCP鏈接請求報文,其中包含seq序列號,是由回覆端隨機生成的,而且將SYN置爲1,並且會產生ACK字段,ACK字段數值是在客戶端發送過來的序列號seq的基礎上加1進行回覆,以便客戶端收到信息時,知曉本身的TCP創建請求已獲得驗證。(SYN=1,ACK=x+1,seq=y,y爲隨機生成數值)這裏的ack加1能夠理解爲是確認和誰創建鏈接。
三、客戶端收到服務端發送的TCP創建驗證請求後,會使本身的序列號加1表示,而且再次回覆ACK驗證請求,在服務端發過來的seq上加1進行回覆。(SYN=1,ACK=y+1,seq=x+1)網絡
四次揮手過程說明:
一、客戶端發送斷開TCP鏈接請求的報文,其中報文中包含seq序列號,是由發送端隨機生成的,而且還將報文中的FIN字段置爲1,表示須要斷開TCP鏈接。(FIN=1,seq=x,x由客戶端隨機生成)socket二、服務端會回覆客戶端發送的TCP斷開請求報文,其包含seq序列號,是由回覆端隨機生成的,並且會產生ACK字段,ACK字段數值是在客戶端發過來的seq序列號基礎上加1進行回覆,以便客戶端收到信息時,知曉本身的TCP斷開請求已經獲得驗證。(FIN=1,ACK=x+1,seq=y,y由服務端隨機生成)
三、服務端在回覆完客戶端的TCP斷開請求後,不會立刻進行TCP鏈接的斷開,服務端會先確保斷開前,全部傳輸到A的數據是否已經傳輸完畢,一旦確認傳輸數據完畢,就會將回復報文的FIN字段置1,而且產生隨機seq序列號。(FIN=1,ACK=x+1,seq=z,z由服務端隨機生成)
四、客戶端收到服務端的TCP斷開請求後,會回覆服務端的斷開請求,包含隨機生成的seq字段和ACK字段,ACK字段會在服務端的TCP斷開請求的seq基礎上加1,從而完成服務端請求的驗證回覆。(FIN=1,ACK=z+1,seq=h,h爲客戶端隨機生成)
至此TCP斷開的4次揮手過程完畢tcp
一、一開始,創建鏈接以前服務器和客戶端的狀態都爲CLOSED;
二、服務器建立socket後開始監聽,變爲LISTEN狀態;
三、客戶端請求創建鏈接,向服務器發送SYN報文,客戶端的狀態變味SYN_SENT;
四、服務器收到客戶端的報文後向客戶端發送ACK和SYN報文,此時服務器的狀態變爲SYN_RCVD;
五、而後,客戶端收到ACK、SYN,就向服務器發送ACK,客戶端狀態變爲ESTABLISHED;
六、服務器端收到客戶端的ACK後變爲ESTABLISHED。此時3次握手完成,鏈接創建!ide
因爲TCP鏈接是全雙工的,斷開鏈接會比創建鏈接麻煩一點點。
一、客戶端先向服務器發送FIN報文,請求斷開鏈接,其狀態變爲FIN_WAIT1;
二、服務器收到FIN後向客戶端發送ACK,服務器的狀態圍邊CLOSE_WAIT;
三、客戶端收到ACK後就進入FIN_WAIT2狀態,此時鏈接已經斷開了一半了。若是服務器還有數據要發送給客戶端,就會繼續發送;
四、直到發完數據,就會發送FIN報文,此時服務器進入LAST_ACK狀態;
五、客戶端收到服務器的FIN後,立刻發送ACK給服務器,此時客戶端進入TIME_WAIT狀態;
六、再過了2MSL長的時間後進入CLOSED狀態。服務器收到客戶端的ACK就進入CLOSED狀態。
至此,還有一個狀態沒有出來:CLOSING狀態。
CLOSING狀態表示:
客戶端發送了FIN,可是沒有收到服務器的ACK,卻收到了服務器的FIN,這種狀況發生在服務器發送的ACK丟包的時候,由於網絡傳輸有時會有意外。code
LISTEN:等待從任何遠端TCP 和端口的鏈接請求。 SYN_SENT:發送完一個鏈接請求後等待一個匹配的鏈接請求。 SYN_RECEIVED:發送鏈接請求而且接收到匹配的鏈接請求之後等待鏈接請求確認。 ESTABLISHED:表示一個打開的鏈接,接收到的數據能夠被投遞給用戶。鏈接的數據傳輸階段的正常狀態。 FIN_WAIT_1:等待遠端TCP 的鏈接終止請求,或者等待以前發送的鏈接終止請求的確認。 FIN_WAIT_2:等待遠端TCP 的鏈接終止請求。 CLOSE_WAIT:等待本地用戶的鏈接終止請求。 CLOSING:等待遠端TCP 的鏈接終止請求確認。 LAST_ACK:等待先前發送給遠端TCP 的鏈接終止請求的確認(包括它字節的鏈接終止請求的確認) TIME_WAIT:等待足夠的時間過去以確保遠端TCP 接收到它的鏈接終止請求的確認。 TIME_WAIT 兩個存在的理由: 1.可靠的實現tcp全雙工鏈接的終止; 2.容許老的重複分節在網絡中消逝。 CLOSED:不在鏈接狀態(這是爲方便描述假想的狀態,實際不存在)