(57)【要約】      （修正有）【課題】選択的ＡＣＫオプションが有効ではない通信において「Ｌｅｓｓ Ｃａｒｅｆｕｌ」方式による高速再送が行われる場合に最適な再送処理を行いスループットの低下を抑制する通信装置を提供する。【解決手段】データを送信単位に分割することで生成され、送信順序を表すシーケンス番号が内包されているセグメントを送受信することで、データを受信装置と通信する通信装置であって、各セグメントに内包されるシーケンス番号を管理し、セグメントの再送を行うまでに受信装置に向けて送信された複数のセグメントに内包されていたシーケンス番号の各々のうち、最も大きい値のシーケンス番号から算出される値を記憶し、所定の条件を満たす場合に、同一のシーケンス番号が内包されている受信確認信号を重複受信確認信号と判定しないようにする判定部を有する。【選択図】図５
2016096391.tif 000002
【特許請求の範囲】
【請求項１】
データを送信単位に分割することで生成され、送信順序を表すシーケンス番号が内包されているセグメントを送受信することで、データを受信装置と通信する通信装置であって、
各セグメントに内包されるシーケンス番号を管理し、セグメントの再送を行うまでに前記受信装置に向けて送信された複数のセグメントに内包されていたシーケンス番号の各々のうち、最も大きい値のシーケンス番号から算出される値を記憶する管理部と、
当該通信装置に対して次に送信を要求するセグメントのシーケンス番号が内包されている受信確認信号を、前記受信装置から受信する受信部と、
前記値と同一のシーケンス番号が内包されている受信確認信号が受信された場合であって、かつ、所定の条件を満たす場合に、前記同一のシーケンス番号が内包されている受信確認信号を重複受信確認信号と判定しないようにする判定部と、
を有する通信装置。
【請求項２】
前記判定部は、複数の前記同一のシーケンス番号が内包されている受信確認信号のうち、最初の前記同一のシーケンス番号が内包されている受信確認信号を受信した後、所定の数のセグメントが前記受信装置に向けて送信されるまでの間に受信した前記同一のシーケンス番号が内包されている受信確認信号を、重複受信確認信号と判定しないようにする、請求項１に記載の通信装置。
【請求項３】
セグメントを送信してから、該セグメントに内包されるシーケンス番号と同一のシーケンス番号を内包する受信確認信号を受信するまでの応答時間を計測する計測部と、
前記判定部は、前記所定の数のセグメントを送信した後、前記応答時間が経過するまでの間に受信した前記同一のシーケンス番号が内包されている受信確認信号を、重複受信確認信号と判定しないようにする、請求項２に記載の通信装置。
【請求項４】
前記判定部は、前記所定の数のセグメントが前記受信装置に向けて送信されるまでの間に受信した前記同一のシーケンス番号が内包されている受信確認信号のうち、３番目を含む以後の前記同一のシーケンス番号が内包されている受信確認信号を、重複受信確認信号と判定しないようにする、請求項２に記載の通信装置。
【請求項５】
前記判定部は、前記応答時間が経過するまでの間に受信した前記同一のシーケンス番号が内包されている受信確認信号のうち、３番目を含む以後の前記同一のシーケンス番号が内包されている受信確認信号を、重複受信確認信号と判定しないようにする、請求項３に記載の通信装置。
【請求項６】
セグメントを送信してから、該セグメントに内包されるシーケンス番号と同一のシーケンス番号を内包する受信確認信号を受信するまでの平均応答時間と、最大応答時間と、最小応答時間とを計測する計測部と、
前記判定部は、前記平均応答時間と前記最大応答時間と前記最小応答時間とを用いて算出した時間に基づき、前記同一のシーケンス番号が内包されている受信確認信号を、重複受信確認信号とするか否かを判定する、請求項１に記載の通信装置。
【請求項７】
前記判定部は、前記値と同一のシーケンス番号が内包されている受信確認信号を受信する前に前記受信装置に向けて再送したセグメントが存在する場合、前記再送したセグメントの数に基づいて、前記同一のシーケンス番号が内包されている受信確認信号を、重複受信確認信号と判定しないようにする、請求項１に記載の通信装置。
【請求項８】
前記受信装置にセグメントを送信する送信部を有し、
前記送信部は、前記値と同一のシーケンス番号が内包されている受信確認信号を受信する前に前記受信装置に向けて再送したセグメントのうち、最後に再送したセグメントを送信してから所定の時間が経過した後に、新たなセグメントを送信し、
前記判定部は、前記新たなセグメントを送信するまでに受信した前記同一のシーケンス番号が内包されている受信確認信号を、重複受信確認信号と判定しないようにする、請求項１に記載の通信装置。
【請求項９】
前記受信装置と通信するデータのスループットを測定する測定部を有し、
前記スループットに応じて、前記判定部の動作の選択を受け付ける受付部と、
を有する、請求項１乃至８のいずれか一項に記載の通信装置。
【請求項１０】
データを送信単位に分割することで生成され、送信順序を表すシーケンス番号が内包されているセグメントを送受信することで、データを受信装置と通信する通信装置のプログラムであって、
通信装置に、
各セグメントに内包されるシーケンス番号を管理し、セグメントの再送を行うまでに前記受信装置に向けて送信された複数のセグメントに内包されていたシーケンス番号の各々のうち、最も大きい値のシーケンス番号から算出される値を記憶する管理ステップと、
当該通信装置に対して次に送信を要求するセグメントのシーケンス番号が内包されている受信確認信号を、前記受信装置から受信する受信ステップと、
前記値と同一のシーケンス番号が内包されている受信確認信号が受信された場合であって、かつ、所定の条件を満たす場合に、前記同一のシーケンス番号が内包されている受信確認信号を重複受信確認信号と判定しないようにする判定ステップと、
を実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、通信装置及びプログラムに関する。
【背景技術】
【０００２】
近年、データ通信機能を備えた携帯電話機やパーソナルコンピュータ装置など、ＴＣＰ（Transmission Control Protocol）に従ってデータの送受信を行う通信装置が一般に普及している。
【０００３】
ＴＣＰによる通信では、送信されたセグメントが受信装置に到達しなかった（以下、「セグメントが欠落した」という）場合に、「再送タイムアウト（Retransmission Time Out（以下、「ＲＴＯ」という））」と「高速再送信（Fast Retransmit & Fast Recovery（以下、「ＦＲ」という））」と呼ばれる２種類の方式により、受信装置に到達しなかったセグメントが再送信される。ここで、セグメントとはＴＣＰにおける通信単位であり、各セグメントには送信装置から送信された順番を示す一連の番号（「以下、「シーケンス番号」という」が内包されている。
【０００４】
１つ目の再送方式であるＲＴＯは、セグメントを受信装置に向けて送信してから再送タイムアウト時間が経過するまでに、受信装置から確認応答（Acknowledge（以下、「ＡＣＫ」という）が送信されてこなかった場合、送信装置はセグメントが欠落したと判断し、確認応答が届かないセグメントを再送信する方式である。
【０００５】
ここで、ＡＣＫとは、受信装置から送信装置にセグメントを受け取ったことを通知する応答であり、ＴＣＰの信頼性を実現するために規定されている信号である。例えば、送信装置が１〜１００までのシーケンス番号を内包する１００個のセグメントを送信し、受信装置がこれらすべてのセグメントを受信した場合、受信装置が次に受信を期待するセグメントは、シーケンス番号が１０１であるセグメントである。従って、受信装置は、シーケンス番号として１０１を包含するＡＣＫを送信装置に送信する。すなわち、受信装置は、受信したセグメントのシーケンス番号をそのままＡＣＫに内包して送信するのではなく、次に受信を期待するセグメントのシーケンス番号をＡＣＫに内包して送信する。
【０００６】
なお、ＡＣＫの拡張オプションとしてＳＡＣＫ（Selective Acknowledge：選択的確認応答）がある。これは、セグメントが欠落した場合、受信装置が送信装置へ欠落したセグメントを通知するものである。
【０００７】
例えば、送信装置が、１〜１００までのシーケンス番号を内包するセグメントを送信した場合において、５１〜６０のシーケンス番号を内包するセグメントが欠落し、残りのセグメントが受信装置へ届いたとする。このとき、受信装置は、シーケンス番号として５１を包含するＡＣＫを送信装置に送信することで、１〜５０のシーケンス番号を内包するセグメントを受信できたことを通知すると共に、ＳＡＣＫオプションにより６１〜１００のシーケンス番号を内包するセグメントも受信できたことを通知する。これにより、送信装置は、５１〜６０のシーケンス番号を内包するセグメントが欠落したことを知ることができる。しかし、ＳＡＣＫオプションは、ＳＡＣＫオプションに対応していない通信装置の間では利用することができない。
【０００８】
２つ目の再送方式であるＦＲは、送信装置が、受信装置から重複確認応答（Duplicate ACK（以下、「ＤＡＣＫ」という）を所定の回数受信した場合、再送タイムアウト時間が経過してＲＴＯが開始されるのを待たずに、ＤＡＣＫで指定されるセグメントを再送信する方式である。
【０００９】
ＤＡＣＫとは、受信装置が受信したセグメントに内包されるシーケンス番号と、その１つ前に受信したセグメントに内包されるシーケンス番号とが連続していなかった場合（すなわち、セグメントが欠落した場合）に、次に受信を期待するセグメントのシーケンス番号を送信装置へ通知するために、受信装置が送信するＡＣＫのことを指す。すなわち、送信装置は、受信装置からＡＣＫを受信した後、受信したＡＣＫと同じシーケンス番号を内包するＡＣＫを更に連続して受信（ＲＦＣ（Request for Comments）仕様では３回）した場合に、これらのＡＣＫはＤＡＣＫであると判断し、そのシーケンス番号を内包するセグメントを受信装置に対して再送する。
【００１０】
また、送信装置は、受信装置に送信したセグメントに内包されるシーケンス番号のうち、最も大きなシーケンス番号、又は、次に送信する予定のセグメントに内包されるシーケンス番号を「ｒｅｃｏｖｅｒ変数」に保持する。更に、送信装置は、受信したＡＣＫに内包されるシーケンス番号がｒｅｃｏｖｅｒ変数の値より大きい場合、受信したＡＣＫはＤＡＣＫであると判断し、ｒｅｃｏｖｅｒ変数の値より小さい場合、ＤＡＣＫとして扱わずに無視するといった判定を行う。
【００１１】
これにより、不必要なＤＡＣＫを受信した場合に、無駄にＦＲの処理が開始されるのを回避することができる。ＦＲが開始されると、一度に送信できるセグメント数を減少させる必要があるため、送信装置から受信装置への通信のスループットが低下することになる。従って、ｒｅｃｏｖｅｒ変数を用いることで無駄にＦＲの処理が開始されるのを回避し、通信のスループットの低下を抑制させることができる。
【００１２】
ここで、ｒｅｃｏｖｅｒ変数と同じ値のシーケンス番号を内包するＡＣＫを受信した場合の処理方式として、このＡＣＫをＤＡＣＫとして扱わない「Ｃａｒｅｆｕｌ」と呼ばれる方式と、このＡＣＫをＤＡＣＫとして扱う「Ｌｅｓｓ Ｃａｒｅｆｕｌ」と呼ばれる方式がＲＦＣに規定されている。どちらの方式を選択するかについては、システムの実装時に選択することになる。
【００１３】
図１は、従来のＦＲの方式における課題を説明するための図である。
【００１４】
まず、図１に示すように、７つのセグメントを送信側から受信側に送信するとする。１〜７までの数字は各セグメントのシーケンス番号を示している。また、受信側は、シーケンス番号が１〜３までのセグメントを既に受信しており、送信側が記憶しているｒｅｃｏｖｅｒ変数の値は４であるとする。
【００１５】
図１（ａ）は、４〜７のシーケンス番号を内包するセグメントが送信され、シーケンス番号が４であるセグメントのみが欠落した状況を示す図である。図１（ｂ）は、１〜３のシーケンス番号を内包するセグメントが再送信された状況を示す図である。いずれの場合においても、受信側はシーケンス番号が４であるセグメントの受信を期待しているため、シーケンス番号が４以外のセグメントを受信した場合、受信側は、４のシーケンス番号を内包するＡＣＫを送信側に送信することになる。
【００１６】
最初に、「Ｃａｒｅｆｕｌ」方式で動作するＦＲについて説明する。図１（ａ）の場合、受信側は、５〜７のシーケンス番号を内包したセグメントを受信すると、４のシーケンス番号を内包するＡＣＫを送信側に送信する。すなわち、送信側は、４のシーケンス番号を内包する３つのＡＣＫを受信することになる。この場合、ｒｅｃｏｖｅｒ変数の値は４であることから、送信側は、これらのＡＣＫをＤＡＣＫとはみなさない。従って、ＦＲによる再送信は行われない。
【００１７】
一方、図１（ｂ）の場合、受信側は、１〜３のシーケンス番号を内包したセグメントを受信すると、４のシーケンス番号を内包するＡＣＫを送信側に送信する。すなわち、送信側は、４のシーケンス番号を内包する３つのＡＣＫを受信することになる。この場合、ｒｅｃｏｖｅｒ変数の値は４であることから、送信側は、これらのＡＣＫをＤＡＣＫとして扱う。従って、ＦＲにより、４のシーケンス番号を内包するセグメントが再送信される。
【００１８】
次に、「Ｌｅｓｓ Ｃａｒｅｆｕｌ」方式で動作するＦＲについて説明する。図１（ａ）の場合、受信側は、５〜７のシーケンス番号を内包したセグメントを受信すると、４のシーケンス番号を内包するＡＣＫを送信側に送信する。すなわち、送信側は、４のシーケンス番号を内包する３つのＡＣＫを受信することになる。この場合、ｒｅｃｏｖｅｒ変数の値は４であることから、送信側は、これらのＡＣＫをＤＡＣＫとして扱う。従って、ＦＲにより、４のシーケンス番号を内包するセグメントが再送信される。
【００１９】
一方、図１（ｂ）の場合、受信側は、１〜３のシーケンス番号を内包したセグメントを受信すると、４のシーケンス番号を内包するＡＣＫを送信側に送信する。すなわち、送信側は、４のシーケンス番号を内包する３つのＡＣＫを受信することになる。この場合、ｒｅｃｏｖｅｒ変数の値は４であることから、送信側は、これらのＡＣＫをＤＡＣＫとはみなさない。従って、ＦＲによる再送信は行われない。
【００２０】
理想的には、図１（ａ）の場合、４のシーケンス番号を内包するセグメントが欠落していることからＦＲによる再送処理が動作し、図１（ｂ）の場合、４のシーケンス番号を内包するセグメントが欠落しているのではないため、ＦＲによる再送処理が動作しないことが望ましい。しかしながら、ＳＡＣＫオプションが有効ではない場合、送信側は、受信側がどのセグメントを受信し、どのセグメントを受信していないのかを把握することができないため、図１（ａ）の状況と、図１（ｂ）の状況とを区別して再送処理を行うことができない。
【発明の概要】
【発明が解決しようとする課題】
【００２１】
このように、ＳＡＣＫオプションが有効でない通信においては、「Ｃａｒｅｆｕｌ」方式、「Ｌｅｓｓ Ｃａｒｅｆｕｌ」方式のそれぞれにおいて一長一短がある状況である。
【００２２】
すなわち、ＳＡＣＫオプションが有効でない通信においては、ｒｅｃｏｖｅｒ変数を用いたＦＲによると、同じ値のシーケンス番号を内包するＡＣＫを受信した場合の処理方式において、最適なＤＡＣＫ判定を行うことができない。これにより、無駄なＦＲの処理が開始され、スループットの低下を招く場合があった。
【００２３】
開示の技術は上記に鑑みてなされたものであって、ＳＡＣＫオプションが有効ではない通信において「Ｌｅｓｓ Ｃａｒｅｆｕｌ」方式によるＦＲが行われる場合に、最適な再送処理を行うことで、スループットの低下を抑制することを目的とする。
【課題を解決するための手段】
【００２４】
開示の技術の通信装置は、データを送信単位に分割することで生成され、送信順序を表すシーケンス番号が内包されているセグメントを送受信することで、データを受信装置と通信する通信装置であって、各セグメントに内包されるシーケンス番号を管理し、セグメントの再送を行うまでに前記受信装置に向けて送信された複数のセグメントに内包されていたシーケンス番号の各々のうち、最も大きい値のシーケンス番号から算出される値を記憶する管理部と、当該通信装置に対して次に送信を要求するセグメントのシーケンス番号が内包されている受信確認信号を、前記受信装置から受信する受信部と、前記値と同一のシーケンス番号が内包されている受信確認信号が受信された場合であって、かつ、所定の条件を満たす場合に、前記同一のシーケンス番号が内包されている受信確認信号を重複受信確認信号と判定しないようにする判定部と、を有する。
【発明の効果】
【００２５】
開示の技術によれば、ＳＡＣＫオプションが有効ではない通信において「Ｌｅｓｓ Ｃａｒｅｆｕｌ」方式によるＦＲが行われる場合に、最適な再送処理を行うことで、スループットの低下を抑制することができる。
【図面の簡単な説明】
【００２６】
【図１】従来のＦＲの方式における課題を説明するための図である。
【図２】第一の実施の形態に係る通信システムの概要を示す図である。
【図３】第一の実施の形態に係る通信装置のハードウェア構成の一例を示す図である。
【図４】第一の実施の形態に係る通信装置の機能構成の一例を示す図である。
【図５】第一の実施の形態に係る通信装置のＤＡＣＫ判定手順の一例を示すフローチャートである。
【図６】第一の実施の形態に係る通信装置の各機能部が送受信する信号を示す図である。
【図７】第一の実施の形態に係る再送処理の具体例を示すシーケンス図である。
【図８】必要な再送制御が行われる様子を示すシーケンス図である。
【図９】第一の実施の形態に係る再送処理（変形例１）の具体例を示すシーケンス図である。
【図１０】第一の実施の形態に係る再送処理（変形例２）の具体例を示すシーケンス図である。
【図１１】第一の実施の形態に係る再送処理（変形例３）の具体例を示すシーケンス図である。
【図１２】第一の実施の形態におけるＲＴＴの変動を考慮した判定処理の一例を示す図である。
【図１３】第一の実施の形態に係る再送処理（変形例５）の具体例を示すシーケンス図である。
【図１４】第一の実施の形態に係る再送処理（変形例６）の具体例を示すシーケンス図である。
【図１５】第二の実施の形態に係る通信装置の機能構成の一例を示す図である。
【発明を実施するための形態】
【００２７】
以下、図面を参照して実施の形態について説明する。各図面において、同一構成部分には同一符号を付し、重複した説明を省略する場合がある。
【００２８】
[第一の実施の形態]
（１．概要）
図２は、第一の実施の形態に係る通信システムの概要を示す図である。第一の実施の形態に係る通信システムは、送信側の通信装置１０（以下、「送信装置１０ａ」という）と、受信側の通信装置１０（以下、「受信装置１０ｂ」という）が通信網２０を介して接続されている。なお、以下の説明において、送信装置１０ａと受信装置１０ｂとを、まとめて通信装置１０と呼ぶことがある。
【００２９】
送信装置１０ａは、「Ｌｅｓｓ Ｃａｒｅｆｕｌ」方式のＦＲが実装されたＴＣＰを用いて通信を行うコンピュータ装置である。また、受信装置１０ｂから受信したＡＣＫの内容に基づいて、欠落したセグメントを再送信する機能、及び輻輳制御を行う機能を備えている。
【００３０】
受信装置１０ｂは、ＴＣＰを用いて通信を行うコンピュータ装置である。受信装置１０ｂは、セグメントの欠落を検出した場合、送信装置１０ａからセグメントを受信する度に、送信を期待するセグメントのシーケンス番号を内包するＡＣＫを送信する。これにより、受信装置１０ｂは、送信装置１０ａに対して欠落したセグメントの再送信を要求する。
【００３１】
なお、第一の実施の形態における送信装置１０ａ及び受信装置１０ｂは、コンピュータ装置であるとして説明するが、送信装置１０ａ及び受信装置１０ｂはコンピュータ装置に限定されるものではなく、ＴＣＰを用いて通信する通信装置１０であれば種類を問わない。例えば、送信装置１０ａ及び受信装置１０ｂは、ＴＣＰを用いて通信を行う携帯電話機、タブレット端末、画像処理装置、プロジェクタ、テレビ会議システムなどでもよい。
【００３２】
また、第一の実施の形態における送信装置１０ａ及び受信装置１０ｂは、ＴＣＰを用いた通信以外にも適用することができる。例えば、ＦＲと同様の処理方式により再送処理を行う通信プロトコルに対しても適用することができる。
【００３３】
通信網２０は、例えばＬＡＮ（Ｌｏｃａｌ Ａｒｅａ Ｎｅｔｗｏｒｋ）やＷＡＮ（Ｗｉｄｅ Ａｒｅａ Ｎｅｔｗｏｒｋ）であり、有線、無線を問わない。
【００３４】
（２．ハードウェア構成）
図３は、第一の実施の形態に係る通信装置のハードウェア構成の一例を示す図である。通信装置１０は、ＣＰＵ１０１と、ＲＯＭ１０２と、ＲＡＭ１０３と、ＨＤＤ１０４と、操作部１０５と、表示部１０６と、ドライブ装置１０７と、ＮＩＣ（Network Interface card）１０８とを有する。
【００３５】
ＣＰＵ１０１は、通信装置１０の全体制御を行うプロセッサである。ＣＰＵ１０１、ＨＤＤ１０４等に記憶されたオペレーティングシステム、アプリケーション、各種サービス等のプログラムを実行し、通信装置１０の各機能を実現する。ＲＯＭ１０２には、各種のプログラムやプログラムによって利用されるデータ等が記憶される。ＲＡＭ１０３は、プログラムをロードするための記憶領域や、ロードされたプログラムのワーク領域等として用いられる。ＨＤＤ１０４には、各種情報及びプログラム等が記憶される。
【００３６】
操作部１０５は、ユーザからの入力操作を受け付けるためのハードウェアであり、例えばキーボード又はマウスである。表示部１０６は、ユーザに向けた表示を行うハードウェアである。
【００３７】
ドライブ装置１０７は、プログラムを記録した記憶媒体１０９からプログラムを読み取る。ドライブ装置１０７によって読み取られたプログラムは、例えば、ＨＤＤ１０４にインストールされる。ＮＩＣ１０８は、通信装置１０を通信網２０に接続し、データの送受信を行うための通信インタフェースである。
【００３８】
なお、記憶媒体１０９とは、非一時的（non-transitory）な記憶媒体を言う。記憶媒体１０９の例としては、磁気記憶媒体、光ディスク、光磁気記憶媒体、不揮発性メモリなどがある。
【００３９】
（３．機能構成）
図４は、第一の実施の形態に係る通信装置の機能構成の一例を示す図である。図４に示すように、第一の実施の形態に係る通信装置１０は、レイヤ４であるＴＣＰに関する処理を行うトランスポート層処理部２００と、レイヤ３（Internet Protocol）に関する処理を行うネットワーク層処理部２１０と、レイヤ２に関する処理を行うデータリンク層処理部２２０とを備える。また、トランスポート層処理部２００は、送信部２０１と、受信部２０２と、計測部２０３と、管理部２０４と、判定部２０５とを有する。なお、図４は、第一の実施の形態に特に関係する機能を示すものであり、例えば、Ｗｅｂ通信のような、本願発明に係る実施の形態とは関係が低い機能については図示していない。
【００４０】
これらの各部は、各部の処理内容を記述したプログラムを通信装置１０に実行させることにより実現可能である。すなわち、これらの各部は、通信装置１０に内蔵されるＣＰＵ１０１、ＲＯＭ１０２、ＲＡＭ１０３、及びＨＤＤ１０４などのハードウェア資源を用いて、各部で実施される処理に対応するプログラムを実行することにより実現することが可能である。上記プログラムは、コンピュータが読取り可能な記憶媒体１０９等に記録して、保存したり、配布したりすることが可能である。また、上記プログラムをインターネットなど、ネットワークを通じて提供することも可能である。
【００４１】
送信部２０１は、管理部２０４からセグメントを受け取り、受け取ったセグメントを受信装置１０ｂに対して送信する。また、送信したセグメントを計測部２０３に渡す。
【００４２】
受信部２０２は、受信装置１０ｂからＡＣＫを受信し、受信したＡＣＫを計測部２０３及び管理部２０４に渡す。
【００４３】
計測部２０３は、受信装置１０ｂに対してセグメントを送信し、当該セグメントに対するＡＣＫを受信するまでのＲＴＴ（Round Trip Time：応答時間）を計測する。具体的には、送信部２０１からセグメントを受け取った時刻を記憶しておき、受信部２０２から当該セグメントに対するＡＣＫを受け取った時刻から、記憶していた時刻を除算することでＲＴＴを計測する。なお、ＲＴＴは、通信網２０の通信状況に応じて変動することから、計測部２０３は、複数のセグメントに対してＲＴＴを計測することで、ＲＴＴave（平均応答時間）と、ＲＴＴmax（最大応答時間）と、ＲＴＴmin（最小応答時間）とを計測するようにしてもよい。また、計測部２０３は、セグメント毎にＲＴＴを計測するようにしてもよいし、一部のセグメントからＲＴＴを計測するようにしてもよい。
【００４４】
管理部２０４は、ＴＣＰにおけるデータの送信単位であるセグメントの管理、及びＴＣＰにおける送信アルゴリズムの管理を行う。管理部２０４は、受信装置１０ｂに送信するデータをセグメント単位に分割し、分割したセグメントに対してシーケンス番号を内包させることで、受信装置１０ｂに送信するセグメントを生成する。生成されたセグメントは、送信部２０１を介して、受信装置１０ｂに送信される。また、管理部２０４は、受信部２０２からＡＣＫを受け取り、ＡＣＫに内包されているシーケンス番号を参照することで、どのセグメントまでが受信装置１０ｂに到達したのかを管理する。
【００４５】
また、管理部２０４は、送信したセグメント及び受信したＡＣＫに基づいて、ＴＣＰにおける送信アルゴリズムのうち、どの送信アルゴリズムに従ってセグメントを送信（又は再送信）するのかを管理する。具体的には、管理部２０４は、ＴＣＰにおける送信アルゴリズムのうち、通常状態であるＳＳｏｒＣＡ（Slow Start or Congestion Avoidance）、再送状態であるＲＴＯ及びＦＲを管理する。
【００４６】
また、管理部２０４は、受信装置１０ｂに対して送信したセグメントに対するＡＣＫが、所定の時間が経過しても受信されない場合に再送タイムアウトを検出し、送信アルゴリズムをＲＴＯに切替えることで、セグメントの再送処理を行う。また、管理部２０４は、ＡＣＫを受信した場合に、受信したＡＣＫがＤＡＣＫであるか否かを判定部２０５に判定させる。更に、管理部２０４は、同一のシーケンス番号を内包するＡＣＫが所定の回数連続でＤＡＣＫであると判定された場合、送信アルゴリズムをＦＲに切替えてセグメントの再送処理を行う。なお、ＲＦＣ仕様では、所定の回数は３回であるが、第一の実施の形態における管理部２０４は、必ずしも３回とは限らず、他の回数である場合にＦＲに切替えて再送処理を行うようにしてもよい。
【００４７】
判定部２０５は、管理部２０４からの指示を受けて、管理部２０４が受信したＡＣＫがＤＡＣＫであるか否かを判定する。
【００４８】
（４．処理手順）
図５は、第一の実施の形態に係る通信装置のＤＡＣＫ判定手順の一例を示すフローチャートである。図５の判定手順は、管理部２０４が、受信したＡＣＫがＤＡＣＫであるか否か判定するように判定部２０５に指示した時に起動される。
【００４９】
ステップＳ３０１で、判定部２０５は、受信装置１０ｂから受信したＡＣＫに内包されているシーケンス番号と、ｒｅｃｏｖｅｒ変数に格納されているシーケンス番号とが同一であるか否かを確認する。同一である場合、ステップＳ３０３の処理手順に進み、同一でない場合、ステップＳ３０９の処理手順に進む。
【００５０】
ステップＳ３０３で、判定部２０５は、受信装置１０ｂに対して、ｒｅｃｏｖｅｒ変数に格納されているシーケンス番号の値以上のシーケンス番号を内包するセグメントを所定の個数以上送信し、かつ、送信した所定の個数のセグメントのうち、最後のセグメントを送信してからＲＴＴが経過しているかどうかを判定する。条件を満たすと判定された場合はステップＳ３０５の処理手順に進み、条件を満たさないと判定された場合はステップＳ３０７の処理手順に進む。なお、以降の説明において、「ｒｅｃｏｖｅｒ変数に格納されているシーケンス番号の値以上のシーケンス番号を内包するセグメントを所定の個数以上送信し」の条件を、「第一の条件」ということがある。また、「送信した所定の個数のセグメントのうち、最後のセグメントを送信してからＲＴＴが経過しているかどうか」の条件を、「第二の条件」ということがある。
【００５１】
ステップＳ３０５で、判定部２０５は、管理部２０４が受信したＡＣＫはＤＡＣＫであると判定し、判定結果を管理部２０４に伝える。
【００５２】
ステップＳ３０７で、判定部２０５は、管理部２０４が受信したＡＣＫはＤＡＣＫではないと判定し、判定結果を管理部２０４に伝える。
【００５３】
ステップＳ３０９で、判定部２０５は、ＲＦＣ仕様に沿ったＤＡＣＫ判定処理を行い、判定結果を管理部２０４に伝える。すなわち、受信したＡＣＫに内包されるシーケンス番号がｒｅｃｏｖｅｒ変数の値より大きい場合、受信したＡＣＫはＤＡＣＫであると判定し、ｒｅｃｏｖｅｒ変数の値より小さい場合、受信したＡＣＫはＤＡＣＫではないと判定する。
【００５４】
図６は、第一の実施の形態に係る通信装置の各機能部が送受信する信号を示す図である。図６を用いて、図５の処理を行う際に、各機能部間で送受信される信号を説明する。なお、図６の説明においては、ステップＳ３０３の第一の条件における所定の個数は２個である前提で説明する。
【００５５】
まず、計測部２０３は、測定したＲＴＴを含んでいる「ＲＴＴ」信号を判定部２０５に送信する。なお、測定部２０６は、任意のタイミングで「ＲＴＴ」信号を判定部２０５に送信するようにしてもよいし、判定部２０５から要求されたタイミングで「ＲＴＴ」信号を送信するようにしてもよい。
【００５６】
次に、管理部２０４は、受信部２０２を介してＡＣＫを受信すると、判定部２０５に対し、受信したＡＣＫのシーケンス番号が含まれている「ＡＣＫ＿ＮＵＭ」信号と、ＡＣＫを受信した時点のｒｅｃｏｖｅｒ変数が含まれている「ＲＥＣＯＶＥＲ」信号とを送信する。また、管理部２０４は、ｒｅｃｏｖｅｒ変数に格納されているシーケンス番号以上のシーケンス番号を内包するセグメントを２つ送信した時点で、判定部２０５に対して「ＳＮＤ＿ＳＥＣＯＮＤ＿ＰＡＣＫＥＴ」信号を送信する。
【００５７】
判定部２０５は、管理部２０４から「ＡＣＫ＿ＮＵＭ」及び「ＲＥＣＯＶＥＲ」信号を受信すると、図５のステップＳ３０１の判定処理を行う。判定の結果ステップＳ３０９の処理手順に進んだ場合は、ステップＳ３０９の処理手順に沿って、受信したＡＣＫがＤＡＣＫであるか否かの判断が行われる。
【００５８】
一方、判定の結果ステップＳ３０３の処理手順に進んだ場合、判定部２０５は、管理部２０４から「ＳＮＤ＿ＳＥＣＯＮＤ＿ＰＡＣＫＥＴ」を受信し、かつ、「ＳＮＤ＿ＳＥＣＯＮＤ＿ＰＡＣＫＥＴ」を受信してからＲＴＴが経過しているかを判断する。条件を満たす場合は、管理部２０４が受信したＡＣＫはＤＡＣＫであると判定し、条件を満たさない場合は、管理部２０４が受信したＡＣＫはＤＡＣＫではないと判定する。最後に、判定部２０５は、判定結果が含まれている「ＪＵＤＧＲ＿ＤＡＣＫ」信号を管理部２０４に送信する。
【００５９】
図７は、第一の実施の形態に係る再送処理の具体例を示すシーケンス図である。図７（ｂ）は図７（ａ）の一部を拡大した図である。図７を用いて、図５の処理手順により再送処理が行われる場合の具体例について説明する。
【００６０】
図７の縦軸は、上から下に向かって時間の経過を表している。また、ステップＳ４０１乃至ステップＳ４１６までの各信号は、送信装置１０ａが受信装置１０ｂに対して送信するセグメントを表しており、ステップＳ５０１乃至ステップＳ５１４までの各信号は、各セグメントに対するＡＣＫ（acknowledgment信号）を表している。また、各セグメント及びＡＣＫに付与されている数字は、シーケンス番号を表している。例えば、ｓｅｎｄ＃１は、１のシーケンス番号を内包するセグメントを表しており、ＡＣＫ＃６は、６のシーケンス番号を内包するＡＣＫを表している。また、ＡＣＫが内包するシーケンス番号は、受信装置１０ｂが次に送信を要求するセグメントのシーケンス番号を意味している。
【００６１】
図７（ａ）左側のＳＳｏｒＣＡ、ＦＲ、及びＲＴＯは、ＴＣＰにおける送信アルゴリズムのうち、送信装置１０ａがどの送信アルゴリズムで動作しているかを表している。すなわち、ステップＳ４０１乃至ステップＳ４０５及びステップＳ４１３乃至ステップＳ４１６は、送信アルゴリズムがＳＳｏｒＣＡの場合の処理であり、ステップＳ４０６及びステップＳ４０７は、送信アルゴリズムがＦＲの場合の処理であり、ステップＳ４０８乃至ステップＳ４１２は、送信アルゴリズムがＲＴＯの場合の処理である。なお、送信アルゴリズムは、送信装置１０ａ側の動作を決定するものであり、受信装置１０ｂ側の動作には直接関係しない。
【００６２】
ステップＳ４０１乃至ステップＳ４０５で、送信装置１０ａは、ｓｅｎｄ＃０乃至ｓｅｎｄ＃４までのセグメントを送信する。ここで、ｓｅｎｄ＃１が受信装置１０ｂに届かずに欠落したと仮定する。
【００６３】
ステップＳ５０１乃至ステップＳ５０４で、受信装置１０ｂは、ｓｅｎｄ＃０、ｓｅｎｄ＃２乃至ｓｅｎｄ＃４の各々のセグメントに対してＡＣＫ＃１を返す。受信装置１０ｂは、ｓｅｎｄ＃１を受信していないため、ｓｅｎｄ＃２乃至ｓｅｎｄ＃４の各々のセグメントに対するＡＣＫとしてＡＣＫ＃１を返す。受信装置１０ｂは、受信したｓｅｎｄ＃２乃至ｓｅｎｄ＃４のセグメントを内部バッファに保持しておく。
【００６４】
続いて、送信装置１０ａは、ステップＳ５０１乃至ステップＳ５０４で送信された４つのＡＣＫ＃１を受信する。ここで、ｒｅｃｏｖｅｒ変数の初期値は、送信装置１０ａと受信装置１０ｂとの間でＴＣＰコネクションが確立された際にランダムで決定される初期シーケンス番号と同じ値である。図７の例では、ステップＳ４０１で送信されるセグメント（ｓｅｎｄ＃０）に内包されるシーケンス番号（０）が初期シーケンス番号に該当する。すなわち、送信装置が記憶しているｒｅｃｏｖｅｒ変数には０の値が格納されている。前述の通り、受信したＡＣＫに内包されるシーケンス番号がｒｅｃｏｖｅｒ変数の値より大きい場合、受信したＡＣＫはＤＡＣＫであると判断される。従って、送信装置１０ａは、ステップＳ５０２乃至ステップＳ５０４のＡＣＫ＃１を、ＤＡＣＫであると判定する。ＤＡＣＫを３回受信したことから、送信装置１０ａは、ＲＦＣの仕様に従って送信アルゴリズムをＳＳｏｒＣＡからＦＲに遷移させることで、ＦＲの処理を開始する。
【００６５】
また、ＦＲの処理を開始するタイミングで、送信装置１０ａは、ｒｅｃｏｖｅｒ変数に、既に送信したセグメントのうち最も大きなシーケンス番号（４番）、又は、次に送信する予定のセグメントに内包されるシーケンス番号（５番）のいずれかの値を格納する。図７の例では、５番のシーケンス番号をｒｅｃｏｖｅｒ変数に格納した場合を示している。どちらの値を格納するのかは、通信装置１０の実装により異なるが、第一の実施の形態では、どちらの値を格納してもよい。
【００６６】
ステップＳ４０６で、ＦＲの処理を開始した送信装置１０ａは、ＤＡＣＫにより指示されたｓｅｎｄ＃１のセグメントを再送信する。ここで、再送信したｓｅｎｄ＃１も、受信装置１０ｂに届かずに欠落したと仮定する。
【００６７】
ステップＳ４０７で、送信装置１０ａは、ｓｅｎｄ＃１のセグメントを再送信した後、ステップＳ４０５で送信したセグメントの次のセグメントであるｓｅｎｄ＃５を送信する。受信装置１０ｂは、受信したｓｅｎｄ＃５のセグメントを内部バッファに保持しておく。なお、ＦＲの送信アルゴリズムに遷移した場合、送信可能なセグメントの数を表すウインドウサイズはＳＳｏｒＣＡよりも小さいサイズに変更されることになるが、ウインドウサイズの範囲であれば再送するセグメント以外のセグメントも送信することができる。従って、送信装置１０ａはｓｅｎｄ＃１のセグメントを再送信した後、ｓｅｎｄ＃５のセグメントを送信するようにしている。
【００６８】
ステップＳ５０５で、受信装置１０ｂは、受信したｓｅｎｄ＃５のセグメントに対するＡＣＫ＃１を返す。ここで、ｒｅｃｏｖｅｒ変数には５番が格納されていることから、送信装置１０ａは、ＡＣＫ＃１をＤＡＣＫではないと判定する。また、送信装置１０ａは、ＦＲの処理とは独立して、ステップＳ４０２で送信したｓｅｎｄ＃１のセグメントに対するＡＣＫが返ってきていないことを記憶しており、ｓｅｎｄ＃１のセグメントを送信してから計測していた再送タイマが満了したタイミングで送信アルゴリズムをＲＴＯに遷移させる。
【００６９】
ステップＳ４０８乃至ステップＳ４１２で、ＲＴＯの処理を開始した送信装置１０ａは、ＡＣＫが返っていないｓｅｎｄ＃１乃至ｓｅｎｄ＃５のセグメントを再送信する。
【００７０】
また、ＲＴＯの処理を開始するタイミングで、送信装置１０ａは、ｒｅｃｏｖｅｒ変数に、既に送信したセグメントのうち最も大きなシーケンス番号（５番）、又は、次に送信する予定のセグメントに内包されるシーケンス番号（６番）のいずれかの値を格納する。図７の例では、６番のシーケンス番号をｒｅｃｏｖｅｒ変数に格納した場合を示している。なお、どちらの値を格納するのかについて、送信装置１０ａは、ＦＲとＲＴＯとで同じ動作になるようにする。すなわち、ＦＲの処理開始時に、次に送信する予定のセグメントに内包されるシーケンス番号をｒｅｃｏｖｅｒ変数に格納するのであれば、ＲＴＯの処理開始時についても、次に送信する予定のセグメントに内包されるシーケンス番号をｒｅｃｏｖｅｒ変数に格納する。
【００７１】
ステップＳ５０６乃至ステップＳ５１０で、受信装置１０ｂは、ｓｅｎｄ＃１乃至ｓｅｎｄ＃５のセグメントに対するＡＣＫ＃６を返す。受信装置１０ｂは、ｓｅｎｄ＃２乃至ｓｅｎｄ＃５を内部バッファに保持しているため、それぞれのセグメントに対し、次に送信を要求するセグメントのシーケンス番号（６番）をＡＣＫに内包させて送信することになる。送信装置１０ａは、ステップＳ５０６で送信されたＡＣＫ＃６を受信したタイミングで、それまでに送信した全てのセグメントが受信装置１０ｂに到達したと判断して、送信アルゴリズムをＲＴＯからＳＳｏｒＣＡに遷移させる。
【００７２】
ステップＳ４１３乃至ステップＳ４１６で、送信装置１０ａは、ｓｅｎｄ＃６乃至ｓｅｎｄ＃９のセグメントを送信する。
【００７３】
ステップＳ５１１乃至ステップＳ５１４で、受信装置１０ｂは、ｓｅｎｄ＃６乃至ｓｅｎｄ＃９のセグメントに対してそれぞれＡＣＫ＃７乃至ＡＣＫ＃１０を返す。
【００７４】
ここで、従来の「Ｌｅｓｓ Ｃａｒｅｆｕｌ」方式のＦＲは、ステップＳ５０７乃至ステップＳ５１０で送信されたＡＣＫ＃６を、ＤＡＣＫであると判定してしまい、送信アルゴリズムをＦＲに遷移させてしまう。ｒｅｃｏｖｅｒ変数には６番が格納されており、ｒｅｃｏｖｅｒ変数の値と、ＡＣＫに内包されているシーケンス番号（６番）が一致するためである。しかしながら、送信装置１０ａは、ステップＳ５０６により送信されたＡＣＫ＃６により、それまでに送信した全てのセグメントが受信装置１０ｂに到達したと判断していることから、このタイミングでＦＲの処理を開始する必要は無い。すなわち、無駄なＦＲが動作してしまうことになる。更に、無駄にＦＲが動作することで、スループットの低下を招くことになる。
【００７５】
一方、第一の実施の形態における送信装置１０ａは、ステップＳ５０７乃至ステップＳ５１０で送信されたＡＣＫ＃６を、ＤＡＣＫではないと判定するように動作することで、送信アルゴリズムをＦＲに遷移させないようにする。
【００７６】
具体的には、図５のステップＳ３０３及びステップＳ３０７で説明したように、第一の実施の形態における送信装置１０ａは、ｒｅｃｏｖｅｒ変数の値以上のシーケンス番号を内包するセグメントを所定の個数以上送信し（第一の条件）、かつ、送信した所定の個数のセグメントのうち最後のセグメントを送信した時点からＲＴＴが経過するまで（第二の条件）の間に受信したＡＣＫについては、ＤＡＣＫではないと判定するように動作する。
【００７７】
図７（ｂ）を用いて説明する。図７（ｂ）は、第一の条件及び第二の条件における所定の個数が２個である場合を示している。まず、第一の条件である「ｒｅｃｏｖｅｒ変数の値以上のシーケンス番号を内包するセグメントを２個以上送信し」は、図７（ｂ）のＡ区間に相当する。次に、第二の条件である「２個目のセグメントを送信した時点からＲＴＴが経過するまでの間」は、図７（ｂ）のＢ区間に相当する。すなわち、Ａ区間及びＢ区間で受信したＡＣＫについては、ＤＡＣＫではないと判定される。
【００７８】
第一の条件であるＡ区間を設定した理由について説明する。仮にステップＳ４１３で送信したｓｅｎｄ＃６が欠落した場合、ｓｅｎｄ＃６が欠落したことを示すＤＡＣＫ＃６が受信装置１０ｂから返るのは、少なくとも、ステップＳ４１４で送信したｓｅｎｄ＃７が受信装置１０ｂに到達した後である。すなわち、ステップＳ５０６で送信された最初のＡＣＫ＃６を受信してからｓｅｎｄ＃７を送信するまでの間（Ａ区間）に、ＤＡＣＫ＃６が返ることはないと考えられるためである。
【００７９】
次に、第二の条件であるＢ区間を設定した理由について説明する。セグメントを送信してから、当該セグメントに対するＡＣＫを受信するまでには、少なくともＲＴＴの時間を要すると考えられる。つまり、ステップＳ４１４でｓｅｎｄ＃７を送信してからＲＴＴが経過するまでの間は、ＤＡＣＫ＃６が返ることはないと考えられるためである。
【００８０】
なお、第一の条件及び第二の条件における所定の個数は、必ずしも２個目のセグメントでなくてもよい。例えば、３個目のセグメント（ｓｅｎｄ＃８）としてもよい。なぜなら、図７のステップＳ５０７乃至ステップＳ５１０のＡＣＫをＤＡＣＫではないと判定することができれば、無駄なＦＲの動作を抑止できるためである。
【００８１】
図８は、必要な再送制御が行われる様子を示すシーケンス図である。図８は、図７において、ステップＳ４１３で送信したｓｅｎｄ＃６のセグメントが受信装置１０ｂに到達せず欠落したと仮定した場合に、ＦＲの処理によりセグメントの再送が行われる様子を示している。なお、図８は、第一の条件及び第二の条件における所定の個数が２個である場合を示している。
【００８２】
ステップＳ４１３乃至ステップＳ４１６で、送信装置１０ａはｓｅｎｄ＃６乃至ｓｅｎｄ＃９を送信する。ここで、ｓｅｎｄ＃６が受信装置１０ｂに届かずに欠落したと仮定する。
【００８３】
ステップＳ６１１乃至ステップＳ６１３で、受信装置１０ｂは、ｓｅｎｄ＃７乃至ｓｅｎｄ＃９の各々に対してＡＣＫ＃６を送信する。ここで、ステップＳ６１１で送信されたＡＣＫ＃６が送信装置１０ａに到達するのは、少なくとも、ステップＳ４１４でｓｅｎｄ＃７が送信されてからＲＴＴが経過した後である。従って、送信装置１０ａは、ステップＳ６１１乃至ステップＳ６１３で送信された３つのＡＣＫ＃６を、ＤＡＣＫであると判定することができる。これにより、送信装置１０ａは、送信アルゴリズムをＳＳｏｒＣＡからＦＲに遷移させることでＦＲの処理を開始し、ｓｅｎｄ＃６のセグメントを再送信することができる。
【００８４】
（４．１  処理手順（変形例１））
図５の処理手順では、第一の条件及び第二の条件を満たす場合、言い換えると、図７（ｂ）のＡ区間及びＢ区間の間に受信したＡＣＫについては、ＤＡＣＫではないと判定するようにした。しかしながら、通信装置１０が計測部２０３を備えておらずＲＴＴを計測出来ない場合、又は、通信網２０の回線が不安定でＲＴＴの変動が大きい等の理由により、ＲＴＴを用いた判定処理に信頼性がない場合が考えられる。そこで、図５のステップＳ３０３の処理手順の変形例として、第二の条件であるＢ区間の判定を行わないようにしてもよい。すなわち、図５のステップＳ３０３は、以下の処理手順を行うようにしてもよい。
【００８５】
「ステップＳ３０３で、判定部２０５は、受信装置１０ｂに対して、ｒｅｃｏｖｅｒ変数に格納されているシーケンス番号の値以上のシーケンス番号を内包するセグメントを所定の個数以上送信しているかどうかを判定する。送信している場合はステップＳ３０５の処理手順に進み、送信していない場合はステップＳ３０７の処理手順に進む」。
【００８６】
図９は、第一の実施の形態に係る再送処理（変形例１）の具体例を示すシーケンス図である。図９は、第一の条件において所定の個数が２個である場合を示している。なお、図９では送信装置１０ａの送信アルゴリズムがＲＴＯに遷移した後のシーケンスのみを抜粋して記載しているが、一連のシーケンスは図８と同一である。
【００８７】
図９において、ステップＳ５０６乃至ステップＳ５１０で送信されたＡＣＫ＃６を送信装置１０ａが受信した時点のｒｅｃｏｖｅｒ変数には６番が格納されている。従って、送信装置１０ａは、ステップＳ４１４でｓｅｎｄ＃７を送信するまでの間に受信したＡＣＫ＃６については、ＤＡＣＫではないと判定する。具体的には、送信装置１０ａは、ステップＳ５０７乃至ステップＳ５０９で送信されたＡＣＫ＃６は、ＤＡＣＫではないと判定する。
【００８８】
なお、図９の具体例においては、ステップＳ４１３で送信されたｓｅｎｄ＃６は、受信装置１０ｂに到達せずに欠落している。この場合、送信装置１０ａは、ＦＲの処理を開始することでｓｅｎｄ＃６を再送信することが望ましい。図９においては、ステップＳ４１４で送信されたｓｅｎｄ＃７に対するＡＣＫ＃６はＤＡＣＫであると判定されることから、その後のシーケンスにおいて、ＡＣＫ＃６を２個受信すれば、ＦＲの処理が開始されることになる。
【００８９】
（４．２  処理手順（変形例２））
図５の処理手順では、第一の条件及び第二の条件を満たす場合、言い換えると、図７（ｂ）のＡ区間及びＢ区間の間に受信したＡＣＫについては、ＤＡＣＫではないと判定するようにした。しかしながら、単にＤＡＣＫではないと判定するのではなく、図７（ｂ）のＡ区間及びＢ区間の間に受信したＡＣＫについては、２個目までＤＡＣＫであると判定し、３個目以降のＡＣＫについては、ＤＡＣＫではないと判定するようにしてもよい。すなわち、図５のステップＳ３０７は、以下の処理手順を行うようにしてもよい。
【００９０】
「ステップＳ３０７で、判定部２０５は、２個目までのＡＣＫはＤＡＣＫであると判定し、３個目以降のＡＣＫについては、ＤＡＣＫではないと判定する」。
【００９１】
図１０は、第一の実施の形態に係る再送処理（変形例２）の具体例を示すシーケンス図である。図１０は、第一の条件及び第二の条件における所定の個数が４個である場合を示している。なお、図１０では送信装置１０ａの送信アルゴリズムがＲＴＯに遷移した後のシーケンスのみを抜粋して記載しているが、一連のシーケンスは図８と同一である。
【００９２】
図１０において、ステップＳ５０６乃至ステップＳ５１０で送信されたＡＣＫ＃６を送信装置１０ａが受信した時点のｒｅｃｏｖｅｒ変数には、６番が格納されている。従って、送信装置１０ａは、ステップＳ４１６でｓｅｎｄ＃９を送信するまでの間、及び、ｓｅｎｄ＃９を送信してからＲＴＴが経過するまでの間に受信したＡＣＫ＃６については、２つまでをＤＡＣＫであると判定する。具体的には、送信装置１０ａは、ステップＳ５０７及びステップＳ５０８で送信されたＡＣＫ＃６についてはＤＡＣＫであると判定し、ステップＳ５０９、ステップＳ５１０、ステップＳ６１１及びステップＳ６１２で送信されたＡＣＫ＃６については、ＤＡＣＫではないと判定する。
【００９３】
なお、図１０においては、ステップＳ４１３で送信されたｓｅｎｄ＃６は、受信装置１０ｂに到達せずに欠落している。従って、送信装置１０ａは、ＦＲの処理を開始することでｓｅｎｄ＃６を再送信することが望ましい。図１０においては、ステップＳ６１３で送信されたＡＣＫ＃６についてはＤＡＣＫであると判定されることから、このＤＡＣＫが３個目のＤＡＣＫとなり、ＦＲの処理が開始されることになる。
【００９４】
（４．３  処理手順（変形例３））
変形例３は、変形例２の処理手順において、第二の条件であるＢ区間の判定を行わないようにしたものである。その他の処理手順は変形例２と同一である。
【００９５】
図１１は、第一の実施の形態に係る再送処理（変形例３）の具体例を示すシーケンス図である。図１１は、第一の条件における所定の個数が４個である場合を示している。なお、図１１では送信装置１０ａの送信アルゴリズムがＲＴＯに遷移した後のシーケンスのみを抜粋して記載しているが、一連のシーケンスは図８と同一である。
【００９６】
図１１において、ステップＳ５０６乃至ステップＳ５１０で送信されたＡＣＫ＃６を送信装置１０ａが受信した時点のｒｅｃｏｖｅｒ変数には、６番が格納されている。従って、送信装置１０ａは、ステップＳ４１６でｓｅｎｄ＃９を送信するまでの間に受信したＡＣＫ＃６については、２つまでをＤＡＣＫであると判定する。具体的には、送信装置１０ａは、ステップＳ５０７及びステップＳ５０８で送信されたＡＣＫ＃６についてはＤＡＣＫであると判定し、ステップＳ５０９、ステップＳ５１０で送信されたＡＣＫ＃６については、ＤＡＣＫではないと判定する。
【００９７】
なお、図１１においては、ステップＳ４１３で送信されたｓｅｎｄ＃６は、受信装置１０ｂに到達せずに欠落している。この場合、送信装置１０ａは、ＦＲの処理を開始することでｓｅｎｄ＃６を再送信することが望ましい。図１１においては、ステップＳ６１１で送信されたＡＣＫ＃６についてはＤＡＣＫであると判定されることから、このＤＡＣＫが３個目のＤＡＣＫとなり、ＦＲの処理が開始されることになる。
【００９８】
（４．４  処理手順（変形例４））
変形例４は、図５のステップＳ３０３の処理手順、又は変形例２の処理手順における判定処理を、ＲＴＴの変動を考慮して判定するようにしたものである。
【００９９】
計測部２０３は、複数のセグメントに対してＲＴＴを計測することで、予めＲＴＴaveとＲＴＴmaxとＲＴＴminとを計測しておく。
【０１００】
判定部２０５は、予め計測されたＲＴＴaveとＲＴＴmaxとＲＴＴminとを用いて、受信したＡＣＫがＤＡＣＫであるかどうかを判定する。
【０１０１】
図１２は、第一の実施の形態におけるＲＴＴの変動を考慮した判定処理の一例を示す図である。
【０１０２】
「ｓｅｎｄ＃ｎ」は、シーケンス番号がｎであるセグメントを表しており、図５のステップＳ３０３の処理手順、又は変形例２の処理手順における、「送信した所定の個数のセグメントのうち、最後のセグメント」に該当するセグメントである。「ＡＣＫ」は、ｓｅｎｄ＃ｎを受信した受信装置１０ｂから返されるＡＣＫを表している。
【０１０３】
ｓｅｎｄ＃ｎが送信されてからＡＣＫが受信されるまでの時間をＴとすると、ｓｅｎｄ＃ｎが送信されてからの時間は、下記の計算式によりＡ〜Ｆの時間帯に分割することができる。
【０１０４】
Ａ：Ｔ  ＜  ＲＴＴmin
Ｂ：ＲＴＴmin  ≦  Ｔ  ＜（ＲＴＴmin＋ＲＴＴave）／２
Ｃ：（ＲＴＴmin＋ＲＴＴave）／２  ≦  Ｔ  ＜ＲＴＴave
Ｄ：ＲＴＴave  ≦  Ｔ  ＜（ＲＴＴave＋ＲＴＴmax）／２
Ｅ：（ＲＴＴave＋ＲＴＴmax）／２  ≦  Ｔ  ＜ＲＴＴmax
Ｆ：ＲＴＴmax  ≦  Ｔ
判定部２０５は、Ａ〜Ｅのうち、Ｔがどの時間帯であるかを判断することで、受信したＡＣＫがＤＡＣＫであるかどうかを判定するようにする。
【０１０５】
例えば、通信網２０の混雑によりＲＴＴが長くなる傾向にあると想定する場合、判定部２０５は、ＲＴＴmaxまでの間（Ａ〜Ｅの時間帯）に受信したＡＣＫについては、ＤＡＣＫではないと判定し、ＲＴＴmaxを超えた時間帯（Ｆの時間帯）に受信したＡＣＫについては、ＤＡＣＫであると判定することが考えられる。
【０１０６】
逆に、通信網２０が比較的空いておりＲＴＴが短くなる傾向にあると想定する場合、判定部２０５は、ＲＴＴminまでの間（Ａの時間帯）に受信したＡＣＫについては、ＤＡＣＫではないと判定し、ＲＴＴminを超えた時間帯（Ｂ〜Ｆの時間帯）に受信したＡＣＫについては、ＤＡＣＫであると判定することが考えられる。
【０１０７】
また、他の例として、変形例２の処理手順において、第一の条件における所定の個数が２個であるとした場合、ＲＴＴの変動を考慮することで下記のように判定することもできる。
【０１０８】
Ａの時間帯にＡＣＫを受信した場合、ｓｅｎｄ＃ｎに対するＡＣＫであるとは考えにくいため、ＤＡＣＫではないと判定する。
【０１０９】
Ｂの時間帯にＡＣＫを受信した場合、ｓｅｎｄ＃ｎに対するＡＣＫである可能性はあるものの、信頼性が低いためＤＡＣＫではないと判定する。
【０１１０】
Ｃ及びＤの時間帯にＡＣＫを受信した場合、ｓｅｎｄ＃ｎに対するＡＣＫである可能性が高いため、ＤＡＣＫであると判断する。
【０１１１】
Ｅの時間帯にＡＣＫを受信した場合、ｓｅｎｄ＃ｎに対するＡＣＫである可能性はあるものの、信頼性が低いためＤＡＣＫではないと判定する。
【０１１２】
Ｆの時間帯にＡＣＫを受信した場合、ｓｅｎｄ＃ｎに対するＡＣＫであるとは考えにくいものの、ｓｅｎｄ＃ｎ以降に送信されたセグメントに対するＡＣＫである可能性が考えられるため、ＤＡＣＫであると判定する。
【０１１３】
なお、図１２では、ＲＴＴminからＲＴＴaveまでの時間帯、及びＲＴＴaveからＲＴＴmaxまでの時間帯の各々を２等分することで時間帯を分割したが、３等分以上に分割することで、さらに細かい時間帯に分割するようにしてもよい。
【０１１４】
（４．５  処理手順（変形例５））
変形例５は、図５のステップＳ３０３の処理手順において、ＲＴＯの処理により再送信したセグメントの数を予め記憶しておき、記憶したセグメントの数に応じて、受信したＡＣＫがＤＡＣＫであるかの判定を行うようにする。
【０１１５】
ＲＴＯの処理により再送信が行われた場合、再送信したセグメント数と同じ数のＡＣＫが返るはずである。例えば、実際の通信では、ＲＴＯの処理で再送信が必要なセグメント（実際に欠落したセグメント）は１個であることが多い。従って、ＲＴＯの処理で再送信されたセグメントが全部で５個である場合、これらのセグメントに対する５個のＡＣＫのうち、例えば４個のＡＣＫは無駄なＡＣＫであると推測するようにしてもよい。
【０１１６】
図１３は、第一の実施の形態に係る再送処理（変形例５）の具体例を示すシーケンス図である。図１３では送信装置１０ａの送信アルゴリズムがＲＴＯに遷移した後のシーケンスのみを抜粋して記載しているが、一連のシーケンスは図８と同一である。
【０１１７】
ステップＳ４０８乃至ステップＳ４１２で、送信装置１０ａは、ｓｅｎｄ＃１乃至ｓｅｎｄ＃５の５個のセグメントを送信したことを記憶しておく。
【０１１８】
送信装置１０ａは、ステップＳ５０６乃至ステップＳ５１０で送信された５個のＡＣＫ＃６を受信すると、ステップＳ５０６で送信された最初のＡＣＫ＃６以外、すなわちステップＳ５０７乃至ステップＳ５１０で送信されたＡＣＫ＃６については、ＤＡＣＫではないと判定する。
【０１１９】
なお、図１３においては、ステップＳ４１３で送信されたｓｅｎｄ＃６は、受信装置１０ｂに到達せずに欠落している。従って、送信装置１０ａは、ＦＲの処理を開始することでｓｅｎｄ＃６を再送信することが望ましい。図１３においては、ステップＳ６１１乃至ステップＳ６１３で送信された３個のＡＣＫ＃６についてはＤＡＣＫであると判定されることから、ＦＲの処理が開始されることになる。
【０１２０】
（４．６  処理手順（変形例６））
変形例６は、ｒｅｃｏｖｅｒ変数に格納された数以上のシーケンス番号を内包するセグメントのうち２番目に送信するセグメントの送信を遅延させ、第一の条件における所定の個数を２個として、変形例１又は変形例３の処理手順を用いてＤＡＣＫ判定を行うものである。
【０１２１】
送信部２０１は、ＲＴＯの処理で最後にセグメントを送信してから所定の時間が経過した後に、ｒｅｃｏｖｅｒ変数に格納された数以上のシーケンス番号を内包するセグメントのうち２番目に送信するセグメントを送信するようにする。所定の時間は、例えばＲＴＴとするようにしてもよい。判定部２０５は、第一の条件における所定の個数を２個として、変形例１又は変形例３の処理手順を用いて受信したＡＣＫがＤＡＣＫであるかを判定する。
【０１２２】
図１４は、第一の実施の形態に係る再送処理（変形例６）の具体例を示すシーケンス図である。図１４では送信装置１０ａの送信アルゴリズムがＲＴＯに遷移した後のシーケンスのみを抜粋して記載しているが、一連のシーケンスは図８と同一である。
【０１２３】
送信装置１０ａは、ステップＳ４１２でｓｅｎｄ＃５を送信してから、ＲＴＴ経過した後で、ステップＳ４１４のｓｅｎｄ＃７を送信するようにする。
【０１２４】
送信装置１０ａは、変形例１の処理手順を用いた場合、ステップＳ４１４のｓｅｎｄ＃７を送信するまでの間に受信したステップＳ５０７乃至ステップＳ５１０で送信されたＡＣＫ＃６については、ＤＡＣＫではないと判定する。なお、送信装置１０ａは、変形例３の処理手順を用いた場合、ステップＳ５０７及びステップＳ５０８で送信されたＡＣＫ＃６はＤＡＣＫであると判定し、ステップＳ５０９及びステップＳ５１０で送信されたＡＣＫ＃６は、ＤＡＣＫではないと判定する。
【０１２５】
なお、送信装置１０ａは、ステップＳ４１４のｓｅｎｄ＃７を送信するまでの間に、ＲＴＯにて再送信したセグメント数と同じ数のＡＣＫを受信した場合、又は、ｒｅｃｏｖｅｒ変数に格納されている値を超えたシーケンス番号が内包されているＡＣＫ（例えば、ＡＣＫ＃７）を受信した場合は、ＲＴＴが経過するのを待たずに、ｓｅｎｄ＃７のセグメントの送信を開始するようにしてもよい。
【０１２６】
なお、送信を遅延させるセグメントは、必ずしも、ｒｅｃｏｖｅｒ変数に格納された数以上のシーケンス番号を内包するセグメントのうち２個目のセグメントでなくてもよい。例えば、最初のセグメントでもよいし、３個目以降のセグメントであってもよい。
【０１２７】
＜効果＞
以上、第一の実施の形態によれば、ＳＡＣＫオプションが有効ではない通信において「Ｌｅｓｓ Ｃａｒｅｆｕｌ」方式によるＦＲが行われる場合に、無駄にＦＲの処理が開始されるのを防ぐことができる。ＦＲが起動されると、ＡＣＫを待たずに送信可能なセグメント数を表すウインドウサイズが小さくなることから、スループット低下の要因になる。従って、無駄にＦＲの処理が開始されるのを防ぐことで、スループット低下を抑制することができる。また、所定の期間に受信されるＡＣＫのみをＤＡＣＫであると判定しないようにしたことで、必要なＦＲの処理が行われるようにした。これにより、ＲＴＯを待たずにセグメントの再送信を行うことができる。
【０１２８】
[第二の実施の形態]
次に、第二の実施の形態について図面に基づいて説明する。
【０１２９】
なお、第一の実施の形態と同一構成部分についての説明は省略する。また、特に言及しない点については、第一の実施の形態と同様でよい。
【０１３０】
（３．ソフトウェア構成）
図１５は、第二の実施の形態に係る通信装置の機能構成の一例を示す図である。図１５に示すように、第一の実施の形態に係る通信装置１０は、レイヤ４であるＴＣＰに関する処理を行うトランスポート層処理部２００と、レイヤ３（Internet Protocol）に関する処理を行うネットワーク層処理部２１０と、レイヤ２に関する処理を行うデータリンク層処理部２２０とを備える。また、トランスポート層処理部２００は、送信部２０１と、受信部２０２と、計測部２０３と、管理部２０４と、判定部２０５と、測定部２０６と、受付部２０７とを有する。
【０１３１】
測定部２０６は、送信装置１０ａ及び受信装置１０ｂの間で送受信されるデータ量に基づいて、送信装置１０ａ及び受信装置１０ｂの間を流れるデータのスループットを測定する。
【０１３２】
受付部２０７は、利用者から、判定部２０５が行うＤＡＣＫ判定方法の選択、又はＤＡＣＫ判定の設定に関する指示を受け付け、受け付けた指示を判定部２０５に設定する。利用者は、ＤＡＣＫ判定方法の選択として、例えば、第一の実施の形態で説明したＤＡＣＫ判定方法のうち、どの判定方法により判定するかを選択することができる。また、利用者は、選択したＤＡＣＫ判定方法に対し、例えば、図５に示す第一の条件及び第二の条件における、所定の個数の設定、図１２に示すＡ〜Ｆの各時間帯に対する判定部２０５の動作の設定等を行うことができる。
【０１３３】
＜効果＞
第二の実施の形態によれば、利用者は、送信装置１０ａ及び受信装置１０ｂの間を流れるデータのスループットに応じて、適切なＤＡＣＫ判定処理を選択することが可能になる。また、利用者は、ＤＡＣＫ判定条件を様々に変化させたときのスループットを測定し、最もスループットが大きくなるＤＡＣＫ判定条件を求めることが可能になる。
【０１３４】
＜実施形態の補足＞
以上、本発明は、各実施の形態に限定されるものではなく、本発明の範囲内で種々の変形及び改良が可能である。
【０１３５】
以上、各実施の形態で述べたシーケンス及びフローチャートは、矛盾の無い限り順序を入れ替えてもよい。
【０１３６】
以上、各実施の形態の全部又は一部は、プログラムによって実装され得る。このプログラムは、記憶媒体に格納することができる。
【０１３７】
なお、各実施の形態において、ｒｅｃｏｖｅｒ変数は、最も大きい値のシーケンス番号から算出される値の一例である。また、ＡＣＫは、受信確認信号の一例である。また、ＤＡＣＫは、重複受信確認信号の一例である。また、ＲＴＴaveは、平均応答時間の一例である。また、ＲＴＴmaxは、最大応答時間の一例である。また、ＲＴＴminは、最小応答時間の一例である。
【符号の説明】
【０１３８】
１０  通信装置
１０ａ  送信装置
１０ｂ  受信装置
２０  通信網
２００  トランスポート層処理部
２０１  送信部
２０２  受信部
２０３  計測部
２０４  管理部
２０５  判定部
２０６  測定部
２０７  受付部
２１０  ネットワーク層処理部
２２０  データリンク層処理部
【先行技術文献】
【特許文献】
【０１３９】
【特許文献１】特開２００４−３４３５５２号公報
【図１】
2016096391.tif 000003
【図２】
2016096391.tif 000004
【図３】
2016096391.tif 000005
【図４】
2016096391.tif 000006
【図５】
2016096391.tif 000007
【図６】
2016096391.tif 000008
【図７】
2016096391.tif 000009
【図８】
2016096391.tif 000010
【図９】
2016096391.tif 000011
【図１０】
2016096391.tif 000012
【図１１】
2016096391.tif 000013
【図１２】
2016096391.tif 000014
【図１３】
2016096391.tif 000015
【図１４】
2016096391.tif 000016
【図１５】
2016096391.tif 000017