如何查看某個端口被誰占用?

1. 部署環(huán)境

我們首先啟動一個Tomcat進程,Tomcat會占用8080端口。

2. 查詢端口

Windows 下使用netstat -ano命令查詢端口占用情況,下面的示例中可以看到,當(dāng)前主機啟動了MySQL服務(wù),進程號為4732,監(jiān)聽3306端口;還啟動了Tomcat服務(wù),進程號為7092,監(jiān)聽8080端口。

> netstat -ano

  協(xié)議    本地地址                外部地址                 狀態(tài)             PID
  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING       4732     # MySQL
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       7092     # IPv4 Tomcat
  TCP    [::]:8080              [::]:0                 LISTENING       7092     # IPv6 Tomcat
  UDP    0.0.0.0:53             *:*                                    2696     # DNS服務(wù)

netstat:顯示協(xié)議統(tǒng)計信息和當(dāng)前 TCP/IP 網(wǎng)絡(luò)連接。

  • -a 顯示所有連接的端口和監(jiān)聽端口。
  • -n 以數(shù)字形式顯示地址和端口號。
  • -o 顯示擁有的與每個連接關(guān)聯(lián)的進程 ID。
  • 輸出結(jié)果各列分別是1. 協(xié)議名稱TCP/UDP,2.本地地址與端口, 3.外部地址與端口,4.連接狀態(tài),通常為LISTENING,ESTABLISHED,TIME_WAIT, FIN_WAIT_2等狀態(tài),4. 進程ID

上面的查詢省略了其他不重要的連接,我們也可以使用命令netstat -ano | findstr "8080"來查詢指定端口的占用情況。

> netstat -ano | findstr "8080"
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       7092
  TCP    [::]:8080              [::]:0                 LISTENING       7092

然后根據(jù)查詢到的進程號7092,使用命令tasklist | findstr "7092"去任務(wù)列表中查詢對應(yīng)的進程信息,當(dāng)然也可以直接打開任務(wù)管理器進行查詢。

> tasklist | findstr "7092"
映像名稱             PID           會話名            會話#       內(nèi)存使用
java.exe           7092           Console          1          305,928 K

從查詢結(jié)果可知,是一個進程號為7092的Java程序占用了8080端口,可以使用命令taskkill -T -F -PID 7092終止該程序。當(dāng)然也可以在任務(wù)管理器手動終止該進程。

> taskkill -T -F -PID 7092
成功: 已終止 PID 8564 (屬于 PID 7092 子進程)的進程。
成功: 已終止 PID 7092 (屬于 PID 13676 子進程)的進程。
image.png

Linux

Linux 查詢端口占用使用 lsofnetstat命令,終止進程使用kill -9 PID命令。

# lsof -i:8000
COMMAND   PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nodejs  26993 root   10u  IPv4 37999514      0t0  TCP *:8000 (LISTEN)

# netstat -anp | grep 8080
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1752061/mysqld 

Linux 查看端口占用情況 | 菜鳥教程 (runoob.com)

3. TCP連接信息

  1. 我們使用瀏覽器訪問http://localhost:8080/,然后查看端口占用如下所示。
  • 第 1 個TCP連接,表示Tomcat進程7092監(jiān)聽8080端口,連接狀態(tài)為LISTENING

    0.0.0.0表示當(dāng)前主機,指的是本機上的所有IPV4地址,如果一個主機有兩個IP地址,192.168.1.10310.1.2.1,并且該主機上的一個服務(wù)監(jiān)聽的地址是0.0.0.0,那么通過兩個IP地址都能夠訪問該服務(wù)。

  • 第 2 個TCP連接,表示Tomcat進程7092監(jiān)聽8080端口,連接狀態(tài)為LISTENING

    [::]表示當(dāng)前主機,是IPV6地址[0000:0000:0000:0000:0000:0000:0000:0000]的縮寫。

  • 第 3-5 個TCP連接,表示瀏覽器進程15948通過2126端口,與地址[::1]:8080建立了TCP連接,連接狀態(tài)為ESTABLISHED即連接已建立。

    通過任務(wù)管理器可以知道15948正是我們訪問Tomcat的瀏覽器進程。

    [::1]是環(huán)回地址,用于同一臺設(shè)備中不同進程之間的通信,可以在host文件中看到,locahost就是IPV6地址::1的別名。

    瀏覽器第一次訪問時,為了避免建立TCP連接失敗,會一次性發(fā)送三個TCP連接請求,因此我們可以看到瀏覽器進程15948通過三個不同端口與地址[::1]:8080即Tomcat服務(wù)建立了TCP連接。

  • 第 6-8 個TCP連接,表示Tomcat進程7092通過8080端口與地址[::1]:2126建立了TCP連接,連接狀態(tài)為ESTABLISHED即連接已建立。

