Tcp抓包以及tcp狀態解釋

轉自:http://www.aichengxu.com/view/47568linux

Tcp抓包以及tcp狀態解釋,有須要的朋友能夠參考下。ios

 

  • tcp三次握手

 

發送端發送一個SYN=1,ACK=0標誌的數據包給接收端,請求進行鏈接,這是第一次握手;接收端收到請求而且容許鏈接的話,就會發送一個SYN=1,ACK=1標誌的數據包給發送端,告訴它,能夠通信了,而且讓發送端發送一個確認數據包,這是第二次握手;最後,發送端發送一個SYN=0,ACK=1的數據包給接收端,告訴它鏈接已被確認,這就是第三次握手。以後,一個TCP鏈接創建,開始通信。

服務器



  • tcp鏈接狀態

 

SYN:同步標誌。同步序列編號(Synchronize Sequence Numbers)欄有效。該標誌僅在三次握手創建TCP鏈接時有效。它提示TCP鏈接的服務端檢查序列編號,該序列編號爲TCP鏈接初始端(通常是客戶端)的初始序列編號。在這裏,能夠把 TCP序列編號看做是一個範圍從0到4,294,967,295的32位計數器。經過TCP鏈接交換的數據中每個字節都通過序列編號。在TCP報頭中的序列編號欄包括了TCP分段中第一個字節的序列編號。網絡

 



ACK:確認標誌。確認編號(Acknowledgement Number)欄有效。大多數狀況下該標誌位是置位的。TCP報頭內的確認編號欄內包含的確認編號(w+1,Figure-1)爲下一個預期的序列編號,同時提示遠端系統已經成功接收全部數據。



RST:復位標誌。復位標誌有效。用於復位相應的TCP鏈接。



URG:緊急標誌。緊急(The urgent pointer) 標誌有效。緊急標誌置位,



PSH:推標誌。該標誌置位時,接收端不將該數據進行隊列處理,而是儘量快將數據轉由應用處理。在處理 telnet 或 rlogin 等交互模式的鏈接時,該標誌老是置位的。



FIN:結束標誌。帶有該標誌置位的數據包用來結束一個TCP回話,但對應端口仍處於開放狀態,準備接收後續數據。less



.TCP的幾個狀態對於咱們分析所起的做用。在TCP層,有個FLAGS字段,這個字段有如下幾個標識:SYN, FIN, ACK, PSH, RST, URG.其中,對於咱們平常的分析有用的就是前面的五個字段。它們的含義是:tcp



  1. SYN表示創建鏈接
  2. FIN表示關閉鏈接
  3. ACK表示響應
  4. PSH表示有 DATA數據傳輸
  5. RST表示鏈接重置

 

其中,ACK是可能與SYN,FIN等同時使用的,好比SYN和ACK可能同時爲1,它表示的就是創建鏈接以後的響應,若是隻是單個的一個SYN,它表示的只是創建鏈接。TCP的幾回握手就是經過這樣的ACK表現出來的。但SYN與FIN是不會同時爲1的,由於前者表示的是創建鏈接,然後者表示的是斷開鏈接。RST通常是在FIN以後纔會出現爲1的狀況,表示的是鏈接重置。通常地,當出現FIN包或RST包時,咱們便認爲客戶端與服務器端斷開了鏈接;而當出現SYN和SYN+ACK包時,咱們認爲客戶端與服務器創建了一個鏈接。PSH爲1的狀況,通常只出如今 
DATA內容不爲0的包中,也就是說PSH爲1表示的是有真正的TCP數據包內容被傳遞。TCP的鏈接創建和鏈接關閉,都是經過請求-響應的模式完成的。 



工具



  • tcp常見錯誤狀態



  1. Tcp previous segment lost(tcp先前的分片丟失)
  2. Tcpacked lost segment(tcp應答丟失)
  3. Tcp window update(tcp窗口更新)
  4. Tcp dup ack(tcp重複應答)
  5. Tcp keep alive(tcp保持活動)
  6. Tcp retransmission(tcp重傳)
  7. Tcp ACKed unseen segument (tcp看不見確認應答)
  8. tcp port numbers reused(tcp端口重複使用)
  9. tcp retransmission(tcp重傳)
  10. tcp fast retransmission (tcp快速重傳)
  11. TCP Previoussegment lost(發送方數據段丟失)
  12. tcp spurious retransmission(tcp僞重傳)



  • tcp抓包工具tcpdump和wireshark

 

在linux下tcpdump是一個很強大的tcp抓包工具,可是因爲linux分析不方便,所以能夠將抓包數據保存到.cap文件中,而後在windos下使用wireshark進行分析,很是方便。

spa



  • tcpdump抓包命令

 

 

tcpdump tcp -i eth2 -s 0 and port 20058  -w /home/pjroot/attence.cap
tcpdump tcp -i eth2 -t -s 0 -c 100 and port 20058  -w /home/pjroot/attence.cap
tcpdump tcp -i eth2 -s 0 and port 20058 and host 125.77.252.211 -w ./attence.cap

 

 

