TCP/IP 協(xié)議不是 TCP 和 IP 這兩個(gè)協(xié)議的合稱(chēng),而是指因特網(wǎng)整個(gè) TCP/IP 協(xié)議族。從協(xié)議分層模型方面來(lái)講,TCP/IP 由四個(gè)層次組成:網(wǎng)絡(luò)接口層、網(wǎng)絡(luò)層、傳輸層、應(yīng)用層。
1.1 網(wǎng)絡(luò) 訪問(wèn)層(Network Access Layer)
網(wǎng)絡(luò)訪問(wèn)層(Network Access Layer)在 TCP/IP 參考模型中并沒(méi)有詳細(xì)描述,只是指出主機(jī)必須使用某種協(xié)議與網(wǎng)絡(luò)相連。
1.2. 網(wǎng)絡(luò)層(Internet Layer)
網(wǎng)絡(luò)層(Internet Layer)是整個(gè)體系結(jié)構(gòu)的關(guān)鍵部分,其功能是使主機(jī)可以把分組發(fā)往任何網(wǎng)絡(luò),并使分組獨(dú)立地傳向目標(biāo)。這些分組可能經(jīng)由不同的網(wǎng)絡(luò),到達(dá)的順序和發(fā)送的順序也可能不同。高層如果需要順序收發(fā),那么就必須自行處理對(duì)分組的排序?;ヂ?lián)網(wǎng)層使用因特網(wǎng)協(xié)議(IP,Internet Protocol)。
1.3. 傳輸層(Tramsport Layer-TCP/UDP)
傳輸層(Tramsport Layer)使源端和目的端機(jī)器上的對(duì)等實(shí)體可以進(jìn)行會(huì)話。在這一層定義了兩個(gè)端到端的協(xié)議:傳輸控制協(xié)議(TCP,Transmission Control Protocol)和用戶(hù)數(shù)據(jù)報(bào)協(xié)議(UDP,User Datagram Protocol)。TCP 是面向連接的協(xié)議,它提供可靠的報(bào)文傳輸和對(duì)上層應(yīng)用的連接服務(wù)。為此,除了基本的數(shù)據(jù)傳輸外,它還有可靠性保證、流量控制、多路復(fù)用、優(yōu)先權(quán)和安全性控制等功能。UDP 是面向無(wú)連接的不可靠傳輸?shù)膮f(xié)議,主要用于不需要 TCP 的排序和流量控制等功能的應(yīng)用程序。
1.4. 應(yīng)用層(Application Layer)
應(yīng)用層(Application Layer)包含所有的高層協(xié)議,包括:虛擬終端協(xié)議(TELNET,TELecommunications NETwork)、文件傳輸協(xié)議(FTP,F(xiàn)ile Transfer Protocol)、電子郵件傳輸協(xié)議(SMTP,Simple Mail Transfer Protocol)、域名服務(wù)(DNS,Domain Name Service)、網(wǎng)上新聞傳輸協(xié)議(NNTP,Net News Transfer Protocol)和超文本傳送協(xié)議(HTTP,HyperText Transfer Protocol)等。
TCP 在傳輸之前會(huì)進(jìn)行三次溝通,一般稱(chēng)為“三次握手”,傳完數(shù)據(jù)斷開(kāi)的時(shí)候要進(jìn)行四次溝通,一般稱(chēng)為“四次揮手”。
2.1. 數(shù)據(jù)包說(shuō)明
源端口號(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 位):用來(lái)標(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 的無(wú)符號(hào)數(shù),序號(hào)到達(dá) 2 的 32 次方 - 1 后又從 0 開(kāi)始。當(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)頭長(zhǎng)度( 4 位):給出報(bào)頭中 32bit 字的數(shù)目,它實(shí)際上指明數(shù)據(jù)從哪里開(kāi)始。需要這個(gè)值是因?yàn)槿芜x字段的長(zhǎng)度是可變的。這個(gè)字段占 4bit ,因此 TCP 最多有 60 字節(jié)的首部。然而,沒(méi)有任選字段,正常的長(zhǎng)度是 20 字節(jié)。
保留位( 6 位):保留給將來(lái)使用,目前必須置為 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ū)裝滿(mǎn)。
? RST :用于復(fù)位由于主機(jī)崩潰或其他原因而出現(xiàn)錯(cuò)誤的連接。它還可以用于拒絕非法的報(bào)文段和拒絕連接請(qǐng)求。一般情況下,如果收到一個(gè) RST 為1 的報(bào)文,那么一定發(fā)生了某些問(wèn)題。
? SYN :同步序號(hào),為 1 表示連接請(qǐng)求,用于建立連接和使順序號(hào)同步( synchronize )。
? FIN :用于釋放連接,為 1 表示發(fā)送方已經(jīng)沒(méi)有數(shù)據(jù)發(fā)送了,即關(guān)閉本方數(shù)據(jù)流。
8.窗口大?。?16 位):數(shù)據(jù)字節(jié)數(shù),表示從確認(rèn)號(hào)開(kāi)始,本報(bào)文的源方可以接收的字節(jié)數(shù),即源方接收窗口大小。窗口大小是一個(gè) 16bit 字段,因而窗口大小最大為 65535 字節(jié)。
9.校驗(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)證。
10.緊急指針( 16 位):只有當(dāng) URG 標(biāo)志置 1 時(shí)緊急指針才有效。TCP 的緊急方式是發(fā)送端向另一端發(fā)送緊急數(shù)據(jù)的一種方式。
11.選項(xiàng):最常見(jiàn)的可選字段是最長(zhǎng)報(bào)文大小,又稱(chēng)為 MSS(Maximum Segment Size) 。每個(gè)連接方通常都在通信的第一個(gè)報(bào)文段(為建立連接而設(shè)置 SYN 標(biāo)志的那個(gè)段)中指明這個(gè)選項(xiàng),它指明本端所能接收的最大長(zhǎng)度的報(bào)文段。選項(xiàng)長(zhǎng)度不一定是 32 位字的整數(shù)倍,所以要加填充位,使得報(bào)頭長(zhǎng)度成為整字?jǐn)?shù)。
12.數(shù)據(jù): TCP 報(bào)文段中的數(shù)據(jù)部分是可選的。在一個(gè)連接建立和一個(gè)連接終止時(shí),雙方交換的報(bào)文段僅有 TCP 首部。如果一方?jīng)]有數(shù)據(jù)要發(fā)送,也使用沒(méi)有任何數(shù)據(jù)的首部來(lái)確認(rèn)收到的數(shù)據(jù)。在處理超時(shí)的許多情況中,也會(huì)發(fā)送不帶任何數(shù)據(jù)的報(bào)文段。
2.2. 三次握手
第一次握手:主機(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 則連接建立成功。
2.3. 四次揮手
TCP 建立連接要進(jìn)行三次握手,而斷開(kāi)連接要進(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 來(lái)向另一方通告將要終止個(gè)方向的連接。
1) 關(guān)閉客戶(hù)端到服務(wù)器的連接:首先客戶(hù)端 A 發(fā)送一個(gè) FIN,用來(lái)關(guān)閉客戶(hù)到服務(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ù)器到客戶(hù)端的連接:也是發(fā)送一個(gè) FIN 給客戶(hù)端。
4) 客戶(hù)段收到 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)閉。
聯(lián)系客服