トップページ⇒tech
1001コメント356KB

ネットワークプログラミング相談室 Port16

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/12/31(土) 14:07:24
主にソケットに関しての質疑応答スレッドです。

Programming UNIX Socket FAQ (日本語訳)
  http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
Winsock Programmer's FAQ (日本語訳)
  http://www.kt.rim.or.jp/~ksk/wskfaq-ja/

関連リンクは>>2-10辺り
足りなかったら適当に付け足してね

前スレ
ネットワークプログラミング相談室 Port15
http://pc8.2ch.net/test/read.cgi/tech/1128088448/
0153デフォルトの名無しさん2006/01/20(金) 00:24:20
>>152
まあ、Ethereal で全部取れたら、sniffer の糞重
い機器の立つ瀬がないわな。
0154デフォルトの名無しさん2006/01/20(金) 05:15:43
 こんばんわ。初心者の疑問なのですが、お教え頂けないでしょうか?

 DirectPlayでピアツーピアアプリを開発しようとしていたのですが、WEBで検索していて、
以下のように変化してきています。

1.ピアツーピアは NAT 越えできないから、費用かかってもクラサバでやるべきだろう。
2.DirectPlay は推奨されていない(MS自身を含めて)から Socket でやるべきだろう。

 で、今はサーバーを NAT の外に置き、クライアントはどこでも可、通信は Socket で行う。
という環境を想定しています。

 そこで以下の疑問が発生して悩んでいます。

1.部分的に UDP を使いたいのですが、UDP もやはり NAT 越え出来ないのでしょうか?
  今回の環境でいうと クライアントからの送信は UDP で行えるが、サーバーからクライアント
  への送信に UDP は使えないのでしょうか?
2.速さを要求する部分には UDP を使うべきでしょうか?TCP-IP と UDP ではかなり差があるもの
  なのでしょうか?

どうかよろしくご教授下さい。
0155デフォルトの名無しさん2006/01/20(金) 08:37:37
>ピアツーピアは NAT 越えできないから

ダウト

>1.
そんなことはない

>2.
無視できない差がある
0156デフォルトの名無しさん2006/01/20(金) 10:52:42
>>155
NATごぅぇできないだろ
設定めんどうくさいじゃん
頭で思っただけでルータが設定されるならいいけど
0157デフォルトの名無しさん2006/01/20(金) 11:02:29
>>155 ありがとうございます。


>1 そんなことはない

やはりできるのですね?DNSサーバーへの問い合わせとかにもUDP使われてる訳ですもんね。
調べてきます。


>2 無視できない差がある

やはり。


ちょっと、勉強し直してきます。また質問させて下さい。
0158デフォルトの名無しさん2006/01/20(金) 13:47:55
>>155 ちょっと進歩しました。

>そんなことはない

 NAT 、静的IPマスカレードは、ゲートウェイ外部から内部へのアクセスはできました。

 ところで、それ以外のIPマスカレードの場合、やはり外部から内部にアクセスはできないのでしょうか?
 IP、UDPに関わらす。
 
0159デフォルトの名無しさん2006/01/20(金) 15:07:47
>>158
内部のPC のアドレスを a.a.a.a 、ルータの外部アドレスをb.b.b.b
どこか他の PC やサーバのアドレスを c.c.c.c、
p, q, r をポート番号としたとき、

多くのルーターは、
a.a.a.a:p ⇒ b.b.b.b:q ⇒ c.c.c.c: r と UDP パケットを転送すると、その後しばらくの間は、
c.c.c.c: r ⇒ b.b.b.b:q と到着したパケットを a.a.a.a : p に転送してくれる。

これを利用していろいろなことが出来る。
0160デフォルトの名無しさん2006/01/20(金) 15:29:49
>>158
UDP Hole punching でぐぐるといいよ。
0161デフォルトの名無しさん2006/01/20(金) 16:04:36
>>154
> 2.速さを要求する部分には UDP を使うべきでしょうか?
>   TCP と UDP ではかなり差があるものなのでしょうか?

