引言
我們知道客戶端(Client)A 和服務器端(Server)B 的通信方式可分為:全雙工、半雙工、單工:
- 單工:A 可以發給 B ,B 不能發給 A ,叫做單工
- 半雙工:A 可以發給 B , B 也可以發給 A ,但是兩者的步驟不能同時進行,即 A 給 B 發信息的時候,B 不能給 A 發。
- 全雙工:即客戶端 A 在給服務器端 B 發信息的同時,服務器端 B 也可以給客戶端 A 發送信息。
TCP 屬於全雙工。
TCP 的工作原理
下面小編就帶你們瞭解 TCP 的工作原理是啥?
由前面的知識我們學習到 TCP 有三次握手(前文參考: )。
TCP 的三次握手的示意圖:
具體的含義理解可以這樣看:
1、第一次握手
客戶端想服務器發送一個 SYN 標誌位為1的包,以及初始序號X,包裝在包的頭的序列號字段裡。
客戶端進入 SYN_SEND 狀態,等待服務器端的確認。
2、第二次握手
服務器發回 ACK(確認包),即將SYN和ACK標誌位都命名為1,同時將序列號修改為X+1。
同時自己也發送了一個包,SYN包,序列號(seq =Y),即 SYN +ACK 包。
此時服務器進入
SYN_RECV 狀態。3、第三次握手
客戶端接收到服務器發送過來的(ACK+SYN)包,SYN 標誌位為0。ACK 標誌位為1。
同時把服務器發過來的 ACK 包序列號字段+1並放在包中,發給服務器即 ACK=Y+1。
通俗解釋:
是不是覺得還是很難懂啊,那下面就給你舉個例子。
首先我們假設 A和B 是本次進行通信的雙方。 而發一次信息就代表著一次握手。
- 第一次握手: A 給 B 發微信語音聊天,在嗎?能聽到我講話嗎?
- 第二次握手:B 收到了 A 發來的微信語音通話,然後對A說:嗯,人在的,我能聽見你說的話,你能聽得見我說話嗎,有什麼事情?
- 第三次握手: A 收到了 B 回覆回來的信息語音,我想問你一件事?
然後就開始愉快的聊天了。
兩次握手是否可以?
那我們接下來探究 兩次握手可不可以?
- 第一次握手之後: 服務器端B 可以接收到客戶端A發來來的信息,但是對於客戶端A 來說,它並不能確定自己發送的消息有沒有成功。
- 第二次握手之後: 服務端B 向客戶端A 發送的報文信息,服務器端B可以認為我發送的消息成功了。
- 如果現在沒有第三次握手的話,服務器端B 在進行第二次握手之後,會認為我們的連接時成功的。
但是對於,客戶端A 呢?並不能保證一定能接收到服務器端B發來的信息吧,如果客戶端A沒接受到服務器端發來的信息呢?
客戶端就會認為我們之間的通信沒有建立起來。 這樣的通信過程顯然是不成功的。
如果存在大量的這種情況發生的話,服務器B 會發生崩潰的。
看樣子僅僅兩次握手是不行的,完成不了 TCP 的通信工作原理。
兩次不行,那四次呢?
四次握手行不行?
我們根據上面的 TCP 通信原理可知道,經過三次握手之後,客戶端A 和服務器端B 都可以確認之前他們的所發送的消息,各自都能收到且報文也都成功發送給對方了。
依據上面那個結論可知道,你是四次握手還是五次握手,都是徒勞的。因為經過“三次握手”之後,把該做的事情都做完了。
結論
TCP 的三次握手是經典,計算機上的通信協議也都依據於 TCP 的三次握手和四次揮手。
因為計算機應用直接的通信依據於 HTTP 協議,而 HTTP 實質上是依靠 TCP 協議完成的,這個知識在前面說過。從而形成了:
- TCP 只能是三次握手,不能是兩次,也不能是四次。
- 少於三次握手,不能保證是否建立了通信連接;
- 多於三次握手,都是徒勞和浪費的。
我們看出經過三次握手之後,我們可以得出下面的結論:
- A 可以給B發送消息了,同時A也能接受到B發來的信息;
- 與此同時對於B而言,B也可以給A發送消息,同時B也能接收到A發來的消息。
閱讀更多 老王談運維 的文章