• ベストアンサー
  • 困ってます

javaでtcpヘッダを自前で作成する方法

javaでtcpヘッダを自前で作成する方法 こんにちは。 javaでtcpヘッダを自前で作成する方法を探しています。 例えばsynやrstのみ出力するですとか、シーケンス番号を自分で決めてTCPヘッダとデータを作っていくことです。 tcpコネクションを自動で確立してくれるものではありません。 実験用にfinだけ付けたパケット1つだけ飛ばし、対向の機器がどのような反応をするかを見るためのものです。 Cでは方法はあるようなのですが、私にはCよりもJavaの方がとっつきやすいので、Javaでできる方法を探しています。 例えばどのようなクラス(java.io.*など?)をインポートしてどのような関数を使えばよいでしょうか。 何卒よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数4
  • 閲覧数1776
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.4

たぶんJpcapでできると思いますよ。 http://netresearch.ics.uci.edu/kfujii/jpcap/doc/index.html 見れば分かると思いますが、サンプルも、 http://netresearch.ics.uci.edu/kfujii/jpcap/sample/SendTCP.java

共感・感謝の気持ちを伝えよう!

質問者からのお礼

mintia007さん、ありがとうございます! まさしくこのようなものを探していました。 さっそく使ってみます。

関連するQ&A

  • TCPの接続処理と終了処理について

    TCPでコネクションを確立するとき、制御フラグでSYN、SYN+ACK、ACKで3パケットをやりとしますが、終了手順のときは、FIN、ACK、FIN、ACKと4パケットをやりとりします。 これは何故でしょうか? コネクション確立時と同じく、FIN、FIN+ACK、ACKにしないのは何故でしょうか?教えてください。

  • TCPヘッダのヘッダ長について

    誰か知っていましたら御教示ください。 TCPヘッダのヘッダ長は,通常5または6を使用するものだと考えてました 7を使用するのは,どのような場合でしょうか? なぜこのような質問するかは,以下のことをおこなって専用制御装置とPCでTCP/IPの通信が出来なくなっためです。 (1)PC側のOSを winNT→2Kへ変えたところ専用制御装置との通信断となりました。 (2)イーサアナライザで解析したらPCからのSYN送信にてTCPヘッダにおけるヘッダ長がNTの時は,6(24バイト)なのにwin2Kでは,7(28バイト)になった (3)専用制御装置側はTCPヘッダのヘッダ長7は,エラーと判定し通信しない設計になってました (4)PCのアプリはwinsockの単なるソケット通信 そのため,TCPヘッダを書き換えることはできません (5)おそらくOSがwin2Kになったことが原因だと思います。 win2KでwinNTの時のように SYN送信でTCPヘッダのヘッダ長を6にする方法は,あるのでしょうか? 大変恐縮ですが誰か御回答ください。

  • WindowsのTCPコネクション管理

    Windows server 2003及びwindowsXPにおいて、以下のような動作を確認しております。(他のバージョンは未確認) [動作] あるIFからTCPコネクションを張った状態で、そのIFの無効化(非活性化)を行うと、TCPコネクションが切断される。 これはWindowsの仕様なのでしょうか? ちなみにUNIX系OSで同様のことを行っても、TCPコネクションは切断されません。 また、通信の対向マシンではTCPのFIN、RSTなどは受信していないことから、WindowsOS内部で何かしらの形でコネクションを強制切断していると思われます。 以上、ご回答をお願いいたします。

その他の回答 (3)

  • 回答No.3

多くのOSはTCPの実装をOS側が持っているので、そこを変更したいのであれば RAW Socketを使うか、ドライバレベルで変更するしかありません。 http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/net/socketOpt.html JavaではRAW/ICMP SOCKETSをサポートしていないと書かれていますね。(実装はC/C++で書いてJNIで呼び出すとかしかないようです。) >例えばsynやrstのみ出力するですとか、シーケンス番号を自分で決めてTCPヘッダとデータを作っていくことです。 TCPの偽装が目的でなく、そのような制御を実装したいのであればUDPで可能かと思います。 ちなみにRAW Socketを扱う場合WindowsならAdmin権限、UNIX系ではRoot権限が必要になります。

共感・感謝の気持ちを伝えよう!

  • 回答No.2

