Winsock2を使ってソケットプログラミングをするため通信プロトコルを考えています。そこでソケットの挙動について疑問があります。
sendを複数回使って以下のバイト数のデータを送信したとします。
1.3byte送信[AAA]
2.5byte送信[BBBBB]
3.3byte送信[CCC]
このとき正常に通信ができたときは受信側では1~3回のrecvによって
[AAABBBBBCCC]
というデータが受信できると思います。ここまではいいのですが、疑問があるのは送受信に異常があった場合です。
1.send単位で欠落(再度connectの必要なし)。損失受信データ例[AAACCC]、[BBBBBCCC]
2.TCP上での送信パケット単位で欠落(再度connectの必要なし)。損失データ例[AAABB]
3.send単位で欠落して以後は全て欠落(再度connect必要あり)。損失データ例[AAABBBBB]、[AAA]
4.TCPのパケット単位で欠落して以後は全て欠落(再度connect必要あり)。損失データ例[AAABB]
おそらくこれらのいずれかの方法でデータが欠落することになるかと思います。データの再送信をするのであればconnectが必要になるのかという点も分かりません。
ソケットがcloseになったという理由によるデータ欠落であれば4番になるかと思いますが。。。@FreeDのようにドーマントに入るようなネットワークの場合単純にcloseを期待することもできないような気がしますし。。。
どなたか教えていただけないでしょうか?よろしくお願いします。
No.1ベストアンサー
- 回答日時:
基本的にTCP自体が
チェックサム等をもち信頼性のあるプロトコルです。
特に1(send単位で欠落)等は途中でデータが損失していますが、
ひとつのパケットに対してシーケンス番号を持っている為
その時点でコネクションロストします。
1~4いずれにしてもデータがおかしい場合
再度connectの必要があります。
あるとするなら
3.send単位で欠落して以後は全て欠落(再度connect必要あり)。損失データ例[AAABBBBB]、[AAA]
ただしsend単位ではなくパケット単位です
例えばsendで5Mぐらいのデータを送ろうとしても内部で1024バイトずつに
分割されていたりします。(recvでも1024ずつ受け取ります)
参考URL:http://akademeia.info/main/lecture2/hyoujyunn_tc …
この回答への補足
4番の例になるということですね。自分の中では1番可能性がありそうだと思っていたものです。参考URLもまだ詳しくは見ていませんが役に立ちそうです。ありがとうございます。
補足日時:2005/02/10 02:03No.3
- 回答日時:
すいません。
4ですね。ただ5バイトの文字列(BBBBB)が2つのパケット(BBとBBB)になることは
基本的にはありませんが
勿論プログラム的に必ず5バイトが1パケットで送られることを
前提とするのはよくないです。
1パケットの最大サイズ
MTU(Max Transfer Unit)は
Windowsならレジストリに設定されていると
思います。
ちなみにWin2kのデフォルトは1024らしいです。
(だからsendが1024ずつに分割されたのかと今納得、、)
参考URL:http://www.janis.or.jp/adsl/tuneup/tcp_tune.html
No.2
- 回答日時:
アプリケーションから見た場合、sendが正常なら、ちゃんと受信できている。
としか判断できません。完全にブラックボックスの世界です。
なので、sendで送ったバイト数と戻り値が異なっていれば、socketをshutdown & closesocketして、再度、connectする必要があります。
この回答への補足
>sendで送ったバイト数と戻り値が異なっていれば、socketをshutdown & closesocketして、再度、connectする必要があります。
MSDNにはsend関数の解説として
----------------
宣言
int send(SOCKET s,const char FAR *buf,int len,int flags);
戻り値
If no error occurs, send returns the total number of bytes sent, which can be less than the number indicated by len for nonblocking sockets.
----------------
と書かれています。現在使おうと考えているソケットは非ブロッキングです。そのため戻り値では単純にチェックできません。プログラム上でタイムアウトを設定して時間内に指定したバイト数送信できなければcloseと考えるということになりそうですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) 「プロトコル」の定義について 5 2023/04/16 13:13
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- iPhone(アイフォーン) 皆さんiPhoneは、機能が少な過ぎますか?? iPhoneには、なぜ僕がAndroid合計3台持ち 2 2022/07/12 19:59
- その他(メールソフト・メールサービス) メールサーバーは「PC側がメールをDL済みか否か?」を何を以て感知するのか? 2 2022/12/20 14:56
- docomo(ドコモ) +メッセージの送受信。 au(uq mobile)のデータ回線でdocomoの電話番号の+メッセージ 2 2022/09/14 16:09
- ヤフオク! 関税 詐欺でしょうか?ヤフオク 3 2023/06/25 11:22
- ネットワーク OSI参照モデルの各層の役割がわかりません。 3 2023/04/21 21:12
- HTML・CSS GETをPOSTに変更したところ 送信 不能です。 1 2022/04/10 17:31
- UNIX・Linux Ubuntuサーバーでメールを受信できない 7 2022/08/23 20:55
- その他(法律) 携帯電話会社に保管されている解約済み個人情報を消去したい 3 2022/08/13 23:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Winsock 受信について
-
ペイロードって何ですか?
-
ワード ある日突然 文書の表...
-
wordの文書をPC画面中央に表示...
-
結局、ノートパソコンはいつ買...
-
Wordの印刷レイアウト表示のと...
-
Microsoft office 2010
-
外部のPC(たとえば学校)から...
-
ラジオ聴く時何してる?何をし...
-
YAHOO/JAPANの表示サイズ
-
DMMでダウンロードしたビデオを...
-
FTPソフト filezillaのキューフ...
-
zoomでオープンキャンパスがあ...
-
エクセルの列と行の見出しが小...
-
Skypeで映像が送れないです
-
相談です。今現在AndroidのLG S...
-
2台のPCでRS-232C接続でファイ...
-
データ転送速度(LAN)が遅い
-
av4と言うエ○サイトって動画を...
-
持ち主に似る
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ペイロードって何ですか?
-
Winsock 受信について
-
パリティビットはわかるけど、...
-
セル、データグラム、パケット...
-
高速シリアル通信での大容量の...
-
UDPでマルチスレッドは可能か
-
配列内に通番(文字列)を挿入し...
-
同期速度とは
-
ローカルプロキシの作り方を教...
-
TCP/IP通信3ハンドシェイクにつ...
-
HTTP POST送信のヘッダの書き方
-
TCP/IPのデータ送受信の"確実性...
-
スマホでauなどの大手キャリア...
-
リピータHUBでコリジョンが認識...
-
ワード ある日突然 文書の表...
-
結局、ノートパソコンはいつ買...
-
wordの文書をPC画面中央に表示...
-
av4と言うエ○サイトって動画を...
-
FTPソフト filezillaのキューフ...
-
2台のPCでRS-232C接続でファイ...
おすすめ情報