C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C# TCP Socket通信で送受信パケット分析方法?

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■102551 / inTopicNo.1)  C# TCP Socket通信で送受信パケット分析方法?
  
□投稿者/ ななしさん (1回)-(2023/11/16(Thu) 13:00:50)

分類:[C#] 

環境:VisualStudio C# .Net Framework 4.6


System.Net.Sockets.TcpListenerインスタンスから TCPサーバを立て、
System.Net.Sockets.Socketによりクライアント接続し通信するプログラムを作成しています。
片方からデータを送信して、片方からデータを受信するのは簡単ですが、
TCPデータの送受信って ACK、NAK、FIN、SYNがありますよね。

クライアントからサーバへデータを送信すると、WireSharkでパケット分析してみると下記のように出ていました。
1.「[PSH, ACK] データ部」クライアント→サーバ
2.「[ACK]」クライアント←サーバ

この「2.[ACK]」が問題なんですが、別にコーディングしなくても勝手に送信しています。
普段はそれでいいんですが、これをうまくコントロールする必要があって。。。

目標1.データ受信時、ACKを返すタイミングを遅らせたい
目標2.データ受信時、わざと ACKではなく NAKを返したい
目標3.データ送信後、本当に ACKを返してもらったか明確に知りたい
目標4.FINってどうやって受信したか分かる?!

という事が必要です。
下記、現在のTCPデータ送受信コード一部です。

<@サーバー側>
var listener = new TcpListener(IPAddress.Any, port);
listener.Start();
Socket serverSocket = listener.AcceptSocket();

<Aクライアント側>
var clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(IPAddress.Parse(IPアドレス), ポート);

<Bクライアント送信側スレッド>
clientSocket.Send(バイトアレイ);
// この時、「[PSH, ACK] データ部」送信
//(目標3 送信後、本当に ACKを返してもらったかクライアントは分かるか?)

<Cサーバー受信側スレッド>
var size = serverSocket.Receive(バッファ);
// この時、「[ACK]」を返している
//(目標1 ACKをどう遅らせるか?)
//(目標2 ACKではなくNAKを返すには?)

<Dサーバー側終了(FIN)>
serverSocket.Shutdown(SocketShutdown.Both);
// この時、「FIN, ACK」を送信。クライアントは「ACK」を返した
serverSocket.Close();
//(目標4 クライアントは FIN受信したかをどう分かる?)

という流れが今の実装です。
通信は上手く出来ていますが、それぞれの目標達成方法がまったく知りません。
細かいコントロールは Socketライブラリが勝手にやってくれているんでしょうか。
シミュレータツール開発の機能なので、TCPパケットをユーザーが知る必要はないという言葉では逃げられないんです。

引用返信 編集キー/
■102553 / inTopicNo.2)  Re[1]: C# TCP Socket通信で送受信パケット分析方法?
□投稿者/ Azulean (1289回)-(2023/11/16(Thu) 21:10:29)
No102551 (ななしさん さん) に返信
> 目標1.データ受信時、ACKを返すタイミングを遅らせたい
> 目標2.データ受信時、わざと ACKではなく NAKを返したい
> 目標3.データ送信後、本当に ACKを返してもらったか明確に知りたい
> 目標4.FINってどうやって受信したか分かる?!
>
> という事が必要です。

> 細かいコントロールは Socketライブラリが勝手にやってくれているんでしょうか。
> シミュレータツール開発の機能なので、TCPパケットをユーザーが知る必要はないという言葉では逃げられないんです。

少なくとも、こういった高位な使い方をしている限り、不可能です。
ドライバーレベルまで落ちないと無理じゃないかな…。
引用返信 編集キー/
■102554 / inTopicNo.3)  Re[2]: C# TCP Socket通信で送受信パケット分析方法?
□投稿者/ Hongliang (1294回)-(2023/11/16(Thu) 22:04:08)
RAWソケットで自前でTCPを喋ればなんとかなりそうではあります。
System.Net.Sockets.SocketクラスでもRAWソケットは扱えますが、Windowsの場合管理者権限が必要だったはずです。
他には、私は触ったことはありませんがpcapをC#から扱えるようにラップしたSharpPcapというのがあって、パケットの書き換えなどもできそう?
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