tcpdump抓取HTTP包
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
0x4745為“GET”前兩個字母“GE”
0x4854為“HTTP”前兩個字母“HT”
通常情況下:一個正常的TCP連接,都會有三個階段
- 1.TCP三次握手
- 2.數據傳送
- 3.TCP四次揮手
TCP三次握手(創建OPEN)
- 客戶端發起一個和服務創建TCP連接的請求SYN
- 服務端接受到客戶端的創建請求之后,返回SYN(i)+ACK(j)
- 客戶端在接收到服務端的ACK信息校驗成功后(j與j+1),返回一個信息ACK(i+1)
- 服務端這時接收到客戶端的ACK信息校驗成功后(i與i+1),不再返回信息,后面進入數據通訊階段
數據通訊
客戶端/服務端 read/write數據包
TCP四次握手
- 客戶端發起關閉請求,發送一個信息:FIN(M)
- 服務端接受到信息后,首先返回ACK(M+1),表明自己已經收到消息。
- 服務端在准備好關閉之前,最后發送給客戶端一個 FIN(N)消息,詢問客戶端是否准備好關閉了
- 客戶端接受到服務端發送的消息后,返回一個確認信息: ACK(N+1)
- 最后,服務端和客戶端在雙方都得到確認時,各自關閉或者回收對應的TCP連接
詳細狀態說明
-
SYN_SEND
- 客戶端嘗試連接服務端,通過open方法。屬於客戶端的狀態
sysctl -w net.ipv4.tcp_syn_retries = 2
,作為客戶端可以設置SYN包的重試次數,默認5次(大約180s)
-
SYN_RECEIVED
- 服務器接收創建連接的SYN請求后,發送ACK數據包之前,上述三次握手中的第二步
- 服務端端口,一般15個左右正常,如果很大,懷疑SYN_FLOOD攻擊
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
,設置該狀態的等待隊列數,默認1024,調大后可適當防止syn-flood.sysctl -w net.ipv4.tcp_syncookies=1
,打開syscookie
,在syn backlog
隊列不足的時候,提供一種機制將臨時syn連接換出sysctl -w net.ipv4.tcp_synack_retries=2
,作為服務端返回ACK包的重試次數,默認5次(大約180s)
-
ESTABLISHED
- 客戶端接收到服務端的ACK包后的狀態,服務端再發出ACK在一定時間后即為這個狀態
sysctl -w net.ipv4.tcp_keepalive_time = 1200
,默認為7200秒(2小時),系統針對空閑鏈接會進行心跳檢查,如果超過net.ipv4.tcp_keepalive_probes * net.ipv4.tcp_keepalive_intvl = 默認11分,終止對應的tcp鏈接,可適當調整心跳檢查頻率
-
FIN_WAIT1
- 主動關閉的一方,在發出FIN請求之后(TCP四次握手第一步)
-
CLOSE_WAIT
- 被動關閉的一方,在接收到客戶端的FIN后(TCP四次握手第二步)
-
FIN_WAIT2
- 主動關閉的一方,在接收到被動關閉一方的ACK后(TCP握手第三步)
-
LASK_ACK
- 被動關閉的一方,在發送ACK后一段時間后(確保客戶端已收到),再發起一個FIN請求。(TCP四次握手第四步)
-
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.
備注:
-
主動關閉方在接收到被動關閉方的FIN請求后,發送給對方一個ACK后,將自己的狀態由FIN_WAIT2修改為TIME_WAIT,而必須再等2MSL(Maximum Segment Lifetime,MSL是一個數據報在internetwork中能存在的時間)時間之后雙方才能把狀態 都改為CLOSED以關閉連接。目前RHEL里保持TIME_WAIT狀態的時間為60秒
-
keepAlive策略可以有效的避免進行三次握手和四次關閉的動作
其他網絡重要參數:
-
net.ipv4.tcp_rmem 參數
- 默認 : min=4096 default=87380 max=4194304
-
net.ipv4.tcp_wmem 參數
- 默認 : min=4096 default=16384 max=4194304
Tcpdump
tcpdump是linux系統自帶的抓包工具,主要通過命令行的方式,比較適合在線上服務器進行抓包操作,如果是windows或者ubuntu完全可 以選擇一些圖形化的工具,ubuntu比較推薦用wireshark,安裝方式很簡單sudo apt一下即可。