1. 程式人生 > >TCP/IP-TCP

TCP/IP-TCP

TCP/IP-TCP

作者:Danbo 2015-8-23

TCP通過以下方式來提供可靠性:
-應用資料被分割成TCP認為最合適傳送的資料塊。
-當TCP發出一個段後,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。
-當TCP收到發自TCP連線另一端的資料,它將傳送一個確認。這個確認不是立即傳送,通常將推遲幾分之一秒。
-TCP將保持它首部和資料的校驗和。注意IP只覆蓋頭部,上層比如UDP、ICMP等都有覆蓋自己頭部和資料的校驗和,這單IP沒有必要再次校驗了。
-既然T C P報文段作為I P資料報來傳輸,而I P資料報的到達可能會失序,因此T C P報文段的到達也可能會失序。如果必要, T C P將對收到的資料進行重新排序,將收到的資料以正確的順序交給應用層。
-既然I P資料報會發生重複, T C P的接收端必須丟棄重複的資料。
-T C P還能提供流量控制。T C P連線的每一方都有固定大小的緩衝空間。T C P的接收端只允許另一端傳送接收端緩衝區所能接納的資料。這將防止較快主機致使較慢主機的緩衝區溢位。
-兩個應用程式通過T C P連線交換8 bit位元組構成的位元組流。T C P不在位元組流中插入記錄識別符號。我們將這稱為位元組流服務( byte stream service

)。

TCP的首部:

注意序列號欄位指成功傳輸一個位元組序列號加1
SYN/FIN標誌消耗一個序號。其他的標誌位都不算。 
對於攻擊者可以利用TCP保留的6bit傳輸控制信令對目標主機進行攻擊。
序列號應當是上次成功收到資料位元組序號加1。只有ACK標誌位置1時確認序號欄位才有效。
傳送ACK無需任何代。ACK除了第一個SYN包沒有外,其他任何包的ACK位都被置為1。
TCP是全雙工,兩個方向都有位元組流,都有序列號。
TCP是沒有選擇確認或選擇否認的滑動視窗協議,不能選擇確認:即收到的資料包中中間某個包沒收到,不能確認每收到包的後一個包;沒有選擇否認,即收到的包中某個包CRC校驗失敗,那麼TCP不能夠告訴傳送端,這個包是錯的,他只能還發送錯誤報之前的包的序列號+1的ACK Sequence包。
TCP最常見的選項欄位是MSS(Maximum Segment Size),每個連線方向通常都在通訊的第一個報文段(為建立連線而設定SYN標誌的那個段)中指明這個選項。它指明本端所能接收的最大長度的報文段,因為發包之前會協商這個引數,這點導致一般情況下TCP資料包不會分片。
TCP報文段中的資料部分是可選的,我們知道在一個連線建立和一個連線終止時,雙方交換的報文段僅有TCP首部。如果一方沒有資料要傳送,也使用沒有任何資料的首部來確認收到的資料。在處理超時的許多情況中,也會發送不帶任何資料的報文段。

當建立一個連線時,每一方都有用於通告它期望接收的M S S選項(M S S選項只能出現在S Y N報文段中)。如果一方不接收來自另一方的M S S值,則M S S就定為預設值5 3 6位元組(這個預設值允許2 0位元組的I P首部和2 0位元組的T C P首部以適合5 7 6位元組I P資料報)。Telnet直連裝置為1460,非直連鏈路為536。一般都小於1500。這個就是TCP一般不會分片的原因,除非中間路由器故意調小MTU值。

客戶端傳送SYN包,包含序列號,不過這個序列號是亂的。你要截獲一個TCP連線還是很困難的,你要知道源目IP,源目埠號,還要知道序列號,而這個初始序列號是隨機出現的,以後資料包的序列號就跟本端所傳輸的資料多少有關係了。而為什麼防火牆要擾亂序列號呢,因為這個序列號在作業系統看來是有一定演算法實現的,這樣就能大概才做序列號範圍(1024-5000之間),這樣防火牆就去擾亂初始化序列號。

TCP建立連線是有超時時間的,第一次大概為6s,第二次

我們在路由器上想要清某個TCP連線可以先:show tcp brief 找到TCP的號,然後:clear tcp tcb +號就可以清掉該連線。

復位報文段:
一般來說,無論何時一個報文段發往基準的連線(Referenced Connection)出現錯誤,TCP都會發出一個復位報文段(這裡的基準連線指的是一個四元組確定的連線。)來終止這個連線。

同時開啟:
即通過四次握手,要注意的是我們沒有將任何一端稱為客戶或伺服器,因為每一端既是客戶又是伺服器。還有一點要注意,同時開啟其埠號的問題:一段埠號為8000連線另一端的80埠,而另一端的80埠連線本段的8000埠,這個埠號與三次握手時一樣,這個不能誤解了。

同時關閉:
兩邊同時發FIN,兩邊都會進入Time_Wait狀態。

TCP的互動資料流
TCP分為互動資料流和成塊資料流,互動資料流我們舉個例子:Rlogin應用,當我們在本端輸入資料的時候,資料是先發送到對端,然後對端接收後返回,然後本端應用程式再打印出之前輸入的資料,這個就是在網路卡的時候出現輸入和顯示出現延遲的原因。

其步驟如下圖所示:

(1)來自客戶的互動按鍵;
(2)來自伺服器的按鍵確認;
(3)來自伺服器的按鍵回顯;(注意密碼是不會回顯的,僅會回覆確認。)
(4)來自客戶的按鍵回顯確認。

通常T C P在接收到資料時並不立即傳送A C K;相反,它推遲傳送,以便將A C K與需要沿該方向傳送的資料一起傳送(有時稱這種現象為資料捎帶A C K)。絕大多數實現採用的時延為200 ms,也就是說,T C P將以最大200 ms 的時延等待是否有資料一起傳送。

納格演算法要求一個TCP連線上最多隻能有一個未被確認的分組,這樣TCP在傳送這些小分組前就會在有線時間內收集這些小分組,然後一起傳送出去。這種一般用在低速鏈路上,高速鏈路用不到。
路由器啟用命令為:service nagle

Telnet和tftp都是明文傳輸的。