TCP三向交握
TCP(Transmission Control Protocol) 傳輸控制協定 TCP是端到端的傳輸控制協定,提供可靠的連接配接服務,采用三次握手方式來建立連接配接。 要了解三次握手流程,需要先了解TCP協定格式,因為在三次握手過程中,發送的都是沒有資料,隻有報頭資訊的TCP封包,通過報頭中某些字段值的不同含義進而實作連接配接的建立。TCP封包格式如下:

上述的TCP封包格式中每個字段意義已經描述得很清楚,現針對三次握手中要用到的字段再做簡單描述, TCP封包格式中有6位的tcp标志位,每個标志位對應着TCP連接配接的不同狀态,完整的6個标志位組成了TCP連接配接的完整狀态。 具體每個标志位的含義如下:
URG (urgent 緊急 =1時表示Urgent Pointer字段值有效)
ACK (acknowledgement 确認 =1表示Acknowledgement number字段值有效)
PSH (push =1時表示傳送資料)
RST (reset =1時表示連接配接需要複位)
SYN( synchronous =1時表示建立連接配接,序号同步)
FIN (finish 結束 =1時表示終止連接配接)
三次連接配接具體過程描述:
第一次握手:Client端發送标志位SYN=1,随機産生Seq number=8000的SYN包到Server,此時Client進入SYN_SEND狀态。Server根據SYN=1知道Client要求建立TCP連接配接 第二次握手:Server收到SYN請求後如果允許建立連接配接,就向Client發送Ack number=8001 (Client的Seq Number+1),随機産生Seq Number=15000,狀态标志位,SYN=1,ACK=1的SYN+ACK包,此時Server進入SYN_RECV狀态。 第三次握手:Client收到SYN+ACK包後檢查Ack number是否正确,是否等于第一次握手中發送的Seq number+1,同時檢查标志位ACK是否為1,若兩項檢查都正确,Client會再次發送Ack number=15001(Server的Seq Number+1),ACK=1的ACK包,Server收到後檢查Ack number值與ACK=1無誤後則連接配接建立成功, 此時Client和Server均進入ESTABLISHED狀态。 完成三次握手後Client與Server開始傳送資料。
三次握手過程中報頭資訊的變化
第一次握手 SYN包沒有攜帶任何資料,使用了報頭中SYN标志位和Seq number字段,其中SYN=1标志請求建立一個連接配接 第二次握手 SYN+ACK包也沒有攜帶任何資料,使用了報頭中的SYN和ACK标志位,以及Seq Number 和 Ack Number字段, 其中SYN=1标志Server端同步初始順序号,以便Server向Client發送資訊。 ACK=1标志已确認收到SYN包,同時給出期望從Client端收到的下一個序号。 需要注意的是在第二次握手中還定義了動态視窗大小。 第三次握手 ACK包沒有攜帶任何資料,使用标志位ACK=1以及Seq Number和Ack Number字段。