2012-03-07 112 views
0

我對原始套接字以及如何創建它們感到好奇,並且希望實現我自己的TCP機制。我已經閱讀了一些示例,併成功地發送了自定義的TCP數據包和UDP數據包以及我自己編寫的IP頭(當然受到很多示例的影響)。我已經檢查過Wireshark數據包是否到達目的地,所以一切都很好。如何通過原始套接字接收「syn」數據包時使用「syn ack」數據包進行響應?

但對於TCP數據包,使全握手:

Client  Server 
syn ---> 
    <--- syn ack 
ack ---> 

我從視server's點需要什麼來獲得syn包,所以我可以在syn ack發送回客戶端?

+0

「我需要從服務器的角度來獲得syn包「這是什麼意思? – 2012-03-07 10:17:37

+0

當SYN數據包到達指定端口上的服務器時,如何捕獲運行在服務器上的應用程序內的數據包? – Rox 2012-03-07 10:30:04

+0

由於你自己處理IP,網絡協議會將幀傳遞給你的IP層,你從IP的有效載荷中取出'message',你的'message'現在包含了syn header。 – 2012-03-07 10:36:24

回答

1

要在原始套接字上接收數據包,只需撥打recvrecvfrom就可以了。操作系統會向您返回發往本機的下一個數據包的副本,其中包含標題和全部,其中應包含地址信息。觀察目標地址,端口和傳輸協議,並忽略不符合您期望的內容。 (因爲原始套接字的意思是沒有內置的端口或任何操作系統可以用來將數據包路由到套接字的概念,它不知道將程序發送給哪個程序......所以每個原始套接字應該接收每個數據包發往機器,意思是你可能會收到很多你不感興趣的廢話。)

一旦你看到一個發給「你」的數據包,只要建立一個SYN/ACK數據包併發送到地址和端口列爲接收數據包中的源。

請注意,操作系統通常會自行處理TCP和UDP數據包(包括髮送ICMP「端口不可達」或其他端口沒有偵聽器的響應)......並進行自己的處理最重要的是必然會造成不正常。如果你要實現自己的TCP協議,你可能需要使用不同的協議號。 (當然,那麼大多數客戶將無法連接到它...你必須做一個客戶端。)

+0

比從未更好的遲到,但謝謝你的回覆! :-) – Rox 2013-12-29 22:37:00

+0

UDP有套接字,因此如果您正在偵聽UDP,則不必擔心目標地址,端口和傳輸協議。 – 2014-03-19 19:25:37

+0

@MooingDuck:如果你有一個UDP套接字,你不必擔心 - 操作系統會爲你過濾它們,只給你發送給綁定到套接字的address:端口的UDP消息。另一方面,原始套接字是非常愚蠢的 - 操作系統將所有內容都傳遞給您,並將其放在您身上以識別(並因此解析)您所關心的內容。 – cHao 2014-03-19 20:36:47

相關問題