TCP/IP——TCP、TCP首部、TCP在IP數據報中的封裝

一、概念

TCP提供一種面向連接的、可靠的字節流服務。
面向連接 ,TCP一定要有三次握手的建立和四次握手的結束。
可靠 ,TCP傳輸的每一個字節都需要確認。
字節流服務,UDP叫數據報服務 ,應用層不管給UDP多大一個包,UDP就直接在這個基礎之上封裝UDP頭部、IP頭部、以太網頭部,然後發走,網絡上傳輸的數據和應用層給的數據是一一對應的。TCP是叫數據流,應用層給的數據,大了會把它拆小,小了會把它組裝大,然後在網絡上發走,網絡上傳輸的數據和應用層給的數據是沒有關係的。

面向連接意味着兩個使用TCP的應用(通常時一個客戶和一個服務器)在彼此交換數據之前必須先建立一個TCP連接,在一個TCP連接中,僅有兩方進行彼此通信,TCP的連接肯定是 點對點的 ,TCP肯定是不支持組播和廣播的,UDP是可以支持的

應用數據被分隔成TCP認爲最適合發送的數據塊。應用層給的數據,大了會把它拆小,小了會把它組裝大,反正TCP會以它認爲最合適的大小來發送。

當TCP發送出一個段後,它啓動一個定時器,等待目的端的確認收到這個報文段。如果不能即時收到一個確認,將重發這個報文段。

當TCP收到發自TCP連接另一端的數據,它將發送一個確認。這個確認不是立即發送,通常將推遲幾分之一秒。爲什麼要等呢?因爲馬上給確認的話,有點浪費資源,發一個確認也是有消耗的,會有以太網頭部、IP頭部、TCP頭部這些頭部就有幾十個字節,還是會浪費帶寬的,但是如果等一會有可能這邊的主機也有數據要發給另一端,那樣就可以把確認同要發過去的數據用一個數據報一起發走,這樣效率就會更高。

TCP校驗和校驗的是它的首部、僞首部和數據部分

既然TCP報文段作爲IP數據報來傳輸,而IP數據報的到達可能會失序,因此TCP報文段的到達也可能失序。如果必要,TCP將對收到的數據進行重新排序,將收到的數據以正確的順序交給應用層

既然IP數據報會發生重複,TCP的接收端必須丟棄重複的數據

TCP還能夠提供流量控制:

TCP連接的每一方都有固定大小的緩衝空間,目的主機會告訴源端主機它的窗口大小是4096個字節,如果說源端發送的太快,目的端的緩衝空間有可能就滿了,目的主機就會告訴源端主機它的剩餘的緩衝區已經爲0了,當源端知道爲0後就不會再發了,等緩衝區空閒了之後會繼續再發。

TCP的接收端只允許另一端發送接收端緩衝區所能接納的數據。這將防止較快主機導致使較慢主機的緩衝區溢出

TCP的字節流:

兩個應用程序通過TCP連接交換8bit字節構成的字節流。TCP不在字節流中插入記錄標識符。我們將這稱爲字節流服務。如果一方的應用程序先傳10字節,又傳20字節,再傳50字節,連接的另一方將無法瞭解發送方每次發送了多少字節。接收方可以分4次接收這80個字節,每次接收20字節。一端將字節流放到TCP連接上,同樣的字節流將出現在TCP連接的另一端。10+20+50=20+20+20+20

另外,TCP對字節流的內容不作任何解釋。TCP不知道傳輸的數據字節是二進制數據,還是ASCII字符、EBCDIC字符或者其它類型數據。對字節流的解釋由TCP連接雙方的應用層解釋。

二、TCP包首部

在這裏插入圖片描述
在這裏插入圖片描述
源端口和目的端口:各佔2字節.端口是傳輸層與應用層的服務接口.傳輸層的複用和分用功能都要通過端口才能實現,這2個值加上IP首部中的源端IP地址和目的端IP地址唯一確定一個TCP連接(套接字)

序號:Seq序號,佔32位,用來標識從TCP源端向目的端發送的字節流,它表示在這個報文段中的第一個數據字節。如果將字節流看作再兩個應用程序間的單向流動,則TCP用序號對每個字節進行計數數據部分如果有100個字節,seq就會加100,序號是32bit的無符號數,序號達到2的32次方後又從0開始。如果沒有數據只有首部還會加嗎?有可能會加,如果SYN或者FIN被置1就會加。因爲SYN和FIN標誌都是有代價的,SYN標誌和FIN標誌都將消耗一個序號。發送ACK無需任何代價,因爲32bit的確認序號字段和ACK標誌一樣,總是TCP的一部分。因此,我們看到一旦一個鏈接建立起來,這個字段總是被設置,ACK標誌也總是被設置爲1。

確認號:Ack序號,佔32位,只有ACK標誌位爲1時,確認序號字段纔有效,確認序號是上次已成功收到數據字節序號加1。除了三次握手的第一個包SYN包是沒有ACK以外,其餘全部都有ACK位,也就是說除了第一個包以外,其他的包的確認序號都是有意義的。TCP爲應用層提供全雙工服務。這意味數據能在兩個方向上獨立地進行傳輸。因此,連接的每一端必須保持在每個方向上的傳輸數據序號。

