TCP實現原理和為什么需要三次握手?兩次握手不可以?四次握手不可以?讀者可以帶著疑問,看一遍本篇博客的詳細講解
ok,首先解釋原因之前還是要先復習一下TCP的基本知識和三次握手協議:
1、什么是TCP協議?
TCP:Transmission Control Protocol翻譯過來就是傳輸控制協議,TCP協議是一個面向連接的、可靠的、基于字節流的傳輸層協議
RFC 793對TCP連接的定義:
Connections:
- The reliability and flow control mechanisms described above require that TCPs initialize and maintain certain status information for each data stream.
- The combination of this information, including sockets, sequence numbers, and window sizes, is called a connection.
其大致意思是TCP連接是為了用于保證可靠性和流控制機制的,包括 Socket、序列號及窗口大小。
其中Socket是由IP加端口組成的,序列號是用來解決亂序問題的,而窗口大小則是用來做流量控制的。
2、TCP協議的特性
- 面向連接:是指TCP是通過服務端和客戶端進行連接的協議
- 面向字節流:TCP服務端和客戶端之間的數據通訊是通過字節流數據傳輸的
- 可靠的:是指TCP服務端客戶端之間的數據傳輸是很穩定的,即使網絡很差的情況,TCP都能保證將數據傳輸到接收方。
ps:TCP傳輸的可靠性得益于TCP會記錄信息的發送狀態,哪些數據收到了,哪些數據沒收到,TCP都是會記錄的,然后哪些丟包的情況,就是發送不成功的情況,TCP會重新發包,所以TCP的可靠性就是這么保證的
3、TCP三次握手執行流程
TCP的三次握手執行過程是面試中的一個很常見的問題,因為這個問題也是計算機的一個很重要的基礎,所以需要認真學習
關鍵字說明:
- SYN:Synchronize Sequence Numbers,同步序列編號
- ACK:Acknowledge Character,確認字符
- SEQ:Sequence Number,序列號
TCP三次握手執行過程:
- 首先,服務端和客戶端都是處于CLOSED狀態的,然后服務端啟動,監聽端口,狀態變為LISTEN(監聽)狀態
- 客戶端為了請求資源,發送連接,發送同步序列號SYN,此時客戶端就變成了SYN-SEND狀態
- 服務端接收到客戶端請求之后,發送SYN和ACK,然后服務端狀態就變成SYN-RCVD狀態
- 客戶端接收到信息之后,再次發送ACK,然后變成ESTABLISHED(已確認)狀態,服務端接收到返回信息后,狀態也變成ESTABLISHED(已確認)狀態
4、TCP協議為什么需要三次握手?
ok,知道了TCP的三次握手的基本工作原理之后,就可以解釋為什么TCP需要三次握手?為什么不設計成兩次握手就可以?
原因:避免重復連接
其實在RFC 793 Transmission Control Protocol里就有指出為什么要三次握手的原因
The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.
翻譯為中文大致意思是主要原因是為了防止舊的重復連接引起連接混亂問題
比如在網絡環境比較復雜的情況,客戶端可能會連續發送多次請求。如果只設計成兩次握手的情況,服務端只能一直接收請求,然后返回請求信息,也不知道客戶端是否請求成功。這些過期請求的話就會造成網絡連接的混亂。
所以設計成三次握手的情況,客戶端在接收到服務端SEQ+1的返回消息之后,就會知道這個連接是歷史連接,所以會發送報文給服務端,告訴服務端。
所以TCP設計成三次握手的目的就是為了避免重復連接。
然后可以設計成四次握手?五次握手?不可以?
答案是也是可以的,不過為了節省資源,三次握手就可以符合實際情況,所以就沒必要設計成四次握手、五次握手等等情況
原文地址:https://www.toutiao.com/a7002147111685161509/