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 子進程)的進程。

Linux
Linux 查詢端口占用使用 lsof和netstat命令,終止進程使用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連接信息
- 我們使用瀏覽器訪問
http://localhost:8080/,然后查看端口占用如下所示。
-
第 1 個TCP連接,表示Tomcat進程7092監(jiān)聽
8080端口,連接狀態(tài)為LISTENING。0.0.0.0表示當(dāng)前主機,指的是本機上的所有IPV4地址,如果一個主機有兩個IP地址,192.168.1.103和10.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
- 我們再使用瀏覽器訪問
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
- 我們再使用瀏覽器訪問
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.1到 127.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]。
- 我們再使用手機瀏覽器,訪問在同一局域網(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)閉