jpcapでググってみてください。 もしかしたら出来るかもしれません。 (としか言えませんが・・・)

共感・感謝の気持ちを伝えよう!

  • 回答No.1

ネットワーク通信関係のクラスはjava.netにありますが、Javaではそのレベルでの制御は難しいんじゃないのかな。 http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/net/package-summary.html

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • TCPのsynとかっていつ・何回位するのでしょうか

    ネットワークの勉強中の中年です。 入門編のTCP/IPですが、コネクション確立(syn→ack/syn→syn)などは 普通に手動で作業をする場合、いつ、何回位されるのでしょうか。 たとえばftpなどですが、 もちろん最初にクライアントからサーバーに接続する際にはとは思うのですか、 パスワードを送るたび、ファイルを送受信するたびに行うものなのでしょうか。 また、finを送るのは、byeでftpを閉じる時でしょうか。 パスワードの送信後とか、ファイルのやり取り後といったタイミングで 発生するのでしょうか。 それともパケットトレースで見るように1秒間に何十回というように されるものなのでしょうか。 挙動についていろいろ資料等があるのですが、 実際に使っているイメージではいつ何をしているかわからず… よろしくお願いいたします。

  • C言語でTCPの3way handshake

    (C言語)Linuxのpacket socket(socket(AF?PACKET, SOCK_DGRAM, htons(ETH_P_IP))) を使ってTCPの3way handshakeをOSのプロトコルスタックに頼らず自力で挑戦しています。 RFCやほかの技術本をよんでIPヘッダやTCPヘッダの実装は一応できたのですが、肝心のsynパケットを送った後のackパケットが返ってきません。 wiresharkでは問題なくsynパケットと認識できているのですが、きっとどこかに不備があるはずです。 そこでC, C++ Javaでもいいのでこのプログラムの実装例が載っているサイトなどを教えてください。(英語でもかまいません)

  • インターネット通信不能攻撃への対策

    ネットにつなぐ時もし攻撃者が僕が毎日10:00にモデムに電源をいれ プロバイダーからIPアドレスを振ってもらうタイミングがわかるとします。そして時々僕のところに除きに来て通信先もわかるとして、そこからIPアドレスをパケットを盗聴して僕のIPアドレスは完全に特定できるとして、IPアドレスの変更は無駄なこととして聞いてください。 僕のIPアドレスがばれているので通信先がわかり訪れたサイトのIPアドレスに成りすましTCPパケットを連続で打ってきます。 これはパーソナルファイアウォールのTCPのインバウンド拒否で防げますが、迷惑なのが 通信できないようにしてくることです。 僕のIPアドレスに成りすましてFIN、RSTパケットを送って通信を終わらせてるのか 通信先のIPアドレスに成りすまして僕のほうにFIN、RSTパケットを送ってきて終わらせてるのか そういうの詳しくないんですけど そういうのができると本気を出せば一日中強制的に通信不能にできることもできますよね? IPアドレスが偽装されてるのでどう相手を特定したらいいんですか? またjeticoというPFWがありますがこれはTCPのFIN,SYN,RSTなどフラグ別にまで制御できますが、これでインバウンドのRST,FINを遮断すれば解決できませんか?(それではぼくのIPアドレスに偽装して通信先にFIN、RSTパケットを送る遮断攻撃対策になってませんが) どうすれば遮断攻撃を回避できますか?

  • 任意のTCPパケットを送信するプログラムの実装

    TCP 通信確立後、任意のパケットを送信するプログラムを 作成しようと考えてます。ここでの任意のパケットとは、 下記のように TCP ヘッダの値を色々と設定したパケットを 指します。 ・TCP ヘッダのすべての制御フラグを有効にしたパケット ・TCP ヘッダのチェックサムを意図的に間違えたパケット 任意のデータを送信するだけであれば、通常の socket プログラムで実装できると思うのですが、TCP ヘッダを 色々と設定するプログラムとなると、どんな実装になるの でしょうか。C だと SOCK_RAW で socket 通信するよう、 実装するのでしょうか。 実装は C、perl を考えてます。

  • 3ウェイハンドシェイクについて

    TCP通信を行う場合、3ウェイハンドシェイクでパイプをつくるようですが、その始め(通信の始め)にSYNを送り、その返信にACKを返す仕組みになっていると思います。そのSYNを送るときに、MAC、IP、TCPヘッダーをつけたパケットを送ると思うのですが、アプリが作ったデータもまた送るのでしょうか?通信できるかどうかを確かめるだけなら最初の通信はデータが必要ないと思うのですが・・・。また、データをつけないパケットなども送ることができるのか(フォーマットに合わないような気が・・・)どうかもあわせてお願いします。

  • 無線LANで任意のパケットを作成し送信する方法について

    無線LANで任意のパケットを作成し送信する方法について linux(ubuntu)を使用しています。C言語を使い無線LANで、有線みたいにパケットを作成して目的のアドレス宛に送信したいと考えています。ですが、どのようにしたらよいのかよく分かりません。(IP、TCPヘッダーを作成できた様に無線LANでも同じことが出来るのですか?) プログラムの仕方等、どなたか分かる方教えていただけませんか? なにかそのようなことが載っているサイトや本はご存知ないですか? どうぞよろしくお願いします。

  • Javaのパケットキャプチャについて

    Javaでもネットワークのプログラミングができるということを知って、ちょっとそれをかじっている者です。 その学習をするに当たって、最終目標としてパケットキャプチャを作ってみたいと考えてるようになりました。 自分自身に送られてくるパケットを拾って、それを解析したいと思っています。 Pcap系のアプリケーション(WinPcapやlibpcap)を用いれば、それを用いたライブラリを使って作成できることもわかりました。 ただ、ちょっとこだわってみたいので、そういったものを利用することなく作成してみたいなと考えています。 ですが、インターネットで調べても、それらを使用した方法しかわかりません。 実際にそのようなことができるのでしょうか・・・。 TCPパケット・UDPパケットを受信することは可能ですが、その他のプロトコルのパケットの受信と、パケットの解析まではできないのじゃないかと思っています。 気になったので質問しました。 よろしくお願いします。

    • ベストアンサー
    • Java
  • wiresharkの見方がよく分からない(3ウェイハンドシェイク)。

    wiresharkを使って(遊んで?)、ネットワークの勉強をしているのですが(『実践 パケット解析』という本を読んでいます)、いまいち見方がよく分かりません。ネットワークの知識が乏しいせいかもしれませんが。 例えば、TCPの接続で、3ウェイハンドシェイクというものがあると思うのですが、その時のinfoで、 2580>http [syn] seq=0 Len=0 MSS=1460 という、表示があります。多分、一番最初のSYNパケットを送っているところだと思うのですが、なぜ最初にhttpという表示があるのでしょうか?まず、TCPで3ウェイハンドシェイクで行って、セッションを確立してからhttp…だと思っているのですが…。また、2580>の意味もよく分かりません。本には、この部分は触れられていませんでした。 よろしくお願いします。

  • FINパケット、RSTパケットが返却される理由?

    アパッチのヘルスチェックにて、パケットをみました。 シーケンス番号を追っていきましたが、下記のような 通常ではない動作がありました。 <ケース1> (1)サーバからのHTTPのGETに対して、クライアントがFIN.ACKパケットを返却する。 (2)サーバがFIN.ACKパケットをクライアントに送る。 (3)クライアントからRSTパケットが返却される。 ※RSTパケット内にて、broken tcpとの記載あり <ケース2> (1)サーバからのFIN.ACKパケットに対して、クライアントからRST.ACKパケットが返却される。 ・質問1 それぞれについて、正常な動作とはおもえないのですが、 異常でしょうか? ・質問2 FIN.ACKパケット又はRSTパケットが返却されるのはどんな場合が想定されるのでしょうか? ・質問3 FIN.ACKパケット→RST.ACKパケットは異常な動作でしょうか? よろしくお願いします。

  • パケットキャプチャについて

    パケットキャプチャについて wiresharkでパケットキャプチャをやっております。tcpでsynのパケットのみを収集したいのですが、現在では、 (1)ファイルの読み込み (2)フィルタの条件でtcp.flag.fin == 0 and tcp.fla.syn ==1 and tcp.flg.ack == 0 と入れフィルタリング。 (3)結果のファイルを保存 となって大変時間がかかります。cuiでコマンドライン上で一発ですませられる方法はありませんか?