TCP協議長什麼樣


  • 1位表示1bit,除去任選字段(選項和數據)共160bit也就是20字節
  • 源端口號和目的端口號用於尋找發端和接收端【源端口+源IP地址+目的端口+目的IP地址惟一肯定一個TCP鏈接】
  • 序號用來標識從TCP發送端向接收端發送的數據字節流,他是32bit的無符號數,到達2的32次方-1後又從0開始
  • 確認序號是上次已成功收到數據字節序號加1【只有ack標識是1時,他纔有效】
  • 首部長度標識TCP包首部實際長度,它的單位是32bit【假如數字是6,那麼表示頭部實際長度是 4字節*6=24字節,因爲首部長度只有4bit,最大數爲15,於是最多有15*32bit=480bit=60字節】
  • URG置爲1表示緊急指針有效
  • ACK置爲1表示確認序號有效
  • PSH置爲1表示接收方應該儘快將這個報文段交給應用層
  • RST置1表示重建鏈接
  • SYN置1用來發起鏈接
  • FIN置1表示發端完成發送任務
  • 窗口大小是TCP用來作流量控制
  • 校驗和覆蓋TCP的首部和TCP數據,它必定由發端計算存儲,收端驗證
  • 緊急指針是一個正偏移量,和序號字段中的值相加表示緊急數據最後一個字段的序號
  • 常見可選字段如MSS(Maximim Segment Size 最長報文大小),用來標識本端能接收的最大長度的報文段

真實tcp報文怎麼看?

如下報文爲TCP創建和終止的報文示例bash


完整格式以下:網絡

報文序號 報文產生時間(與上次報文的時間間隔) 源地址.端口號 > 目的地址 : 標識 分組序號:確認序號(報文段中字節數) 窗口大小 接收的最大報文長度複製代碼

  • svr4.1037 > bsdi.discard 表示源地址的某個端口到目的地址
  • S是SYN標誌,表示發起鏈接 ;F是FIN標誌,表示發送端發送完數據;. 表示(SIN,FIN,RST,PSH)這四個標識都是0
  • 1415531521:1415531521(0) 表示分組的序號是1415531521,報文段中的數據字節數爲0
  • ack後跟着的數字串是確認序號,它只有首部標識置爲1纔有用
  • win 4096表示窗口大小
  • <mss 1024>表示發送端能接收的最大報文長度

默認狀況下tcpdump輸出只顯示SYN報文段的完整序號,其它位置顯示偏移量tcp


tcpdump怎麼用?

經常使用參數解析post

-X :用16進制顯示具體內容
-n:顯示IP,不轉換域名
-s 0:儘量多的展現內容
-vvv: 展現詳細內容
-i eth1:監聽eth1網絡
tcp :監聽協議類型
dst port 8500:8500端口接收的數據
-A:acsii顯示內容複製代碼

抓取當前機器上的post請求 sudo tcpdump -i eth1 -X -vvv -n -s 0 'tcp dst port 8500 and tcp[(tcp[12]>>2):4] = 0x504f5354'spa

好比我想獲取post請求的原始IP能夠用 sudo tcpdump -i eth1 -A -vvv -n -s 0 'tcp dst port 8500 and tcp[(tcp[12]>>2):4] = 0x504f5354' | grep 'X-Forwarded-For'指針

抓取當前機器上的get請求 sudo tcpdump -i eth1 -X -vvv -n -s 0 'tcp dst port 8500 and tcp[(tcp[12]>>2):4] = 0x47455420'code

上面用到的tcp中括號相關內容是指tcp過濾,字節範圍表達: proto [ expr : size ] photo表示協議 expr 表示與指定協議開頭相關的字節偏移量;如只查看fin包 tcpdump -i <interface> 「tcp[tcpflags] & (tcp-fin) !=0」

TCP協議從那些方面保證可靠性的?

  • 應用數據被分割成TCP認爲最適合發送的數據塊
  • 發送一個報文段(TCP傳遞給IP信息的單位)後啓動定時器,若是沒法及時收到確認,重發報文
  • 收到報文後,推遲幾分之一秒發送確認
  • 提供首部和校驗和,校驗和出錯不確認收到此報文,引起重發
  • 必要狀況TCP會對收到的數據重排序,將正確的順序交給應用層
  • 接收端會丟棄重複的數據
  • 自己能作流量控制


附錄

把書讀薄(TCP/IP詳解 卷一 第十七章)
cdn

相關文章
相關標籤/搜索