建立TCP連接:三次握手
連接的過(guò)程可以卻確保通信雙方在發(fā)送應用數據包之前靜靜準備好了傳送和接收數據。對于一個(gè)要建立的連
接,通信雙方必須用彼此的初始化序列號seq和來(lái)自對方成功傳輸確認的應答號ack來(lái)同步。(ack號致命希望收到的下一個(gè)八位組的編號)習慣上將同步信號寫(xiě)為SYN,應答信號為ACK。整個(gè)同步的過(guò)程稱(chēng)為三次握手。
1)主機A發(fā)送SYN給主機B:我的序列號seq是X。
2)主機B發(fā)送SYN、ACK給主機A:我的序列號seq是X+1,應答號是X+1(等待接收第X+1號八位組)。
3)主機B發(fā)送SYN、ACK給主機B:我的序列號seq是X+1,應答號是Y+1.
通過(guò)以上3個(gè)步驟(三次握手),TCP連接連接建立,開(kāi)始傳輸數據。任何機器上的TCP都能被動(dòng)地等待握手或主動(dòng)地發(fā)起握手。一旦連接建立,數據可以對等地雙向流動(dòng)。
如果TCP使用1作為每次建立連接的初始化序列號,當本地系統重啟后,遠程系統會(huì )認為以前的連接依然存在。所以每次連接時(shí),主機都會(huì )隨機選擇一個(gè)初始化序列號,用它來(lái)辨別所傳輸的八位組在數據流中的位置。然后雙方要對各自的序列號進(jìn)行協(xié)商,因為接收收到第一個(gè)SYN時(shí),他并不知道這是否一個(gè)被延遲的舊信號。所以它必須要求發(fā)送驗證這個(gè)SYN。
一般情況下,TCP使用最少信息的報文段來(lái)實(shí)現三次握手,這對減少網(wǎng)絡(luò )通信流量是有效的??傊?,三次握手使通信雙方做好了傳輸數據的準備,并且使通信通信雙方統一了初始化序列號。
關(guān)閉TCP連接:改進(jìn)的三次握手
對于一個(gè)已經(jīng)建立的連接,TCP使用改進(jìn)的三次握手來(lái)結束通話(huà)(使用一個(gè)帶有FIN附加標記的報文段)。
1)當主機A的應用程序通知TCP數據已經(jīng)完畢時(shí),TCP向主機B發(fā)送一個(gè)帶有FIN附加標記的報文段(FIN理解為
finish)。
2)主機B收到這個(gè)FIN報文段之后,并不立即用FIN報文段回復主機A,而是向主機A發(fā)送一個(gè)確認ACK,同時(shí)
同時(shí)通知自己相應的應用程序:對方要求關(guān)閉連接(先發(fā)送ACK為了防止在這段時(shí)間內,對方重傳FIN報文段)。
3)主機B的應用程序告訴TCP:我要徹底的關(guān)閉的關(guān)閉連接,TCP向主機A送第二個(gè)FIN報文段。
4)主機A收到第二個(gè)FIN報文段后,向主機B發(fā)送一個(gè)ACK表示連接徹底關(guān)閉。
TCP的可靠性
TCP是面向流的,即數據段被當作字節的序列化進(jìn)行傳輸。
在通過(guò)三次握手建立連接時(shí),序列號被初始化。在傳輸過(guò)程中,TCP繼續使用這個(gè)序列號來(lái)標記每一個(gè)發(fā)送的數據段每發(fā)送一個(gè)數據段,序列號加1.接收站點(diǎn)一句序列號重新組裝縮所收到數據段。為什么要依靠序列號來(lái)重組數據段呢?
例如,在一個(gè)告訴高速鏈路與低速鏈路并存的網(wǎng)絡(luò )上,可能會(huì )出現高速鏈路比低速鏈路上的數據段提前到達的情況,此時(shí)就必須依靠序列號來(lái)重組數據段,這就是序列號的作用之一。
在傳輸過(guò)程中,確認號ACK的作用是告訴發(fā)送端那些數據包已經(jīng)成功接收,并且確認號會(huì )向發(fā)送端指出了接收端希望收到的下一個(gè)數據段的序列號,這種機制稱(chēng)為預期確認,即確認號等于下一個(gè)預期的位元組。
在 TCP/IP網(wǎng)絡(luò )中,存在超時(shí)與重傳兩種現象。如果在傳輸過(guò)程中丟失了某個(gè)序列號的數據段,導致發(fā)送端在給定時(shí)間間隔內得不到那個(gè)數據段的應答,那么那個(gè)丟失數據段就會(huì )被要求重發(fā)。數據段會(huì )被保存在發(fā)送端的緩沖區中,直到發(fā)送端接收到應答號,它才會(huì )釋放這個(gè)緩沖區。這種機制被稱(chēng)為肯定確認與重新傳輸 (Positive Acknowledgement and Retransimission,PAR),他是虛脫通信協(xié)議用來(lái)確??尚哦鹊囊环N技術(shù)。
序列號的第二個(gè)作用就是消除網(wǎng)絡(luò )中的重復包(同步復制)。例如在網(wǎng)絡(luò )擁塞時(shí),發(fā)送端遲遲沒(méi)有收到接收端某個(gè)數據段的ACK包,它可能會(huì )認為這個(gè)序列號的數據段丟失了,于是它會(huì )重新發(fā)送,這種情況可能會(huì )導致接收端在網(wǎng)絡(luò )恢復正常后收到兩個(gè)同樣序列號的數據段,此時(shí)接收端會(huì )自動(dòng)丟棄第二個(gè)一樣數據段。
序列號和應答號為T(mén)CP提供了一種糾錯機制,提高了TCP的可靠性。
評論