TCP/IP通信3ハンドシェイクとは?パケットのやり取りについての疑問

このQ&Aのポイント
  • TCP/IPのTCP通信の3ハンドシェイク通信について疑問があります。インターネットを使ったある端末でセンターのサーバーとの通信を行い、インターネット回線の正常性を判定する機能があるそうです。その際、1回の通信でどの程度のパケットをやり取りしているのか質問しましたが、約1.2kbyte程度のパケットをやり取りしていると回答されました。
  • WireSharkでパケット通信を観察したところ、端末が1.2kbyteのデータを送信し、サーバーからのACKと思われるパケットが1.2kbyteで返ってきていました。その後、端末が60バイト程度のパケットをサーバーのIPアドレスに送信していました。3ウェイハンドシェイクの総量は1.2kbyteだと思っていましたが、実際には2.46kbyteのやり取りが行われているようです。
  • サーバーが受け取ったデータをACKとして返しているのか疑問です。Wiresharkで確認したところ、サーバーからのACKパケットは送信されたデータと同じではないようでした。データの受信を確認するためには、1か0のデータが返れば十分だと思いますが、なぜ同じ容量のデータを返しているのでしょうか?
回答を見る
  • ベストアンサー

TCP/IP通信3ハンドシェイクについて

TCP/IPのTCP通信の3ハンドシェイク通信に関して質問なのですが、インターネットを使ったある端末でセンターのサーバーと6秒に1度程度3ハンドシェイク通信を行ってインターネット回線が正常かどうかを判定する機能を持っているそうなのですが、その時に1回の通信でどの程度のパケットをやり取りしているのかということを質問してみたら、約1.2kbyte程度のパケットをやり取りしていると業者の方が言っていました。 ちょっと興味があってWireSharkでこの端末とサーバ間のパケット通信をのぞいてみたところ、端末が1.2kbyte送信していたのですが、サーバからのACKと思われるパケットが1.2kbyteのパケットを返してきていて、再度端末が60バイト程度のパケットをサーバのIPアドレスに送信していました。 私はてっきり、端末とサーバー間のこの3ウェイハンドシェイクのパケットの総量が1.2kbyteだと思っていたのですが、これだと1.2k + 1.2k + 60 = 2.46kbyteとなると思うのですが、パケットのやり取りとしては正しいのでしょうか? サーバー側が受信したら同じ容量の1.2kbyteのデータをACKとして返してきているように思うのですが、Wiresharkで見ても全く同じデータでは無いようでした。サーバはデータを受け取ったら、ちゃんと受信したという1 or 0のデータみたいなものを返せばよいだけだと思うのですが、理由はあるのでしょうか?

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

  • ベストアンサー
  • Toshi0230
  • ベストアンサー率51% (836/1635)
回答No.2

TCPのAckは、「ここまでのデータを受信したよ」という信号なので、ペイロード(アプリケーションデータ)が乗っている必要はありません。 もちろん、相互にデータをやりとりするようなアプリケーションであればAckのパケットにデータをつけて送信することもありますが、FTPなどでデータをダウンロードする場合などデータが一方向しか流れない場合は、AckはTCPのヘッダだけ流れることもよくあります。 開発はやったことがないので、実際のプログラムでどのように作るかまでは知識が無く、お答えできません。 > Wiresharkでモニタできるデータというのは”あくせとめでぶ”の”あくせ”の層ぐらいまでしか確認できないみたいなことを聞いたことがありました。 Wiresharkは時々使用しますが、データリンク層のプロトコルまでしっかり拾えますが。データリンク層が拾えないなんて言うのは何かの間違いでしょう。 # 余談ですが、「あくせとめでぶ」は「あぷせとねでぶ」の間違いでは? # http://ja.wikipedia.org/wiki/OSI%E5%8F%82%E7%85%A7%E3%83%A2%E3%83%87%E3%83%AB

diy_sunny
質問者

お礼

