- 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建立和終止的報文示例
完整格式如下:
報文序號 報文產生時間(與上次報文的時間間隔) 源地址.埠號 >
目的地址 : 標識 分組序號:確認序號(報文段中位元組數) 視窗大小 接收的最大報文長度複製程式碼
- 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報文段的完整序號,其它位置顯示偏移量
tcpdump怎麼用?
常用引數解析
-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'
比如我想獲取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'
上面用到的tcp中括號相關內容是指tcp過濾,位元組範圍表達: proto [ expr : size ] photo表示協議 expr 表示與指定協議開頭相關的位元組偏移量;
如只檢視fin包 tcpdump -i <
interface>
“tcp[tcpflags] &
(tcp-fin) !=0”
TCP協議從那些方面保證可靠性的?
- 應用資料被分割成TCP認為最適合傳送的資料塊
- 傳送一個報文段(TCP傳遞給IP資訊的單位)後啟動定時器,如果無法及時收到確認,重發報文
- 收到報文後,推遲幾分之一秒傳送確認
- 提供首部和校驗和,校驗和出錯不確認收到此報文,引發重發
- 必要情況TCP會對收到的資料重排序,將正確的順序交給應用層
- 接收端會丟棄重複的資料
- 本身能做流量控制
附錄
把書讀薄(TCP/IP詳解 卷一 第十七章)