終於看到了TCP協議,這是TCP/IP詳解裏面最重要也是最精彩的部分,要花大力氣來讀。tcp
簡要介紹線程
TCP和UDP處在同一層---傳輸層,可是TCP和UDP最不一樣的地方是,TCP提供了一種可靠的數據傳輸服務,TCP是面向鏈接的,也就是說,利用TCP通訊的兩臺主機首先要經歷一個「撥打電話」的過程,等到通訊準備結束纔開始傳輸數據,最後結束通話。因此TCP要比UDP可靠的多,UDP是把數據直接發出去,而無論對方是否是在收信,就算是UDP沒法送達,也不會產生ICMP差錯報文,這一經時重申了不少遍了。排序
工做原理進程
把TCP保證可靠性的簡單工做原理摘抄以下:
1. 應用數據被分割成TCP認爲最適合發送的數據塊。這和UDP徹底不一樣,應用程序產生的 數據報長度將保持不變。由TCP傳遞給IP的信息單位稱爲報文段或段( segment)。
2. 當TCP發出一個段後,它啓動一個定時器,等待目的端確認收到這個報文段。若是不能 及時收到一個確認,將重發這個報文段。
3. 當TCP收到發自TCP鏈接另外一端的數據,它將發送一個確認。這個確認不是當即發送,一般將推遲幾分之一秒。
4. TCP將保持它首部和數據的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸 過程當中的任何變化。若是收到段的檢驗和有差錯, T P將丟棄這個報文段和不確認收到此報文段(但願發端超時並重發)。
5. 既然TCP報文段做爲IP數據報來傳輸,而IP數據報的到達可能會失序,所以TCP報文段 的到達也可能會失序。若是必要, TCP將對收到的數據進行從新排序,將收到的數據以正確的順序交給應用層。
6. TCP還能提供流量控制。TCP鏈接的每一方都有固定大小的緩衝空間。TCP的接收端只容許另外一端發送接收端緩衝區所能接納的數據。這將防止較快主機導致較慢主機的緩衝區溢出。
從這段話中能夠看到,TCP中保持可靠性的方式就是超時重發,這是有道理的,雖然TCP也能夠用各類各樣的ICMP報文來處理這些,可是這也不是可靠的,最可靠的方式就是隻要不獲得確認,就從新發送數據報,直到獲得對方的確認爲止。原理
tcp發送過程定時器
TCP的首部和UDP首部同樣,都有發送端口號和接收端口號。可是顯然,TCP的首部信息要比UDP的多,能夠看到,TCP協議提供了發送和確認所須要的全部必要的信息。能夠想象一個TCP數據的發送應該是以下的一個過程。
1. 雙方創建鏈接
2. 發送方給接受方TCP數據報,而後等待對方的確認TCP數據報,若是沒有,就從新發,若是有,就發送下一個數據報。
3. 接受方等待發送方的數據報,若是獲得數據報並檢驗無誤,就發送ACK(確認)數據報,並等待下一個TCP數據報的到來。直到接收到FIN(發送完成數據報)。
4. 停止鏈接
能夠想見,爲了創建一個TCP鏈接,系統可能會創建一個新的進程(最差也是一個線程),來進行數據的傳送。程序