TCP协议及帧格式
參考文章鏈接:http://www.cnblogs.com/lshs/p/6038458.html
TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由IETF的RFC 793定義。
面向連接:在應(yīng)用TCP協(xié)議進(jìn)行通信之前雙方通常需要通過三次握手來建立TCP連接,連接建立后才能進(jìn)行正常的數(shù)據(jù)傳輸,因此廣播和多播不會(huì)承載在TCP協(xié)議上。
可靠性:由于TCP處于多跳通信的IP層之上,而IP層并不提供可靠的傳輸,因此在TCP層看來就有四種常見傳輸錯(cuò)誤問題,分別是比特錯(cuò)誤(packet bit errors)、包亂序(packet reordering)、包重復(fù)(packet duplication)、丟包(packet erasure或稱為packet drops),因此TCP要提供可靠的傳輸,就需要具有超時(shí)與重傳管理、窗口管理、流量控制、擁塞控制等功能。
因此個(gè)人理解可靠性體現(xiàn)在三個(gè)方面,首先TCP通過超時(shí)重傳和快速重傳兩個(gè)常見手段來保證數(shù)據(jù)包的正確傳輸,也就是說接收端在沒有收到數(shù)據(jù)包或者收到錯(cuò)誤的數(shù)據(jù)包的時(shí)候會(huì)觸發(fā)發(fā)送端的數(shù)據(jù)包重傳(處理比特錯(cuò)誤和丟包)。其次TCP接收端會(huì)緩存接收到的亂序到達(dá)數(shù)據(jù),重排序后在向應(yīng)用層提供有序的數(shù)據(jù)(處理包亂序)。最后TCP發(fā)送端會(huì)維持一個(gè)發(fā)送”窗口”動(dòng)態(tài)的調(diào)整發(fā)送速率以適用接收端緩存限制和網(wǎng)絡(luò)擁塞情況,避免了網(wǎng)絡(luò)擁塞或者接收端緩存滿而大量丟包的問題(降低丟包率)。
字節(jié)流式:應(yīng)用層發(fā)送的數(shù)據(jù)會(huì)在TCP的發(fā)送端緩存起來,統(tǒng)一分片(例如一個(gè)應(yīng)用層的數(shù)據(jù)包分成兩個(gè)TCP包)或者打包(例如兩個(gè)或者多個(gè)應(yīng)用層的數(shù)據(jù)包打包成一個(gè)TCP數(shù)據(jù)包)發(fā)送,到接收端的時(shí)候接收端也是直接按照字節(jié)流將數(shù)據(jù)傳遞給應(yīng)用層。作為對比,同樣是傳輸層的協(xié)議,UDP并不會(huì)對應(yīng)用層的數(shù)據(jù)包進(jìn)行打包和分片的操作,一般一個(gè)應(yīng)用層的數(shù)據(jù)包就對應(yīng)一個(gè)UDP包。
TCP報(bào)文格式:
TCP封裝在IP報(bào)文中的時(shí)候,如下圖所示,TCP頭緊接著IP頭(IPV6有擴(kuò)展頭的時(shí)候,則TCP頭在擴(kuò)展頭后面),不攜帶選項(xiàng)(option)的TCP頭長為20bytes,攜帶選項(xiàng)的TCP頭最長可到60bytes。
其中header length字段由4比特構(gòu)成,最大值為15,單位是32比特,即頭長的最大值為15*32 bits = 60bytes,因此上面說攜帶選項(xiàng)的TCP頭長最長為60bytes。
TCP的源端口、目的端口、以及IP層的源IP地址、目的IP地址四元組唯一的標(biāo)識(shí)了一個(gè)TCP連接
TCP各字段釋義:
TCP源端口(Source Port):16位的源端口其中包含發(fā)送方應(yīng)用程序?qū)?yīng)的端口。源端口和源IP地址標(biāo)示報(bào)文發(fā)送端的地址。
TCP目的端口(Destination port):16位的目的端口域定義傳輸?shù)哪康?。這個(gè)端口指明報(bào)文接收計(jì)算機(jī)上的應(yīng)用程序地址接口。
TCP序列號(SequenceNumber):32位的序列號標(biāo)識(shí)了TCP報(bào)文中第一個(gè)byte在對應(yīng)方向的傳輸中對應(yīng)的字節(jié)序號。當(dāng)SYN出現(xiàn),SN=ISN(隨機(jī)值)單位是byte。比如發(fā)送端發(fā)送的一個(gè)TCP包凈荷(不包含TCP頭)為12byte,SN為5,則發(fā)送端接著發(fā)送的下一個(gè)數(shù)據(jù)包的時(shí)候,SN應(yīng)該設(shè)置為5+12=17。通過序列號,TCP接收端可以識(shí)別出重復(fù)接收到的TCP包,從而丟棄重復(fù)包,同時(shí)對于亂序數(shù)據(jù)包也可以依靠系列號進(jìn)行重排序,進(jìn)而對高層提供有序的數(shù)據(jù)流。另外如果接收的包中包含SYN或FIN標(biāo)志位,邏輯上也占用1個(gè)byte,應(yīng)答號需加1。
TCP應(yīng)答號(Acknowledgment Number簡稱ACK Number):32位的ACK Number標(biāo)識(shí)了報(bào)文發(fā)送端期望接收的字節(jié)序列。如果設(shè)置了ACK控制位,這個(gè)值表示一個(gè)準(zhǔn)備接收的包的序列碼,注意是準(zhǔn)備接收的包,比如當(dāng)前接收端接收到一個(gè)凈荷為12byte的數(shù)據(jù)包,SN為5,則會(huì)回復(fù)一個(gè)確認(rèn)收到的數(shù)據(jù)包,如果這個(gè)數(shù)據(jù)包之前的數(shù)據(jù)也都已經(jīng)收到了,這個(gè)數(shù)據(jù)包中的ACK Number則設(shè)置為12+5=17,表示之前的數(shù)據(jù)都已經(jīng)收到了,準(zhǔn)備接受SN=17的數(shù)據(jù)包。
注:關(guān)于TCP序列號和應(yīng)答號,也可以參考文章:http://blog.csdn.net/a19881029/article/details/38091243/
頭長(Header Length):4位包括TCP頭大小,指示TCP頭的長度,即數(shù)據(jù)從何處開始。
保留(Reserved):4位值域,這些位必須是0。為了將來定義新的用途所保留,其中RFC3540將Reserved字段中的最后一位定義為Nonce標(biāo)志。后續(xù)擁塞控制部分的講解我們會(huì)簡單介紹Nonce標(biāo)志位。
標(biāo)志(Code Bits):8位標(biāo)志位,下面介紹。
窗口大小(Window Size):16位,該值指示了從Ack Number開始還愿意接收多少byte的數(shù)據(jù)量,也即用來表示當(dāng)前接收端的接收窗還有多少剩余空間,用于TCP的流量控制。
校驗(yàn)位(Checksum):16位TCP頭。發(fā)送端基于數(shù)據(jù)內(nèi)容計(jì)算一個(gè)數(shù)值,接收端要與發(fā)送端數(shù)值結(jié)果完全一樣,才能證明數(shù)據(jù)的有效性。接收端checksum校驗(yàn)失敗的時(shí)候會(huì)直接丟掉這個(gè)數(shù)據(jù)包。CheckSum是根據(jù)偽頭+TCP頭+TCP數(shù)據(jù)三部分進(jìn)行計(jì)算的。
優(yōu)先指針(緊急,Urgent Pointer):16位,指向后面是優(yōu)先數(shù)據(jù)的字節(jié),在URG標(biāo)志設(shè)置了時(shí)才有效。如果URG標(biāo)志沒有被設(shè)置,緊急域作為填充。
選項(xiàng)(Option):長度不定,但長度必須以是32bits的整數(shù)倍。常見的選項(xiàng)包括MSS、SACK、Timestamp等等。
八位標(biāo)志位分別介紹如下:
CWR(Congestion Window Reduce):擁塞窗口減少標(biāo)志set by sender,用來表明它接收到了設(shè)置ECE標(biāo)志的TCP包。并且sender 在收到消息之后已經(jīng)通過降低發(fā)送窗口的大小來降低發(fā)送速率。
ECE(ECN Echo):ECN響應(yīng)標(biāo)志被用來在TCP3次握手時(shí)表明一個(gè)TCP端是具備ECN功能的。在數(shù)據(jù)傳輸過程中也用來表明接收到的TCP包的IP頭部的ECN被設(shè)置為11。注:IP頭部的ECN被設(shè)置為11表明網(wǎng)絡(luò)線路擁堵。
注:關(guān)于CWR和ECE標(biāo)記為詳細(xì)信息可參考:http://www.cnblogs.com/hadis-yuki/p/5467787.html
URG(Urgent):該標(biāo)志位置位表示緊急(The urgent pointer) 標(biāo)志有效。該標(biāo)志位目前已經(jīng)很少使用參考后面流量控制和窗口管理部分的介紹。
ACK:取值1代表Acknowledgment Number字段有效,這是一個(gè)確認(rèn)的TCP包,取值0則不是確認(rèn)包。后續(xù)文章介紹中當(dāng)ACK標(biāo)志位有效的時(shí)候我們稱呼這個(gè)包為ACK包,使用大寫的ACK稱呼。
PSH(Push):該標(biāo)志置位時(shí),一般是表示發(fā)送端緩存中已經(jīng)沒有待發(fā)送的數(shù)據(jù),接收端不將該數(shù)據(jù)進(jìn)行隊(duì)列處理,而是盡可能快將數(shù)據(jù)轉(zhuǎn)由應(yīng)用處理。在處理 telnet 或 rlogin 等交互模式的連接時(shí),該標(biāo)志總是置位的。
RST(Reset):用于reset相應(yīng)的TCP連接。通常在發(fā)生異?;蛘咤e(cuò)誤的時(shí)候會(huì)觸發(fā)復(fù)位TCP連接。
SYN:同步序列編號(Synchronize Sequence Numbers)有效。該標(biāo)志僅在三次握手建立TCP連接時(shí)有效。
FIN(Finish):No more data from sender。當(dāng)FIN標(biāo)志有效的時(shí)候我們稱呼這個(gè)包為FIN包。
總結(jié)
- 上一篇: kaminari 简要文档
- 下一篇: 通信协议格式