> netstat -ano | findstr "8080"
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       7092
  TCP    [::]:8080              [::]:0                 LISTENING       7092
  TCP    [::1]:2126             [::1]:8080             ESTABLISHED     15948
  TCP    [::1]:2127             [::1]:8080             ESTABLISHED     15948
  TCP    [::1]:2132             [::1]:8080             ESTABLISHED     15948
  TCP    [::1]:8080             [::1]:2126             ESTABLISHED     7092
  TCP    [::1]:8080             [::1]:2127             ESTABLISHED     7092
  TCP    [::1]:8080             [::1]:2132             ESTABLISHED     7092
  1. 我們再使用瀏覽器訪問http://127.0.0.1:8080/,然后查看端口占用如下所示。
  • 第 2-3 個TCP連接,表示瀏覽器進程8176通過2927端口,與地址127.0.0.1:8080建立了TCP連接,連接狀態(tài)為ESTABLISHED即連接已建立。

  • 第 4-5 個TCP連接,表示Tomcat進程7092通過8080端口與地址127.0.0.1:2927建立了TCP連接,連接狀態(tài)為ESTABLISHED即連接已建立。

  • 通過以上連接可以看出,如果使用127.0.0.1,則建立TCP連接的是IPV4地址127.0.0.1,而不是localhost代表的默認IPV6地址[::1]

> netstat -ano | findstr "8080"
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       7092
  TCP    127.0.0.1:2927         127.0.0.1:8080         ESTABLISHED     8176
  TCP    127.0.0.1:2928         127.0.0.1:8080         ESTABLISHED     8176
  TCP    127.0.0.1:8080         127.0.0.1:2927         ESTABLISHED     7092
  TCP    127.0.0.1:8080         127.0.0.1:2928         ESTABLISHED     7092
  TCP    [::]:8080              [::]:0                 LISTENING       7092
  1. 我們再使用瀏覽器訪問http://127.11.22.33:8080/,然后查看端口占用如下所示。
> netstat -ano | findstr "8080"
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       7092
  TCP    127.0.0.1:3072         127.11.22.33:8080      ESTABLISHED     8176
  TCP    127.11.22.33:8080      127.0.0.1:3072         ESTABLISHED     7092

可以看到,TCP連接的地址變?yōu)榱?code>127.11.22.33:8080,這是因為地址 127.0.0.1127.255.255.255均為環(huán)回地址。

環(huán)回地址

用于主機向自身發(fā)送通信的特殊地址,用于同一臺設(shè)備中不同進程之間的通信。也就是說,這些數(shù)據(jù)包不會通過外部網(wǎng)絡(luò)接口。

IPv4 的環(huán)回地址是保留地址之一 127.0.0.1。盡管只使用 127.0.0.1 這一個地址,但均予以保留。此地址塊中的任何地址都將環(huán)回到本地主機中。我們可以使用瀏覽器訪問http://127.1.2.3:8080/,同樣可以訪問到Tomcat服務(wù)。

與 IPv4 一樣,IPv6 也提供了特殊環(huán)回地址以供測試使用,發(fā)送到此地址的數(shù)據(jù)報會環(huán)回到發(fā)送設(shè)備。不過,IPv6 中環(huán)回地址只有一個,為 0:0:0:0:0:0:0:1,一般用零的壓縮形式表示為[::1]。

  1. 我們再使用手機瀏覽器,訪問在同一局域網(wǎng)內(nèi)的Tomcat進程,http://192.168.1.103:8080/,然后查看端口占用如下所示。
> netstat -ano|findstr "8080"
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       7092
  TCP    192.168.1.103:8080     192.168.1.101:38513    ESTABLISHED     7092
  TCP    192.168.1.103:8080     192.168.1.101:38515    ESTABLISHED     7092
  TCP    192.168.1.103:8080     192.168.1.101:38517    ESTABLISHED     7092
  TCP    [::]:8080              [::]:0                 LISTENING       7092
  • 第 2-4 個TCP連接,表示Tomcat進程7092通過8080端口與外部地址192.168.1.101:38513建立了TCP連接,連接狀態(tài)為ESTABLISHED即連接已建立。

4. TCP 連接狀態(tài)

這個詳見TCP三次握手和四次揮手。

  • LISTENING 監(jiān)聽狀態(tài) 常見
  • ESTABLISHED 連接已建立 常見
  • SYN-SENT 客戶端TCP建立連接請求已發(fā)送,等待服務(wù)端響應(yīng)。
  • SYN-REVD 服務(wù)端接收到客戶端的TCP建立連接請求并響應(yīng),等待客戶端確認。
  • FIN-WAIT-1 客戶端TCP斷開連接請求已發(fā)送,等待服務(wù)端響應(yīng)。
  • CLOSE-WAIT 服務(wù)端接收到客戶端的TCP斷開連接請求并響應(yīng),進入等待狀態(tài),等待數(shù)據(jù)傳輸完成。
  • FIN-WAIT-2 客戶端等待服務(wù)端的TCP斷開請求。 常見
  • LAST-ACK 服務(wù)端TCP斷開連接請求已發(fā)送,等待客戶端響應(yīng)。
  • TIME-WAIT 客戶端接收到服務(wù)端的TCP斷開連接請求并響應(yīng),等待一段時間進入關(guān)閉狀態(tài)。 常見
  • CLOSE 連接關(guān)閉
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容