1、創建鏈接(三次握手)服務器
第一次握手:創建鏈接時,客戶端發送SYN
(seq=x)包到服務器,並進入SYN_SENT狀態
,等待服務器的確認。SYN:同步序列編號(Synchronize Sequence Numbers)。操作系統
第二次握手:服務器收到SYN包
,必須確認客戶的SYN(ack=x+1),同時本身也發送一個SYN包(seq=y),即發送SYN+ACK包
,此時服務器進入SYN_RECV狀態
;指針
第三次握手:客戶端收到SYN+ACK包
,向服務器發送ACK(ack=y+1)包
,此包發送完畢,客戶端和服務器進入ESTABLISHED狀態
,完成三次握手。code
握手過程當中傳送的包裏不包含數據,三次握手完畢後,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP鏈接一旦創建,在通訊雙方中的任何一方主動關閉鏈接以前,TCP 鏈接都將被一直保持下去。blog
SYN(synchronous創建聯機)、ACK(acknowledgement 確認)、PSH(push傳送)、FIN(finish結束)、RST(reset重置)、 URG(urgent緊急)進程
Sequence number(順序號碼) Acknowledge number(確認號碼)同步
2、關閉鏈接(四次揮手)服務器端
第一次揮手:客戶端發送FIN+ACK包
(序號爲seq=a,確認序號ack=b)給服務端,用來關閉客戶端到服務端的數據傳送,客戶端進入FIN_WAIT_1狀態
。請求
第二次揮手:服務端收到FIN+ACK包
後,發送ACK包
給客戶端進行確認,服務端進入CLOSE_WAIT狀態
。客戶端收到ACK包
後進入FIN_WAIT_2狀態
。到這裏,關閉一個單向通道。程序
第三次揮手:服務端發送FIN+ACK包
給客戶端,服務端進入LAST_ACK狀態
。
第四次揮手:客戶端收到FIN+ACK包
後,發送ACK包
給服務端進行確認,客戶端進入TIME_WAIT狀態
,在等待30秒
(可修改)後進入CLOSED狀態
。服務端收到ACK包後進入CLOSED狀態
,關閉另外一個單向通道。
3、TCP與IP報文結構
●源、目標端口號字段:佔16比特。TCP協議經過使用"端口"來標識源端和目標端的應用進程。端口號能夠使用0到65535之間的任何數字。在收到服務請求時,操做系統動態地爲客戶端的應用程序分配端口號。在服務器端,每種服務在"衆所周知的端口"(Well-Know Port)爲用戶提供服務。
●順序號字段:佔32比特。用來標識從TCP源端向TCP目標端發送的數據字節流,它表示在這個報文段中的第一個數據字節。
●確認號字段:佔32比特。只有ACK標誌爲1時,確認號字段纔有效。它包含目標端所指望收到源端的下一個數據字節。
●頭部長度字段:佔4比特。給出頭部佔32比特的數目。沒有任何選項字段的TCP頭部長度爲20字節;最多能夠有60字節的TCP頭部。
●標誌位字段(U、A、P、R、S、F):佔6比特。各比特的含義以下:
◆URG:緊急指針(urgent pointer)有效。
◆ACK:確認序號有效。
◆PSH:接收方應該儘快將這個報文段交給應用層。
◆RST:重建鏈接。
◆SYN:發起一個鏈接。
◆FIN:釋放一個鏈接。
●窗口大小字段:佔16比特。此字段用來進行流量控制。單位爲字節數,這個值是本機指望一次接收的字節數。
●TCP校驗和字段:佔16比特。對整個TCP報文段,即TCP頭部和TCP數據進行校驗和計算,並由目標端進行驗證。
●緊急指針字段:佔16比特。它是一個偏移量,和序號字段中的值相加表示緊急數據最後一個字節的序號。
●選項字段:佔32比特。可能包括"窗口擴大因子"、"時間戳"等選項。
參考文章:http://aofengblog.blog.163.com/blog/static/631702120152322848786/