TCP三次握手
TCP(Transmission Control Protocol) 傳輸控制協(xié)議
TCP是端到端的傳輸控制協(xié)議,提供可靠的連接服務,采用三次握手方式來建立連接。
要理解三次握手流程,需要先了解TCP協(xié)議格式,因為在三次握手過程中,發(fā)送的都是沒有數(shù)據(jù),只有報頭信息的TCP報文,通過報頭中某些字段值的不同含義從而實現(xiàn)連接的建立。TCP報文格式如下:

上述的TCP報文格式中每個字段意義已經描述得很清楚,現(xiàn)針對三次握手中要用到的字段再做簡單描述,
TCP報文格式中有6位的tcp標志位,每個標志位對應著TCP連接的不同狀態(tài),完整的6個標志位組成了TCP連接的完整狀態(tài)。
具體每個標志位的含義如下:
- URG (urgent 緊急 =1時表示Urgent Pointer字段值有效)
- ACK (acknowledgement 確認 =1表示Acknowledgement number字段值有效)
- PSH (push =1時表示傳送數(shù)據(jù))
- RST (reset =1時表示連接需要復位)
- SYN( synchronous =1時表示建立連接,序號同步)
- FIN (finish 結束 =1時表示終止連接)
三次連接具體過程描述:

第一次握手:Client端發(fā)送標志位SYN=1,隨機產生Seq number=8000的SYN包到Server,此時Client進入SYN_SEND狀態(tài)。Server根據(jù)SYN=1知道Client要求建立TCP連接
第二次握手:Server收到SYN請求后如果允許建立連接,就向Client發(fā)送Ack number=8001 (Client的Seq Number+1),隨機產生Seq Number=15000,狀態(tài)標志位,SYN=1,ACK=1的SYN+ACK包,此時Server進入SYN_RECV狀態(tài)。
第三次握手:Client收到SYN+ACK包后檢查Ack number是否正確,是否等于第一次握手中發(fā)送的Seq number+1,同時檢查標志位ACK是否為1,若兩項檢查都正確,Client會再次發(fā)送Ack number=15001(Server的Seq Number+1),ACK=1的ACK包,Server收到后檢查Ack number值與ACK=1無誤后則連接建立成功, 此時Client和Server均進入ESTABLISHED狀態(tài)。
完成三次握手后Client與Server開始傳送數(shù)據(jù)。
三次握手過程中報頭信息的變化
第一次握手
SYN包沒有攜帶任何數(shù)據(jù),使用了報頭中SYN標志位和Seq number字段,其中SYN=1標志請求建立一個連接
第二次握手
SYN+ACK包也沒有攜帶任何數(shù)據(jù),使用了報頭中的SYN和ACK標志位,以及Seq Number 和 Ack Number字段,
其中SYN=1標志Server端同步初始順序號,以便Server向Client發(fā)送信息。
ACK=1標志已確認收到SYN包,同時給出期望從Client端收到的下一個序號。
需要注意的是在第二次握手中還定義了動態(tài)窗口大小。
第三次握手
ACK包沒有攜帶任何數(shù)據(jù),使用標志位ACK=1以及Seq Number和Ack Number字段。
|