題 ping(8)如何工作?


作為我的網絡編程技能開發的一部分,我正在學習服務器/客戶端基礎知識。

所以基本上我在一些端口上寫服務器監聽,並且客戶端連接到它 並且數據流繼續......

現在我很著迷 ping 能夠從遠程機器接收響應, 沒有任何服務響應它?或者我在這裡誤?


4
2017-10-11 14:43


起源


有關ping如何訪問收到的ICMP消息,請參閱我的更新答案 - artistoex


答案:


由於ping(更準確地說,ICMP回應請求)是Internet協議的一部分,因此您的網絡堆棧(這是您的操作系統協議的實現)會回答這些請求。

它既不是TCP也不是UDP,也不是任何其他傳輸協議。在因特網頭中,存在協議字段,其指示IP分組包含什麼類型的有效載荷。對於TCP數據包,該字段表示TCP。對於ping數據包,它表示ICMP。

順便說一句。這不是ICMP的唯一用途。例如。當。。。的時候 TTL 如果數據包在網絡上傳輸時降至零,則將其丟棄,並通過ICMP數據包通知發送方。

如果你想知道如何 ping (8) 設法顯示從用戶空間收到的ICMP回复,它使用套接字API。這是源代碼中的相關部分:

/* Initialize raw ICMP socket */
proto = getprotobyname ("icmp");
if (!proto)
  {
    fprintf (stderr, "ping: unknown protocol icmp.\n");
    return NULL;
  }

fd = socket (AF_INET, SOCK_RAW, proto->p_proto);

10
2017-10-11 14:48





是的,你有點誤會。

當一個 ping請求 按標準(RFC 1122)發送給主機,主機必須回复。因此,有一個“服務”響應它。它不是應用程序級服務 - TCP / IP堆棧本身就是響應的“服務”。

Ping是無會話的 - 這可能讓你感到困惑。 Ping使用IP,不需要通過協商建立會話(TCP會這樣做)。當你為你的課程編寫程序時,我敢打賭你用TCP套接字寫了它。


5
2017-10-11 14:48



當iptables無狀態規則文檔談論ping“連接”時,它會變得很有趣:-)當真正的連接更少時。 - artistoex
UDP?錯誤。它在IP之上使用ICMP。 - artistoex
@artistoex,你是對的。我會編輯。我對大腦有UDP - 用它做點什麼。 :) - John
@artistoex,關於iptables,我認為人們更難想像“少連接”的聯繫。一般來說,更容易使用一般術語,例如“帶寬”與“速度”。等等 - John
對不起,我打算說iptables 狀態 規則 - artistoex


ping 實際上對IP堆棧本身發出ICMP請求,因此機器上沒有服務會記錄它,但是如果你有類似wireshark運行的東西,你可以通過這種方式檢測數據包。


2
2017-10-11 14:47



對抗NIC?那是錯的。 - artistoex
糾正。道歉,還在這裡...... - Jared Tritsch
更正了,它只是IP堆棧,沒有 TCP 涉及(ICMP 取代它的位置) - Darth Android