网络:TCP协议
TCP首部格式
tcp數(shù)據(jù)是被封裝在IP數(shù)據(jù)包中的,和udp類似,在IP數(shù)據(jù)包的數(shù)據(jù)部分。
tcp數(shù)據(jù)包的格式如下:?
源端口號(hào)和目的端口號(hào)(尋址)與udp中類似,用于尋找發(fā)端和收端應(yīng)用進(jìn)程。這兩個(gè)值加上IP首部中的源端IP地址和目的端IP地址稱為一個(gè)四元組。
在網(wǎng)絡(luò)編程中,一般一個(gè)IP地址和一個(gè)端口號(hào)組合稱為一個(gè)套接字(socket)。?
序號(hào)(seq):用來標(biāo)識(shí)從TCP發(fā)端向TCP收端發(fā)送的數(shù)據(jù)字節(jié)流,它表示在這個(gè)報(bào)文段中的第一個(gè)數(shù)據(jù)字節(jié)。在tcp中tcp用序號(hào)對(duì)每個(gè)字節(jié)進(jìn)行計(jì)數(shù)(這個(gè)值與發(fā)送的幀數(shù)沒有關(guān)系,而是與發(fā)送的數(shù)據(jù)字節(jié)數(shù)有關(guān)系,后面會(huì)有說明)。?
? ? ? 確認(rèn)序號(hào)(seq+1):包含發(fā)送確認(rèn)的一端所期望收到的下一個(gè)序號(hào)。因此,確認(rèn)序號(hào)應(yīng)當(dāng)是上次已成功收到數(shù)據(jù)字節(jié)序號(hào)加?1(不是單純的序號(hào)加1,還包括數(shù)據(jù)字節(jié)數(shù))。?
? ? ? 首部長度:用于記錄tcp數(shù)據(jù)報(bào)首部的長度,一般為20字節(jié),實(shí)際值為首部長度除以4。?
下面的是標(biāo)志位對(duì)應(yīng)的功能:
URG:?緊急指針(?urgent pointer)有效。?
ACK:?確認(rèn)序號(hào)有效。?
PSH:?接收方應(yīng)該盡快將這個(gè)報(bào)文段交給應(yīng)用層。?
RST:?重建連接。?
SYN:?同步序號(hào)用來發(fā)起一個(gè)連接。?
FIN:?發(fā)端完成發(fā)送任務(wù)。?
窗口大小:用于流量控制。?
檢驗(yàn)和:檢驗(yàn)和覆蓋了整個(gè)的?TCP報(bào)文段:?TCP首部和TCP數(shù)據(jù),與udp相似需要計(jì)算偽首部。
?
(1)每個(gè)TCP段都包括源端和目的端的端口號(hào),用于尋找發(fā)送端和接收端的應(yīng)用進(jìn)程。這兩個(gè)值加上IP首部的源端IP地址和目的端IP地址唯一確定一個(gè)TCP連接。?
(2)序號(hào)用來標(biāo)識(shí)從TCP發(fā)送端向接收端發(fā)送的數(shù)據(jù)字節(jié)流,它表示在這個(gè)報(bào)文段中的第一個(gè)數(shù)據(jù)字節(jié)。如果將字節(jié)流看作在兩個(gè)應(yīng)用程序間的單向流動(dòng),則TCP用序號(hào)對(duì)每個(gè)字節(jié)進(jìn)行計(jì)數(shù)(seq)。?
(3)當(dāng)建立一個(gè)新連接時(shí),SYN標(biāo)志位置1。序號(hào)字段包含由這個(gè)主機(jī)選擇的該連接的初始序號(hào)ISN,該主機(jī)要發(fā)送數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)為這個(gè)ISN加1,因?yàn)镾YN標(biāo)志使用了一個(gè)序號(hào)。?
(4)既然每個(gè)被傳輸?shù)淖止?jié)都被計(jì)數(shù),確認(rèn)序號(hào)包含發(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)字段才有效。(ack)?
(5)發(fā)送ACK無需任何代價(jià),因?yàn)?2位的確認(rèn)序號(hào)字段和ACK標(biāo)志一樣,總是TCP首部的一部分。因此一旦一個(gè)連接建立起來,這個(gè)字段總是被設(shè)置,ACK標(biāo)志也總是被設(shè)置為1。
?
(6)TCP為應(yīng)用層提供全雙工的服務(wù)。因此,連接的每一端必須保持每個(gè)方向上的傳輸數(shù)據(jù)序號(hào)。?
(7)TCP可以表述為一個(gè)沒有選擇確認(rèn)或否認(rèn)的滑動(dòng)窗口協(xié)議。因此TCP首部中的確認(rèn)序號(hào)表示發(fā)送方已成功收到字節(jié),但還不包含確認(rèn)序號(hào)所指的字節(jié)。當(dāng)前還無法對(duì)數(shù)據(jù)流中選定的部分進(jìn)行確認(rèn)。
?
(8)首部長度需要設(shè)置,因?yàn)槿芜x字段的長度是可變的。TCP首部最多60個(gè)字節(jié)。?
(9)6個(gè)標(biāo)志位中的多個(gè)可同時(shí)設(shè)置為1?
◆URG-緊急指針有效?
◆ ACK-確認(rèn)序號(hào)有效?
◆ PSH-接收方應(yīng)盡快將這個(gè)報(bào)文段交給應(yīng)用層?
◆ RST-重建連接?
◆ SYN-同步序號(hào)用來發(fā)起一個(gè)連接?
◆ FIN-發(fā)送端完成發(fā)送任務(wù)?
(10)TCP的流量控制由連接的每一端通過聲明的窗口大小來提供。窗口大小為字節(jié)數(shù),起始于確認(rèn)序號(hào)字段指明的值,這個(gè)值是接收端期望接收的字節(jié)數(shù)。窗口大小是一個(gè)16為的字段,因而窗口大小最大為65535字節(jié)。?
(11)檢驗(yàn)和覆蓋整個(gè)TCP報(bào)文端:TCP首部和TCP數(shù)據(jù)。這是一個(gè)強(qiáng)制性的字段,一定是由發(fā)送端計(jì)算和存儲(chǔ),并由接收端進(jìn)行驗(yàn)證。TCP檢驗(yàn)和的計(jì)算和UDP首部檢驗(yàn)和的計(jì)算一樣,也使用偽首部。?
(12)緊急指針是一個(gè)正的偏移量,序號(hào)字段中的值相加表示緊急數(shù)據(jù)最后一個(gè)字節(jié)的序號(hào)。TCP的緊急方式是發(fā)送端向另一端發(fā)送緊急數(shù)據(jù)的一種方式。 (帶外數(shù)據(jù))
(13)最常見的可選字段是最長報(bào)文大小MSS,每個(gè)連接方通常都在通信的第一個(gè)報(bào)文段中指明這個(gè)選項(xiàng)。它指明本端所能接收的最大長度的報(bào)文段。?
Wireshark抓包分析TCP結(jié)構(gòu)
利用wireshark抓取一個(gè)tcp數(shù)據(jù)包,查看其具體數(shù)據(jù)結(jié)構(gòu)和實(shí)際的數(shù)據(jù):
TCP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。?
面向連接:?面向連接意味著使用tcp的應(yīng)用程序在傳輸數(shù)據(jù)前必須先建立連接,就如打電話一樣,要先進(jìn)行撥號(hào),等待對(duì)方響應(yīng)才能開始說話。?
可靠性:tcp協(xié)議通過下列方式來提高可靠性:?
·????????1.應(yīng)用數(shù)據(jù)被分割成TCP認(rèn)為最適合發(fā)送的數(shù)據(jù)塊。這和UDP完全不同,應(yīng)用程序產(chǎn)生的數(shù)據(jù)報(bào)長度將保持不變。由TCP傳遞給IP的信息單位稱為報(bào)文段或段。(定長)
·????????2.當(dāng)TCP發(fā)出一個(gè)段后,它啟動(dòng)一個(gè)定時(shí)器,等待目的端確認(rèn)收到這個(gè)報(bào)文段。如果不能及時(shí)收到一個(gè)確認(rèn),將重發(fā)這個(gè)報(bào)文段。(定時(shí)重發(fā))
·????????3.當(dāng)TCP收到發(fā)自TCP連接另一端的數(shù)據(jù),它將發(fā)送一個(gè)確認(rèn)。這個(gè)確認(rèn)不是立即發(fā)送,通常將推遲幾分之一秒。(確認(rèn)機(jī)制)
·????????4.TCP將保持它首部和數(shù)據(jù)的檢驗(yàn)和。這是一個(gè)端到端的檢驗(yàn)和,目的是檢測(cè)數(shù)據(jù)在傳輸過程中的任何變化。如果收到段的檢驗(yàn)和有差錯(cuò),TCP將丟棄這個(gè)報(bào)文段和不確認(rèn)收到此報(bào)文段(希望發(fā)端超時(shí)并重發(fā))。(檢驗(yàn)和較檢)
·????????5.既然TCP報(bào)文段作為IP數(shù)據(jù)報(bào)來傳輸,而IP數(shù)據(jù)報(bào)的到達(dá)可能會(huì)失序,因此TCP報(bào)文段的到達(dá)也可能會(huì)失序。如果必要,TCP將對(duì)收到的數(shù)據(jù)進(jìn)行重新排序,將收到的數(shù)據(jù)以正確的順序交給應(yīng)用層。(必要時(shí)重新排序)
·????????6.既然I P數(shù)據(jù)報(bào)會(huì)發(fā)生重復(fù),TCP的接收端必須丟棄重復(fù)的數(shù)據(jù)。(去重)
·????????7.TCP還能提供流量控制。TCP連接的每一方都有固定大小的緩沖空間。TCP的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)。這將防止較快主機(jī)致使較慢主機(jī)的緩沖區(qū)溢出。(流量控制)
? ? ? ? ?8.防止網(wǎng)絡(luò)因?yàn)榇笠?guī)模的通信負(fù)載而癱瘓,其基本方法有理由認(rèn)為網(wǎng)絡(luò)即將進(jìn)入擁塞狀態(tài)時(shí)應(yīng)該減緩TCP傳輸。(擁塞控制)
?
總結(jié)
- 上一篇: 网络:http请求之几种常见技术
- 下一篇: 网络:TCP协议3次握手4次挥手