按照我的理解說一下TCP 為什么三次握手而不是兩次握手。
一步一步來。
1. TCP是可靠的
TCP是可靠的傳輸,握手指的是TCP建立鏈接,怎么才可以可靠的建立鏈接呢?
2. 最簡單的建立一個可靠發送通道
A-------->B
A要發送數據給B,如果沒有建立鏈接就直接發送,大概率石沉大海。所以至少要建立鏈接。
A先發一個建立鏈接的請求,B收到后告訴A:“我收到了”。所以需要A發送一次 B發送一次來確保A發送給B是通的。
(這樣真的可靠嗎?也有可能B告訴A“我收到了”后,這個通道不通了,接下來發送數據給B,B收不到,但是這種情況極少,TCP 有其他機制來得知這種情況)
3.AB互相建立鏈接需要發送多少個包
A-------->B
B-------->A
從2得知,A到B建立鏈接需要A給B發一次 B給A發一次兩個包,那么AB互相建立鏈接需要4次,但是,B告訴A它收到了和B請求跟A建立鏈接這兩個包可以合成一個,所以需要3次即可
4.AB互相建立鏈接2個包可以嗎?
從2和3知道,兩個包,兩次握手只能確保單通道是可靠的,TCP是雙工的,需要互相確認都可以發包和收包,所以不能兩次握手。
5.正式的過程
- A向B請求建立鏈接,SYN標志位標記,seq填充為x。
- B收到A的建立請求,然后發送SYN標志位標記,ACK標記,ack=x+1,seq=y 給A
- A收到B的收到包和建立請求包,然后發送ACK標記表示接收到SYN包,ack=y+1,seq=x+1
個人簡介:高級開發工程師,興趣和領域(Unity、Unreal、cocos creator、安卓終端開發、ios終端開發、音視頻開發、圖形學),歡迎加W:wlxklyh 探討問題。(歡迎star:https://github.com/wlxklyh/SoftRenderer)