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