回答頂きありがとうございました。 私も憶測でいろいろと発言してしまい大変申し分けありません。いろいろな状況でACKに乗せるデータもいろいろみたいですね。いろいろなことを勝手に勘ぐってしまっています。確かなことはACKは応答の意味だから、”ちゃんと届いたよ”ということを受けた方が送信した側に返せば大方役目を果たしてますね。 私は勝手に送信側が出したデータが受信側に届くと、受信側が”ちゃんと届いたよ、だって、あなたが送ったデータってこれでしょ! ほら”みたいに全部のデータを送り返すようなやり方はちょっと非効率ですね。別にそこまでしなくてもTCP通信ってデータのチェックサム機能にCRCチェックを行っていたと思うし、かなり厳しいことをやったりしてましたよね、確か。遅れてなければ、TCPなら再送のをWireSharkで見たことがありますし、2,3重のデータの正確性を重んじていることはなんとなくわかります。 ”め”と”ね”は大変申し訳ありません。ありがとうございました。 ”め”ってなに?ってかんじですね。 周りにWireShark仲間がおらず勝手に勘ぐりながら使わせて頂いているような状態です。物理層以外はすべて表示されるというのは知りませんでした。今後ともよろしゅう。

その他の回答 (1)

  • Toshi0230
  • ベストアンサー率51% (836/1635)
回答No.1

TCPの3way handshakeであれば、通常 SYN, SYNACK, ACKのいずれもペイロードを乗せることは通常有りません。なので、パケットサイズとしてはIP+TCPで40byteくらい(イーサネットのフレームヘッダ入れたらもう少し大きい)のはずです。 もし1.2kbyte程度のデータを持っているのであれば、TCPレベルではなくてアプリケーションレベルで何らかのセッション確認をしているものと推測します。こうなるとアプリケーションの仕様などを知らないと何ともいえませんね。

diy_sunny
質問者

お礼

回答頂きありがとうございました。 アプリケーションレベルで何らかの確認をしているということですね。そうすると、そのやり取りはあくまでユーザ側のプログラムでの取り決めだからそこはユーザの仕様によるということなのですね。 私はTCPというプロトコルは、自分がクライアントで送ったデータが1.2kbyteあったら、サーバ側でACKとして返信している1.2kbyteは、ちゃんとサーバ側にクライアントが送信してきたデータがちゃんと届いているということを確認させるためにわざわざそれと同じものを送ってきて、”ほら、ちゃんと届いているでしょ”と確認させるために同じものを送ってきていて、クラアント側もそのデータとチェックサムを確認して、最後は60byte”OK! 了解”って感じで最後のデータを送信しているように感じていたのですが、 別にこれはTCPの物理層に近いプロトコルのやり取りというわけではないのですね。たぶんMicrosoftのVC++とかで作ったプログラムではVC++のTCP/IP通信のソケットプログラムのモジュールに、アプリケーション層のデフォルトの仕様として入っている可能性は十分に考えられますね。 そういえば、Wiresharkでモニタできるデータというのは”あくせとめでぶ”の”あくせ”の層ぐらいまでしか確認できないみたいなことを聞いたことがありました。私の勘違いかも

