熱點推薦:
您现在的位置: 電腦知識網 >> 網絡技術 >> 正文

通過連接實例解讀TCP/IP協議

2022-06-13   來源: 網絡技術 

  最近狂補基礎猛看TCP/IP協議不過書上的東西太抽象了沒有什麼數據實例看了不
  久就忘了於是搬來一個sniffer抓了數據包來看呵呵結合書裡面得講解理解得
  比較快我就來灌點基礎知識 
   開始吧先介紹IP協議 
   IP協議(Internet Protocol)是網絡層協議用在因特網上TCPUDPICMPIGMP數
  據都是按照IP數據格式發送得IP協議提供的是不可靠無連接得服務IP數據包由一個頭部
  和一個正文部分構成正文主要是傳輸的數據我們主要來理解頭部數據可以從其理解到
  IP協議 
   IP數據包頭部格式(RFC
   
   Example Internet Datagram Header 
   上面的就是IP數據的頭部格式這裡大概地介紹一下 
   IP頭部由字節的固定長度和一個可選任意長度部分構成以大段點機次序傳送從左到
  右 
   TCP協議 
   TCP協議(TRANSMISSION CONTROL PROTOCOL)是傳輸層協議為應用層提供服務和UDP
  不同的是TCP協議提供的可靠的面向連接的服務在RFC中是基本的TCP描述關於TCP
  協議的頭部格式內容的說明 
   TCP Header FORMat 
  
  TCP Header FORMat 
  
   跟IP頭部差不多基本的長度也是字節TCP數據包是包含在一個IP數據報文中的 
  
   好了簡單介紹到此為止來看看我捕獲的例子吧這是一次FTP的連接呵呵
  cuteftp默認的cuteftp的FTP站點IP地址是我的IP地址假設為
  下面的數據就是TCO/IP連接過程中的數據傳輸我們可以分析TCP/IP協議數
  據格式以及TCP/IP連接的三次握手(ThreeWayHandshake)情況下面的這些十六進制數據
  只是TCP/IP協議的數據不是完整的網絡通訊數據 
  
  第一次 我向FTP站點發送連接請求(我把TCP數據的可選部分去掉了) 
  > 
  IP頭部 c c a d e  
  TCP頭部d f a c  
  
   來看看IP頭部的數據是些什麼 
   第一字節其中是IP協議的版本(Version)說明是IP是IHL
  位表示IP頭部的長度是一個bit字段最大就是值為IP頭部的最大長度就
  是字節而這裡為說明是字節這是標准的IP頭部長度頭部報文中沒有發送
  可選部分數據 
   接下來的一個字節是服務類型(Type of Service)這個bit字段由bit的優先
  權子字段(現在已經被忽略) bit的TOS子字段以及 bit的未用字段(現在為)構成
   bit的TOS子字段包含最小延時最大吞吐量最高可靠性以及最小費用構成這四個 
  bit位最多只能有一個為本例中都為表示是一般服務 
   接著的兩個字節 是IP數據報文總長包含頭部以及數據這裡表示字節
  字節由字節的IP頭部以及字節的TCP頭構成(本來截取的TCP頭應該是字節的其中
  字節為可選部分被我省去了)因此目前最大的IP數據包長度是字節 
   再是兩個字節的標志位(Identification) 轉換為十進制就是這個
  是讓目的主機來判斷新來的分段屬於哪個分組 
   下一個字節轉換為二進制就是 其中第一位是IP協議目前沒有用
  上的接著的是兩個標志DF和MFDF為表示不要分段MF為表示還有進一步的分段
  (本例為然後的 是分段便移(Fragment Offset) 
   這個字節就是TTL(Time To Live)了表示一個IP數據流的生命周期用Ping顯
  示的結果能得到TTL的值很多文章就說通過TTL位來判別主機類型因為一般主機都有默
  認的TTL值不同系統的默認值不一樣比如WINDOWS為不過一般Ping得到的都不是
  默認值這是因為每次IP數據包經過一個路由器的時候TTL就減一當減到這個數據包
  就消亡了這也時Tracert的原理本例中為轉換為十進制就是我用的
  WIN 
   繼續下來的是這個字節表示傳輸層的協議類型(Protocol)在RFC中有定
  義表示傳輸層是TCP協議 
   c 這個bit是頭校驗和(Header Checksum) 
   接下來c a 這個就是源地址(Source Address)了也就是我的IP地址
  轉換為十進制的IP地址就是同樣繼續下來的d e 是目標
  地址 
  
   好了真累啊終於看完基本的字節的IP數據報頭了繼續看TCP的頭部吧這個是作
  為IP數據包的數據部分傳輸的 
  
  TCP頭部d f a c  
  
   一來就是一個兩字節段d 表示本地端口號轉換為十進制就是第二個兩
  字節段 表示目標端口因為我是連接FTP站點所以這個就是十六進制當
  然就是  
   接下來的四個字節 f a 是順序號(Sequence Number)簡寫為SEQ
  SEQ= 
   下面的四個字節 是確認號(Acknowledgment Number)簡寫為
  ACKNUM 
   繼續兩個字節 轉換為二進制吧 這兩個字節
  總共bit有好多東西呢第一個bit是TCP頭長十進制為表示個字節
  (剛才說了我省略了字節的option數據所以你只看見了字節)接著的bit現在TCP
  協議沒有用上都為最後的bit 是六個重要的標志這是兩個計算機數據交
  流的信息標志接收和發送斷根據這些標志來確定信息流的種類下面是一些介紹 
   URG(Urgent Pointer field significant)緊急指針用到的時候值為用來處理避
  免TCP數據流中斷 
   ACK(Acknowledgment field significant)置時表示確認號(Acknowledgment 
  Number)為合法的時候表示數據段不包含確認信息確認號被忽略 
   PSH(Push Function)PUSH標志的數據時請求的數據段在接收方得到後就可直
  接送到應用程序而不必等到緩沖區滿時才傳送 
   RST(Reset the connection)用於復位因某種原因引起出現的錯誤連接也用來拒絕
  非法數據和請求如果接收到RST位時候通常發生了某些錯誤 
   SYN(Synchronize sequence numbers)用來建立連接在連接請求中SYN=
  ACK=連接響應時SYN=ACK=SYN和ACK來區分Connection Request和
  Connection Accepted 
   FIN(No more data from sender)用來釋放連接表明發送方已經沒有數據發送了 
   這個標志位你們自己對號入座吧本例中SYN=ACK=當然就是表示連接請求了
  我們可以注意下面兩個過程的這兩位的變換 
   後面的 c 不講了呵呵偷懶了
   後面兩次通訊的數據自己分開看吧我們看看連接的過程一些重要地方的變化 
  第二次FTP站點返回一個可以連接的信號 
  > 
  IP頭部 c c be a cd ba d e c a  
  TCP頭部 d b f c f a  
  
  第三次我確認連接TCP連接建立起來 
  > 
  IP頭部 c a c a d e  
  TCP頭部d f a b f c b b c  
  
   好我們看看整個Threeway_handshake過程 
   第一步我發出連接請求TCP數據為SEQ= f a ACKNUM=
  SYN=ACK= 
   第二步對方確認可以連接TCP數據為SEQ=b f cACKNUM= f a
  SYN=ACK= 
   第三步我確認建立連接SEQ= f a ACKNUM=b f cSYN=ACK= 
   可以看出什麼變化麼?正式建立連接了呢這些東西是什麼值? 
  我接收從>的下一個數據包中 
  SEQ=b f cACKNUM= f a SYN=ACK= 
   這些都是很基礎的東西對於編寫sniffer這樣的東西是必須非常熟悉的這裡只講解了
  TCP/IP協議的一點點東西主要是頭部數據的格式
  
  
  
          

From:http://tw.wingwit.com/Article/Network/201311/30091.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.