TCP三次握手
TCP(Transmission Control Protocol) 傳輸控制協(xié)議
TCP是端到端的傳輸控制協(xié)議,,提供可靠的連接服務(wù),采用三次握手方式來建立連接,。
要理解三次握手流程,,需要先了解TCP協(xié)議格式,因為在三次握手過程中,,發(fā)送的都是沒有數(shù)據(jù),,只有報頭信息的TCP報文,通過報頭中某些字段值的不同含義從而實現(xiàn)連接的建立,。TCP報文格式如下:
上述的TCP報文格式中每個字段意義已經(jīng)描述得很清楚,,現(xiàn)針對三次握手中要用到的字段再做簡單描述,
TCP報文格式中有6位的tcp標(biāo)志位,,每個標(biāo)志位對應(yīng)著TCP連接的不同狀態(tài),,完整的6個標(biāo)志位組成了TCP連接的完整狀態(tài)。
具體每個標(biāo)志位的含義如下:
- URG (urgent 緊急 =1時表示Urgent Pointer字段值有效)
- ACK (acknowledgement 確認(rèn) =1表示Acknowledgement number字段值有效)
- PSH (push =1時表示傳送數(shù)據(jù))
- RST (reset =1時表示連接需要復(fù)位)
- SYN( synchronous =1時表示建立連接,,序號同步)
- FIN (finish 結(jié)束 =1時表示終止連接)
三次連接具體過程描述:
第一次握手:Client端發(fā)送標(biāo)志位SYN=1,隨機(jī)產(chǎn)生Seq number=8000的SYN包到Server,,此時Client進(jìn)入SYN_SEND狀態(tài)。Server根據(jù)SYN=1知道Client要求建立TCP連接
第二次握手:Server收到SYN請求后如果允許建立連接,,就向Client發(fā)送Ack number=8001 (Client的Seq Number+1),,隨機(jī)產(chǎn)生Seq Number=15000,狀態(tài)標(biāo)志位,SYN=1,ACK=1的SYN+ACK包,,此時Server進(jìn)入SYN_RECV狀態(tài),。
第三次握手:Client收到SYN+ACK包后檢查Ack number是否正確,是否等于第一次握手中發(fā)送的Seq number+1,同時檢查標(biāo)志位ACK是否為1,,若兩項檢查都正確,,Client會再次發(fā)送Ack number=15001(Server的Seq Number+1),ACK=1的ACK包,Server收到后檢查Ack number值與ACK=1無誤后則連接建立成功,, 此時Client和Server均進(jìn)入ESTABLISHED狀態(tài),。
完成三次握手后Client與Server開始傳送數(shù)據(jù)。
三次握手過程中報頭信息的變化
第一次握手
SYN包沒有攜帶任何數(shù)據(jù),,使用了報頭中SYN標(biāo)志位和Seq number字段,,其中SYN=1標(biāo)志請求建立一個連接
第二次握手
SYN+ACK包也沒有攜帶任何數(shù)據(jù),使用了報頭中的SYN和ACK標(biāo)志位,,以及Seq Number 和 Ack Number字段,,
其中SYN=1標(biāo)志Server端同步初始順序號,以便Server向Client發(fā)送信息。
ACK=1標(biāo)志已確認(rèn)收到SYN包,,同時給出期望從Client端收到的下一個序號,。
需要注意的是在第二次握手中還定義了動態(tài)窗口大小。
第三次握手
ACK包沒有攜帶任何數(shù)據(jù),,使用標(biāo)志位ACK=1以及Seq Number和Ack Number字段,。
|