関連するQ&A

  • WiresharkのFlow Graph

    現在WiresharkのFlow Graphという機能を使用して、クライアント端末がサーバー端末へのTCP通信での3ウェイハンドシェイクのパケットやりとりを観測したいと思っています。 次のようなパケットをモニターしました。 |Time | 192.168.1.111 | | | | 192.168.1.222 | |6.402 | PSH, ACK - Len: 1212 |Seq = 1 Ack = 1 | |(6057) ------------------> (5000) | |6.606 | PSH, ACK - Len: 1212 |Seq = 1 Ack = 1 | |(6057) ------------------> (5000) | |6.835 | PSH, ACK - Len: 1212 |Seq = 1 Ack = 1213 | |(6057) <------------------ (5000) | |7.039 | ACK | |Seq = 1213 Ack = 1213 | |(6057) ------------------> (5000) | |7.150 | ACK | |Seq = 1213 Ack = 1213 このパケットのやりとりを観ていて思ったのですが、TCP通信は3ウェイハンドシェイクは SYN--->SYN ACK---> ACK という順序でのパケットのやりとりをクライアントとサーバー間で行うと思っていたのですが、 PSH, ACK ----> PSH, ACK ----> ACK ----> ACK このような順序になっているように思うのですが、これはなぜなのかご教授頂けないでしょうか? どうぞ、よろしくお願い致します。

  • TCP/IP ACKについて

    初めて質問させて頂きます。 現在WinpCapを使ってTCPの通信プログラムを作成しています。 単純にパケットの受信や送信は出来たので、ローカルサーバーに接続出来るか試しているのですが、通信が確立しません。 状況としては、こちらからSYN = 1でサーバーに信号を送ると、サーバーから返事が来ます。 サーバーの返事を待ってACK = 1でサーバーに返事をするのですが、そのときの状態をWiresharkで確認すると、ACKの番号が2067011292等と表示されて通信が確立しません。 ACKの値が異常なのは判りますが、この数値はどこから来るのか、又対処方法などが有りましたら教えてください。 環境はVC2003、WInXP/Win7です。

  • TCPでのACK確認応答のメカニズム

    TCPでの通信では、3ウェイハンドシェイク後、データ送信とACK確認応答の返答をしあい信頼性のある通信を行うと思うのですが、あるテキストによるとネットワークの関係上、順番どおりにTCPセグメントが届かない場合があるとの事でした。 データ受信ホストが発するACK確認応答の中に次の送信のシーケンス番号が指定されているともありましたので、TCPセグメントが順番どおりに来ないと通信が上手くいかないと思うのですが、思い違いでしょうか? このあたりのやり取りについて、教えて頂けないでしょうか?是非お願いします。

  • ネット回線の上がりと上りの通信スピードの違いで、TCP3ウェイハンドシェイク通信に影響はでる?

    以前から、疑問に思っていたのですが、ADSL回線などでは、下りのスピードが8Mbpsで上りは1Mbps以下というのがだいたい一般的ですが、ADSL回線で固定IPをとってサーバを運営したりすると、そのサーバにアクセスするときにはその影響を受けるとよく聞きます。 ただ、TCP通信もたとえば動画サイトを見たりする場合に、そのサイトのサーバと常にTCP通信でやり取りした場合、常に3ウェイハンドシェイク通信を行うときは、サーバポートがACKとしてクライアントのPCにデータを返す時はADSLの上りのスピードに影響を受けてしまうのでしょうか? その場合、下りが8Mbpsで早くても、上りが1Mbpsだったら上りでやり取りするACK通信が確立しない限りデータとして成立しないのならば、結局1Mbpsの範囲でしか通信は成り立たないということになってしまうということでしょうか?

  • TCP/IPで同じパケットが2つ送信される。なぜ?

    Windows8 PC上のブラウザから、LAN上の機器(HTTPサーバ)にアクセスしようとしています。 Wiresharkでそのときの通信を覗いてみると、PCから送信されるパケットはなぜか2回同じものが短時間の間に連続して送信されているようです。その理由に心当たりがある方がいらっしゃいましたら、教えて下さいませんか? また、設定で回避できるのであれば、その設定項目などもわかるとありがたいです。 詳しい状況です。Wiresharkのキャプチャ画像と合わせて見て下さい。 *PC側IPは192.168.0.12、HTTPサーバは192.168.0.18です。 *Wiresharkでは、パケット6と7、9と11、10と12、14と15は内容的に同じパケットのようです(seqとackが同じ) *同じパケットのうち、前の方のパケットではIPパケットのチェックサムが0000hとなっているようです(チェックサムオフロード?)。後の方のパケットには、具体的なチェックサムの値が入っています。 *前のパケットが短い場合(54バイトとか)、後のパケットにはパディングとして00hが追加されて、60バイト長となるようです。それ以上の長さのパケットは、前述のチェックサム以外には違いは見られません。 *同じ2つのパケットは、極短い期間で連続して送信されているので、HTTPサーバからの応答タイムアウトで再送しているという風には思えないです。 *PC側のブラウザは、ChromeでもIEでも同じように2つの同じパケットが送信されていました。しかし、LANの外(ルーター外のインターネット)に接続するときは、このように2つの同じパケットはWiresharkで見ると出ていないようです。 *ちなみに、PC側のLANはRealtekのGigabit Ether(有線)です。 よろしくお願いいたします。

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

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

  • WinsockによるUDP通信にて

    WinsockでUDP通信を行うプログラムを作っているのですが、 原因不明の問題が発生していて困っています。 通信手順は以下のとおりです。 (1) クライアントからサーバへ要求パケット送信 (2) 要求パケットを受け取ったサーバは、クライアントへACKを送信 (3) サーバが要求に対する応答パケットをクライアントへ送信 (4) 応答パケットを受け取ったクライアントは、サーバへACKを送信 クライアント-サーバ間でやりとりするデータは最大で992バイト、 それ以上になる場合は、分割して送信します。 パケットの分割が発生しない場合は、(1)~(3)がパケットの損失もなく通信できるのですが、 パケットの分割が発生する場合には、2回目以降の(4)のパケットがクライアントに届きません。再現率は今のところ100%です。 クライアント側のselect関数でもソケットを検出しません。 たしかにUDPは信頼性が低いですが、パケット分割が発生しないパターンでは100%届くので、UDPの仕様とは関係ないような気がします。 原因がさっぱりわからないので、アドバイスをお願いいたします。 ちなみに、クライアント、サーバともに同一端末内にあります(双方がループバックアドレスに対してパケットを送信)が、 これはテスト段階だからであって、本来はそれぞれ別々の端末で動作します。

  • TCP/IPでのエラーシーケンス

    TCP/IPで1台のサーバSから複数のコンピュータA,B,C...に データを送信している途中で、 Cがハングパップした時のエラーシーケンスを知りたいのですが。 例えば、 サーバSからA,B,Cに1つのデータを複数のパケットに分けて送信するときに、 送信途中でCがハングアップ(通信不能)した場合に、 サーバSがCにパケットを送信しなくなるのは、どのタイミングなのでしょうか? 例えば、5つ目のパケットで通信不能になった時は Cへのそれ以降のパケットを送信しないのでしょうか? 初歩できなことですが、お願いいたします。 ここら辺のことで、参考になる文献がある場合にも教えて頂きたく思います。

  • グローバルIPが数分毎に変更されるSIMカード

    モバイルルータにTCP端末を接続して動作させている端末があるのですが、接続先のサーバーで、今回のTCP端末だけグローバルIPと送信元ポートがコロコロ変わる(約1分間隔に1kbyte程度のパケットを送信)との連絡をもらい、netstatで観測すると、その都度ESTABLISHEDが増えているとのことでした。 その後、サーバ側のプログラムの改善などで問題は解消したのですが、モバイルルータに割り振られたグローバルIPアドレスを1通信毎に変更していくようなプロバイダさんというのはあるのでしょうか? また、どのような理由でやっているのかなど、ご教示の程宜しくお願い致します。

  • TCP/IPにおける端末間の通信について(NAPT)

    TCP/IPにおける端末間の通信について(NAPT) お世話になります。 TCP/IPについて質問です。 NAPT機能の付いたルータを介し、インターネット越しに通信を行う場合を想定します。 1.端末A(送信側)から端末B(受信側)にTCPあるいはUDPを用いてデータを送信する場合、端末Bでは必ず待ち受けるポートにbind(listen)し、また端末Aでは指定されたポート宛てにデータを送信する必要があると聞きました。 ここまでは理解できますが、ここにNAPT機能の付いたルータが介入する場合、"例外なく"端末B側のルータでポートマッピングを行う必要があるのでしょうか? 2.上記の認識がもし正しい場合、2台の端末で通信を行う場合は少なくとも片方でポートマッピングが必要ということになります。 だとするならば、SkypeやMSNメッセンジャーなどのクライアント側でポートマッピングが必要のないアプリケーションは、必ずサーバを介した通信を行っているということでしょうか? Skypeなどの仕組みを説明しているサイトを見ると、接続の手順を踏んだのちに端末間で通信を行うとの記述があるのですが、いくら接続先のIPがわかっていても、アプリケーション間で接続を確立するには、片方でポートマッピングが必要になると思うのですが、これはどういうことなのでしょうか? 3.上記の認識が正しい場合、UDPで受信する為には必ずポートマッピングが必要ということになります。 だとするならば、クライアント側でポートマッピングが必要のないアプリケーションは、少なくとも受信にはUDPを用いていないということでしょうか? 以上の3点についてお答え頂けると幸いです。 回答お待ちしています。