TCP 三次握手/四次揮手
TCP 在傳輸之前會(huì)進(jìn)行三次溝通,一般稱為“三次握手”,傳完數(shù)據(jù)斷開的時(shí)候要進(jìn)行四次溝通,一般稱為“四次揮手”。
數(shù)據(jù)包說明
-
源端口號(hào)( 16 位):它(連同源主機(jī) IP 地址)標(biāo)識(shí)源主機(jī)的一個(gè)應(yīng)用進(jìn)程。
-
目的端口號(hào)( 16 位):它(連同目的主機(jī) IP 地址)標(biāo)識(shí)目的主機(jī)的一個(gè)應(yīng)用進(jìn)程。這兩個(gè)值加上 IP 報(bào)頭中的源主機(jī) IP 地址和目的主機(jī) IP 地址唯一確定一個(gè) TCP 連接。
-
順序號(hào) seq( 32 位):用來標(biāo)識(shí)從 TCP 源端向 TCP 目的端發(fā)送的數(shù)據(jù)字節(jié)流,它表示在這個(gè)報(bào)文段中的第一個(gè)數(shù)據(jù)字節(jié)的順序號(hào)。如果將字節(jié)流看作在兩個(gè)應(yīng)用程序間的單向流動(dòng),則TCP 用順序號(hào)對(duì)每個(gè)字節(jié)進(jìn)行計(jì)數(shù)。序號(hào)是 32bit 的無符號(hào)數(shù),序號(hào)到達(dá) 2 的 32 次方 - 1 后又從 0 開始。當(dāng)建立一個(gè)新的連接時(shí), SYN 標(biāo)志變 1 ,順序號(hào)字段包含由這個(gè)主機(jī)選擇的該連接的初始順序號(hào) ISN ( Initial Sequence Number )。
-
確認(rèn)號(hào) ack( 32 位):包含發(fā)送確認(rèn)的一端所期望收到的下一個(gè)順序號(hào)。因此,確認(rèn)序號(hào)應(yīng)當(dāng)是上次已成功收到數(shù)據(jù)字節(jié)順序號(hào)加 1 。只有 ACK 標(biāo)志為 1 時(shí)確認(rèn)序號(hào)字段才有效。 TCP 為應(yīng)用層提供全雙工服務(wù),這意味數(shù)據(jù)能在兩個(gè)方向上獨(dú)立地進(jìn)行傳輸。因此,連接的每一端必須保持每個(gè)方向上的傳輸數(shù)據(jù)順序號(hào)。
-
TCP 報(bào)頭長度( 4 位):給出報(bào)頭中 32bit 字的數(shù)目,它實(shí)際上指明數(shù)據(jù)從哪里開始。需要這個(gè)值是因?yàn)槿芜x字段的長度是可變的。這個(gè)字段占 4bit ,因此 TCP 最多有 60 字節(jié)的首部。然而,沒有任選字段,正常的長度是 20 字節(jié)。
-
保留位( 6 位):保留給將來使用,目前必須置為 0 。
-
控制位( control flags , 6 位):在 TCP 報(bào)頭中有 6 個(gè)標(biāo)志比特,它們中的多個(gè)可同時(shí)被設(shè)置為 1 。依次為:
- URG :為 1 表示緊急指針有效,為 0 則忽略緊急指針值。
- ACK :為 1 表示確認(rèn)號(hào)有效,為 0 表示報(bào)文中不包含確認(rèn)信息,忽略確認(rèn)號(hào)字段。
- PSH :為 1 表示是帶有 PUSH 標(biāo)志的數(shù)據(jù),指示接收方應(yīng)該盡快將這個(gè)報(bào)文段交給應(yīng)用層而不用等待緩沖區(qū)裝滿。
- RST :用于復(fù)位由于主機(jī)崩潰或其他原因而出現(xiàn)錯(cuò)誤的連接。它還可以用于拒絕非法的報(bào)文段和拒絕連接請(qǐng)求。一般情況下,如果收到一個(gè) RST 為 1 的報(bào)文,那么一定發(fā)生了某些問題。
- SYN :同步序號(hào),為 1 表示連接請(qǐng)求,用于建立連接和使順序號(hào)同步( synchronize )。
- FIN :用于釋放連接,為 1 表示發(fā)送方已經(jīng)沒有數(shù)據(jù)發(fā)送了,即關(guān)閉本方數(shù)據(jù)流。
-
窗口大?。?16 位):數(shù)據(jù)字節(jié)數(shù),表示從確認(rèn)號(hào)開始,本報(bào)文的源方可以接收的字節(jié)數(shù),即源方接收窗口大小。窗口大小是一個(gè) 16bit 字段,因而窗口大小最大為 65535 字節(jié)。
-
校驗(yàn)和( 16 位):此校驗(yàn)和是對(duì)整個(gè)的 TCP 報(bào)文段,包括 TCP 頭部和 TCP 數(shù)據(jù),以 16 位字進(jìn)行計(jì)算所得。這是一個(gè)強(qiáng)制性的字段,一定是由發(fā)送端計(jì)算和存儲(chǔ),并由接收端進(jìn)行驗(yàn)證。
-
緊急指針( 16 位):只有當(dāng) URG 標(biāo)志置 1 時(shí)緊急指針才有效。TCP 的緊急方式是發(fā)送端向另一端發(fā)送緊急數(shù)據(jù)的一種方式。
-
選項(xiàng):最常見的可選字段是最長報(bào)文大小,又稱為 MSS(Maximum Segment Size) 。每個(gè)連接方通常都在通信的第一個(gè)報(bào)文段(為建立連接而設(shè)置 SYN 標(biāo)志的那個(gè)段)中指明這個(gè)選項(xiàng),它指明本端所能接收的最大長度的報(bào)文段。選項(xiàng)長度不一定是 32 位字的整數(shù)倍,所以要加填充位,使得報(bào)頭長度成為整字?jǐn)?shù)。
-
數(shù)據(jù): TCP 報(bào)文段中的數(shù)據(jù)部分是可選的。在一個(gè)連接建立和一個(gè)連接終止時(shí),雙方交換的報(bào)文段僅有 TCP 首部。如果一方?jīng)]有數(shù)據(jù)要發(fā)送,也使用沒有任何數(shù)據(jù)的首部來確認(rèn)收到的數(shù)據(jù)。在處理超時(shí)的許多情況中,也會(huì)發(fā)送不帶任何數(shù)據(jù)的報(bào)文段。
三次握手
第一次握手:主機(jī) A 發(fā)送位碼為 syn=1,隨機(jī)產(chǎn)生 seq number=1234567 的數(shù)據(jù)包到服務(wù)器,主機(jī) B由 SYN=1 知道,A 要求建立聯(lián)機(jī);
第二次握手:主機(jī) B 收到請(qǐng)求后要確認(rèn)聯(lián)機(jī)信息,向 A 發(fā) 送 ack number=( 主 機(jī) A 的seq+1),syn=1,ack=1,隨機(jī)產(chǎn)生 seq=7654321 的包
第三次握手:主機(jī) A 收到后檢查 ack number 是否正確,即第一次發(fā)送的 seq number+1,以及位碼ack 是否為 1,若正確,主機(jī) A 會(huì)再發(fā)送 ack number=(主機(jī) B 的 seq+1),ack=1,主機(jī) B 收到后確認(rèn)seq 值與 ack=1 則連接建立成功。
四次揮手
TCP 建立連接要進(jìn)行三次握手,而斷開連接要進(jìn)行四次。這是由于 TCP 的半關(guān)閉造成的。因?yàn)?TCP 連接是全雙工的(即數(shù)據(jù)可在兩個(gè)方向上同時(shí)傳遞)所以進(jìn)行關(guān)閉時(shí)每個(gè)方向上都要單獨(dú)進(jìn)行關(guān)閉。這個(gè)單方向的關(guān)閉就叫半關(guān)閉。當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù),就發(fā)送一個(gè) FIN 來向另一方通告將要終止這個(gè)方向的連接。
1) 關(guān)閉客戶端到服務(wù)器的連接:首先客戶端 A 發(fā)送一個(gè) FIN,用來關(guān)閉客戶到服務(wù)器的數(shù)據(jù)傳送,然后等待服務(wù)器的確認(rèn)。其中終止標(biāo)志位 FIN=1,序列號(hào) seq=u
2) 服務(wù)器收到這個(gè) FIN,它發(fā)回一個(gè) ACK,確認(rèn)號(hào) ack 為收到的序號(hào)加 1。
3) 關(guān)閉服務(wù)器到客戶端的連接:也是發(fā)送一個(gè) FIN 給客戶端。
4) 客戶段收到 FIN 后,并發(fā)回一個(gè) ACK 報(bào)文確認(rèn),并將確認(rèn)序號(hào) seq 設(shè)置為收到序號(hào)加 1。 首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方執(zhí)行被動(dòng)關(guān)閉。
主機(jī) A 發(fā)送 FIN 后,進(jìn)入終止等待狀態(tài), 服務(wù)器 B 收到主機(jī) A 連接釋放報(bào)文段后,就立即給主機(jī) A 發(fā)送確認(rèn),然后服務(wù)器 B 就進(jìn)入 close-wait 狀態(tài),此時(shí) TCP 服務(wù)器進(jìn)程就通知高層應(yīng)用進(jìn)程,因而從 A 到 B 的連接就釋放了。此時(shí)是“半關(guān)閉”狀態(tài)。即 A 不可以發(fā)送給文章來源:http://www.zghlxwxcb.cn/news/detail-804617.html
B,但是 B 可以發(fā)送給 A。此時(shí),若 B 沒有數(shù)據(jù)報(bào)要發(fā)送給 A 了,其應(yīng)用進(jìn)程就通知 TCP 釋放連接,然后發(fā)送給 A 連接釋放報(bào)文段,并等待確認(rèn)。A 發(fā)送確認(rèn)后,進(jìn)入 time-wait,注意,此時(shí) TCP 連接還沒有釋放掉,然后經(jīng)過時(shí)間等待計(jì)時(shí)器設(shè)置的 2MSL 后,A 才進(jìn)入到close 狀態(tài)。文章來源地址http://www.zghlxwxcb.cn/news/detail-804617.html
到了這里,關(guān)于TCP 三次握手:四次揮手的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!