承接各類網(wǎng)站建設(shè)關(guān)鍵詞排名代發(fā)
序言
?在傳輸層 Tcp 的學(xué)習(xí)中,我們了解了 三次握手和四次揮手 的概念,但是看了這么多篇文章,我們也只是停留在 紙上談兵。
?欲知事情如何,我們其實(shí)可以嘗試去看一下具體的網(wǎng)絡(luò)包的信息。在這篇文章中將向大家介紹,在 Linux 上抓包工具 tcpdump 的基本使用。
一、tcpdump 的使用
1. 安裝
?大多數(shù) Linux 系統(tǒng)都自帶了這個(gè)工具,你可以如下指令來(lái)查看是否安裝就緒:
tcpdump --version
如果不存在的話,我們使用指令安裝一個(gè)就好:
sudo apt-get install tcpdump
現(xiàn)在我們就可以正式開(kāi)始學(xué)習(xí)如何來(lái)使用這個(gè)簡(jiǎn)單且強(qiáng)大的工具了。
2. 基本使用
?tcpdump 的基本語(yǔ)法是:
tcpdump [選項(xiàng)] [表達(dá)式]
- 捕獲所有網(wǎng)絡(luò)數(shù)據(jù)包:
sudo tcpdump
該條指令將捕獲你所有的進(jìn)出網(wǎng)絡(luò)數(shù)據(jù)包,但是我們大多時(shí)候只需要獲取特定條件的數(shù)據(jù)包即可,所以我們需要對(duì)數(shù)據(jù)包進(jìn)行篩選。
- 按接口過(guò)濾:
sudo tcpdump -i [接口]
通過(guò) -i
選項(xiàng)來(lái)指定要捕獲的接口,接口的信息你可以使用 ifconfig 來(lái)查看。
- 按協(xié)議過(guò)濾:
sudo tcpdump [協(xié)議]
常見(jiàn)的協(xié)議:tcp,udp,icmp
這個(gè)選項(xiàng)很重要,等會(huì)我們就需要借助它來(lái)查看我們?nèi)挝帐趾退拇螕]手的過(guò)程。
- 按 IP 地址過(guò)濾:
sudo tcpdump [dst/src] [IP]
在這里的 dst 代表的是捕獲發(fā)送到特定地址的包;而 src 代表的是捕獲來(lái)自特定地址的包。
- 按端口過(guò)濾:
sudo tcpdump port [端口號(hào)]
- 組合多個(gè)過(guò)濾條件:
?使用邏輯運(yùn)算符 and、or 和 not
來(lái)組合過(guò)濾條件。例如,我需要捕捉某個(gè)源地址的某個(gè)端口的 tcp 網(wǎng)絡(luò)數(shù)據(jù)包:
sudo tcpdump tcp and src 129.0.10.12 and port 8888
// 示例
基礎(chǔ)的使用說(shuō)到這里就結(jié)束了,咋們實(shí)戰(zhàn)抓一下包。
二、三次握手
?現(xiàn)在我們簡(jiǎn)單寫一個(gè)用于網(wǎng)絡(luò)通信的套接字編程,然后開(kāi)啟對(duì)本地端口的監(jiān)聽(tīng):
sudo tcpdump -i lo tcp and port 8888
大家注意咯,我使用的是本地環(huán)回進(jìn)行測(cè)試,所以我們需要指定接口 lo
,不然默認(rèn)的接口是 eth0
,這樣就不能捕獲我們的數(shù)據(jù)包;之后我們指定了進(jìn)行通信的接口 8888。
?現(xiàn)在我們啟動(dòng)客戶端發(fā)起連接,捕獲到如下信息:
現(xiàn)在我們來(lái)介紹一個(gè)三次握手中,具體包含了什么信息:
-
第一次:客戶端發(fā)送 SYN 包
-
時(shí)間戳: 18:06:37.782287
-
源地址: localhost.48058,即源端口為 48058
-
目標(biāo)地址: localhost.8888,即目標(biāo)端口為 8888
-
TCP 標(biāo)志: Flags [S],表示這是 SYN 包,即請(qǐng)求建立連接。
-
序列號(hào): seq 3613884573,這是發(fā)送方的初始序列號(hào)。
-
窗口大小: win 65495,接收方的接收窗口大小(在 TCP 握手過(guò)程中,表示能夠接收的最大字節(jié)數(shù))。
-
-
第二次:服務(wù)器響應(yīng) SYN-ACK 包
-
時(shí)間戳: 18:06:37.782298
-
源地址: localhost.8888,即目標(biāo)端口(8888)現(xiàn)在變成了源端口。
-
目標(biāo)地址: localhost.48058,即源端口(48058)現(xiàn)在變成了目標(biāo)端口。
-
TCP 標(biāo)志: Flags [S.],表示 SYN-ACK 包,服務(wù)器響應(yīng)客戶端的連接請(qǐng)求。S 表示 SYN(同步序列號(hào)),. 表示 ACK(確認(rèn)響應(yīng))。
-
序列號(hào): seq 3949276879,服務(wù)器的序列號(hào)。
-
確認(rèn)號(hào): ack 3613884574,服務(wù)器確認(rèn)客戶端的初始序列號(hào) + 1,表示已經(jīng)收到客戶端的請(qǐng)求。
-
窗口大小: win 65483,接收方窗口大小。
-
-
第三次:客戶端發(fā)送 ACK 包,確認(rèn)連接
- 時(shí)間戳: 18:06:37.782307
- 源地址: localhost.48058,客戶端。
- 目標(biāo)地址: localhost.8888,服務(wù)器。
- TCP 標(biāo)志: Flags [.],表示 ACK 包,即客戶端確認(rèn)服務(wù)器響應(yīng)的連接建立。
- 確認(rèn)號(hào): ack 1,表示客戶端確認(rèn)了服務(wù)器的響應(yīng)包。
- 窗口大小: win 512,接收窗口大小。
- 長(zhǎng)度: length 0,此包也沒(méi)有攜帶數(shù)據(jù),只有頭部。
所以我們直到有三次握手,但是沒(méi)想到,三次握手背后干了這么事情:
- 客服端,服務(wù)端初始化序列號(hào)
- 兩者通告接受窗口大小
- 協(xié)商出一個(gè)合適的 MSS 值
現(xiàn)在再讓我們看看四次揮手吧!
三、四次揮手
?現(xiàn)在服務(wù)端斷開(kāi)連接,之后客戶端也斷開(kāi)了連接,這中間發(fā)生了什么了:
現(xiàn)在我們就不逐個(gè)字段的介紹了,但是很奇怪呢?怎么四次揮手變成三次了?我們理一下:
- 服務(wù)端發(fā)送 FIN 包,表示斷開(kāi)連接請(qǐng)求
- 收到服務(wù)端的消息后,客戶端發(fā)送了 ACK 表示收到,并且發(fā)送 FIN 包表示斷開(kāi)連接,以捎帶應(yīng)答的方式發(fā)出
- 收到客戶端的信息后,服務(wù)端發(fā)送 ACK,連接正式斷開(kāi)
所以,中間分開(kāi)發(fā)送的 ACK 和 FIN 被合并了!這很合理,之所以分開(kāi)發(fā)送的原因是因?yàn)?#xff1a;服務(wù)端還存在未處理完的數(shù)據(jù)并未發(fā)送給客戶端,需要處理并發(fā)送后再斷開(kāi)!但是我們并沒(méi)有剩余的數(shù)據(jù),所以直接就斷開(kāi)了!
四、總結(jié)
?在這篇文章中,我們介紹了抓包工具 tcpdump 的使用,并且還實(shí)踐了利用該工具抓取三次握手,四次揮手過(guò)程中數(shù)據(jù)包的信息。