速度に関する特性が全く違うので応用による。
UDPで、どんな状況下でも効率の良い実装を行うのはかなり難しい。
0162デフォルトの名無しさん2006/01/20(金) 16:48:57
TCPでもほとんど再送が起こらない状況ならUDPとたいして変わらんよ。
0163デフォルトの名無しさん2006/01/20(金) 19:47:17
unix系でのネットワークプログラミングなんですが。
サーバー側のaccept()で待つソケットについて質問があります。
普通、accept()に突っ込むソケットacpt_sockはまずバインドして、listen()で接続を受け付ける
クライアント数を設定するわけですが、accept()してからだと、クライアント数を変更することが
できません。
accept()中でも接続を受け付けるクライアント数を変更したいのですが、何かいい方法を教え
ていただけないでしょうか。
0164デフォルトの名無しさん2006/01/20(金) 19:55:02
>>159

 なるほど!スゴイ。このあたり掘り下げて調査してみます。

>>160

 こ、これも!さっきWEBで見ていたGapNATとNATSとかより、確実そうな方法。調査してみます。

>>161

 そうですか。では、UDPをアプリデータ通信よりも、経路確保やKEEP-ALIVEの為に使うのが現実的そうですね。

>>162

 ありがとうございます。経路確保やKEEP-ALIVE以外は全てIP転送を使用するというところから初めてみます。


 皆様、的確なご指示ありがとうございます。

 以前、別スレで他の質問をした事がありますが、板違いで質問ツアー → 玉砕 というパターンばかりでした。
 これほど的確に教えて頂けるものなのですね。感動しました。2ちゃんすごい。

 これからはスレの内容を充分把握してから質問するよう心がけます。ありがとうごさいました。

 
0165デフォルトの名無しさん2006/01/20(金) 21:41:04
http://pc8.2ch.net/test/read.cgi/gamedev/1078503950/635
0166デフォルトの名無しさん2006/01/20(金) 21:49:38
>>164
>  経路確保やKEEP-ALIVE以外は全てIP転送を使用する

UDPとTCPが並列関係。
IPはUDPとTCPの下位層で、
UDP使った時もTCP使った時も、IPを使っている。

TCP/IPというのは、IP, TCP, UDP, DNS, HTTPなどプロトコル群の総称。
同じ意味の言葉に、インターネット・プロトコル・スーツがある。
0167デフォルトの名無しさん2006/01/20(金) 22:51:55
>>163
ん? backlog を動的に変えたいのか?
まず、何のためにそんなことしたいのか書いたほうがいいと思う。
(backlog の意味を勘違いしてるに一票を投じておくか…。)

>>166
DNS と HTTP まで含むのか?
0168デフォルトの名無しさん2006/01/20(金) 23:05:05
>>167
そういう定義です。> TCP/IP
http://www.ipa.go.jp/security/rfc/RFC2828-03TJA.html#TCP/IP
http://www.instantweb.com/D/dictionary/foldoc.cgi?TCP%2FIP
0169デフォルトの名無しさん2006/01/21(土) 07:03:10
レイヤ的には

DNS -> UDP -> IP
HTTP -> TCP -> IP

ですよね?
どうして UDP/IP とは言わないんだろう・・・orz
0170デフォルトの名無しさん2006/01/21(土) 07:26:47
>>166
すみません。TCPのつもりでIPと書いていました。
用語を適切にしようするよう注意します。
0171デフォルトの名無しさん2006/01/21(土) 07:35:08
>>169
いや、言うよ?
0172デフォルトの名無しさん2006/01/21(土) 07:37:25
>>165
申し訳ありません。マルチポストしてしまいました。
2度とこのような事はしませんのでご勘弁下さい。
0173デフォルトの名無しさん2006/01/21(土) 07:46:48
>>171
言わないな。
TCP/IPが>>168の意味だから。
0174デフォルトの名無しさん2006/01/21(土) 16:29:19
>>173
だから、言うって。上のリンク見ても別に否定されないじゃん。
0175デフォルトの名無しさん2006/01/21(土) 18:04:01
インターネット研究している奴が、UDP/IPなんて言っているの聞いたことない。
0176デフォルトの名無しさん2006/01/21(土) 18:10:09
http://www.google.co.jp/search?q=%22UDP%2FIP%22&start=0&hl=ja&lr=lang_ja&ie=utf-8&oe=utf-8

