
說明: 通常情況下:一個正常的tcp連接配接,都會有三個階段:1、tcp三次握手;2、資料傳送;3、tcp四次揮手
裡面的幾個概念:
syn: (同步序列編号,synchronize sequence numbers)
ack: (确認編号,acknowledgement number)
fin: (結束标志,finish)
用戶端發起一個和服務建立tcp連結的請求,這裡是syn(j)
服務端接受到用戶端的建立請求後,傳回兩個資訊: syn(k) + ack(j+1)
用戶端在接受到服務端的ack資訊校驗成功後(j與j+1),傳回一個資訊:ack(k+1)
服務端這時接受到用戶端的ack資訊校驗成功後(k與k+1),不再傳回資訊,後面進入資料通訊階段
用戶端/服務端 read/write資料包
用戶端發起關閉請求,發送一個資訊:fin(m)
服務端接受到資訊後,首先傳回ack(m+1),表明自己已經收到消息。
服務端在準備好關閉之前,最後發送給用戶端一個 fin(n)消息,詢問用戶端是否準備好關閉了
用戶端接受到服務端發送的消息後,傳回一個确認資訊: ack(n+1)
最後,服務端和用戶端在雙方都得到确認時,各自關閉或者回收對應的tcp連結。
syn_send
用戶端嘗試連結服務端,通過open方法。也就是tcp三次握手
中的第1步之後,注意是用戶端狀态
sysctl -w net.ipv4.tcp_syn_retries = 2 ,做為用戶端可以設定syn包的重試次數,預設5次(大約180s)引用校長的話:僅僅重試2次,現代網絡夠了
syn_received
服務接受建立請求的syn後,也就是tcp三次握手
中的第2步,發送ack資料包之前
注意是服務端狀态,一般15個左右正常,如果很大,懷疑遭受syn_flood攻擊
sysctl -w net.ipv4.tcp_max_syn_backlog=4096 , 設定該狀态的等待隊列數,預設1024,調大後可适當防止syn-flood,可參見man 7 tcp
sysctl -w net.ipv4.tcp_syncookies=1 , 打開syncookie,在syn backlog隊列不足的時候,提供一種機制臨時将syn連結換出
sysctl -w net.ipv4.tcp_synack_retries = 2 ,做為服務端傳回ack包的重試次數,預設5次(大約180s)引用校長的話:僅僅重試2次,現代網絡夠了
established
用戶端接受到服務端的ack包後的狀态,服務端在發出ack在一定時間後即為established
sysctl -w net.ipv4.tcp_keepalive_time = 1200 ,預設為7200秒(2小時),系統針對空閑連結會進行心跳檢查,如果超過net.ipv4.tcp_keepalive_probes * net.ipv4.tcp_keepalive_intvl = 預設11分,終止對應的tcp連結,可适當調整心跳檢查頻率
目前線上的監控 waring:600 , critial : 800
fin_wait1
主動關閉的一方,在發出fin請求之後,也就是在tcp四次握手
的第1步
close_wait
被動關閉的一方,在接受到用戶端的fin後,也就是在tcp四次握手
的第2步
fin_wait2
主動關閉的一方,在接受到被動關閉一方的ack後,也就是tcp四次握手
sysctl -w net.ipv4.tcp_fin_timeout=30, 可以設定被動關閉方傳回fin後的逾時時間,有效回收連結,避免syn-flood.
lask_ack
被動關閉的一方,在發送ack後一段時間後(確定用戶端已收到),再發起一個fin請求。也就是tcp四次握手
的第3步
time_wait
主動關閉的一方,在收到被動關閉的fin包後,發送ack。也就是tcp四次握手
的第4步
sysctl -w net.ipv4.tcp_tw_recycle = 1 , 打開快速回收time_wait,enabling this option is not recommended since this causes problems when working with nat (network address translation)
sysctl -w net.ipv4.tcp_tw_reuse =1, 快速回收并重用time_wait的連結, 貌似和tw_recycle有沖突,不能重用就回收?
net.ipv4.tcp_max_tw_buckets: 處于time_wait狀态的最多連結數,預設為180000.
</h2>
主動關閉方在接收到被動關閉方的fin請求後,發送成功給對方一個ack後,将自己的狀态由fin_wait2修改為time_wait,而必須再等2倍的msl(maximum segment lifetime,msl是一個資料報在internetwork中能存在的時間)時間之後雙方才能把狀态 都改為closed以關閉連接配接。目前rhel裡保持time_wait狀态的時間為60秒
keepalive政策可以有效的避免進行三次握手和四次關閉的動作
預設值: min=4096 default=87380 max=4194304
預設值: min=4096 default=16384 max=4194304
tcpdump是linux系統自帶的抓包工具,主要通過指令行的方式,比較适合線上上伺服器進行抓包操作,如果是windows或者ubuntu完全可以選擇一些圖形化的工具,ubuntu比較推薦用wireshark,安裝方式很簡單sudo apt一下即可。
tcpdump [ -adeflnnopqstvx ] [ -c 數量 ] [ -f 檔案名 ][ -i 網絡接口 ] [ -r 檔案名] [ -s snaplen ][ -t 類型 ] [ -w 檔案名 ] [表達式 ]
-l 使标準輸出變為緩沖行形式;
-n 不把網絡位址轉換成名字;
-c 在收到指定的包的數目後,tcpdump就會停止;
-i 指定監聽的網絡接口;
-w 直接将包寫入檔案中,并不分析和列印出來;
-s 指定記錄package的大小,常見 -s 0 ,代表最大值65535,一半linux傳輸最小單元mtu為1500,足夠了
-x 直接輸出package data資料,預設不設定,隻能通過-w指定檔案進行輸出
關于類型的關鍵字,主要包括host,net,port
傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src
協定的關鍵字,主要包括fddi,ip ,arp,rarp,tcp,udp等類型
邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算 是'or' ,'||'
其他重要的關鍵字如下:gateway, broadcast,less,greater
tcpdump tcp port 80 -n -x -s 0 指定80端口進行輸出
tcpdump tcp port 80 -n -s 0 -w /tmp/tcp.cap
對應的/tmp/tcp.cap基本靠肉眼已經能看一下資訊,比如http header , content資訊等
tcpdump tcp port 80 -n -s 0 -x -l | grep xxxx
這樣可以實時對資料包進行字元串比對過濾
線上伺服器apache+jetty,通過apache mod_proxy進行一個反向代理,80 apache端口, 7001 jetty端口
apache端口資料抓包: tcpdump tcp port 80 -n -s 0 -x -i eth0 注意:指定eth0網絡接口
jetty端口資料抓包: tcpdump tcp port 7001 -n -s 0 -x -i lo 注意:指定loopback網絡接口
tcpdump tcp host 10.16.2.85 and port 2100 -s 0 -x
需要使用tcp表達式的組合,這裡是host訓示隻監聽該ip
操作:
在伺服器上進行tcpdump -w /tmp/tcp.cap 指定輸出外部檔案
scp /tmp/tcp.cap 拷貝檔案到你本地
wireshark & 啟動wireshark
通過 file -> open 打開拷貝下來的檔案,這樣就可以利用進行資料包分析了
剩下來的事就非常友善了
注意:
wireshark如果要開啟網絡監控,需要通過root方式啟動,否則無法直接通過網卡進行資料抓包
x11的反向輸出,需要客戶機支援x11協定,如果是ubuntu天生支援很友善,如果是windows需要安裝個軟體
李濤 郵件資料
man tcp
http://blog.sina.com.cn/s/blog_466c66400100bi2n.html~type=v5_one&label=rela_prevarticle
http://www.iteye.com/topic/624598
http://baike.baidu.com/view/76504.htm (tcpdump)