首部長度:佔4位,(和IP首部長度一樣)它指出 TCP 報文段的數據起始處距離 TCP 報文段的起始處有多遠.單位是32 位字(以 4 字節爲計算單位)

保留:佔 6 位,保留爲今後使用,但目前應置爲 0。(有些黑客使用這6位上傳數據,來逃避檢測。但是現在有些東西會專門查這6個位,如果這6個位不是0,就會丟棄掉)

緊急URG:當 URG=1 時,表明緊急指針字段有效.它告訴系統此報文段中有緊急數據,應儘快傳送(相當於高優先級的數據)

確認ACK:只有當 ACK=1 時確認號字段纔有效.當 ACK=0 時,確認號無效。不要將確認序號Ack與標誌位中的ACK搞混了。

PSH(Push):接收 TCP 收到 PSH = 1 的報文段,就儘快地交付接收應用進程,而不再等到整個緩存都填滿了後再向上交付,一般現在的PSH位應用程序都不會理睬,收到了就受到了,大家都是一樣的,不能說攜帶了PSH位就要優先,因爲應用層序也無法識別你這個PSH合不合法(惡意使PSH位置1),收到了也需要排隊。

RST (ReSeT):當 RST=1 時,表明 TCP 連接中出現嚴重差錯(如由於主機崩潰或其他原因),必須釋放連接,然後再重新建立運輸連接

同步 SYN:同步 SYN = 1 表示這是一個連接請求或連接接受報文

終止 FIN:用來釋放一個連接.FIN=1 表明此報文段的發送端的數據已發送完畢,並要求釋放運輸連接

窗口大小:佔2個字節,窗口大小就是一個流控的技術,表明了接收方的剩餘緩衝空間的大小。TCP的流量控制由連接的每一端通過聲明的窗口大小來提供。窗口大小是一個16bit字段,因而窗口大小最大爲65535字節。但是有窗口擴大因子來允許這個值按比例變化以提供更大的窗口(原理以後介紹,背景:由於現在的超高速網絡,窗口大小最大爲65535字節已經遠遠不夠使用,因爲在超高速網絡中,一發送數據,接收端就會告訴發送端窗口爲0了,需要等待,一發送就需要等待。這樣效率就會很低,因此有了窗口擴大因子)。如果我的窗口大小是4096個字節,不管你發幾個包過來,在沒得到我的ACK之前,你發的包總的大小最大爲4096個字節。這時候我回復ACK時更改窗口大小爲0時,發送端就不會發送數據,會等待接收端發送一個ACK,告訴發送端窗口大小閒置了。接受方對發送方的速度進行限制,不能超過接收方的緩存空間。

檢驗和:佔2個字節,檢驗和字段檢驗的範圍包括首部和數據這兩部分.在計算檢驗和時,要在 TCP 報文段的前面加上 12 字節的僞首部

緊急指針:佔2個字節,URG須置1,指出在本報文段中緊急數據共有多少個字節(緊急數據放在本報文段數據的最前面)

選項:長度可變.TCP 最初只規定了一種選項,即最大報文段長度 MSS(MTU-IP首部-TCP首部=1460).MSS 告訴對方 TCP:“我的緩存所能接收的報文段的數據字段的最大長度是 MSS 個字節.” [MSS(Maximum Segment Size)是 TCP 報文段中的數據字段的最大長度.數據字段加上 TCP 首部纔等於整個的TCP 報文段]

TCP報文段中的數據部分是可選的

三、TCP數據在IP數據報中的封裝

在這裏插入圖片描述
TCP可以表述爲一沒有選擇確認否認的滑動窗口協議。
我們說TCP缺少選擇確認是因爲TCP首部中的確認序號表示接收方已成功收到字節,但還不包含確認序號所指的字節,無法對數據流中選定的部分進行確認。例如,如果1-1024字節已經成功收到,接收端會發送一個確認號爲1025的報文確認,下一報文段中序號從1025-2048字節的報文因爲什麼原因沒有收到,在重發定時器還沒到期時,2049-3072字節和後續的包已經到了,而且接收端也收到了。這時候接收端不能告訴發送到我接收到了1-1024和2049-3072的包和後續的包,沒有收到1025-2048的包,接收端所能做的就是每接收到一段字節的包後,過幾分之一秒發送確認序號爲1025的ACK給發送端。當發送端多次收到1025的ACK時,就會發現問題,這時候它可能(什麼原因不清楚)會把1025之後的包一起打包成一個大包發送過去。或者等到重發定時器到期時,發送端依次重新發送1025後續的包。
沒有否認,當接收到接收到1-1024字節的包後,在檢查CRC時校驗失敗把包丟了,這時候接收端不能告訴發送端,已經接收到了1~1024字節的包,因爲CRC校驗失敗丟棄了。接收端只能發送一個ACK爲1的包告訴發送端。要求發送端發送從1開始的包。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章