まあ、DNSやHTTPをTCPやIPと同列に語るよりは、ずっとまとも。
0177デフォルトの名無しさん2006/01/21(土) 18:41:49
HTTP,FTP,etc. DNS,SNTP,etc.
------------------------------
TCP UDP
------------------------------
IP
0178デフォルトの名無しさん2006/01/21(土) 18:58:46
>>175
言うよ。
単にTCPと比べて用途が限定されてるから機会がそれほど多くないだけで。
0179デフォルトの名無しさん2006/01/21(土) 19:01:38
UDPもTCPもIP込みが当たり前だから、TCP, UDPで十分。
「UDPとIP」を「UDP, IP」と書いたり言うことはあっても、UDP/IPは変だ。
0180デフォルトの名無しさん2006/01/21(土) 19:17:14
UDP/IPが変に感じるのは、単なる知識不足。
0181デフォルトの名無しさん2006/01/21(土) 19:20:42
「TCP」との比較として「UDP」とだけ表記されることは良くある、というよりこっちが大半だけど

TCPについては「TCP/IP」と明記していながら
UDPについては「UDP」としか書かれていない、なんてことは
まともな書籍、資料等なら、まず無い。
0182デフォルトの名無しさん2006/01/21(土) 19:59:17
へー(棒読み
0183デフォルトの名無しさん2006/01/21(土) 20:46:44
ひとりで頑張るね
0184デフォルトの名無しさん2006/01/21(土) 21:00:31
TCPとUDPの使われ方が絡んでるだろ>TCP/IP
0185デフォルトの名無しさん2006/01/21(土) 22:35:05
>>179
> 「UDPとIP」を「UDP, IP」と書いたり言うことは
> あっても、UDP/IPは変だ。

お前、UDP/IP って「UDP と IP」の意味だと思ってる
のか? そりゃそんな意味で UDP/IP なんて書く奴はい
ないよ。

>>184
何を言いたいの?
0186デフォルトの名無しさん2006/01/21(土) 22:44:57
おまえらヌルい盛り上がり方してんな。
0187デフォルトの名無しさん2006/01/21(土) 22:47:09
>>181
>TCPについては「TCP/IP」と明記していながら

"TCP/IP" と書いたら、TCP だけでなく UDP 等も含んだプロトコルセットを
意味するのが一般的でしょう。反対に、UDP/IP という表記は多くの人に
とって違和感のある表現であると思われます。
0188デフォルトの名無しさん2006/01/21(土) 23:03:41
レイヤを分けるスラッシュじゃないの?
0189デフォルトの名無しさん2006/01/21(土) 23:06:27
>>186
いつものことだよ
0190デフォルトの名無しさん2006/01/21(土) 23:08:31
こんばんは。UDP Hole punching についてお教え下さい。

1.TCP でこの処理を行えないという点がよく分かりません。
「TCP は非対称だから」という事なのですが。接続の方向のことでしょうか?

2.UDPで UDP Hole punching を行った後は TCP で接続できるのでしょうか?


ちなみに、間違っているかも知れませんが 私は UDP Hole punching を以下のよう
に理解しています。

別々のNAT内に Ha, Hb がありルーターをそれぞれ Ra, Rb とする。
インターネット上に Hc がある。

1.Ha, Hb ともに Hc に接続 Hc は Ha, Hb のグローバルアドレスを記録する。
2.Ha は Hc から Hb のグローバルアドレスを取得し接続する。
  この時、Rb が conn NAT でなければ越えられないが、Ra には Hb との変換レ
  コードが記録される。
  この時点で、Hb から Ha に接続できる。
3.同様に Hb が Ha に接続( punching )する。
0191デフォルトの名無しさん2006/01/21(土) 23:15:17
>>187
「TCP over IP」の意味で「TCP/IP」という言葉を使う人が、世界に一人も居ないと思ってるの?
それと同様の意図で「UDP/IP」と言うのは間違いだと言いたいわけ?
0192デフォルトの名無しさん2006/01/21(土) 23:16:42
すみません。>>190 で言ってるグローバルアドレスとはポート番号を含めたものです。
よろしくお願いいたします。
0193デフォルトの名無しさん2006/01/21(土) 23:30:26
|―――――――|
|  UDP  |  TCP  |
|―――――――|
|      IP      |
|―――――――|
0194デフォルトの名無しさん2006/01/21(土) 23:31:05
めっちゃずれてたw
0195デフォルトの名無しさん2006/01/21(土) 23:31:10
>>21
∧_∧         ミ ギャハッハッ ズレてる!ズレてる!
     o/⌒(. ;´∀`)つ
     と_)__つノ  ☆ バンバン




∧_∧         
     o/⌒(゜Д゜  )つ
     と_)__つノ
0196デフォルトの名無しさん2006/01/21(土) 23:32:42
>>191
>それと同様の意図で「UDP/IP」と言うのは間違いだと言いたいわけ?

こっちは世界的に見て少数派だろうなぁ。
UDP が over IP である事を厳格に明示したい場合ってどういう時?
0197デフォルトの名無しさん2006/01/21(土) 23:34:46
     m(・∀・)<この5円玉をじっと見つめてください
     |
     �D

     m(・∀・)<あなたはだんだんどうでもよくなる…
     /
    �D ))

     m(・∀・)<あなたはだんだんどうでもよくなる…
      \
      (( �D
0198デフォルトの名無しさん2006/01/21(土) 23:48:51
>>196
は?
あんた「UDP/IPは間違い」って言ってんだろ?
多数か少数かは関係ないだろ。
0199デフォルトの名無しさん2006/01/21(土) 23:55:03
>>198
誰と勘違いしてるのか知らんが、>>197 でも見て落ち着け。
ちなみに俺も、理由無しに UDP/IP なんて書いてる奴がいたら、ちょっと眉をひそめるな。
0200デフォルトの名無しさん2006/01/22(日) 00:01:18

  .-、 
 (,,■)
0201デフォルトの名無しさん2006/01/22(日) 00:22:16
>>190
1. TCPでも同様の技法は使える。
  非対称の接続を行う場合対称構造にはならない。
  (ただしTCPには対称に接続確立する方法がある)
2. NATルータは通常TCPとUDPを区別して管理しているので不能。

ちなみに、登録サーバがあるスタイルのものを、
UDP hole punchingと呼ぶ流儀もあるが、
http://en.wikipedia.org/wiki/UDP_hole_punching
portの利用方法のことだけを言う場合も多い。
http://muziyoshiz.jp/20041225.html

私は後者(の前者)をUCP hole punchingと読んでいる。
0202デフォルトの名無しさん2006/01/22(日) 01:06:44
ローカルアドレス入りのデータグラムををGatewayから
たくさん送出しちゃいました・・別に大丈夫ですよね?
ちなみに私は18歳女子高生(処女)です。
0203デフォルトの名無しさん2006/01/22(日) 01:11:36
残念、俺は非処女だよ。
0204デフォルトの名無しさん2006/01/22(日) 01:12:19
>>202
それはUDP/IPのパケットですね?
0205デフォルトの名無しさん2006/01/22(日) 02:17:22
Winsock+vc++でのWindowsプログラミングの練習中なんですが質問が何点か。
買った参考書では、一対一でのチャットのソフトではTCP/IPを、複数での
チャットソフトではUDP用いていましたが、TCP/IPで同様に複数でチャットを
するには、接続分ソケットを用意するということでしょうか?

それと、WSAAsyncSelectを使いメッセージ等を単一で処理をするのと、
マルチスレッド化してaccept()などを使用するのと、どちらが良いのでしょうか?
どちらとも、ということでしたら、理由などを参考程度にお願いします。
0206デフォルトの名無しさん2006/01/22(日) 02:20:04
WinsockFAQの、「どのIO戦略を使うべきか」でも見とけ
0207デフォルトの名無しさん2006/01/22(日) 02:23:35
>>205
はい、UDP/IPとちがって、TCPは接続指向ですから、
接続後とにその端点であるソケットが必要になります。
02082052006/01/22(日) 02:30:18
助かります、ありがとうございました。
0209デフォルトの名無しさん2006/01/22(日) 02:35:23
>>205 間違っているかも知れませんが、自分は以下のように理解しています。

TCPは基本的にクラサバで、サーバー側がListenしてクライアントがConnectする。
Listenしているポートには、IPアドレス.ポート番号さえ違えば、いくらでも接続できる。(例:Webサーバーのポート80)

0210デフォルトの名無しさん2006/01/22(日) 03:01:16
だってTCPの接続の識別子は、
<src IP, src port, dst IP, dst port>の四つ組なんですもの。
0211デフォルトの名無しさん2006/01/22(日) 05:09:31
>>202
どこかのサイトの誰かのローカルアドレスに届くだけだから大丈夫
0212デフォルトの名無しさん2006/01/22(日) 12:40:51
>210
いや、UDPだって同じだろ?
0213デフォルトの名無しさん2006/01/22(日) 12:49:12
>>210
UDPには接続はない。常に一方向である。
よって<dst IP, dst port>だけで目的のソケットまで辿り着く。
TCPはそうではない。<src IP, src port, XXX, 80>は何組みもありうる。
これが>>209が理解し、>>212が理解してないこと。

UDPで、<src IP, src port>にパケットを返すケース、
それは上位層(セッション、アプリケーション)の仕様なのである。
# UDP hole punchingは上位層の振る舞いを利用する。
TCPの場合は、TCP層で<src IP, src port>が相手であることがはっきりしている。
0214デフォルトの名無しさん2006/01/22(日) 13:29:18
よくわからんな。
TCPのsrcaddr:srcpotが信頼できて、UDPのは信頼できないってだけの話か?
それともUDP・TCPのソケットレイヤにおける動作の違いが言いたい?
TCPだって、相手にデータを返すのは上位層の役割。送信と受信で
TCPソケットを分けるような変態設計もできるわけだし。
0215デフォルトの名無しさん2006/01/22(日) 13:44:27
自分はUDPパケットの中身よく知らないんですが、ひょっとして、
物理的にも DstAddr、DstPort しか持っていないんですか?
0216デフォルトの名無しさん2006/01/22(日) 13:47:45
すいません。sage
0217デフォルトの名無しさん2006/01/22(日) 13:54:28
>>215
UDPパケットにも、ありますよ。
http://www.faqs.org/rfcs/rfc768.html

けどUDP層ではそれは使わないんです。
それがUDPとTCPのサービスの違いになっています。

> それともUDP・TCPのソケットレイヤにおける動作の違いが言いたい?

その動作はサービスの違いを反映しているんです。
OSIの言葉で言うところの、各層のエンティティのアドレスって考え方を理解してください。

>>210はTCPの極めて基本的な常識です。
TCPの接続を実現するためには四つ組を識別子に使わざるを得ないんです。
# <dst IP, dst port>が同じ接続を認めないといけないので。
UDPには接続がないので、そうではありません。

これを理解してない人はTCP/IPの基本を理解してないと言わざるを得ません。
0218デフォルトの名無しさん2006/01/22(日) 13:57:33
>>215
SrcAddrはIPヘッダに、SrcPortはUDPヘッダに。
0219デフォルトの名無しさん2006/01/22(日) 14:15:36
>>218
加えるにpseudo headerの中にSrcAddr, DstAddrもある。
0220デフォルトの名無しさん2006/01/22(日) 14:30:18
>よって<dst IP, dst port>だけで目的のソケットまで辿り着く。
は間違い。UDPでもconnect済みのソケットは、srcを区別して捨てるようになるから。
0221デフォルトの名無しさん2006/01/22(日) 14:31:18
> TCPだって、相手にデータを返すのは上位層の役割。

レイヤーが理解できていませんね。

ヒント: ACK パケット

>>219
え゛?
0222デフォルトの名無しさん2006/01/22(日) 14:37:40
この場合のデータとは、TCPのペイロード部分を指す。
ソケットレベルで無意味なACKは考えない。
そのために、パケットではなくデータという言葉を使ったんだから。
0223やっぱり、理解できていなかったか…。2006/01/22(日) 14:48:12
>>222
ふーん、そうなんだ。

で、誰がそんな話してるの?

独り言なら、チラシの裏へ…。
0224デフォルトの名無しさん2006/01/22(日) 15:11:35
TCP hole punching を発明?

http://homepage3.nifty.com/toremoro/p2p/firewall.html の下方にあるように UDP hole punching は UDP
でしかできないとなっています。でも以下の方法でやれば TCP でもできるのでは?...

1.STUN サーバー(グローバル状態)に接続して、自分の Address.Portを記録してもらう(サーバー用として)。

2.外部からつなぐ場合、STUN サーバーから Address.Portを取得して、UDP で「サーバー用にポートを切
  り替えて」というパケットを送る。

3.ポートを切り替える。

4.外部からTCPで接続する。

駄目でしょうか?
0225デフォルトの名無しさん2006/01/22(日) 15:40:15
>>224
> 3.ポートを切り替える。

が無理です。

>>224のように登録サーバを使うhole punchingなら簡単です。

双方自分のIPアドレス、ポート番号を登録して、
ローカルソケットには登録したIPアドレス、ポート番号をbindし、
同時に相手にconnectしにいけばいいだけです。

UDPでも全く同じコードで動きます。
0226デフォルトの名無しさん2006/01/22(日) 16:00:19
>>225

>ローカルソケットには登録したIPアドレス、ポート番号をbindし、

ポートを切り替えるといってたのはその事です。やはりできるのですね?

なんでこれをやりたいかと言いますと、単にNATの背後にある PC 同士で通信したいだけなんです。
でも、UDP でやると セッションとかパケットの並べ替えとかを UDP の上に作りこまないといけないと
書いてあり、場合によっては UDP の上で TCP を発明するぐらい作りこむ事になりかねないって事
だったんです。
でも TCP でも やりようによってはできるんですね。やる気でてきました。

ところで、Symmetric NAT のルーターって全体の何割くらいあるものなのですか?
Symmetric NAT は、ポート番号総当りで突破できるでしょうか?
0227デフォルトの名無しさん2006/01/22(日) 18:20:47
注意点としては、
・SYNパケットがhole punchingを行うことになるが、
相手がhole punchingする前にルータにSYNが到達した場合、
ルータの振る舞い、ルータの出したICMPを受けた時のプログラムの振る舞い。

一番簡単なのは中継サーバを使う方法。
0228デフォルトの名無しさん2006/01/22(日) 20:23:32
かなり難しそうですね。パケットを何万を投げると何とか攻撃になりそうだし...
中継サーバーが確実ですね。
0229デフォルトの名無しさん2006/01/22(日) 20:51:31
>>228
udpで実際 Punching holeやってるが
コネクション型のTCPでできるの?
0230デフォルトの名無しさん2006/01/22(日) 21:11:12
>229
すみません。あまりネットワーク詳しくない上に、確認する環境がないもので...orz
ただ、WEBで調査した結果、できそうだなと...

でも、ルータの変換テーブルへの記録され方が TCPとUDP で同じだとの前提ですが。(ConnNAT,Destricted何とかNAT,SymmetricNATなど)

方法としては単純で、以下の手順を行います。

1.PC-A から 外部の PC-B にクライアント接続します。PC-B は PC-B からみたリモートアドレスとリモートポートを取得します。
2.PC-A はローカルポートとリモートポートを逆にして、サーバーとして待機します。
3.外部の PC-X は PC-B から PC-A のアドレスを取得して、クライアントとして接続します。

UDP Hole Punching と違うのは、ポートを逆にする手順だけだと思います。    確認できたとしたら、是非教えて下さい。
0231デフォルトの名無しさん2006/01/22(日) 21:16:48
sage
0232デフォルトの名無しさん2006/01/22(日) 21:19:43
TCPのNATはちゃんとstateを見てるんじゃないのかなぁ。
0233デフォルトの名無しさん2006/01/22(日) 21:24:39
今時の賢い奴はシーケンス番号の重複もちゃんとチェックしているはずだしね。
0234デフォルトの名無しさん2006/01/22(日) 21:29:42
>>.230 ですが。

すみません。さっきの手順でつながるのは ConnNAT の場合だけでした。
DistrictedなんとかNAT (2種類) を考えた場合、 UDP Hole Punching と同じ手順が必要だと思います。
(UDP Hole Punching の手順に ポート逆転 を追加)
0235デフォルトの名無しさん2006/01/22(日) 21:32:57
>>232 >>233
まじですか?もうプログラムを作り変え始めてたのに。
調査はするけど詰めが甘い自分...orz
0236デフォルトの名無しさん2006/01/22(日) 21:55:07
さっきの手順をまとめ直してみました。 駄目ですかね...

1.PC-A から 外部の PC-O にクライアント接続して待機。PC-O は PC-O からみたリモートアドレスとリモートポートを取得します。

2.PC-B から 外部の PC-O にクライアント接続して待機。PC-O は PC-O からみたリモートアドレスとリモートポートを取得します。

3.PC-A から PC-B に接続する場合、PC-O に要求を出します。

4.相手方のアドレスとポートを取得した両方の PC は切断して相手方にクライアント接続します。
  接続は失敗しますが、自分側ルーターの変換テーブルに相手方とのレコードが残ります。(きっと)

5.PC-B はローカルポートとリモートポートを逆にして、サーバーとして待機します。

6.PC-A は PC-B にクライアント接続します。
0237デフォルトの名無しさん2006/01/22(日) 23:23:41
>>236
俺の認識だと
■UDPは非コネクション系だからNATはそのパケットが正規の
ものか認識できない IPアドレスでは
■送信した時のポートを覚えておいて、そのポートできたパケットを受け入れる
■送信したIPアドレスも覚えておく

TCPのコネクションだと相手のIP固定だからルーターも
アドレスで選別できるよね?



0238デフォルトの名無しさん2006/01/22(日) 23:32:43
>>237
ついでに
私が作ったのはTV電話だけど
UDPの欠落、順序違いはたまに発生するけど
頻度から考えてTCPの再発明までこったする必要ないと
思うが?
TV電話の音声・映像は逆に再要求で遅延がひどいパケットは
捨てたいからUDPが向いてるけど
>>236さんがリアルタイム性の強いものを作るならばUDPの方が
向いてるし、ファイル系の速度よりも信頼性を取るならば
リレーサーバーで十分と思うが
0239デフォルトの名無しさん2006/01/22(日) 23:47:22
>>237

>■送信したIPアドレスも覚えておく

Restricted Cone NAT       送信した相手のIPアドレスも覚える
Port-Restricted Cone NAT    送信した相手のIPアドレスとポート番号まで覚える

この場合は考慮しています。と言いますか、送信先を覚えない Conn NAT の場合
Punching する必要はなく、STUNサーバーからアドレス取得してアクセスできる。

 自分はそう理解しています。(ひとりよがり...)
0240デフォルトの名無しさん2006/01/22(日) 23:57:23
固定のポート使う仕様にした方が早いんじゃない?
0241デフォルトの名無しさん2006/01/23(月) 00:03:49
>>238

あ、TV電話興味あるー!
今作ってるのは簡単な会議システムで、ライブ映像(音声)とファイル共有、ホワイトボード共有などです。
ライブ映像(音声)以外はローカルで完成しているのですが、マウス移動情報が大量に流れるのでUDPが理想的なのですが。

>>238 さんはTV電話はどのような技術を利用されたのですか?

自分は以前 Flash Communication Server で作ったことはあるのですが、クラサバだし、サーバーソフト値上がり(600万円!)
 したので止めました。
 今は RTC で作成を始めたところです。

>リアルタイム性の強いものを作るならばUDPの方が
>向いてるし、ファイル系の速度よりも信頼性を取るならば
>リレーサーバーで十分と思うが

 また迷いが出て来ました...そんな気がしてたのですが。
 でも ルーター の変換レコードって 90秒程度で消えるというような文章を目たもので。
 KEEP-ALIVE 用のパケット送ってれば済む話?

 よしゃぁ!UDPを試してみます。
0242デフォルトの名無しさん2006/01/23(月) 00:07:30
ああ、ファイル転送があるのでした...orz
( ゚д゚)ハッ! それだけ STUNサーバー を経由するか?

ちょっと落ち着いてよく考えてみます。
0243デフォルトの名無しさん2006/01/23(月) 00:10:46
>>240

形態的にはネットゲームみたいにしたいんです。
ロビーで相手探して接続するというような。
0244デフォルトの名無しさん2006/01/23(月) 00:15:39
Kanzas, Nebraska みたいなのか

http://sumim.no-ip.com:8080/collab/20
0245デフォルトの名無しさん2006/01/23(月) 00:26:01
>244 同じようなものですね。

文書上に両方から書き込みができる、ズーム、移動等が同期で動くというどっかにありそうな。
場合によっては NetMeeting で事足りるじゃないかって言われるかも...orz
0246デフォルトの名無しさん2006/01/23(月) 00:33:26
http://www.distant-view.co.jp/product/co3/# と同じようなものです。
02472382006/01/23(月) 00:33:56
今はhole punchingやめました 最近安定しない
書くことたくさんあるけど・・・・

リモートツールも作ってます
■ルーターには数分に一度データーを流すことにより接続を維持します
■ファイル転送はTCPでサーバー経由で十分です
■マウスはUDPの方がいいです。TCPでは効率悪すぎます
 マシンスペック、回線により送る量の調整が必要となります
 単純なホワイトボードだとマウス情報送るべきではないよ
■今はUPnPを期待して逆向き接続にしてます、双方UPnPが使用できない
 時はリレーサーバー 複数人の場合は一人でもUPnPが使用できれば
 それをサーバーにします
■UPnPはルーターにXMLで直接送ります。それによりSP2は回避できます
■winsockではUDPは相手に一度でもつながらないと以後 ソケットは
 使用不可になるのでオプションで機能をOFFにします
 Hole Punching時の不到達前提で相手に送るときです
02482382006/01/23(月) 00:40:30
なんか 同じようなもの作ってるな・・・・
Hole Punchingは明日が予測できない技術だから
業務では使用しないほうがいいよ
0249デフォルトの名無しさん2006/01/23(月) 01:07:02
>247

貴重なアドバイスありがとうございます。

>マシンスペック、回線により送る量の調整が必要となります

そこなんですよね。バッファリングというか、ハンドルの遊びみたいな部分というか。
UPnPって操作したことないので全くわかりません。ぅw
確か、これから使うグローバルアドレス等をPGで指定できるんですよね。勉強します。

>248

ですよね。現時点でも Synmetric NAT は越えられない訳だし...
http://www.newrong.com/product/natsdk/ とかはどうなんでしょうねぇ?
0250デフォルトの名無しさん2006/01/23(月) 06:00:20
>>247
> ■マウスはUDPの方がいいです。TCPでは効率悪すぎます

TCP_NODELAYやOOBつーもんがあるが
02512472006/01/23(月) 09:10:39
>>250
すみません書き方悪かったです。本質的にはUDP,TCP関係ないです
回線的には書かれているようにTCP_NODELAYで乗り越えれます
レスの内容がリモートですので相手のマシンの処理能力に
影響される部分が多いです。時間情報つけて処理しきれない事に
気づいた時には回線上には大量のマウスデーターが順番待ちしてます

02522502006/01/23(月) 10:12:54
リアルタイム性を失ったデータは捨てていい、
むしろ捨てた方がいいという状況下で、
TCPはオーバースペックという話なら納得。
■ このスレッドは過去ログ倉庫に格納されています