終于看到了TCP協(xié)議,這是TCP/IP詳解里面最重要也是最精彩的部分,要花大力氣來讀,
TCP/IP詳解學(xué)習(xí)筆記(9)TCP協(xié)議概述
。前面的TFTP和BOOTP都是一些簡單的協(xié)議,就不寫筆記了,寫起來也沒啥東西。TCP和UDP處在同一層---運(yùn)輸層,但是TCP和UDP最不同的地方是,TCP提供了一種可靠的數(shù)據(jù)傳輸服務(wù),TCP是面向連接的,也就是說,利用TCP通信的兩臺(tái)主機(jī)首先要經(jīng)歷一個(gè)“撥打電話”的過程,等到通信準(zhǔn)備結(jié)束才開始傳輸數(shù)據(jù),最后結(jié)束通話。所以TCP要比UDP可靠的多,UDP是把數(shù)據(jù)直接發(fā)出去,而不管對(duì)方是不是在收信,就算是UDP無法送達(dá),也不會(huì)產(chǎn)生ICMP差錯(cuò)報(bào)文,這一經(jīng)時(shí)重申了很多遍了。
把TCP保證可靠性的簡單工作原理摘抄如下
應(yīng)用數(shù)據(jù)被分割成TCP認(rèn)為最適合發(fā)送的數(shù)據(jù)塊。這和UDP完全不同,應(yīng)用程序產(chǎn)生的 數(shù)據(jù)報(bào)長度將保持不變。由TCP傳遞給IP的信息單位稱為報(bào)文段或段(segment)(參見圖1 - 7)。在1 8.4節(jié)我們將看到TCP如何確定報(bào)文段的長度。
當(dāng)TCP發(fā)出一個(gè)段后,它啟動(dòng)一個(gè)定時(shí)器,等待目的端確認(rèn)收到這個(gè)報(bào)文段。如果不能 及時(shí)收到一個(gè)確認(rèn),將重發(fā)這個(gè)報(bào)文段。在第21章我們將了解TCP協(xié)議中自適應(yīng)的超時(shí) 及重傳策略。
當(dāng)TCP收到發(fā)自TCP連接另一端的數(shù)據(jù),它將發(fā)送一個(gè)確認(rèn)。這個(gè)確認(rèn)不是立即發(fā)送,通常將推遲幾分之一秒,這將在1 9.3節(jié)討論。
TCP將保持它首部和數(shù)據(jù)的檢驗(yàn)和。這是一個(gè)端到端的檢驗(yàn)和,目的是檢測數(shù)據(jù)在傳輸 過程中的任何變化,
電腦資料
《TCP/IP詳解學(xué)習(xí)筆記(9)TCP協(xié)議概述》(http://m.clearvueentertainment.com)。如果收到段的檢驗(yàn)和有差錯(cuò),T P將丟棄這個(gè)報(bào)文段和不確認(rèn)收到此報(bào)文段(希望發(fā)端超時(shí)并重發(fā))。既然TCP報(bào)文段作為IP數(shù)據(jù)報(bào)來傳輸,而IP數(shù)據(jù)報(bào)的到達(dá)可能會(huì)失序,因此TCP報(bào)文段 的到達(dá)也可能會(huì)失序。如果必要,TCP將對(duì)收到的數(shù)據(jù)進(jìn)行重新排序,將收到的數(shù)據(jù)以正確的順序交給應(yīng)用層。
TCP還能提供流量控制。TCP連接的每一方都有固定大小的緩沖空間。TCP的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)。這將防止較快主機(jī)致使較慢主機(jī)的緩沖區(qū)溢出。
從這段話中可以看到,TCP中保持可靠性的方式就是超時(shí)重發(fā),這是有道理的,雖然TCP也可以用各種各樣的ICMP報(bào)文來處理這些,但是這也不是可靠的,最可靠的方式就是只要不得到確認(rèn),就重新發(fā)送數(shù)據(jù)報(bào),直到得到對(duì)方的確認(rèn)為止。
TCP的首部和UDP首部一樣,都有發(fā)送端口號(hào)和接收端口號(hào)。但是顯然,TCP的首部信息要比UDP的多,可以看到,TCP協(xié)議提供了發(fā)送和確認(rèn)所需要的所有必要的信息。這在P171-173有詳細(xì)地介紹?梢韵胂笠粋(gè)TCP數(shù)據(jù)的發(fā)送應(yīng)該是如下的一個(gè)過程。
雙方建立連接
發(fā)送方給接受方TCP數(shù)據(jù)報(bào),然后等待對(duì)方的確認(rèn)TCP數(shù)據(jù)報(bào),如果沒有,就重新發(fā),如果有,就發(fā)送下一個(gè)數(shù)據(jù)報(bào)。
接受方等待發(fā)送方的數(shù)據(jù)報(bào),如果得到數(shù)據(jù)報(bào)并檢驗(yàn)無誤,就發(fā)送ACK(確認(rèn))數(shù)據(jù)報(bào),并等待下一個(gè)TCP數(shù)據(jù)報(bào)的到來。直到接收到FIN(發(fā)送完成數(shù)據(jù)報(bào))
中止連接
可以想見,為了建立一個(gè)TCP連接,系統(tǒng)可能會(huì)建立一個(gè)新的進(jìn)程(最差也是一個(gè)線程),來進(jìn)行數(shù)據(jù)的傳送
作者 一塊積木