-i eth2 指定數據包通過的網卡code

 

-s 0 抓取數據包時默認抓取長度爲68字節。加上-S 0 後能夠抓到完整的數據包

blog

 

port 指定端口 能夠加上src 和dst表示如今爲源端口仍是目的端口

 

host 指定主機能夠加上src和dst表示源地址仍是目的地址

 

-w 表示要寫入到文件中

 

-t 表示不顯示時間戳

 

-c 100 表示只抓取初始的100個數據包

 

 

 

打印全部進入或離開sundown的數據包.

 


tcpdump host sundown

 

也能夠指定ip,例如截獲全部210.27.48.1的主機收到的和發出的全部的數據包

 


tcpdump host 210.27.48.1

 

打印helios 與 hot 或者與 ace 之間通訊的數據包

 


tcpdump host helios and \( hot or ace \)

 

截獲主機210.27.48.1和主機210.27.48.2或210.27.48.3的通訊

 


tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

 

打印ace與任何其餘主機之間通訊的IP 數據包, 但不包括與helios之間的數據包.

 


tcpdump ip host ace and not helios

 

若是想要獲取主機210.27.48.1除了和主機210.27.48.2以外全部主機通訊的ip包,使用命令:

 


tcpdump ip host 210.27.48.1 and ! 210.27.48.2

 

截獲主機hostname發送的全部數據

 


tcpdump -i eth0 src host hostname

 

監視全部送到主機hostname的數據包

 


tcpdump -i eth0 dst host hostname

 

若是想要獲取主機210.27.48.1接收或發出的telnet包,使用以下命令

 


tcpdump tcp port 23 and host 210.27.48.1

 


tcpdump  -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854

 

0x4745 爲"GET"前兩個字母"GE",0x4854 爲"HTTP"前兩個字母"HT"。



  • tcpudp命令參數說明

 

-i any : 監聽全部接口-n : 不解析主機名-nn : 不解析主機名和端口名-X : 以16進制和ascii格式顯示包-XX : 和-X同樣,但會顯示以太網頭-v, -vv, -vvv : 獲取包含信息量更多的包-c : 獲取指定數量的包,達到該數量後tcpdump中止-S : 顯示絕對序列號-e : 獲取以太網頭-q : 顯示少許的協議信息-E : 經過密鑰來解密IPSEC交互-s : 設置snaplength(snaplength是抓取的字節數)- host // 根據ip地址查詢交互(不用"-n"也能根據主機名查詢交互)# tcpdump host 1.2.3.4- src,dst // 找出指定源地址或目的地址的交互# tcpdump src 2.3.4.5# tcpdump dst 3.4.5.6- net // 根據網絡號抓取整個網絡# tcpdump net 1.2.3.0/24- proto // 工做在tcp,udp,和icmp。注意你不用必須輸入proto。# tcpdump icmp- port // 查看通過指定端口的交互# tcpdump port 3389- src,dst port // 找出指定源端口或目的端口的交互# tcpdump src port 1025# tcpdump dst port 389- src/dst, port, protocol // 將三個聯合在一塊兒# tcpdump src port 1025 and tcp# tcpdump udp and src port 53你也能夠用選項來找出多個端口而不用一一指定,也能夠僅查看大於或小於某一字節大小的包。- Port Ranges // 查看通過範圍內端口的交互tcpdump portrange 21-23- Packet Size Filter // 查看大於或小於某一字節大小的包tcpdump less 32tcpdump greater 128也能夠用符號來代替tcpdump > 32tcpdump <= 128寫到一個文件tcpdump用"-w"選項能夠將抓到的內容存入文件,再用"-r"選項讀回來,這個功能很是好,能夠抓取原始交互以後再用其餘工具運行它。以這種方式抓取到的交互會存成tcpdump格式的文件,如今網絡分析圈內基本都用這種格式,所以文件能夠被全部工具讀取,包括Wireshark, Snort等。- 抓取全部通過端口80的交互存入一個文件# tcpdump -s 1514 port 80 -w capture_file- 之後能夠再讀回來# tcpdump -r capture_file更多的例子# 從10.5.2.3到端口3389的tcp交互tcpdump -nnvvS and src 10.5.2.3 and dst port 3389# 從網絡192.168到網絡10或172.16的交互tcpdump -nvX src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16# 從192.168.0.2到網絡172.16的非icmp交互tcpdump -nvvXSs 1514 dst 192.168.0.2 and src net and not icmp# 從Mars或Pluto到非SSH端口的交互tcpdump -vv src Mars or Pluto and not dst port 22分組若是你試圖運行這個原本很是有用的命令,由於括號的緣由會報錯,能夠對括號進行轉義(前面加"/")或者將整個命令放在單引號中:# 從10.0.2.4到端口3389或22的交互(正確的表達)tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'

相關文章
相關標籤/搜索