為了通過數(shù)據(jù)包實(shí)現(xiàn)可靠性傳輸,需要考慮很多事情,例如數(shù)據(jù)的破壞、丟包、重復(fù)記憶分片順序混亂等問題。如不能解決這些問題,也就無從談起可靠傳輸。
TCP通過檢驗(yàn)和、序列號(hào)、確認(rèn)應(yīng)答、重發(fā)控制、連接管理以及窗口控制等機(jī)制實(shí)現(xiàn)可靠性傳輸。
通過序列號(hào)與確認(rèn)應(yīng)答提高可靠性
在TCP中,當(dāng)發(fā)送端的數(shù)據(jù)到達(dá)接收主機(jī)時(shí),接收端主機(jī)會(huì)番號(hào)一個(gè)已收到消息的通知。這個(gè)消息叫做確認(rèn)應(yīng)答--ACK(Positive Acknowled-gement 意指已經(jīng)接收。)
TCP通過肯定的確認(rèn)應(yīng)答(ACK)實(shí)現(xiàn)可靠的數(shù)據(jù)傳輸。當(dāng)發(fā)送端將數(shù)據(jù)發(fā)生之后會(huì)等待對(duì)端的確認(rèn)應(yīng)答。如果有確認(rèn)應(yīng)答,說明數(shù)據(jù)已經(jīng)成功到達(dá)對(duì)端。反之,則數(shù)據(jù)丟失的可能性很大。
當(dāng)然,在一定時(shí)間內(nèi)沒有等到確認(rèn)應(yīng)答,發(fā)送端就可以認(rèn)為數(shù)據(jù)已經(jīng)丟失,并進(jìn)行重發(fā)。由此,即使產(chǎn)生了丟包,仍然能夠保證數(shù)據(jù)能夠到達(dá)對(duì)端,實(shí)現(xiàn)可靠傳輸。
未收到確認(rèn)應(yīng)答并不意味著數(shù)據(jù)一定丟失。也有可能是數(shù)據(jù)對(duì)方已經(jīng)收到,知識(shí)返回的確認(rèn)應(yīng)答在途中丟失。這種情況也會(huì)導(dǎo)致發(fā)送端因沒有收到確認(rèn)應(yīng)答,而認(rèn)為數(shù)據(jù)沒有到達(dá)目的地,從而進(jìn)行重新發(fā)送,如下圖: