推薦 《**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 協議,將資料得到之後 立馬通知都說tcp是乙個有鏈結的 stream協議,這一點和udp是乙個資料報的協議。 unp 上面說需要自己設定分隔符來進行邊界的判斷。 在這一點上,在程式設計的時候 tcp 和 udp 到底有什麼不同呢?read()
有資料可以讀,每次可讀取 100位元組。(1) 這樣會迴圈10次呼叫
read()
(2) 每次呼叫
read()
之後會發生什麼情況?(3) 這樣的話,如何判斷 資料接受完畢呢(到達檔案尾)?(每乙個tcp客戶端程式,都要
while
迴圈接受資料嗎?)很多東西還沒表達出來:
情況2:在接收端 將 1000位元組的資料,組合在一起。然後通知 應用程式有資料可讀。
(1)這樣呼叫一次
read()
(2)每一次的
write()
系統呼叫都會發生什麼呢?
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位元組 構成 的位元組流。...