有沒想過TCP為什么要先握手再發送數據
再看計算機網絡的時候,始終有一個問題總是弄不明白,那就是TCP為什么要先三次握手,然后再是發送數據,最后在斷開。注意這里的問題是為什么要先,再次強調的是先三次握手在發數據的疑問,而不是把“TCP為什么要先三次握手”放在百度上百度后出現的“TCP為什么不是2或者4次握手的問題”,有時候還真的是不得不吐槽百度的算法還真不如google,下圖為證:
額。。。至于google的搜索由于要用到翻墻的軟件,影響不好就不貼圖了。。。繼續我們得話題,回答一下這個問題吧,當然這是我的感悟,還是那句話“若是有問題,還是請到評論區寫出自己的見解,以免誤人子弟哈”。
要回答這個問題首先得知道TCP報文段的結構,如下圖:
要說的就是TCP報文段中的窗口這16位字段部分,這里窗口的作用就是為了實現流量的控制,為什么會有流量的控制的引入???它是這樣來的:若是發送方發送數據的速度大于了接收方應用程序取數據的速度(假設數據傳輸過程不擁塞)那么,接收方就會出現失貞的現象,也就是把數據覆蓋了,所以數據的發送就要得到控制,就引入了窗口這16位。怎么引入的??
是這樣的:發送方和接收方都有一個緩存區(用來接收從網絡傳來的數據,并提交給應用程序),對于接收方來說,它要維護兩個變量值,一個是應用程序從緩存讀出去的數據(out來表示);另一個是從網絡接收的數據(in來表示),那么在接收方一個緩存里面剩余的空間就是Buffer-(in - out) = window(假設Buffer表示緩存的數量個數,in - out 表示應用程序沒讀的個數,也就是緩存被占用的個數,總的減去占用的就是可以利用的空間的個數用window來表示),那么這個window就是窗口所要寫入的值,接受方會把這個值傳遞給發送方表示我還有多少空間可以利用。
同樣發送方也會有一個緩存,同樣要維持兩個變量值:一個是已經發送的數據個數(send);另一個是已經得到確認的數據個數(acked),那么send - acked就表示已經發送出去了,但是還沒有得到確認的數據的個數,換句話就是正在傳輸的數據(這樣理解好點,但是有點不對),那么要讓接收方緩存數據不被覆蓋,那么正在發送的數據要小于接收方的窗口(send - acked < window)。
寫以上這些是為了深入理解窗口的概念!!!!僅此而已為理解TCP為什么要握手做準備!!!
在簡單說一下三次握手的過程:
- 第一次,客戶機發送TCP短報文。
- 第二次,服務器發送應答,并建立緩存和變量。
- 第三次,客戶機發送應答,并建立緩存和變量。
注意也就是在三次握手時就建立了緩存,那么也就是說,A與B要通信,兩者之間必須先約定好一些參數,比如這里的緩存,那么依據上面的理論來說,建立緩存的目的就是為了避免不可靠的傳輸數據(也就是為了避免數據被覆蓋),所以在傳輸數據之前,兩者之間先做一些約定,換句話就是在做交易時先談好地點和時間,在做交易。
那么,總的來說,所謂的鏈接就是為了分配內存等資源,然后避免不可靠的傳輸,以免污了TCP可靠傳輸的名頭!!!