2017-12-27 1546 views
2

我正在學習TCP/IP基礎知識。我做了一個服務器 - 客戶端聊天應用程序,服務器在其中打開一個端口1024,客戶端可以發送消息給它。我對服務器和客戶端交換的TCP/IP數據包的內容有點困惑。如果客戶端向服務器發送消息,它將通過以太網作爲數據包發送。在客戶端的以太網幀中,數據字段以TCP/IP格式進行編碼。在TCP/IP幀中,目標端口將是1024.但是,源端口的值是什麼?客戶不開放端口。只有服務器打開一個端口。此外,我想知道是否有任何方法來監視這些在PC中發送和接收的TCP/IP數據包。TCP/IP數據包中的端口號

+0

這並不是說「客戶端沒有開放端口」,操作系統會在當時將客戶端進程綁定到某個可用端口,即只是您並不特別要求客戶端和操作系統上的特定端口將您的客戶端進程綁定到當時的可用端口 – tkhurana96

+0

服務器需要能夠正常響應客戶端,這意味着客戶端會選擇一個隨機端口並告訴服務器可以在那裏發送響應。 Wireshark顯然是監控的最佳工具https://www.wireshark.org/ –

回答

2

別忘了還有multiple layers involve here。即使經常聯合使用,TCP,IP和以太網也是不同的。記住分離很重要。以太網(第2層)是將各個計算機連接在一起的協議,但它並不關心它們具有的IP地址。 IP通過更大規模連接計算機,它可以通過各種「以太網僅僅是其中之一」的「第二層」網絡技術進行路由和發送。

關於IETF互聯網協議的好處是他們都是thoroughly documented,所以你可以瞭解他們如何在內部工作。對於在IP之上運行的TCP,端口號在TCP層中。 IP本身並不關心它們,它只關心源地址和目標地址。

的關鍵是在這裏描述的TCP頭在圖中:

0     1     2     3 
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |   Source Port   |  Destination Port  | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |      Sequence Number      | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |     Acknowledgment Number      | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    | Data |   |U|A|P|R|S|F|        | 
    | Offset| Reserved |R|C|S|S|Y|I|   Window    | 
    |  |   |G|K|H|T|N|N|        | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |   Checksum   |   Urgent Pointer  | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |     Options     | Padding | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |        data        | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

源和目標端口必須來填充。這是您的系統IP堆棧如何跟蹤哪些數據包屬於哪個連接的關鍵組件。

通常,當您編寫連接到服務器的代碼時,您的連接源自(某種程度上)隨機的源端口。當您創建偵聽端口的服務器進程時,可以自動分配或設置該端口。

對於像HTTP這樣的服務,如果您希望其他客戶端連接到該服務,那麼您希望該端口固定爲80,因此自動分配無濟於事。有時候自動分配是最好的,所以沒有衝突。

您可以使用諸如tcpdumpWireshark之類的工具監視所有這些。他們可以深入到各個層面並顯示發生了什麼。

+0

謝謝。我在VB中創建了一個TCP服務器和客戶端應用程序,併成功地在客戶端和服務器之間發送/服務器在筆記本電腦的家庭無線網絡中使用端口1234。但是Wireshark沒有顯示我在該端口的客戶端和服務器之間交換的幀。我檢查了命令提示符,端口1234顯示在那裏。可能是什麼原因 ? –

+0

確保您在正確的界面上「傾聽」。使用WiFi時很容易誤聽以太網端口,反之亦然。這些是兩個不同的硬件接口,「迴環」或localhost接口通常是第三個接口。 – tadman

+0

兩者都在localhost 127.0.0.1中。所以它與我的wifi沒有關係? –

1

端口號是用於標識服務器/客戶端中運行的進程的邏輯實體/編號。就像您的服務器應用程序有一個端口號(您決定的那樣),客戶端應用程序也將擁有與其關聯的一些端口號,由操作系統分配。在cmd提示符下鍵入netstat -ab,您可以在命令給出的進程列表和相應的端口號中看到與客戶端應用程序關聯的端口號。