我和大家一起討論下TCP在保證可靠傳輸數(shù)據(jù)的前提下,是怎樣對傳輸?shù)臄?shù)據(jù)進(jìn)行順序化操作的云矫。
大家都知道,TCP提供了最可靠的數(shù)據(jù)傳輸汗菜,它給發(fā)送的每個數(shù)據(jù)包做順序化(這看起來非常煩瑣)让禀,然而,如果TCP沒有這樣煩瑣的操作陨界,那么巡揍,可能會造成更多的麻煩。如造成數(shù)據(jù)包的重傳普碎、順序的顛倒甚至造成數(shù)據(jù)包的丟失吼肥。
那么,TCP具體是通過怎樣的方式來保證數(shù)據(jù)的順序化傳輸呢?
主機(jī)每次發(fā)送數(shù)據(jù)時缀皱,TCP就給每個數(shù)據(jù)包分配一個序列號并且在一個特定的時間內(nèi)等待接收主機(jī)對分配的這個序列號進(jìn)行確認(rèn)斗这,如果發(fā)送主機(jī)在一個特定時間內(nèi)沒有收到接收主機(jī)的確認(rèn),則發(fā)送主機(jī)會重傳此數(shù)據(jù)包啤斗。接收主機(jī)利用序列號對接收的數(shù)據(jù)進(jìn)行確認(rèn)表箭,以便檢測對方發(fā)送的數(shù)據(jù)是否有丟失或者亂序等,接收主機(jī)一旦收到已經(jīng)順序化的數(shù)據(jù)钮莲,它就將這些數(shù)據(jù)按正確的順序重組成數(shù)據(jù)流并傳遞到高層進(jìn)行處理免钻。
具體步驟如下:
(1)為了保證數(shù)據(jù)包的可靠傳遞,發(fā)送方必須把已發(fā)送的數(shù)據(jù)包保留在緩沖區(qū)崔拥;
(2)并為每個已發(fā)送的數(shù)據(jù)包啟動一個超時定時器极舔;
(3)如在定時器超時之前收到了對方發(fā)來的應(yīng)答信息(可能是對本包的應(yīng)答,也可以是對本包后續(xù)包的應(yīng)答)链瓦,則釋放該數(shù)據(jù)包占用的緩沖區(qū);
(4)否則拆魏,重傳該數(shù)據(jù)包,直到收到應(yīng)答或重傳次數(shù)超過規(guī)定的最大次數(shù)為止慈俯。
(5)接收方收到數(shù)據(jù)包后渤刃,先進(jìn)行CRC校驗(yàn),如果正確則把數(shù)據(jù)交給上層協(xié)議贴膘,然后給發(fā)送方發(fā)送一個累計(jì)應(yīng)答包卖子,表明該數(shù)據(jù)已收到,如果接收方正好也有數(shù)據(jù)要發(fā)給發(fā)送方刑峡,應(yīng)答包也可方在數(shù)據(jù)包中捎帶過去洋闽。