三次握手在正式情況下都做了什么呢??
第一次握手:
客戶端發(fā)送一個TCP的SYN標志位置1的包指明客戶打算連接的服務器的端口,以及初始序號X,保存在包頭的序列號(Sequence Number)字段里
發(fā)送完成,客戶端進入SYN_SENT狀態(tài),等待服務端確認;

第二次握手?:
服務器發(fā)回確認包(ACK)應答。即SYN標志位和ACK標志位均為1同時,將確認序號(Acknowledgement Number)設置為客戶的I S N加1以.即X+1。
數(shù)據(jù)包發(fā)送給客戶端A以確認連接請求,服務端B進入SYN_RCVD狀態(tài)。

第三次握手:
客戶端再次發(fā)送確認包(ACK) SYN標志位為0,ACK標志位為1.并且把服務器發(fā)來ACK的序號字段+1,放在確定字段中發(fā)送給對方.并且在數(shù)據(jù)段放寫ISN的+1
服務端檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,客戶端A和服務端B進入ESTABLISHED狀態(tài),完成三次握手,隨后客戶端與服務端之間可以開始傳輸數(shù)據(jù)了。

為何三次握手,而不是二次或者四次哪
想明白這一點,必須首先明白,三次握手的分別意義是什么
首先第一次握手,客戶端發(fā)送SYN(同步序列編號Synchronize Sequence Numbers),其實是一個隨機的數(shù)字,其意義就在于確認
服務端是否可以接受到客戶端發(fā)送的消息。
第二次握手,服務端發(fā)送SYN+ACK(確認字符Acknowledge character)數(shù)據(jù)到客戶端,注意這個數(shù)據(jù)包的名字叫SYN/ACK,只所以叫這個名字,就是因為它包含了兩個數(shù)據(jù),
并且兩個數(shù)據(jù)所起到的作用不同,SYN是作為同步序號請求確認,ACK則是回復客戶端請求確認信息。
第三次握手,客戶端發(fā)送ACK數(shù)據(jù),在發(fā)送數(shù)據(jù)之前,客戶端至少要做兩件事,一件事是檢查收到ACK數(shù)據(jù)是否正常,如果正常則回復服務端
的請求確認數(shù)據(jù)SYN一個ACK,這個數(shù)據(jù)值也就是SYN值+1,雙方確認完畢,則表示已經(jīng)建立起了可靠的連接,可以相互傳送數(shù)據(jù)。
雙向通信協(xié)議:
除了以上三次握手的意義,還需要了解一點,TCP是一個雙向通訊協(xié)議,也就是不單單客戶端可以主動發(fā)送消息,服務端也可以主動發(fā)送消息,
這就需要做到一點,就是消息確認是雙向的,不能只是單向的。
解釋:
為什么不是二次或者四次握手
當只有兩次握手時,客戶端已經(jīng)確認了消息可以發(fā)送到服務端,并且可以接收到了服務端的消息。但是對于服務端來說,它并不能確認,
自己主動發(fā)出的消息,能不能被客戶端收到。因此不能兩次握手,因為服務端主動發(fā)送消息,不可靠。
當是四次握手時,就會造成不必要的資源浪費,影響傳輸?shù)男?,三次握手已?jīng)可以保證信息傳輸?shù)目煽啃粤?/p>