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

わんくま同盟

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

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

ツリー一括表示

C# TCP Socket通信で送受信パケット分析方法? /ななしさん (23/11/16(Thu) 13:00) #102551
Re[1]: C# TCP Socket通信で送受信パケット分析方法? /Azulean (23/11/16(Thu) 21:10) #102553
  └ Re[2]: C# TCP Socket通信で送受信パケット分析方法? /Hongliang (23/11/16(Thu) 22:04) #102554


親記事 / ▼[ 102553 ]
■102551 / 親階層)  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パケットをユーザーが知る必要はないという言葉では逃げられないんです。

[ □ Tree ] 返信 編集キー/

▲[ 102551 ] / ▼[ 102554 ]
■102553 / 1階層)  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パケットをユーザーが知る必要はないという言葉では逃げられないんです。

少なくとも、こういった高位な使い方をしている限り、不可能です。
ドライバーレベルまで落ちないと無理じゃないかな…。
[ 親 102551 / □ Tree ] 返信 編集キー/

▲[ 102553 ] / 返信無し
■102554 / 2階層)  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というのがあって、パケットの書き換えなどもできそう?
[ 親 102551 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -