亚洲成精品动漫久久精久,九九在线精品视频播放,黄色成人免费观看,三级成人影院,久碰久,四虎成人欧美精品在永久在线

掃一掃
關注微信公眾號

TCP三次握手及原理
2005-09-26   

TCP/IP 是很多的不同的協議組成,實際上是一個協議組,TCP 用戶數據報表協議(也
稱作TCP 傳輸控制協議,Transport Control Protocol。可靠的主機到主機層協議。這里要先
強調一下,傳輸控制協議是OSI 網絡的第四層的叫法,TCP 傳輸控制協議是TCP/IP 傳輸的
6 個基本協議的一種。兩個TCP 意思非相同。)。TCP 是一種可靠的面向連接的傳送服務。
它在傳送數據時是分段進行的,主機交換數據必須建立一個會話。它用比特流通信,即數據
被作為無結構的字節流。通過每個TCP 傳輸的字段指定順序號,以獲得可靠性。是在OSI
參考模型中的第四層,TCP 是使用IP 的網間互聯功能而提供可靠的數據傳輸,IP 不停的把
報文放到網絡上,而TCP 是負責確信報文到達。在協同IP 的操作中TCP 負責:握手過程、
報文管理、流量控制、錯誤檢測和處理(控制),可以根據一定的編號順序對非正常順序的
報文給予從新排列順序。關于TCP 的RFC 文檔有RFC793、RFC791、RFC1700。
在TCP 會話初期,有所謂的“三握手”:對每次發送的數據量是怎樣跟蹤進行協商使
數據段的發送和接收同步,根據所接收到的數據量而確定的數據確認數及數據發送、接收完
畢后何時撤消聯系,并建立虛連接。為了提供可靠的傳送,TCP 在發送新的數據之前,以
特定的順序將數據包的序號,并需要這些包傳送給目標機之后的確認消息。TCP 總是用來
發送大批量的數據。當應用程序在收到數據后要做出確認時也要用到TCP。由于TCP 需要
時刻跟蹤,這需要額外開銷,使得TCP 的格式有些顯得復雜。下面就讓我們看一個TCP 的
經典案例,這是后來被稱為MITNICK 攻擊中KEVIN 開創了兩種攻擊技術:
TCP 會話劫持
SYN FLOOD(同步洪流)
在這里我們討論的時TCP 會話劫持的問題。
先讓我們明白TCP 建立連接的基本簡單的過程。為了建設一個小型的模仿環境我們假
設有3 臺接入互聯網的機器。A 為攻擊者操縱的攻擊機。B 為中介跳板機器(受信任的服務
器)。C 為受害者使用的機器(多是服務器),這里把C 機器鎖定為目標機器。A 機器向B
機器發送SYN 包,請求建立連接,這時已經響應請求的B 機器會向A 機器回應SYN/ACK
表明同意建立連接,當A 機器接受到B 機器發送的SYN/ACK 回應時,發送應答ACK 建立
A 機器與B 機器的網絡連接。這樣一個兩臺機器之間的TCP 通話信道就建立成功了。
B 終端受信任的服務器向C 機器發起TCP 連接,A 機器對服務器發起SYN 信息,使
C 機器不能響應B 機器。在同時A 機器也向B 機器發送虛假的C 機器回應的SYN 數據包,
接收到SYN 數據包的B 機器(被C 機器信任)開始發送應答連接建立的SYN/ACK 數據包,
這時C 機器正在忙于響應以前發送的SYN 數據而無暇回應B 機器,而A 機器的攻擊者預
測出B 機器包的序列號(現在的TCP 序列號預測難度有所加大)假冒C 機器向B 機器發送
應答ACK 這時攻擊者騙取B 機器的信任,假冒C 機器與B 機器建立起TCP 協議的對話連
接。這個時候的C 機器還是在響應攻擊者A 機器發送的SYN 數據。
TCP 協議棧的弱點:TCP 連接的資源消耗,其中包括:數據包信息、條件狀態、序列
號等。通過故意不完成建立連接所需要的三次握手過程,造成連接一方的資源耗盡。
通過攻擊者有意的不完成建立連接所需要的三次握手的全過程,從而造成了C 機器的
資源耗盡。序列號的可預測性,目標主機應答連接請求時返回的SYN/ACK 的序列號時可預
測的。(早期TCP 協議棧,具體的可以參見1981 年出的關于TCP 雛形的RFC793 文檔)
TCP 頭結構
TCP 協議頭最少20 個字節,包括以下的區域(由于翻譯不禁相同,文章中給出
相應的英文單詞):
TCP 源端口(Source Port):16 位的源端口其中包含初始化通信的端口。源端口和
源IP 地址的作用是標示報問的返回地址。
TCP 目的端口(Destination port):16 位的目的端口域定義傳輸的目的。這個端口指
明報文接收計算機上的應用程序地址接口。
TCP 序列號(序列碼,Sequence Number):32 位的序列號由接收端計算機使用,重
新分段的報文成最初形式。當SYN 出現,序列碼實際上是初始序列碼(ISN),而第一個數
據字節是ISN+1。這個序列號(序列碼)是可以補償傳輸中的不一致。
TCP 應答號(Acknowledgment Number):32 位的序列號由接收端計算機使用,重
組分段的報文成最初形式。,如果設置了ACK 控制位,這個值表示一個準備接收的包的序
列碼。
數據偏移量(HLEN):4 位包括TCP 頭大小,指示何處數據開始。
保留(Reserved):6 位值域,這些位必須是0。為了將來定義新的用途所保留。
標志(Code Bits):6 位標志域。表示為:緊急標志、有意義的應答標志、推、重置
連接標志、同步序列號標志、完成發送數據標志。按照順序排列是:URG、ACK、PSH、
RST、SYN、FIN。
窗口(Window):16 位,用來表示想收到的每個TCP 數據段的大小。
校驗位(Checksum):16 位TCP 頭。源機器基于數據內容計算一個數值,收信息機
要與源機器數值結果完全一樣,從而證明數據的有效性。
優先指針(緊急,Urgent Pointer):16 位,指向后面是優先數據的字節,在URG
標志設置了時才有效。如果URG 標志沒有被設置,緊急域作為填充。加快處理標示為緊急
的數據段。
選項(Option):長度不定,但長度必須以字節。如果沒有選項就表示這個一字節
的域等于0。
填充:不定長,填充的內容必須為0,它是為了數學目的而存在。目的是確保空
間的可預測性。保證包頭的結合和數據的開始處偏移量能夠被32 整除,一般額外的零以保
證TCP 頭是32 位的整數倍。
標志控制功能
URG:緊急標志
緊急(The urgent pointer) 標志有效。緊急標志置位,
ACK:確認標志
確認編號(Acknowledgement Number)欄有效。大多數情況下該標志位是置位的。
TCP 報頭內的確認編號欄內包含的確認編號(w+1,Figure:1)為下一個預期的序列編號,同
時提示遠端系統已經成功接收所有數據。
PSH:推標志
該標志置位時,接收端不將該數據進行隊列處理,而是盡可能快將數據轉由應用
處理。在處理telnet 或rlogin 等交互模式的連接時,該標志總是置位的。
RST:復位標志
復位標志有效。用于復位相應的TCP 連接。
SYN:同步標志
同步序列編號(Synchronize Sequence Numbers)欄有效。該標志僅在三次握手建立
TCP 連接時有效。它提示TCP 連接的服務端檢查序列編號,該序列編號為TCP 連接初始端
(一般是客戶端)的初始序列編號。在這里,可以把TCP 序列編號看作是一個范圍從0 到4,
294,967,295 的32 位計數器。通過TCP 連接交換的數據中每一個字節都經過序列編號。
在TCP 報頭中的序列編號欄包括了TCP 分段中第一個字節的序列編號。
FIN:結束標志
帶有該標志置位的數據包用來結束一個TCP 回話,但對應端口仍處于開放狀態,
準備接收后續數據。
服務端處于監聽狀態,客戶端用于建立連接請求的數據包(IP packet)按照TCP/IP
協議堆棧組合成為TCP 處理的分段(segment)。
分析報頭信息: TCP 層接收到相應的TCP 和IP 報頭,將這些信息存儲到內存中。
檢查TCP 校驗和(checksum):標準的校驗和位于分段之中(Figure:2)。如果檢驗
失敗,不返回確認,該分段丟棄,并等待客戶端進行重傳。
查找協議控制塊(PCB{}):TCP 查找與該連接相關聯的協議控制塊。如果沒有找
到,TCP 將該分段丟棄并返回RST。(這就是TCP 處理沒有端口監聽情況下的機制) 如果該
協議控制塊存在,但狀態為關閉,服務端不調用connect()或listen()。該分段丟棄,但不返
回RST。客戶端會嘗試重新建立連接請求。
建立新的socket:當處于監聽狀態的socket 收到該分段時,會建立一個子socket,
同時還有socket{},tcpcb{}和pub{}建立。這時如果有錯誤發生,會通過標志位來拆除相應
的socket 和釋放內存,TCP 連接失敗。如果緩存隊列處于填滿狀態,TCP 認為有錯誤發生,
所有的后續連接請求會被拒絕。這里可以看出SYN Flood 攻擊是如何起作用的。
丟棄:如果該分段中的標志為RST 或ACK,或者沒有SYN 標志,則該分段丟棄。
并釋放相應的內存。
發送序列變量
SND.UNA : 發送未確認
SND.NXT : 發送下一個
SND.WND : 發送窗口
SND.UP : 發送優先指針
SND.WL1 : 用于最后窗口更新的段序列號
SND.WL2 : 用于最后窗口更新的段確認號
ISS : 初始發送序列號
接收序列號
RCV.NXT : 接收下一個
RCV.WND : 接收下一個
RCV.UP : 接收優先指針
IRS : 初始接收序列號
當前段變量
SEG.SEQ : 段序列號
SEG.ACK : 段確認標記
SEG.LEN : 段長
SEG.WND : 段窗口
SEG.UP : 段緊急指針
SEG.PRC : 段優先級
CLOSED 表示沒有連接,各個狀態的意義如下:
LISTEN : 監聽來自遠方TCP 端口的連接請求。
SYN-SENT : 在發送連接請求后等待匹配的連接請求。
SYN-RECEIVED : 在收到和發送一個連接請求后等待對連接請求的確認。
ESTABLISHED : 代表一個打開的連接,數據可以傳送給用戶。
FIN-WAIT-1 : 等待遠程TCP 的連接中斷請求,或先前的連接中斷請求的確認。
FIN-WAIT-2 : 從遠程TCP 等待連接中斷請求。
CLOSE-WAIT : 等待從本地用戶發來的連接中斷請求。
CLOSING : 等待遠程TCP 對連接中斷的確認。
LAST-ACK : 等待原來發向遠程TCP 的連接中斷請求的確認。
TIME-WAIT : 等待足夠的時間以確保遠程TCP 接收到連接中斷請求的確認。
CLOSED : 沒有任何連接狀態。
TCP 連接過程是狀態的轉換,促使發生狀態轉換的是用戶調用:OPEN,SEND,
RECEIVE,CLOSE,ABORT 和STATUS。傳送過來的數據段,特別那些包括以下標記的數
據段SYN,ACK,RST 和FIN。還有超時,上面所說的都會時TCP 狀態發生變化。
序列號
請注意,我們在TCP 連接中發送的字節都有一個序列號。因為編了號,所以可以
確認它們的收到。對序列號的確認是累積性的。TCP 必須進行的序列號比較操作種類包括
以下幾種:
①決定一些發送了的但未確認的序列號。
②決定所有的序列號都已經收到了。
③決定下一個段中應該包括的序列號。
對于發送的數據TCP 要接收確認,確認時必須進行的:
SND.UNA = 最老的確認了的序列號。
SND.NXT = 下一個要發送的序列號。
SEG.ACK = 接收TCP 的確認,接收TCP 期待的下一個序列號。
SEG.SEQ = 一個數據段的第一個序列號。
SEG.LEN = 數據段中包括的字節數。
SEG.SEQ+SEG.LEN-1 = 數據段的最后一個序列號。
如果一個數據段的序列號小于等于確認號的值,那么整個數據段就被確認了。而
在接收數據時下面的比較操作是必須的:
RCV.NXT = 期待的序列號和接收窗口的最低沿。
RCV.NXT+RCV.WND:1 = 最后一個序列號和接收窗口的最高沿。
SEG.SEQ = 接收到的第一個序列號。
SEG.SEQ+SEG.LEN:1 = 接收到的最后一個序列號。

熱詞搜索:

上一篇:統一威脅管理設備很快將取代現有的防火墻設備
下一篇:CA推全方位恢復管理方案 綜合連續數據保護

分享到: 收藏