TCP 傳輸控制協議

2021-06-29 11:33:09 字數 3045 閱讀 5024

推薦 《**tcp/ip》,簡直是程式設計師的福音

tcp 協議是 面向連線的, 可靠的,流傳輸,協議。

流:是指 不間斷 的資料結構,可以想象成排水管道中的水流。

當應用程式採用 tcp 傳送訊息的時候,雖然可以保證傳送的順序,但是還是猶如沒有任何間隔的資料流,傳送給接收端。

可以這麼理解:在傳送端,應用程式傳送了10次 100 位元組的訊息,但是在接收端,應用程式可能會受到乙個1000位元組的連續不間斷的資料。

因此在tcp的通訊中,傳送端應該在自己所要傳送的訊息中設定乙個表示長度,或者間隔的字段資訊

tcp 提供 可靠傳輸,實行「順序控制」「重發控制」機制。此外,還具有「流控制」(流量控制)、「擁塞控制」、用來提高網路利用率等眾多功能。

tcp 協議真的很複雜。

tcp 人如其名, 可以說是 對 「傳輸,傳送,通訊」 進行 「控制」 的 「協議」。

實現了在資料傳輸時候的各種控制功能。

在丟包的時候 進行 重發控制

對亂序的分包 進行 順序重組

面向有連線的協議, 只有在確認通訊對端存在的情況下,才會傳送資料,從而可以控制通訊流量的浪費。

我們一直說,面向連線,那麼到底什麼是連線呢? 我想很多童鞋都會感到迷惑把。

我自己的理解是:

連線 是一種 抽象。

連線 是一種 對概念的抽象。

連線 是一種 對通訊概念的抽象。

比如說: 兩個人打**,只有接通對方的**之後,才可以通話。 可以說**線連線著你們的通訊,只有建立了連線之後,才可以讓對方聽到你的聲音。此時 可以將 連線 想象成乙個 管道,你在管道的一方輸入資料,然後對方就可以得到資料

那麼怎麼理解 tcp 協議是 面向連線 的呢?

可以將 tcp 協議 抽象成這個管道。 為什麼可以抽象成管道呢?

(1) tcp協議幫你確認對方的存在,如果對方不存在,就不能向對方傳送資料。

(2) 你向 tcp協議傳送資料,tcp協議盡最大努力將資料傳送給對方。

(3)你在tcp協議生進行監聽,如果有資料到來,就會通知你。

從這幾點看,tcp協議所實現的功能,和咱們上述說管道的功能十分相似,所以可以 直接 將 tcp 協議抽象成管道,或者抽象成連線。 tcp協議幫你管理這個連線。 所以說 tcp 協議是面向連線的。

官方的解釋為:

連線是指各種裝置、線路、或者網路中進行通訊的兩個應用程式,為了相互傳遞訊息而專有的,虛擬的通訊線路,也叫做虛擬電路。

一旦建立了連線,進行通訊的應用程式只使用這個虛擬的通訊線路傳送和接受資料,就可以保障資訊的傳輸。應用程式不必擔心 ip 網路上可能發生的各種個問題,依然可以**資料。 tcp 則負責,連線的建立,斷開,保持等工作。

官方的解釋很好,需細細品味。

為了通過tcp 資料報,實現可靠傳輸,需要考慮很多問題,

比如,資料的破壞,丟包,重複,以及分片順序混亂等問題。

如果不能解決這些問題,也就無從談起可靠傳輸。

tcp 通過

檢驗和序列號確認應答重發控制連線管理視窗控制等機制來實現可靠傳輸。

要清楚: 這些概念 都是 在一起 協同工作的,離開了乙個都不行。 比如說,有序列號,就必須有確認應答。只有乙個解決不了問題,所以我們在看這些內容的時候,要時不時的以全域性的觀念去思考。

tcp比較複雜,最複雜的機制莫過於超時重傳機制了。什麼條件判斷超時重傳?超時重傳有什麼樣的影響?超時重傳的時間由多少?等等。。。

tcp 超時重傳的時間是多少,linux中最少是200ms,接下來是是指數形式的增加?

最好的文章 1,直接分析到了核心

最好的文章 2

用實驗測試告訴你資料

tcp/ip詳解也是最好的文章了

你看有關 tcp超時重傳就這麼多的內容。。。

有關傳輸層乙個很好地講解

在進行 tcp 程式設計的時候, 比如說,客戶端會阻塞在read()函式,等待資料的到來。 比如go語言func (*tcpconn) read(b byte) (n int, err error)會阻塞,等待資料的到來。 那麼, 在資料的傳送端,比如說 呼叫func (*tcpconn) write(b byte) (n int, err error)1次,每次傳送100位元組,接收端是乙個read()函式迴圈接受資料,會是什麼情況?

情況1: 每次呼叫 write 都會將資料傳送過去, 接收端的 tcp 協議,將資料得到之後 立馬通知read()有資料可以讀,每次可讀取 100位元組。

(1) 這樣會迴圈10次呼叫read()

(2) 每次呼叫read()之後會發生什麼情況?

(3) 這樣的話,如何判斷 資料接受完畢呢(到達檔案尾)?(每乙個tcp客戶端程式,都要while迴圈接受資料嗎?)

很多東西還沒表達出來:

情況2:在接收端 將 1000位元組的資料,組合在一起。然後通知 應用程式有資料可讀。

(1)這樣呼叫一次read()

(2)每一次的write()系統呼叫都會發生什麼呢?

都說tcp是乙個有鏈結的 stream協議,這一點和udp是乙個資料報的協議。 unp 上面說需要自己設定分隔符來進行邊界的判斷。 在這一點上,在程式設計的時候 tcp 和 udp 到底有什麼不同呢?

TCP傳輸控制協議

tcp是網際網路中的傳輸層協議,使用三次握手協議建立連線。當主動方發出syn連線請求後,等待對方回答syn ack 1 並最終對對方的 syn 執行 ack 確認。這種建立連線的方法可以防止產生錯誤的連線,tcp使用的流量控制協議是可變大小的滑動視窗協議 tcp三次握手的過程如下 客戶端傳送syn ...

tcp傳輸控制協議

tcp服務 tcp是面向連線的,提供可靠的服務,對資料有校驗機制。tcp的首部 其格式如下 如上tcp的報文是tcp的首部和tcp的資料。tcp的首部是有源埠和目的埠,這個值和ip首部的源ip和目的ip構成了tcp唯一確定的乙個連線。序號是用來標示從tcp發端向tcp收端傳送的資料位元組。當建立乙個...

TCP 傳輸控制協議

首先tcp和udp都是使用相同的網路層ip,tcp向應用層提供與udp完全不同的服務。tcp是面向連線的,可靠的位元組流服務。面向連線意味著兩個使用tcp的程式進行通訊時首先要進行三次握手連線 tcp的可靠性由他的 頭部和多種方式實現。兩個應用程式通過tcp連線交換8bit位元組 構成 的位元組流。...