JP2017049850A - 通信装置、通信方法およびプログラム - Google Patents

通信装置、通信方法およびプログラム Download PDF

Info

Publication number
JP2017049850A
JP2017049850A JP2015173317A JP2015173317A JP2017049850A JP 2017049850 A JP2017049850 A JP 2017049850A JP 2015173317 A JP2015173317 A JP 2015173317A JP 2015173317 A JP2015173317 A JP 2015173317A JP 2017049850 A JP2017049850 A JP 2017049850A
Authority
JP
Japan
Prior art keywords
socket
buffer
unit
communication
processing unit
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2015173317A
Other languages
English (en)
Inventor
隆博 山浦
Takahiro Yamaura
隆博 山浦
優太 小林
Yuta Kobayashi
優太 小林
丈士 石原
Takeshi Ishihara
丈士 石原
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Toshiba Corp
Original Assignee
Toshiba Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Toshiba Corp filed Critical Toshiba Corp
Priority to JP2015173317A priority Critical patent/JP2017049850A/ja
Publication of JP2017049850A publication Critical patent/JP2017049850A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Information Transfer Between Computers (AREA)
  • Computer And Data Communications (AREA)
  • Communication Control (AREA)

Abstract

【課題】メモリの使用効率を向上させる通信装置、通信方法およびプログラムを提供する。【解決手段】実施形態の通信装置は、第1記憶部と、第1通信処理部と、共有部と、を備える。第1記憶部は、第1装置および第2装置との通信データをバッファリングするためのソケットバッファを含む。第1通信処理部は、第1装置および第2装置との通信データに対してプロトコル処理を行い、ソケットバッファに対して通信データの読み出しおよび書込みを行う。共有部は、第1装置との通信データを記憶するソケットバッファ、および第2装置との通信データを記憶するソケットバッファの少なくとも一部を共有化する。【選択図】図3

Description

本発明の実施形態は、通信装置、通信方法およびプログラムに関する。
従来の通信装置として、TCP(Transmission Control Protocol)/IP(Internet Protocol)オフロードエンジン(以下、「TOE」という)を搭載した装置があり、送信ソケットバッファと受信ソケットバッファとがTCPコネクション(ソケット)毎に生成される装置がある。この装置を用いて、プロキシサーバ等のデータの転送を実現する場合、クライアントと通信を行うTCPコネクション、およびサーバと通信を行うTCPコネクションのそれぞれに送信バッファおよび受信バッファが生成される。
このような装置では、サーバから受信した情報の大部分は、そのまま送信されるが、それぞれのソケットにバッファが生成されるので、メモリの使用効率が悪いという問題があった。
特許第4343760号公報
本発明は、上記に鑑みてなされたものであって、メモリの使用効率を向上させる通信装置、通信方法およびプログラムを提供することを目的とする。
実施形態の通信装置は、第1記憶部と、第1通信処理部と、共有部と、を備える。第1記憶部は、第1装置および第2装置との通信データをバッファリングするためのソケットバッファを含む。第1通信処理部は、第1装置および第2装置との通信データに対してプロトコル処理を行い、ソケットバッファに対して通信データの読み出しおよび書込みを行う。共有部は、第1装置との通信データを記憶するソケットバッファ、および第2装置との通信データを記憶するソケットバッファの少なくとも一部を共有化する。
第1の実施形態の通信システムの全体構成の一例を示す図。 第1の実施形態の通信装置のハードウェア構成の一例を示す図。 第1の実施形態の通信装置の機能ブロック構成の一例を示す図。 第1の実施形態の通信装置の要部の機能ブロック構成の一例を示す図。 ストレージ記憶部に対するアクセス制御の構成の一例を示す図。 ストレージ記憶部に対するアクセス制御の構成の別の例を示す図。 ソケット情報の構成の一例を示す図。 第1の実施形態のバッファ共有する通信動作を示すフローチャート。 第1の実施形態のバッファ共有する通信動作を示すシーケンス図。 第1の実施形態のバッファ共有するソケット情報の変更動作を説明する図。 第1の実施形態の共有したバッファの管理方法を説明する図。 第1の実施形態のバッファを共有解除する通信動作を示すシーケンス図。 第1の実施形態のバッファを共有解除するソケット情報の変更動作を説明する図。 第2の実施形態のバッファ共有する通信動作を示すフローチャート。 第2の実施形態のバッファ共有する通信動作を示すシーケンス図。 第2の実施形態のバッファ共有するソケット情報の変更動作を説明する図。 第2の実施形態の変形例1のバッファ共有するソケット情報の変更動作を説明する図。 第2の実施形態の変形例2のバッファ共有するソケット情報の変更動作を説明する図。 第2の実施形態の変形例3のバッファ共有するソケット情報の変更動作を説明する図。 第3の実施形態のバッファ共有する通信動作を示すフローチャート。 第3の実施形態のバッファ共有する通信動作を示すシーケンス図。 第3の実施形態のバッファ共有するソケット情報の変更動作を説明する図。 第3の実施形態の共有したバッファの管理方法を説明する図。
以下に、図面を参照しながら、本発明の実施形態に係る通信装置、通信方法およびプログラムを詳細に説明する。ただし、図面は模式的なものであるため、具体的な構成は以下の説明を参酌して判断すべきものである。
(第1の実施形態)
図1は、第1の実施形態の通信システムの全体構成の一例を示す図である。図1を参照しながら、通信システム1の全体構成の一例について説明する。
図1に示すように、第1の実施形態に係る通信システム1は、クライアント10a〜10c(第1装置または第2装置の一例)と、通信装置20と、スイッチングハブ30と、サーバ40a、40bと、ルータ50と、サーバ70a〜70c(第1装置または第2装置の一例)と、を含む。
通信装置20は、無線ネットワークのインターフェースを備えるクライアント(クライアント10a〜10c)と、有線ネットワークのインターフェースを備えるサーバ(サーバ70a〜70c)とを接続するアクセスポイントである。また、通信装置20は、単にアクセスポイントとしての機能だけではなく、クライアント10a〜10cからコンテンツ要求があった場合には、クライアント10a〜10cの代わりにコンテンツを取得して応答する透過プロキシとして動作し、さらにそのコンテンツをメモリまたはストレージにキャッシュする機能を備えている。通信装置20は、クライアント10a〜10cで実行されるウェブブラウザからHTTP(Hypertext Transfer Protocol)にてサーバ40a、40b、70a〜70c等に対する要求を受けると、そのコンテンツが既にメモリまたはストレージにキャッシュされているかを調べ、キャッシュされている場合にはキャッシュされているコンテンツを用いてクライアント10a〜10cに応答し、キャッシュされていない場合には、クライアント10a〜10cに代わり、後述するサーバ40a、40b、70a〜70c等からコンテンツを取得し、そのコンテンツをキャッシュしてクライアント10a〜10cに応答する。通信装置20は、HTTPでなく、例えば、自装置宛てではないARP(Address Resolution Protocol)またはICMP(Internet Control Message Protocol)等のフレームを受信した場合はルーティングテーブルに従い、そのままそのフレームをサーバに転送する。
クライアント10a〜10cは、例えば、タブレット、スマートフォン、PC(Personal Computer)等であり、WWW(World Wide Web)を閲覧するためのウェブブラウザがインストールされている。なお、クライアント10a〜10cについて、任意のクライアントを示す場合、または総称する場合、単に「クライアント10」と称するものとする。
スイッチングハブ30は、通信装置20とルータ50とを接続し、接続された機器間のデータの通信を制御するネットワーク機器である。
サーバ40a、40bは、スイッチングハブ30および通信装置20を介して、クライアント10に対して、ウェブサービスを提供するサーバ装置である。
ルータ50は、通信ネットワークにおいて、通信データを2つ以上の異なるネットワーク間で中継するネットワーク機器である。図1に示す通信システム1の例では、ルータ50は、クライアント10と通信装置20との無線LAN(Local Area Network)によるネットワークと、インターネット60との、2つのネットワークを中継する。
サーバ70a〜70cは、インターネット60、ルータ50、スイッチングハブ30および通信装置20を介して、クライアント10に対して、ウェブサービスを提供するサーバ装置である。なお、サーバ70a〜70cについて、任意のサーバを示す場合、または総称する場合、単に「サーバ70」と称するものとする。
なお、図1に示す通信システム1の構成は一例であり、この構成に限定されるものではない。例えば、図1ではクライアント10およびサーバ70がそれぞれ3台図示されているが、これに限定されるものではなく、それぞれ3台以外の台数であってもよい。
図2は、第1の実施形態の通信装置のハードウェア構成の一例を示す図である。図2を参照しながら、本実施形態に係る通信装置20のハードウェア構成について説明する。
図2に示すように、通信装置20は、CPU(Central Processing Unit)901と、RAM(Random Access Memory)902(第1記憶部)と、ROM(Read Only Memory)903と、ストレージ904と、TOE(TCP/IPオフロードエンジン)905と、無線ネットワークI/F906と、有線ネットワークI/F907と、を備えている。
CPU901は、通信装置20全体の動作を制御する制御装置である。CPU901は、ROM903またはストレージ904に記憶されているプログラムを読み込み、処理を実行する。CPU901は、アプリケーション、および複数のアプリケーションを動作させるためのOS(Operating System)を動作させ、TOE905で処理されないネットワーク処理の機能、メモリ管理、ファイルシステム処理、ストレージ904のデバイスドライバ等の、RAM902およびストレージ904に対するアクセスに必要な機能を備える。
RAM902は、CPU901のワークエリアとして使用される揮発性記憶装置である。RAM902は、無線ネットワークI/F906、有線ネットワークI/F907、CPU901、TOE905、およびストレージ904と、バス909を介してアクセスされ、データの読み出しと書き込みが行われる。
ROM903は、通信装置20用のファームウェア等のプログラムを記憶している不揮発性記憶装置である。
ストレージ904は、OS(Operating System)、アプリケーションプログラム、および各種データを記憶するHDD(Hard Disk Drive)または、NANDフラッシュを用いたSSD(Solid State Drive)等の補助記憶装置である。ストレージ904へのアクセスは、AHCI(Advanced Host Controller Interface)またはNVM Express等で行われる。
TOE905は、TCP/IPのプロトコル処理をCPU901に代わって行うためのネットワーク機器である。なお、TOE905は、例えば、CPU901と別の汎用または専用のプロセッサを用いて実現してもよく、FPGA(Field Programmable Gate Array)またはASIC(Application Specific Integrated Circuit)等で実現される専用のハードウェアで実現してもよい。また、TOE905は、図2に示すRAM902以外にもハードウェアモジュールに内蔵した専用のメモリを使用できるようにしてもよい。
無線ネットワークI/F906は、IEEE 802.11b/a/g/n/p/ac/ah/ax等で規定される無線LAN規格で通信を行うためのネットワークアダプタである。無線ネットワークI/F906は、物理層とデータリンク層との送受信に関わる処理を行う。
有線ネットワークI/F907は、Ethernet(登録商標)で通信を行うためのネットワークアダプタである。有線ネットワークI/F907は、物理層とデータリンク層との送受信に関わる処理を行う。
上述のCPU901、RAM902、ROM903、ストレージ904、TOE905、無線ネットワークI/F906、および有線ネットワークI/F907は、アドレスバスおよびデータバス等のバス909によって互いに通信可能に接続されている。なお、バス909は、例えば、PCI Express(登録商標)であってもよく、プロセッサベンダ固有のバスまたは独自に設計したバスであってもよい。また、図2では、説明を簡単にするために共有バスのように示したが、実際には高性能を実現するため、各ハードウェアモジュールがポイント・ツー・ポイントで接続される。
なお、図2に示す通信装置20のハードウェア構成は、一例であり、例えば、TOE905、無線ネットワークI/F906、および有線ネットワークI/F907をSoC(System on Chip)として一のハードウェアとして実現してもよい。
また、上述の通信装置20用のプログラムは、インストール可能な形式または実行可能な形式のファイルによって、CD−ROM、CD−R(Compact Disc Recordable)、DVD(Digital Versatile Disk)またはブルーレイディスク等のコンピュータで読み取り可能な記録媒体に記録して流通させるようにしてもよい。
図3は、第1の実施形態の通信装置の機能ブロック構成の一例を示す図である。図4は、第1の実施形態の通信装置の要部の機能ブロック構成の一例を示す図である。図3および4を参照しながら、本実施形態に係る通信装置20の機能ブロックの構成および動作について説明する。なお、図3において、破線は制御の流れを示し、実線はデータの流れを示す。
図3に示すように、第1の実施形態に係る通信装置20は、第1通信部101と、第2通信部102と、第1通信処理部103と、ストレージアクセス部104(アクセス部)と、バッファ管理部105と、第2通信処理部106と、ファイルシステム処理部107と、プロキシ部108と、ストレージ制御部109と、ストレージ記憶部110(第2記憶部)と、アプリケーションバッファ部111と、ストレージバッファ部112と、ソケットバッファ部113と、ソケット情報記憶部114と、を有する。
第1通信部101は、クライアント10と無線によりデータ通信するための機能部である。第1通信部101は、OSI(Open Systems Interconnection)参照モデルにおける物理層およびデータリンク層のプロトコルの送受信処理を行い、例えば、IEEE 802.11等で規定される処理を行う。第1通信部101は、無線ネットワークI/F906によって実現される。なお、第1通信部101は、物理層およびデータリンク層の全ての処理を行う必要はなく、例えば、TOE905、CPU901上で動作するOS151(図3参照)、または別のハードウェアモジュールで行ってもよい。また、第1通信部101は、クライアント10と無線でデータ通信することに限定されるものではなく、有線でデータ通信するものとしてもよい。
第2通信部102は、サーバ70と有線でデータ通信するための機能部である。第2通信部102は、OSI参照モデルにおける物理層およびデータリンク層のプロトコルの送受信処理を行い、例えば、Ethernet等で規定される処理を行う。第2通信部102は、有線ネットワークI/F907によって実現される。なお、第2通信部102も、第1通信部101と同様に、他のハードウェアモジュールと処理を分担してもよい。また、第2通信部102は、サーバ70と有線でデータ通信することに限定されるものではなく、無線でデータ通信するものとしてもよい。
第1通信処理部103は、OSI参照モデルの主にネットワーク層およびトランスポート層のプロトコル処理を行う機能部である。第1通信処理部103は、例えば、IPv4、IPv6、TCP、およびUDP(User Datagram Protocol)の送受信処理を行う。第1通信処理部103は、例えば、IPv4の受信処理では、IPヘッダの解析を行い、バージョン番号の確認、ヘッダチェックサムの計算を行って一致するかの確認を行う。また、第1通信処理部103は、IPv4の送信処理では、上位のアプリケーションまたはネットワーク処理部から指示された情報を元に、ヘッダチェックサム等の計算を行った上で、IPヘッダを生成する。第1通信処理部103は、TCPまたはUDPでデータ通信を行う場合に、通信に関する情報をソケットと呼ばれるインターフェースで行い、ソケット毎にRAM902においてソケット情報としてソケット情報記憶部114に記憶する。ここで、ソケット情報とは、自装置または相手装置で使用するIPアドレスおよびポート番号等の情報、そのソケットのステート、受信したデータの書き込み先、送信するデータの読み出し元等の情報を含むソケットに関する情報である。特に、TCPの場合には、ソケット情報は、これまで受信したシーケンス番号、これから送信するシーケンス番号、自装置または相手装置のウィンドウサイズ等といった情報も含む。
第1通信処理部103は、UDPの受信処理では、受信したUDPデータグラムの宛先IPアドレス、送信元IPアドレス、宛先UDPポート番号を確認し、合致するソケットを探索して、合致するソケットがあればUDPのチェックサム演算を行い、チェックサムが一致すればソケット情報に指定されたソケットバッファへデータの書き込みを行う。また、第1通信処理部103は、UDPの送信処理では、ソケット情報で指定された送信データを格納したソケットバッファの情報を読み出して、ソケット情報から読み出したIPアドレスおよびポート番号等の情報を使ってUDPヘッダを生成して、第1通信部101または第2通信部102に送信する。
第1通信処理部103は、TCPの受信処理では、受信したTCPセグメントの宛先IPアドレス、送信元IPアドレス、宛先TCPポート番号、および送信元TCPポート番号から合致するソケットを探索しTCPのステートに応じた処理を行う。第1通信処理部103は、例えば、合致したソケットのTCPのステートが「ESTABLISHED」の状態であれば、フラグのチェック、シーケンス番号のチェック、TCPのチェックサム演算、ソケット情報に指定されたソケットバッファへのデータの書き込み、TCPの確認応答セグメント(ACK)の送信指示等を行う。第1通信処理部103は、TCPのステートが「LISTEN」の状態であれば、フラグのチェックを行い、SYNフラグが「1」であれば、新たにTCPのステートが「SYN_RECEIVED」の状態のソケット情報を作成したりする。また、ソケット情報は、探索しやすいようにハッシュテーブル等で接続される。第1通信処理部103は、TCPの送信処理では、ソケット情報で指定された送信データを格納したソケットバッファを読み出して、ソケット情報から読み出したIPアドレス、ポート番号、シーケンス番号、およびウィンドウサイズ等の情報を使ってTCPヘッダを生成して、第1通信部101または第2通信部102に送信する。また、第1通信処理部103は、TCPの送信処理としてACKの送信もあり、これも同様にソケット情報からIPアドレス、ポート番号、シーケンス番号、およびウィンドウサイズ等の情報を使ってACKを送信する。
また、第1通信処理部103は、ネットワーク層のプロトコルがIPv4もしくはIPv6でないパケット、またはトランスポート層のプロトコルがTCPもしくはUDPでないパケットの受信処理は、処理できる範囲で処理を行った後、後述する第2通信処理部106に渡して処理をする。また、第1通信処理部103は、TCPにおけるフロー制御または輻輳制御といった機能も有する。第1通信処理部103は、TOE905によって実現される。
ストレージアクセス部104は、ストレージ904と専用のバスで接続され、ストレージ904に対して命令を発行し、データを読み書きする機能部である。ストレージアクセス部104は、例えば、ストレージ904上のデータを専用のバスを介して読み出して、第2通信処理部106を介さず、第1通信処理部103でTCP/IPの送信処理を行い、第1通信部101または第2通信部102を介して、クライアント10またはサーバ70にデータを送信することができる。また、ストレージアクセス部104は、第1通信部101または第2通信部102を介して受信され、第1通信処理部103で処理されたデータを、第2通信処理部106を介さず、直接、ストレージ904に書き込むことができる。ストレージアクセス部104は、TOE905によって実現される。
バッファ管理部105は、後述するソケットバッファをリングバッファとして使用するために管理する機能部である。バッファ管理部105は、1つのソケットバッファの領域を、読み出し用の領域と、書き込み用の領域とに分けて使用するため、rd_pos(読み出し位置)と、wr_pos(書き込み位置)の2つの変数を用いて管理を行う。
バッファ管理部105は、例えば、第1通信処理部103と第2通信処理部106との間で受信バッファの管理を行う場合、初期化時にrd_posおよびwr_posの双方の値を「0」に設定する。この時、第1通信処理部103は、wr_posからrd_posまでのリングバッファ1周分の領域を、受信したデータを書き込むバッファとして使用することができる。第1通信処理部103は、この1周分の領域のサイズをTCPのウィンドウとして、サーバ70に広告する。そして、第1通信処理部103は、サーバ70からデータを含んだTCPセグメントを受信すると、受信バッファのwr_posの位置からデータを書き込んでいき、バッファ管理部105は、第1通信処理部103によりデータの書き込みが完了した位置までwr_posを進める。また、第2通信処理部106は、受信バッファのrd_posの位置からwr_posの位置まで受信バッファに書き込まれたデータをアプリケーションバッファにコピーし、バッファ管理部105は、第2通信処理部106によりコピーが完了した位置までrd_posを進める。
また、バッファ管理部105は、第1通信処理部103と第2通信処理部106との間で送信バッファの管理を行う場合、初期化時にrd_posおよびwr_posの双方の値を「0」に設定する。この時、第2通信処理部106は、wr_posからrd_posまでの1周分の領域を、送信するデータを書き込むバッファとして使用することができる。そして、第2通信処理部106は、アプリケーションバッファから読み出したデータを、送信バッファのwr_posの位置から書き込んでいき、バッファ管理部105は、第2通信処理部106によりデータの書き込みが完了した位置までwr_posを進める。また、第1通信処理部103は、送信バッファのrd_posの位置からwr_posの位置まで送信バッファに書き込まれたデータをTCPのセグメントとして送信処理し、バッファ管理部105は、相手装置から確認応答を受信した位置までrd_posを進める。バッファ管理部105は、TOE905によって実現される。
第2通信処理部106は、TOE905で処理されないプロトコルの送受信処理、およびアプリケーションとのインターフェースを備える機能部である。第2通信処理部106は、例えば、ARPおよびICMP等の送受信処理を行う。例えば、通信装置20が自装置宛てのARPパケットを受信した場合、TOE905ではEthernetおよびIPの処理を行い、ARPの処理が行われずにOS151の第2通信処理部106にARPパケットがフレームの形で渡され、第2通信処理部106は、ヘッダの解析を行った後、オペレーションタイプがリクエストであれば、リクエストされたIPアドレスに対応するMAC(Media Access Control)アドレスを調べ、リプライのARPパケットを生成して送信する。第2通信処理部106は、受信したARPパケットのオペレーションタイプがリプライであれば、ARPテーブルに登録する。第2通信処理部106は、OS151がCPU901により実行されることによって実現される。
ファイルシステム処理部107は、ストレージ記憶部110に記憶されているデータを管理する機能部である。ファイルシステム処理部107は、アプリケーション152に対してファイル単位での処理インターフェースを提供する。インターフェースには、例えば、ファイルを開いたり、ファイルを作成したりする「open」システムコール、ファイルからデータを読み出す「read」システムコール、ファイルにデータを書き込む「write」システムコール、および、ファイルを閉じる「close」システムコール等がある。ファイルシステム処理部107は、ファイルをストレージ記憶部110のどの位置に書き込むか等の管理を行う。また、ファイルシステム処理部107は、RAM902のストレージバッファ部112の管理も行う。ファイルシステム処理部107は、OS151がCPU901により実行されることによって実現される。
プロキシ部108は、OS151上で動作するひとつのアプリケーションであり、クライアント10からサーバ70へのHTTPの接続を検出し、リクエストを解析して、ストレージ904またはRAM902にキャッシュがあればそのキャッシュを使ってサーバ70に代わりクライアント10に応答する機能部である。プロキシ部108は、キャッシュがなければ、クライアント10に代わり、サーバ70にリクエストを送って、サーバ70のレスポンスをストレージ904またはRAM902にキャッシュして、クライアント10に応答を行う。プロキシ部108は、アプリケーション152がCPU901により実行されることによって実現される。
ストレージ制御部109は、ストレージ記憶部110を制御する機能部である。ストレージ制御部109は、例えば、NANDフラッシュメモリを制御するSSDコントローラである。ストレージ制御部109は、外部に対してAHCIまたはNVM Expressといったインターフェースを提供し、ストレージ記憶部110に対する読み書きのコマンドを受け付ける。ストレージ制御部109は、ストレージ904によって実現される。
ストレージ記憶部110は、OS(OS151)、アプリケーション(アプリケーション152)プログラム、サーバ70から受信してキャッシュしたデータ、および各種データを記憶する機能部である。ストレージ記憶部110は、ストレージ904によって実現される。
アプリケーションバッファ部111は、アプリケーション152がOS151に対してRAM902において確保を要求した記憶領域である。アプリケーション152は、通常、ストレージバッファ部112およびソケットバッファ部113に対して直接アクセスすることはできず、ストレージ904または通信を介してデータをやり取りする場合には、アプリケーションバッファ部111を指定してシステムコールをファイルシステム処理部107または第2通信処理部106に発行することにより、データをやり取りする。アプリケーション152は、例えば、ストレージ904に対する処理では、ファイルシステム処理部107に、ストレージバッファ部112から読み出したデータをアプリケーションバッファ部111にコピーさせ、書き込むデータをアプリケーションバッファ部111に書いて、ストレージバッファ部112にコピーさせてデータにアクセスする。また、アプリケーション152は、通信処理では、第2通信処理部106に、ソケットバッファ部113から受信したデータをアプリケーションバッファ部111にコピーさせ、送信するデータをアプリケーションバッファ部111に書いて、ソケットバッファ部113にコピーさせてデータにアクセスする。アプリケーションバッファ部111は、RAM902によって実現される。
ストレージバッファ部112は、ストレージ904とアプリケーション152との間でデータをやり取りする際に用いられる記憶領域である。ストレージ904のストレージ記憶部110は、セクタと呼ばれる、例えば、512バイト等の単位で入出力が行われるが、アプリケーション152からは、任意のサイズで入出力が行われるため、これらの単位の整合を取るため、または、アクセスを高速化するキャッシュとしてストレージバッファ部112を用いる。ストレージバッファ部112は、RAM902によって実現される。
ソケットバッファ部113は、通信でやりとりするデータを記憶する記憶領域である。ソケットバッファ部113の記憶領域(ソケットバッファ)は、例えば、ソケットの生成、すなわち、TCPコネクションの確立等のタイミングに確保され、ソケットの破棄、すなわち、TCPコネクションの切断等により解放される。ソケットバッファ部113は、RAM902によって実現される。
ソケット情報記憶部114は、第1通信処理部103と第2通信処理部106とが協調して動作を行うために、ソケットを介した通信処理に必要なデータを記憶する機能部(記憶領域)である。ソケット情報記憶部114は、RAM902によって実現される。
なお、上述の第1通信部101、第2通信部102、第1通信処理部103、ストレージアクセス部104、バッファ管理部105、第2通信処理部106、ファイルシステム処理部107、プロキシ部108、ストレージ制御部109、ストレージ記憶部110、アプリケーションバッファ部111、ストレージバッファ部112、ソケットバッファ部113およびソケット情報記憶部114は、機能を概念的に示したものであって、このような構成に限定されるものではない。
図4に示すように、第1通信処理部103は、第1プロトコル処理部201と、第1ソケット情報アクセス部202と、ソケット情報確保部203と、ソケット情報解放部204と、を有する。第2通信処理部106は、第2プロトコル処理部211と、ソケットバッファ確保部212(確保部)と、ソケットバッファ解放部213(解放部)と、ソケットバッファ共有設定部214(共有部)と、第2ソケット情報アクセス部215と、を有する。
第1プロトコル処理部201は、上述したようなプロトコルの送受信に関する処理を行い、第2プロトコル処理部211、および第1通信部101および第2通信部102と接続する機能部である。第1プロトコル処理部201は、デスクリプタ(記述子)と呼ばれるメモリ構造により、第2プロトコル処理部211と、ソケットバッファ、ソケット情報およびフレームそのものをやりとりして、データおよびイベントの発生情報を受け渡しする。
第1ソケット情報アクセス部202は、ソケット情報記憶部114のソケット情報にアクセスし、第1プロトコル処理部201が処理を行う場合に、ソケット情報の読み出しを行ったり、ソケット情報の書き込みを行ったりする機能部である。
ソケット情報確保部203は、第1プロトコル処理部201からの指示に従って、ソケット情報記憶部114にソケット情報を新たに確保する機能部である。ソケット情報解放部204は、第1プロトコル処理部201からの指示に従って、ソケット情報記憶部114から現在使用中のソケット情報を解放する機能部である。
第2プロトコル処理部211は、第1プロトコル処理部201で処理されないプロトコルの処理を行い、第1プロトコル処理部201とのインターフェースに加え、アプリケーション152とのインターフェースを備えた機能部である。アプリケーション152は、OS151のシステムコールを利用して、第2プロトコル処理部211の機能を呼び出すことができる。このインターフェースは、ソケットAPI(Application Program Interface)と呼ばれ、ソケットを作成する「socket」システムコール、ソケットを破棄する「close」システムコール、データを受信する「recv」システムコール、および、データを送信する「send」システムコール等がある。第2プロトコル処理部211によるデータの送受信には、アプリケーションバッファ部111およびソケット情報が用いられる。例えば、「send」システムコールでは、アプリケーション152が、データを用意したアプリケーションバッファ部111のアドレスおよびソケット情報を指定して、データの送信が行われる。また、「recv」システムコールでは、アプリケーション152が、データを書き込みたいアプリケーションバッファ部111のアドレスおよびソケット情報を伝えることで、データの受信が行われる。
ソケットバッファ確保部212は、第2プロトコル処理部211からの指示に従って、ストレージバッファ部112で、各ソケットで使用される受信用のバッファ(受信バッファ)および送信用のバッファ(送信バッファ)を確保する機能部である。ソケットバッファ解放部213は、第2プロトコル処理部211からの指示に従って、不要になったソケットバッファを解放する機能部である。
ソケットバッファ共有設定部214は、ソケット情報の書き換えを第2ソケット情報アクセス部215に指示して、複数のソケットでソケットバッファを共有させるようソケット情報を書き換え、不要になったソケットバッファをソケットバッファ解放部213に指示して解放させる機能部である。また、ソケットバッファ共有設定部214は、ソケットバッファの共有を解除する動作を行う。この場合、ソケットバッファ共有設定部214は、ソケットバッファ確保部212に指示して、ソケットバッファを確保した後、第2ソケット情報アクセス部215に指示して、ソケット情報の書き換えを行う。
第2ソケット情報アクセス部215は、ソケット情報記憶部114に記憶されたソケット情報にアクセスし、第2プロトコル処理部211が処理を行う場合に、ソケット情報の読み出しを行ったり、ソケット情報の書き込みを行ったりする機能部である。
ソケット情報記憶部114は、ソケットごとにソケット情報を記憶する記憶領域であり、例えば、図4では、ソケット情報(1)300_1、ソケット情報(2)300_2、・・・、ソケット情報(n)300_nを含む例を示している。
ソケットバッファ部113は、ソケット情報記憶部114のソケット情報で指定されるソケットバッファを記憶する記憶領域であり、例えば、図4では、ソケット情報(1)300_1により、受信バッファ(1)400a_1および送信バッファ(1)400b_1が指定され、ソケット情報(n)300_nにより、受信バッファ(n)400a_nおよび送信バッファ(n)400b_nが指定される例を示している。
なお、第1通信処理部103の第1プロトコル処理部201、第1ソケット情報アクセス部202、ソケット情報確保部203、およびソケット情報解放部204は、機能を概念的に示したものであって、このような構成に限定されるものではない。例えば、図4の第1通信処理部103の中で独立した機能部として図示した複数の機能部を、1つの機能部として構成してもよい。一方、図4の第1通信処理部103の中で1つの機能部が有する機能を複数に分割し、複数の機能部として構成するものとしてもよい。
また、第2通信処理部106の第2プロトコル処理部211、ソケットバッファ確保部212、ソケットバッファ解放部213、ソケットバッファ共有設定部214、および第2ソケット情報アクセス部215は、機能を概念的に示したものであって、このような構成に限定されるものではない。例えば、図4の第2通信処理部106の中で独立した機能部として図示した複数の機能部を、1つの機能部として構成してもよい。一方、図4の第2通信処理部106の中で1つの機能部が有する機能を複数に分割し、複数の機能部として構成するものとしてもよい。
図5は、CPUおよびTOEのストレージ記憶部に対するアクセス制御の構成の一例を示す図である。図6は、CPUおよびTOEのストレージ記憶部に対するアクセス制御の構成の別の例を示す図である。図5および6を参照しながら、ストレージ記憶部110に対するアクセス制御のための構成について説明する。
上述のように、CPU901のファイルシステム処理部107、およびTOE905のストレージアクセス部104は、それぞれストレージ904(ストレージ記憶部110)にアクセスする。この場合、例えば、図5に示すように、ストレージ制御部109が、ファイルシステム処理部107用に第1コントローラ109aを備え、ストレージアクセス部104用に第2コントローラ109bを備え、NVM Expressで定義されるnamespace sharing等を用いて実現してもよいし、または他の調停部を用いてアクセスの排他制御を行ってもよい。または、図6に示すように、ストレージアクセス部104で、第1コントローラ109aと同じインターフェースを、ファイルシステム処理部107に提供し、ストレージアクセス部104内で調停を行って、ストレージ制御部109の第2コントローラ109bに指示するようにしてもよい。
図7は、ソケット情報の構成の一例を示す図である。図7を参照しながら、ソケット情報記憶部114に記憶されるソケット情報の構成の一例を説明する。
図7に示すように、ソケット情報記憶部114の各ソケット情報は、自装置のIPアドレス、相手装置のIPアドレス、自装置のTCPポート番号、相手装置のTCPポート番号、TCPのステート、出力ネットワークインターフェース部識別子、自装置が送信した最大のシーケンス番号(RFC793のSND.NXTに相当)、自装置が送信したもののうち確認応答未受信のシーケンス番号(SND.UNAに相当)、相手装置のウィンドウサイズ(SND.WND)、次に相手が送信すると期待されるシーケンス番号(RCV.NXTに相当)、アプリケーションバッファにコピーし終わったシーケンス番号、自身のウィンドウサイズ(RCV.WNDに相当)、受信バッファ先頭位置、受信バッファサイズ、送信バッファ先頭位置、送信バッファサイズ、共有状態、共有解除バイト数、MTU(Maximum Transmission Unit)、宛先MACアドレス、次のソケット情報へのポインタ、前のソケット情報へのポインタ等を含む。
TCPのステートは、TCPコネクションの状態を示す。出力ネットワークインターフェース部識別子は、どのネットワークインターフェースへフレームを出力するかを示す。
受信バッファ先頭位置は、第1通信処理部103が受信したフレームから取り出したデータ部分を書き込む先頭位置を示しており、ソケットバッファのアドレスが指定される。受信バッファサイズは、受信バッファの領域が、受信バッファ先頭位置からどこまでの長さかを示す。この受信バッファは、リングバッファとして使用され、バッファ管理部105により、バッファ領域の使用管理が行われる。送信バッファ先頭位置および送信バッファサイズも同様に、送信バッファの領域を示す。受信バッファと送信バッファはソケットバッファ部113に確保される。
共有状態は、そのソケットの受信バッファが共有されているか否か、送信バッファが共有されているか否か、そのソケットバッファを他に共有させている(マスター)か、他のソケットバッファを共有している(スレーブ)か等の情報を含む。共有解除バイト数は、そのソケットバッファの共有状態があと何バイト受信するまで有効かを示す。この情報は、後述するウィンドウサイズの計算に用いられる。
次のソケット情報へのポインタおよび前のソケット情報へのポインタは、ソケット情報をリストにし、ハッシュリストとして用いることにより、受信したフレームと合致するソケット情報を高速に探索することを可能にする。
図8は、第1の実施形態の通信装置のバッファを共有する場合の通信動作の一例を示すフローチャートである。図9は、第1の実施形態の通信装置のバッファを共有する場合の通信動作の一例を示すシーケンス図である。図10は、第1の実施形態の通信装置でバッファを共有する場合のソケット情報の変更動作を説明する図である。図11は、第1の実施形態の通信装置で共有したバッファの管理方法を説明する図である。図12は、第1の実施形態の通信装置のバッファを共有解除する場合の通信動作の一例を示すシーケンス図である。図13は、第1の実施形態の通信装置でバッファを共有解除する場合のソケット情報の変更動作を説明する図である。図8〜13を参照しながら、本実施形態に係る通信装置20のソケットバッファを共有する場合の通信動作について説明する。
<ステップS11>
まず、通信装置20は、クライアント10からのHTTPによるコネクション接続を受け付けるための80番ポートで、TCPコネクションの接続を待つソケットを作成する。このとき、通信装置20は、透過型プロキシとして動作するための設定も行う。具体的には、例えば80番等、特定の宛先ポート番号を持つTCPのコネクションの確立において、クライアント10からサーバ70にTCPコネクションの確立要求を受信すると、サーバ70にパケットをブリッジ処理してサーバ70に転送するのではなく、通信装置20でそのTCPコネクションを処理するよう設定する。クライアント10から、宛先ポート番号が80番のTCP接続によってHTTPのコネクション確立要求(SYNフラグの設定されたTCPセグメント)が送信されると、第1通信部101は、そのコネクション確立要求を受信し、第1プロトコル処理部201は、TCP/IPのプロトコル処理を行う。そして、ソケット情報確保部203は、クライアント10と通信するためのソケット(以下、「ソケット(1)」という)に関するソケット情報(以下、「ソケット情報(1)」という)をソケット情報記憶部114に確保する。第1プロトコル処理部201は、コネクション確立要求のTCPセグメントを受信したことを、ソケット情報(1)(第1ソケット情報または第2ソケット情報)および受信したフレームと共に、デスクリプタを介して、第2プロトコル処理部211に通知する。そして、ステップS12へ移行する。
<ステップS12>
第2プロトコル処理部211は、第1プロトコル処理部201からコネクション確立要求を受信した通知を受けると、ソケットバッファ確保部212に、受信したデータを記憶するための受信バッファ(1)と、送信するデータを記憶するための送信バッファ(1)とを確保させる。ここで、受信バッファ(1)および送信バッファ(1)を、ソケットバッファ(1)(第1ソケットバッファまたは第2ソケットバッファ)と総称するものとする。そして、ステップS13へ移行する。
<ステップS13>
第2ソケット情報アクセス部215は、確保されたソケット情報(1)を初期化する。第2ソケット情報アクセス部215は、ソケット情報(1)の初期化として、ソケットバッファ確保部212により確保された受信バッファ(1)および送信バッファ(1)について、ソケット情報(1)の受信バッファ先頭位置、受信バッファサイズ、送信バッファ先頭位置、および送信バッファサイズを設定する。受信バッファ(1)および送信バッファ(1)は、リングバッファとして使用され、バッファ管理部105は、受信バッファ(1)および送信バッファ(1)をリングバッファとして使用する時の位置情報を管理する。そして、第2ソケット情報アクセス部215は、ソケット情報(1)のその他の情報についても、第1プロトコル処理部201から通知されたフレームに含まれる情報、予め第1プロトコル処理部201および第2プロトコル処理部211で保持している情報、および動的に生成した情報から、初期値を設定する。
第2プロトコル処理部211は、このソケット情報(1)を用いて、コネクション確立要求に対する応答(SYN/ACKフラグが設定されたTCPセグメント)を生成し、デスクリプタを介して、第1プロトコル処理部201に送る。第1プロトコル処理部201は、コネクション確立要求に対する応答に対し、TCP/IPの送信処理を行い、第1通信部101から送信する。
そして、第1プロトコル処理部201は、クライアント10から送信されたコネクション確立要求に対する応答に対する応答(ACKフラグが設定されたTCPセグメント)を、第1通信部101を介して受信する。そして、第1ソケット情報アクセス部202は、該当するソケット情報(1)のステートを「ESTABLISHED」状態に設定し、第1プロトコル処理部201は、第2プロトコル処理部211を介して、アプリケーションであるプロキシ部108にTPCコネクションが確立されたことを通知する。プロキシ部108は、TCPコネクションが確立されると「recv」システムコールにより、データを受信する。この時、プロキシ部108は、予め確保したアプリケーションバッファ部111のアドレスおよび長さを指定して、指定した領域に受信したデータをコピーするように指示する。そして、ステップS14へ移行する。
<ステップS14>
TCPコネクションが確立されると、クライアント10からHTTPリクエストが送信される。第1プロトコル処理部201は、第1通信部101を介して、HTTPリクエストを受信し、プロトコル処理を行い、受信バッファ(1)に書き込む(ステップS101)。また、第1プロトコル処理部201は、HTTPリクエストを受信したことを、デスクリプタを介して、第2プロトコル処理部211に通知する。第2プロトコル処理部211は、第1プロトコル処理部201から通知を受けると、受信バッファ(1)に書き込まれたデータを、プロキシ部108が指定したアプリケーションバッファ部111にコピーし、コピーしたデータのバイト数をプロキシ部108に通知する。そして、ステップS15へ移行する。
<ステップS15>
プロキシ部108は、アプリケーションバッファ部111にコピーされたHTTPリクエストを解析し、リクエストされたコンテンツが既にストレージ記憶部110にキャッシュされているか否かを判定する。キャッシュされている場合(ステップS15:Yes)、ステップS35へ移行し、キャッシュされていない場合(ステップS15:No)、ステップS16へ移行する。
<ステップS16>
ストレージ記憶部110にコンテンツがキャッシュされていない場合、プロキシ部108は、サーバ70と通信を行うソケット(以下、「ソケット(2)」という)が既に存在しているかを確認する。ソケット(2)が存在する場合(ステップS16:Yes)、ステップS20へ移行し、ソケット(2)が存在しない場合(ステップS16:No)、ステップS17へ移行する。
<ステップS17>
ソケット(2)が存在しない場合、プロキシ部108は、ソケット(2)を生成するための「socket」システムコールを呼ぶ。第2プロトコル処理部211は、プロキシ部108から指示された情報を、デスクリプタを介して、第1プロトコル処理部201に通知する。ソケット情報確保部203は、ソケット(2)に関するソケット情報(以下、「ソケット情報(2)」という)をソケット情報記憶部114に確保する。そして、ステップS18へ移行する。
<ステップS18>
第2プロトコル処理部211は、ソケットバッファ確保部212に、受信したデータを記憶するための受信バッファ(2)と、送信するデータを記憶するための送信バッファ(2)とを確保させる。ここで、受信バッファ(2)および送信バッファ(2)を、ソケットバッファ(2)(第1ソケットバッファまたは第2ソケットバッファ)と総称するものとする。第2プロトコル処理部211は、ソケットバッファ確保部212に、受信バッファ(2)および送信バッファ(2)にパケット(フレーム)サイズよりも十分に大きいサイズを指定する。これにより、TOE905の第1プロトコル処理部201でパケット(フレーム)毎の処理をさせ、第2プロトコル処理部211では複数のパケット(フレーム)をまとめて処理することができる。そして、ステップS19へ移行する。
<ステップS19>
第1プロトコル処理部201は、第1ソケット情報アクセス部202に、通知された情報、第1プロトコル処理部201で保持している情報、および動的に生成した情報を用いてソケット情報(2)(第1ソケット情報または第2ソケット情報)を初期化させる。第1ソケット情報アクセス部202は、ソケット情報(2)の初期化として、ソケットバッファ確保部212により確保された受信バッファ(2)および送信バッファ(2)について、ソケット情報(2)の受信バッファ先頭位置、受信バッファサイズ、送信バッファ先頭位置、および送信バッファサイズを設定する。プロキシ部108は、サーバ70とのTCPコネクションの確立要求を行うための「connect」システムコールを呼ぶと、第1プロトコル処理部201と第2プロトコル処理部211とが協調して動作し、サーバ70との間のTCPコネクションが確立される。そして、ステップS20へ移行する。
<ステップS20>
プロキシ部108は、新たに確立したTCPコネクション、または既に確立していたTCPコネクションを用いて、サーバ70にHTTPリクエストを送信する。これは、プロキシ部108が確保したアプリケーションバッファにHTTPリクエストを書き込み、「send」システムコールによって、第2プロトコル処理部211にHTTPリクエストの送信を指示することによって行われる。第2プロトコル処理部211は、アプリケーションバッファからソケットバッファ(2)(送信バッファ(2))にHTTPリクエストのコピーを行い、デスクリプタを介して、第1プロトコル処理部201にデータ送信の指示をする(ステップS102)。
指示を受けた第1プロトコル処理部201は、TCP/IPのプロトコル処理をして、サーバ70に、第2通信部102を介して、HTTPリクエストを送信する(ステップS103)。そして、ステップS21へ移行する。
<ステップS21>
サーバ70は、HTTPリクエストを受けると、HTTPレスポンス(ステータスライン)に続き、HTTPレスポンス(ヘッダ)およびHTTPレスポンス(メッセージボディ)をフロー制御しながら送信する(ステップS104、S107、S111)。第2通信部102は、これらを受信し、第1プロトコル処理部201は、TCP/IPの受信処理を行い、ソケットバッファ(2)の受信バッファ(2)に、HTTPレスポンス(ステータスライン)、HTTPレスポンス(ヘッダ)、およびHTTPレスポンス(メッセージボディ)の一部を書き込む。
第1プロトコル処理部201は、受信バッファ(2)の書き込み可能な領域の大きさをウィンドウサイズとして広告しているため、受信バッファ(2)の書き込み可能な領域がなくなるとウィンドウサイズとして「0」が広告され、送信側(サーバ70)が送信処理を一時停止する。プロキシ部108は、このHTTPレスポンスを読み出すため、「recv」システムコールを実行する。この際、プロキシ部108は、「recv」システムコールのオプションには、PEEKオプションを指定する。通常、「recv」システムコールを呼び、アプリケーションバッファ部111にデータをコピーすると、ソケット情報(2)のアプリケーションバッファ部111にコピーし終わったシーケンス番号が更新されるが、PEEKオプションが指定された場合には、ソケットバッファ(2)の受信バッファ(2)からアプリケーションバッファ部111にデータはコピーするものの、バッファ管理部105のrd_pos、およびソケット情報(2)のアプリケーションバッファ部111にコピーし終わったシーケンス番号は更新されない。このため、新たに受信バッファ(2)の空き領域は発生しないため、読み出しを行ってもサーバ70から新たにTCPセグメントが送信されることなく、受信バッファ(2)から送信してきたデータを読み出すことができる。プロキシ部108は、このようにして、サーバ70から送られてきたHTTPレスポンス(ステータスライン)、HTTPレスポンス(ヘッダ)、およびHTTPレスポンス(メッセージボディ)の一部を読み出し、HTTPレスポンス(ヘッダ)からコンテンツの長さを取り出し、HTTPレスポンス(メッセージボディ)の先頭を検出する。そして、ステップS22へ移行する。
<ステップS22>
プロキシ部108は、HTTPレスポンス(ステータスライン)を、ソケット(1)を介して、クライアント10に送信する(ステップS105、S106)。
次に、プロキシ部108は、ファイルシステム処理部107に指示を行い、HTTPレスポンス(ヘッダ)をストレージ記憶部110に記憶させる。ストレージ記憶部110への書き込みはファイルを「open」システムコールまたは「create」システムコール等で開き、「write」システムコール等でアプリケーションバッファ部111のアドレスおよび長さを指定して記憶する。通常、ファイルシステム処理部107は、アプリケーションバッファ部111からHTTPレスポンス(ヘッダ)を読み出してストレージバッファ部112にコピーし、ストレージ制御部109にストレージバッファ部112に記憶したHTTPレスポンス(ヘッダ)のアドレスおよび長さと、ストレージ記憶部110への書き込み位置を通知する。通知を受けたストレージ制御部109は、ストレージバッファ部112からHTTPレスポンス(ヘッダ)を読み出し、ストレージ記憶部110の指定された領域にデータを記憶する(ステップS108)。なお、ストレージバッファ部112を必ず経由しなければならないわけではなく、例えば、512バイト等のセクタ単位のデータであれば、ストレージバッファ部112を経由しないでデータを書き込むこともできる。続いて、プロキシ部108は、HTTPレスポンス(ヘッダ)を、ソケット(1)を介して、クライアント10に送信する(ステップS109、S110)。
そして、プロキシ部108は、HTTPレスポンス(メッセージボディ)についても、現在受信しているところまで、ファイルシステム処理部107に指示してストレージ記憶部110に書き込んで(ステップS112)、ソケット(1)を介してクライアント10に送信する(ステップS113、S114)。そして、ステップS23へ移行する。
なお、HTTPレスポンス(ステータスライン)およびHTTPレスポンス(ヘッダ)は、必要に応じて改変して送信してもよい。
<ステップS23、24>
次に、プロキシ部108は、第2プロトコル処理部211に、クライアント10との通信(ソケット(1))の送信バッファ(1)を、サーバ70との通信(ソケット(2))の受信バッファ(2)として使用し、サーバ70から受信したデータをストレージ記憶部110に書き込むように、ソケットバッファの共有化を指示する(ステップS115)。プロキシ部108から指示を受けた第2プロトコル処理部211は、まず、ストレージアクセス部104に、データの読み出し元として、ソケット情報(1)の送信バッファ先頭位置(0x00030000)および送信バッファサイズ(0x00010000)と、ストレージ記憶部110への書き込み情報として、ファイルの記憶領域を示すエクステント情報およびファイル中のオフセット位置と、さらに、書き込みバイト数とを通知する。ここで、書き込みバイト数は、HTTPレスポンス(ヘッダ)から取得したコンテンツ長から、これまでソケット(2)で受信したHTTPレスポンス(メッセージボディ)の分を引いた値を設定する。
次に、第2プロトコル処理部211は、図10に示すように、ソケットバッファ共用設定部214に指示し、ソケットバッファ共用設定部214は、第2ソケット情報アクセス部215を介して、ソケット情報(2)の受信バッファ先頭位置および受信バッファサイズを、それぞれ、クライアント10との通信に用いるソケット情報(1)の送信バッファ先頭位置および送信バッファサイズで上書きし、共有解除バイト数(共有解除情報量)および共有状態等のバッファ共有情報を設定する。第2ソケット情報アクセス部215は、図10に示すように、共有解除バイト数に、ストレージアクセス部104に通知した書き込みバイト数と同じ値を書き込む。共有解除バイト数は、設定されたソケットの受信方向において、あと何バイト受信したら共有を解除すべきかを示す。共有状態は、共有を行っているか否か、行っているとしたらバッファを貸しているマスタであるか、バッファを借りているスレーブであるか、送信方向で共有しているか、受信方向で共有しているかを示す。そして、ステップS25へ移行する。
<ステップS25>
第2プロトコル処理部211は、ソケットバッファ解放部213に、不要になったサーバ70との通信用に確保した受信バッファ(2)を解放させる。そして、第2プロトコル処理部211は、第1プロトコル処理部201にソケット(1)においてバッファ共有化を行ったことを通知する。なお、ソケット情報を書き換える際には、ロック等により排他制御を行ってもよい。通知を受けた第1プロトコル処理部201は、ウィンドウサイズのアップデートを送信し、サーバ70にソケットバッファに空きができたことを通知する。そして、ステップS26へ移行する。
<ステップS26>
ソケットバッファに空きができたことを知ったサーバ70は、HTTPレスポンス(メッセージボディ)の続きを送信する(ステップS116)。第1プロトコル処理部201は、第2通信部102を介して、HTTPレスポンス(メッセージボディ)を受信(用いられるソケットはソケット(2))し、TCP/IPの受信処理を行い、データをソケット(1)の送信バッファ(1)に書き込む。バッファ管理部105は、図11に示すように、データ書き込みの完了した位置(RCV.NXT)まで、wr_posを更新する。このとき、第1プロトコル処理部201は、受信したバイト数を、ソケット情報(1)の共有解除バイト数から減算する。そして、ステップS27、S28へ移行する。
<ステップS27、S28>
ストレージアクセス部104は、バッファ管理部105によるwr_posの更新を検知した場合、rd_posからwr_posまでのHTTPレスポンス(メッセージボディ)をストレージ記憶部110に書き込む(ステップS117)。ストレージアクセス部104による書き込みは、セクタ単位で行われる。
また、第1プロトコル処理部201は、バッファ管理部105によるwr_posの更新を検知した場合、rd_posからwr_posまでのHTTPレスポンス(メッセージボディ)を、ソケット(1)を介して、クライアント10に送信する(ステップS118)。TCPでは、再送に備えて一度送信したデータも確認応答を受信するまで、データを保持しておかねばならないが、本実施形態の通信装置20では、同時にストレージ記憶部110に書き込みを行うことにより、ストレージ記憶部110からデータを読み出して再送を行うことができるため、ストレージ記憶部110にデータが記憶されたところで再送のために保持していたデータを破棄することができる。したがって、バッファ管理部105は、ストレージ記憶部110への書き込みが完了した時にrd_posの値を書き込みが終わった位置まで進める。なお、再送でないデータの送信の際には、ストレージ記憶部110ではなく送信バッファ(1)から読み出した方が効率がよいため、SND.NXTの値も考慮して、バッファ管理部105は、SND.NXTの位置と、ストレージ記憶部110への書き込みが完了した位置とのどちらか小さい方までrd_posの値を進めてもよい。
図11にバッファ管理方法の図を示す。なお、ソケットバッファの共有を行っている場合は、TCPのウィンドウサイズとして、下記の式(1)に示すように共有解除バイト数および受信バッファサイズのうち小さい方を広告する。
(広告ウィンドウサイズ)=min(共有解除バイト数,受信バッファサイズ)
・・・(1)
ここで、式(1)のmin関数は、引数のうち小さい方の値を返す関数である。サーバ70から受信したデータ(HTTPレスポンス(メッセージボディ))は、共有解除バイト数またはストレージアクセス部104に設定された書き込みバイト数に達するまで(コンテンツ長分まで)、予め設定されたタイムアウトの時間に達するまで、またはTPCコネクションが切断されるまで、ストレージ記憶部110に書き込みながら、クライアント10に送信される。そして、ステップS29へ移行する。
<ステップS29>
サーバ70から受信したデータが、共有解除バイト数またはストレージアクセス部104に設定された書き込みバイト数に達した場合、予め設定されたタイムアウトの時間に達した場合、またはTPCコネクションが切断された場合(ステップS29:Yes)、ステップS30へ移行し、そうでない場合(ステップS29:No)、ステップS26へ戻り、サーバ70からのデータの受信が継続される。
<ステップS30>
第1プロトコル処理部201は、サーバ70とのキープアライブが有効か否かを判定する。キープアライブが無効の場合(ステップS30:No)、ステップS31へ移行し、キープアライブが有効の場合(ステップS30:Yes)、ステップS33へ移行する。
<ステップS31>
第1プロトコル処理部201は、ソケット情報解放部204に、ソケット情報記憶部114のソケット情報(2)を解放させ、ソケット(2)を破棄する。そして、ステップS32へ移行する。
<ステップS32>
第2プロトコル処理部211は、ソケットバッファ解放部213に、ソケットバッファ部113のソケットバッファ(2)(ここでは、送信バッファ(2))を解放させる。そして、ステップS37へ移行する。
<ステップS33、34>
第2プロトコル処理部211は、ソケットバッファ確保部212に、ソケット(2)について新たな受信バッファ(2)(受信バッファ先頭位置:0x00060000)を確保させ(図13参照)、ソケットバッファ共有設定部214に、ソケットバッファの共有を解除させる。具体的には、第2プロトコル処理部211は、ソケットバッファ共有設定部214に指示し、ソケットバッファ共有設定部214は、図13に示すように、第2ソケット情報アクセス部215を介して、ソケット情報(2)の受信バッファ先頭位置および受信バッファサイズを、新たにソケットバッファ確保部212で確保した受信バッファ(2)の値に設定し、共有状態を共有なしの状態に変更する。共有解除のタイミングは、第1プロトコル処理部201が、ソケット情報(1)の共有解除バイト数の減算を行う際に「0」になったら、第2プロトコル処理部211を経由してプロキシ部108に通知してもよいし、ストレージアクセス部104で設定された書き込みバイト数に達するまで書き込みが行われたときに第2プロトコル処理部211を介してプロキシ部108に通知してもよい。また、タイムアウトは第2プロトコル処理部211が、タイマを備えて検知するようにしてもよい。そして、ステップS37へ移行する。
図12において、ステップS121、S122は、それぞれ図9におけるソケットバッファ共有化後のステップS116、S118と同様である。また、ステップS123では、上述のように、ソケットバッファ共有設定部214によるソケットバッファの共有の解除が行われる。ソケットバッファの共有の解除が行われた後のステップS124〜S135の動作は、図9でソケットバッファが共有化される前のステップS101〜S114と同様である。なお、図12において、図9におけるストレージ記憶部110への書込み動作は、説明の簡略のため図示を省略している。
<ステップS35>
既に、ストレージ記憶部110にコンテンツがキャッシュされている場合、プロキシ部108は、「send」システムコールで、HTTPレスポンス(ステータスライン)およびHTTPレスポンス(ヘッダ)を、アプリケーションバッファ部111に書き込む。第2プロトコル処理部211は、アプリケーションバッファ部111から、HTTPレスポンス(ステータスライン)およびHTTPレスポンス(ヘッダ)を、ソケット情報(1)で指定された送信バッファ(1)にコピーする。第1プロトコル処理部201は、送信バッファ(1)にコピーされたHTTPレスポンス(ステータスライン)およびHTTPレスポンス(ヘッダ)に対して、TCP/IPのプロトコル処理を行い、第1通信部101を介して、クライアント10にTCPセグメントを送信する。
また、プロキシ部108は、「sendfile」システムコールにより、第2プロトコル処理部211に、クライアント10と通信するためのソケット情報(1)と、コンテンツの保存されているファイルと、ファイルの送信開始位置と、長さとをストレージアクセス部104に対して指定させる。ストレージアクセス部104は、指定された情報に基づいて、ストレージ記憶部110からHTTPレスポンス(メッセージボディ)を読み出し、送信バッファ(1)に書き込む。そして、ステップS36へ移行する。
<ステップS36>
第1プロトコル処理部201は、送信バッファ(1)に書き込まれたHTTPレスポンス(メッセージボディ)を、第1通信部101を介して、クライアント10に送信する。そして、ステップS37へ移行する。
<ステップS37>
第1プロトコル処理部201は、クライアント10とのキープアライブが有効か否かを判定する。キープアライブが無効の場合(ステップS37:No)、ステップS38へ移行し、キープアライブが有効の場合(ステップS37:Yes)、ステップS14へ戻る。
<ステップS38>
第2プロトコル処理部211は、ソケットバッファ解放部213に、ソケットバッファ部113のソケットバッファ(1)(受信バッファ(1)および送信バッファ(1))を解放させる。そして、ステップS39へ移行する。
<ステップS39>
第1プロトコル処理部201は、ソケット情報解放部204に、ソケット情報記憶部114のソケット情報(1)を解放させ、ソケット(1)を破棄する。
以上のように、本実施形態に係る通信装置20は、サーバ70から受信したHTTPレスポンスのヘッダに基づいて、コンテンツ(HTTPレスポンス(メッセージボディ))の長さを演算して、サーバ70からコンテンツを受信するための受信バッファを解放し、クライアント10へデータを送信するための送信バッファを、サーバ70からのコンテンツの受信のためのバッファとして共有化している。これによって、解放した受信バッファの分だけ、RAM902の使用容量を削減することができ、RAM902(メモリ)の使用効率を向上させることができる。
また、ストレージ904へデータを書き込む場合、ソケットバッファを、ストレージ904に書き込む際のバッファとしても共用することができるので、さらにRAM902(メモリ)の使用容量を削減することができる。
なお、図8で上述したように、本実施形態では、クライアント10用のソケットバッファ(1)のうちの送信バッファ(1)を、サーバ70用のソケットバッファ(2)のうちの受信バッファ(2)の役割を担うように共有化する例を示したが、これに限定されるものではない。すなわち、共有化のためにソケット情報を変更し、かつ、不使用となるソケットバッファを解放することによって、任意ソケットバッファを、解放したソケットバッファの役割を担うように共有化するものとしてもよい。
(第2の実施形態)
第2の実施形態に係る通信装置20について、第1の実施形態に係る通信装置20と相違する点を中心に説明する。本実施形態では、サーバ70へのHTTPリクエスト送信前から、ソケットバッファを共有化する動作について説明する。なお、本実施形態に係る通信システムの全体構成、通信装置のハードウェア構成および機能ブロック構成、ならびにソケット情報の構成は、第1の実施形態で説明した構成と同様である。
図14は、第2の実施形態の通信装置のバッファを共有する場合の通信動作の一例を示すフローチャートである。図15は、第2の実施形態の通信装置のバッファを共有する場合の通信動作の一例を示すシーケンス図である。図16は、第2の実施形態の通信装置でバッファを共有する場合のソケット情報の変更動作を説明する図である。図14〜16を参照しながら、本実施形態に係る通信装置20のソケットバッファを共有する場合の通信動作について説明する。第1の実施形態では、サーバ70との通信用に受信バッファ(2)および送信バッファ(2)をそれぞれ確保した後、受信バッファ(2)を、クライアント10との通信用の送信バッファ(1)と共用化する例を示したが、以下の例では、最初からサーバ70用のソケットバッファ(2)を確保しない。
<ステップS41〜S44>
ステップS41〜S44の処理は、それぞれ図8に示すS11〜S14の処理と同様である(ステップS141)。
<ステップS45>
プロキシ部108は、アプリケーションバッファ部111にコピーされたHTTPリクエストを解析し、リクエストされたコンテンツが既にストレージ記憶部110にキャッシュされているか否かを判定する。キャッシュされている場合(ステップS45:Yes)、ステップS56へ移行し、キャッシュされていない場合(ステップS45:No)、ステップS46へ移行する。
<ステップS46>
プロキシ部108は、サーバ70と通信を行うソケット(2)を生成するためのシステムコールを呼ぶ。この際に呼ばれるのは通常の「socket」システムコールとは異なり、既存のソケットとバッファを共有する新しいソケットを作成する「socket_shb」システムコールであり、引数には、ソケット(1)のソケット情報(1)を指すポインタを指定する。第2プロトコル処理部211は、プロキシ部108から指示された情報を、デスクリプタを介して、第1プロトコル処理部201に通知する。ソケット情報確保部203は、ソケット(2)に関するソケット情報(2)をソケット情報記憶部114に確保する。そして、ステップS47へ移行する。
<ステップS47>
第1プロトコル処理部201は、第1ソケット情報アクセス部202に、確保されたソケット情報(2)を初期化させる。第1ソケット情報アクセス部202は、ソケット情報(2)の初期化として、図16に示すように、ソケットバッファ確保部212により確保された送信バッファ(1)のアドレスおよび長さ、ならびに受信バッファ(1)のアドレスおよび長さを、それぞれソケット情報(2)の受信バッファ先頭位置、受信バッファサイズ、送信バッファ先頭位置、および送信バッファサイズに設定する。そして、第2プロトコル処理部211は、ソケットバッファ共用設定部214に指示し、ソケットバッファ共用設定部214は、図16に示すように、第2ソケット情報アクセス部215を介して、共有解除バイト数および共有状態等のバッファ共有情報を設定する(ステップS142)。第2ソケット情報アクセス部215は、図16に示すように、ソケット情報(2)の共有解除バイト数に、TCPコネクションの切断またはタイムアウトが発生しない限り共有を解除しないことを示す「0xffffffff」等の特別な値を設定する。また、第2ソケット情報アクセス部215は、図16に示すように、ソケット情報(1)の共有状態には、送受信バッファの共有、および共有のマスタ側であること、および、ソケット情報(2)の共有状態には、送受信バッファの共有、および共有のスレーブ側であることを設定する。そして、ステップS48へ移行する。
<ステップS48>
第2ソケット情報アクセス部215は、ソケット情報(2)のその他の情報についても、第1プロトコル処理部201から通知されたフレームに含まれる情報、予め第1プロトコル処理部201で保持している情報、および動的に生成した情報から、初期値を設定する。プロキシ部108は、サーバ70とのTCPコネクションの確立要求を行うための「connect」システムコールを呼ぶと、第1プロトコル処理部201と第2プロトコル処理部211とが協調して動作し、サーバ70との間のTCPコネクションが確立される。そして、ステップS49へ移行する。
<ステップS49>
プロキシ部108は、これから受信するデータを記憶するためのファイルを作成するため、ファイルシステム処理部107に「open」または「create」等のシステムコールを用いてファイルの作成を指示し、作成したファイルに受信したデータを書き込むようにソケットおよびファイル等の情報を第2プロトコル処理部211に通知する。第2プロトコル処理部211は、それをストレージアクセス部104に指示する。この時、書き込みバイト数は、無限大を表す「0xffffffff」等の特別な値を指示する。そして、ステップS50へ移行する。
<ステップS50>
プロキシ部108は、新たに確立したTCPコネクションを用いて、サーバ70にHTTPリクエストを送信する。これは、プロキシ部108が確保したアプリケーションバッファにHTTPリクエストを書き込み、「send」システムコールによって、第2プロトコル処理部211にHTTPリクエストの送信を指示することによって行われる。ここでは、プロキシ部108は、HTTPリクエストのヘッダの「Connection」ヘッダに、「close」を設定して、サーバ70との通信をキープアライブ状態にしない。第2プロトコル処理部211は、アプリケーションバッファからソケットバッファ(1)(受信バッファ(1))にHTTPリクエストのコピーを行い、デスクリプタを介して、第1プロトコル処理部201にデータ送信の指示をする。
指示を受けた第1プロトコル処理部201では、TCP/IPのプロトコル処理をして、サーバ70に、第2通信部102を介して、HTTPリクエストを送信する(ステップS143)。そして、ステップS51へ移行する。
<ステップS51>
サーバ70は、HTTPリクエストを受けると、HTTPレスポンス(ステータスライン)に続き、HTTPレスポンス(ヘッダ)およびHTTPレスポンス(メッセージボディ)をフロー制御しながら送信する(ステップS144、S147、S150)。第2通信部102は、これらを受信し、第1プロトコル処理部201は、TCP/IPの受信処理を行い、ソケットバッファ(1)の送信バッファ(1)に、HTTPレスポンス(ステータスライン)、HTTPレスポンス(ヘッダ)、およびHTTPレスポンス(メッセージボディ)を書き込む。
バッファ管理部105は、データの書き込みが完了した位置(RCV.NXT)まで、wr_posを更新する。このとき、第1プロトコル処理部201は、ソケット情報(1)の共有解除バイト数が「0xffffffff」等の無限大を示す特定の値に設定されているため、受信したデータのバイト数分減算する処理を行わない。そして、ステップS52、S53へ移行する。
<ステップS52、S53>
ストレージアクセス部104は、バッファ管理部105によるwr_posの更新を検知した場合、rd_posからwr_posまでのデータをストレージに書き込む(ステップS145、S148、S151)。ストレージアクセス部104による書き込みは、セクタ単位で行われる。
また、第1プロトコル処理部201は、バッファ管理部105によるwr_posの更新を検知した場合、rd_posからwr_posまでのデータを、ソケット(1)を介して、クライアント10に送信する(ステップS146、S149、S152)。TCPでは、再送に備えて一度送信したデータも確認応答を受信するまで、データを保持しておかねばならないが、本実施形態の通信装置20では、同時にストレージ記憶部110に書き込みを行うことにより、ストレージ記憶部110からデータを読み出して再送を行うことができるため、ストレージ記憶部110にデータが保存されたところで再送のために保持していたデータを破棄することができる。したがって、バッファ管理部105は、ストレージ記憶部110への書き込みが完了した時にrd_posの値を書き込みが終わった位置まで進める。なお、再送でないデータの送信の際には、ストレージ記憶部110ではなく送信バッファ(1)から読み出した方が効率がよいため、SND.NXTの値も考慮して、バッファ管理部105は、SND.NXTの位置と、ストレージ記憶部110への書き込みが完了した位置のどちらか小さいほうまでrd_posの値を進めてもよい。そして、ステップS54へ移行する。
<ステップS54>
予め設定されたタイムアウトの時間に達した場合、またはTCPコネクションが切断された場合(ステップS54:Yes)、ステップS55へ移行し、そうでない場合(ステップS54:No)、ステップS51へ戻り、サーバ70からのデータの受信が継続される。
<ステップS55>
第1プロトコル処理部201は、ソケット情報解放部204に、ソケット情報記憶部114のソケット情報(2)を解放させ、ソケット(2)を破棄する。そして、ステップS58へ移行する。
<ステップS56、S57>
ステップS56、S57の処理は、それぞれ図8に示すS35、S36の処理と同様である。
<ステップS58>
第1プロトコル処理部201は、クライアント10とのキープアライブが有効か否かを判定する。キープアライブが無効の場合(ステップS58:No)、ステップS59へ移行し、キープアライブが有効の場合(ステップS58:Yes)、ステップS44へ戻る。
<ステップS59>
第2プロトコル処理部211は、ソケットバッファ解放部213に、ソケットバッファ部113のソケットバッファ(1)(受信バッファ(1)および送信バッファ(1))を解放させる。そして、ステップS60へ移行する。
<ステップS60>
第1プロトコル処理部201は、ソケット情報解放部204に、ソケット情報記憶部114のソケット情報(1)を解放させ、ソケット(1)を破棄する。
以上のように、本実施形態に係る通信装置20は、クライアント10からHTTPリクエストを受信し、それに応じたサーバ70へのHTTPリクエストの送信前から、クライアント10用のソケットバッファ(1)を、サーバ70用のソケットバッファの役割を担うように共有化するものとしている。これによって、第1の実施形態よりもさらにRAM902の使用容量を削減することができ、RAM902(メモリ)の使用効率を向上させることができる。
また、ストレージ904へデータを書き込む場合、ソケットバッファを、ストレージ904に書き込む際のバッファとしても共用することができるので、さらにRAM902(メモリ)の使用容量を削減することができる。
<変形例1>
第2の実施形態の変形例1に係る通信装置20について、第2の実施形態に係る通信装置20と相違する点を中心に説明する。
図17は、第2の実施形態の変形例1の通信装置でバッファを共有する場合のソケット情報の変更動作を説明する図である。図17を参照しながら、本変形例に係る通信装置20のソケット情報について説明する。
第2の実施形態においては、バッファ管理部105によってソケットバッファの各受信バッファおよび各送信バッファ位置情報(rd_pos、wr_pos)を管理されるものとしていたが、図17に示すように、これらの位置情報を、受信バッファ位置情報および送信バッファ位置情報としてソケット情報に含めて管理するものとしてもよい。
<変形例2>
第2の実施形態の変形例2に係る通信装置20について、第2の実施形態に係る通信装置20と相違する点を中心に説明する。
図18は、第2の実施形態の変形例2の通信装置でバッファを共有する場合のソケット情報の変更動作を説明する図である。図18を参照しながら、本変形例に係る通信装置20のソケット情報について説明する。
第2の実施形態においては、ソケット情報のうち、受信バッファおよび送信バッファそれぞれのバッファ先頭位置およびバッファサイズを直接変更して、ソケットバッファの共有化を実現していたが、図18に示すように、ソケット情報に、ソケットバッファの共有を行うソケットのソケット情報へのポインタを送受信それぞれ(受信共有ソケットポインタ、送信共有ソケットポインタ)について含むようにしてもよい。この場合、共有状態が共有スレーブのソケットに対する受信バッファおよび送信バッファは、共有ソケットポインタで指し示されたソケットの送信バッファおよび受信バッファを用いるものとすればよい。
<変形例3>
第2の実施形態の変形例3に係る通信装置20について、第2の実施形態に係る通信装置20と相違する点を中心に説明する。
図19は、第2の実施形態の変形例3の通信装置でバッファを共有する場合のソケット情報の変更動作を説明する図である。図19を参照しながら、本変形例に係る通信装置20のソケット情報について説明する。
第2の実施形態においては、2つのソケットでソケットバッファを共有する例を示したが、図19に示すように、3つ以上のソケットでソケットバッファを共有してもよい。図19に示す例では、ソケット(2)で受信したデータをソケット(1)およびソケット(3)で送信する例を示している。この時、rd_posの更新は、ソケット(1)またはソケット(3)のSND.UNAのうち小さいほうの値で行われる。
これにより、例えば、分散ストレージ等において、冗長化のため、複数コピーを行う場合において、アプリケーションバッファを経由せず、複数のソケットで複数の相手装置に同時に送信処理を行うことができる。
なお、上述した変形例2のように各ソケット情報には、ソケットバッファの共有を行うソケットのソケット情報のポインタを含むようにしてもよい。この場合、ポインタは、配列またはリスト等で送信および受信毎に、複数のソケットを記憶できるようにしてもよい。第1プロトコル処理部201は、このポインタにより指定されたソケット情報を使って送信を行えばよい。
(第3の実施形態)
第3の実施形態に係る通信装置20について、第2の実施形態に係る通信装置20と相違する点を中心に説明する。本実施形態では、ストレージ904へのキャッシュを行わず、ソケットバッファを共有化する動作について説明する。なお、本実施形態に係る通信システムの全体構成、通信装置のハードウェア構成および機能ブロック構成、ならびにソケット情報の構成は、第1の実施形態で説明した構成と同様である。
図20は、第3の実施形態の通信装置のバッファを共有する場合の通信動作の一例を示すフローチャートである。図21は、第3の実施形態の通信装置のバッファを共有する場合の通信動作の一例を示すシーケンス図である。図22は、第3の実施形態の通信装置でバッファを共有する場合のソケット情報の変更動作を説明する図である。図23は、第3の実施形態の通信装置で共有したバッファの管理方法を説明する図である。図20〜23を参照しながら、本実施形態に係る通信装置20のソケットバッファを共有する場合の通信動作について説明する。
<ステップS61〜S63>
ステップS61〜S63の処理は、それぞれ図14に示すS41〜S43の処理と同様である。
<ステップS64>
第2プロトコル処理部211は、第1プロトコル処理部201に指示を行い、第1プロトコル処理部201は、ソケット情報確保部203に、サーバ70と通信を行うソケット(2)に関するソケット情報(2)をソケット情報記憶部114に確保する。そして、ステップS65へ移行する。
<ステップS65>
第1プロトコル処理部201は、第1ソケット情報アクセス部202に、確保されたソケット情報(2)を初期化させる。第1ソケット情報アクセス部202は、ソケット情報(2)の初期化として、図22に示すように、ソケットバッファ確保部212により確保された送信バッファ(1)のアドレスおよび長さ、ならびに受信バッファ(1)のアドレスおよび長さを、それぞれソケット情報(2)の受信バッファ先頭位置、受信バッファサイズ、送信バッファ先頭位置、および送信バッファサイズに設定する。そして、第2プロトコル処理部211は、ソケットバッファ共用設定部214に指示し、ソケットバッファ共用設定部214は、図22に示すように、第2ソケット情報アクセス部215を介して、共有解除バイト数および共有状態等のバッファ共有情報を設定する(ステップS161)。第2ソケット情報アクセス部215は、図22に示すように、ソケット情報(1)およびソケット情報(2)の共有解除バイト数に、TCPコネクションの切断またはタイムアウトが発生しない限り共有を解除しないことを示す「0xffffffff」等の特別な値を設定する。また、第2ソケット情報アクセス部215は、図22に示すように、ソケット情報(1)の共有状態には、送受信バッファの共有、および共有のマスタ側であること、および、ソケット情報(2)の共有状態には、送受信バッファの共有、および共有のスレーブ側であることを設定する。そして、ステップS66へ移行する。
<ステップS66>
第2ソケット情報アクセス部215は、ソケット情報(2)のその他の情報についても、第1プロトコル処理部201から通知されたフレームに含まれる情報、予め第1プロトコル処理部201で保持している情報、および動的に生成した情報から、初期値を設定する。プロキシ部108は、サーバ70とのTCPコネクションの確立要求を行うための「connect」システムコールを呼ぶと、第1プロトコル処理部201と第2プロトコル処理部211とが協調して動作し、サーバ70との間のTCPコネクションが確立される。そして、ステップS67へ移行する。
<ステップS67>
TCPコネクションが確立されると、クライアント10からHTTPリクエストが送信される。第1プロトコル処理部201は、第1通信部101を介して、HTTPリクエストを受信し、TCP/IPのプロトコル処理を行い、受信バッファ(1)に書き込む(ステップS162)。また、第1プロトコル処理部201は、HTTPリクエストを受信したことを、デスクリプタを介して、第2プロトコル処理部211に通知する。第2プロトコル処理部211は、第1プロトコル処理部201から通知を受けると、受信バッファ(1)に書き込まれたデータを、プロキシ部108が指定したアプリケーションバッファ部111にコピーし、コピーしたデータのバイト数をプロキシ部108に通知する。
バッファ管理部105は、データの書き込みが完了した位置(RCV.NXT)まで、wr_posの位置を更新する。このとき、第1プロトコル処理部201は、ソケット情報(1)の共有解除バイト数が「0xffffffff」等の無限大を意味する特定の値に設定されているため、受信したデータのバイト数分減算する処理を行わない。そして、ステップS68へ移行する。
<ステップS68>
第1プロトコル処理部201は、バッファ管理部105により受信バッファ(1)のwr_posの更新が検知されると、サーバ70に向けてデータの送信が開始され、クライアント10が送信したHTTPリクエストをそのまま送信する(ステップS163)。そして、第1プロトコル処理部201によるHTTPリクエストの送信が完了し、サーバ70から確認応答が来た場合、バッファ管理部105は、再送の必要のなくなった位置までrd_posを進める。そして、ステップS69へ移行する。
<ステップS69>
サーバ70は、HTTPリクエストを受けると、HTTPレスポンス(ステータスライン)に続き、HTTPレスポンス(ヘッダ)およびHTTPレスポンス(メッセージボディ)をフロー制御しながら送信する(ステップS164、S166、S168)。第2通信部102は、これらを受信し、第1プロトコル処理部201は、TCP/IPの受信処理を行い、ソケットバッファ(1)の送信バッファ(1)に、HTTPレスポンス(ステータスライン)、HTTPレスポンス(ヘッダ)、およびHTTPレスポンス(メッセージボディ)を書き込む。
バッファ管理部105は、データの書き込みが完了した位置(RCV.NXT)まで、wr_posを更新する。このとき、第1プロトコル処理部201は、ソケット情報(1)の共有解除バイト数が「0xffffffff」等の無限大を示す特定の値に設定されているため、受信したデータのバイト数分減算する処理を行わない。そして、ステップS70へ移行する。
<ステップS70>
第1プロトコル処理部201は、バッファ管理部105によるwr_posの更新を検知した場合、rd_posからwr_posまでのデータを、ソケット(1)を介して、クライアント10に送信する(ステップS165、S167、S169)。
図23にバッファ管理方法の図を示す。図23に示す管理方法は、上述の図11と同様であるが、書き込まれたデータがストレージ記憶部110に記憶される構成がない点で異なる。また、受信バッファ(1)も、図23に示す送信バッファ(1)の管理方法と同様である。そして、ステップS71へ移行する。
<ステップS71>
何らかのエラーによりTCPコネクションが切断された場合(ステップS71:Yes)、ステップS72へ移行し、そうでない場合(ステップS72:No)、ステップS67へ戻る。
<ステップS72〜S74>
ステップS72〜S74の処理は、それぞれ図14に示すS55、S59、S60の処理と同様である。
以上のように、ストレージ904へのキャッシュを行わず、ソケットバッファを共有化する動作においても、第2の実施形態と同様に、第1の実施形態よりもさらにRAM902の使用容量を削減することができ、RAM902(メモリ)の使用効率を向上させることができる。
なお、上述の各実施形態において、HTTPのプロトコルとしては、HTTP/1.0、HTTP/1.1、およびHTTP/2のいずれでも適用することができる。HTTP/2の場合、ソケット情報には、ストリーム毎に受信バッファおよび送信バッファが指定できるようにしてもよいし、共有解除バイト数もストリーム毎に設定できるように項目を設けてもよい。
また、上述の各実施形態においては、ストレージアクセス部104によるソケットバッファへの書き込みは、ソケット毎に行う例を示したが、複数のソケットのデータをまとめて書き込んでもよい。例えば、ログ構造の書き込みにより、複数のソケットのデータをまとめて書き込むことにより、一度に書き込みを行う量を増加させ、ストレージ904のNANDフラッシュメモリの書き換え回数を減少させ、NANDフラッシュメモリの寿命を延命させることができる。
また、上述の各実施形態においては、ネットワークI/Fが2つ(無線ネットワークI/F906、有線ネットワークI/F907)ある場合の例を示したが、これに限定されるものではなく、1つでもよいし、物理的に1つでもIEEE 802.1qで定義されるVLAN(Virtual LAN)等を用いて仮想的に複数のネットワークI/Fを実現してもよい。
なお、上述の各実施形態の通信装置で実行されるプログラムは、例えば、ROM等に予め組み込まれて提供されるものとしてもよい。
また、上述の各実施形態の通信装置で実行されるプログラムは、インストール可能な形式または実行可能な形式のファイルでCD−ROM(Compact Disk Read Only Memory)、フレキシブルディスク(FD)、CD−R(Compact Disk Recordable)、DVD(Digital Versatile Disk)等のコンピュータで読み取り可能な記録媒体に記録してコンピュータプログラムプロダクトとして提供されるように構成してもよい。
また、上述の各実施形態の通信装置で実行されるプログラムを、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成してもよい。また、上述の各実施形態の通信装置で実行されるプログラムをインターネット等のネットワーク経由で提供または配布するように構成してもよい。
また、上述の各実施形態の通信装置で実行されるプログラムは、コンピュータを上述した通信装置の各機能部として機能させ得る。このコンピュータは、CPUがコンピュータ読取可能な記憶媒体からプログラムを主記憶装置上に読み出して実行することができる。
本発明の実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これらの新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、および変更を行うことができる。これらの実施形態は、発明の範囲および要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
1 通信システム
10、10a〜10c クライアント
20 通信装置
30 スイッチングハブ
40、40a、40b サーバ
50 ルータ
60 インターネット
70、70a〜70c サーバ
101 第1通信部
102 第2通信部
103 第1通信処理部
104 ストレージアクセス部
105 バッファ管理部
106 第2通信処理部
107 ファイルシステム処理部
108 プロキシ部
109 ストレージ制御部
109a 第1コントローラ
109b 第2コントローラ
110 ストレージ記憶部
111 アプリケーションバッファ部
112 ストレージバッファ部
113 ソケットバッファ部
114 ソケット情報記憶部
151 OS
152 アプリケーション
201 第1プロトコル処理部
202 第1ソケット情報アクセス部
203 ソケット情報確保部
204 ソケット情報解放部
211 第2プロトコル処理部
212 ソケットバッファ確保部
213 ソケットバッファ解放部
214 ソケットバッファ共有設定部
215 第2ソケット情報アクセス部
300_1 ソケット情報(1)
300_2 ソケット情報(2)
300_n ソケット情報(n)
400a_1 受信バッファ(1)
400a_n 受信バッファ(n)
400b_1 送信バッファ(1)
400b_n 送信バッファ(n)
901 CPU
902 RAM
903 ROM
904 ストレージ
905 TOE
906 無線ネットワークI/F
907 有線ネットワークI/F
909 バス

Claims (10)

  1. 第1装置および第2装置との通信データをバッファリングするためのソケットバッファを含む第1記憶部と、
    前記第1装置および前記第2装置との通信データに対してプロトコル処理を行い、前記ソケットバッファに対して前記通信データの読み出しおよび書込みを行う第1通信処理部と、
    前記第1装置との通信データを記憶する前記ソケットバッファ、および前記第2装置との通信データを記憶する前記ソケットバッファの少なくとも一部を共有化する共有部と、
    を備えた通信装置。
  2. 前記ソケットバッファを前記第1記憶部に確保する確保部と、
    前記ソケットバッファの少なくとも一部が前記共有部により共有にされた結果、前記ソケットバッファのうち、前記第1装置および前記第2装置との通信データの読み出しおよび書込みが行われなくなった部分を解放する解放部と、
    をさらに備えた請求項1に記載の通信装置。
  3. 前記第1装置または前記第2装置のうち一方の装置との通信データを記憶させる前記ソケットバッファを前記第1記憶部に確保する確保部と、
    をさらに備え、
    前記共有部は、前記一方の装置の前記ソケットバッファを、前記第1装置または前記第2装置のうちの他方の装置との通信データを記憶するように共有化する請求項1に記載の通信装置。
  4. 前記第1記憶部は、
    前記ソケットバッファとして、前記第1装置との通信データを記憶させる第1ソケットバッファと、前記第2装置との通信データを記憶させる第2ソケットバッファと、を含み、
    前記第1ソケットバッファの領域を示す第1ソケット情報と、前記第2ソケットバッファの領域を示す第2ソケット情報と、を記憶し、
    前記共有部は、前記第1ソケット情報および前記第2ソケット情報が示す領域の少なくとも一部が同じ領域を示すように、前記第1ソケット情報または前記第2ソケット情報を更新することによって、前記第1ソケットバッファおよび前記第2ソケットバッファの少なくとも一部を共有化する請求項1に記載の通信装置。
  5. 前記第1記憶部は、前記ソケットバッファの共有を解除するまでの情報量を示す共有解除情報量を含み、
    前記共有部は、前記ソケット情報に対応する前記ソケットバッファに、前記共有解除情報量で示される情報量の通信データが書き込まれた場合に、前記ソケットバッファの共有化を解除する請求項1に記載の通信装置。
  6. 前記第1通信処理部は、前記第1装置および前記第2装置との通信データに対してプロトコル処理を行うハードウェア回路を含み、
    前記第1通信処理部のプロトコル処理とは異なるプロトコル処理を行い、アプリケーションに対する通信データの送受のうち少なくともいずれかを行う第2通信処理部を、さらに備えた請求項1に記載の通信装置。
  7. 前記共有部は、前記ソケットバッファのうち、前記第1装置から受信した通信データを記憶する受信バッファと、前記第2装置に送信する通信データを記憶する送信バッファとを共有化させる請求項1に記載の通信装置。
  8. 前記第1装置または前記第2装置の少なくともいずれかの通信データを記憶する第2記憶部と、
    前記第1通信処理部により前記ソケットバッファに書き込まれた通信データを、前記ソケットバッファから読み出して前記第2記憶部に記憶させるアクセス部と、
    をさらに備えた請求項1に記載の通信装置。
  9. 第1装置および第2装置との通信データに対してプロトコル処理を行い、記憶部に含まれる前記第1装置および前記第2装置との通信データをバッファリングするためのソケットバッファに対して、前記通信データの読み出しおよび書込みを行う通信処理ステップと、
    前記第1装置との通信データを記憶する前記ソケットバッファ、および前記第2装置との通信データを記憶する前記ソケットバッファの少なくとも一部を共有化する共有ステップと、
    を有する通信方法。
  10. コンピュータを、
    第1装置および第2装置との通信データに対してプロトコル処理を行い、記憶部に含まれる前記第1装置および前記第2装置との通信データをバッファリングするためのソケットバッファに対して、前記通信データの読み出しおよび書込みを行う通信処理部と、
    前記第1装置との通信データを記憶する前記ソケットバッファ、および前記第2装置との通信データを記憶する前記ソケットバッファの少なくとも一部を共有化する共有部と、
    として機能させるためのプログラム。
JP2015173317A 2015-09-02 2015-09-02 通信装置、通信方法およびプログラム Pending JP2017049850A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2015173317A JP2017049850A (ja) 2015-09-02 2015-09-02 通信装置、通信方法およびプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2015173317A JP2017049850A (ja) 2015-09-02 2015-09-02 通信装置、通信方法およびプログラム

Publications (1)

Publication Number Publication Date
JP2017049850A true JP2017049850A (ja) 2017-03-09

Family

ID=58279796

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015173317A Pending JP2017049850A (ja) 2015-09-02 2015-09-02 通信装置、通信方法およびプログラム

Country Status (1)

Country Link
JP (1) JP2017049850A (ja)

Similar Documents

Publication Publication Date Title
JP4638658B2 (ja) オフロードされたネットワークスタックの状態オブジェクトをアップロードする方法及びそれを同期する方法
JP4327496B2 (ja) ネットワークスタックをオフロードする方法
US7924881B2 (en) Datagram identifier management
CN108601043B (zh) 用于控制无线接入点的方法和设备
WO2019134383A1 (zh) 控制网络拥塞的方法、接入设备和计算机可读存储介质
US20080304481A1 (en) System and Method of Offloading Protocol Functions
US9832106B2 (en) System and method for detecting network neighbor reachability
JP2018525941A (ja) 拡張されたセッション管理を用いるネットワークパケットフローコントローラ
US11888818B2 (en) Multi-access interface for internet protocol security
JP2006526969A (ja) オフロードユニットを使用したtcp接続のためのデータ処理
US9118608B2 (en) Communication apparatus, control method therefor, and computer-readable storage medium
WO2018128597A1 (en) Cross-device segmentation offload
US9961147B2 (en) Communication apparatus, information processor, communication method, and computer-readable storage medium
CN110838935A (zh) 高可用sdn控制器集群方法、系统、存储介质及设备
WO2012120990A1 (ja) コンピュータシステム、サーバ、オープンフローコントローラ及び通信方法
JP4658546B2 (ja) フェイルオーバーイベントをサポートするネットワーク状態オブジェクトの多重オフロード
US11489948B2 (en) Method and system for reliable application layer data transmission through unreliable transport layer connections in a network
JP2017049850A (ja) 通信装置、通信方法およびプログラム
JP6279970B2 (ja) プロセッサ、通信装置、通信システム、通信方法およびコンピュータプログラム
WO2020052642A1 (zh) 漫游
JP2017163346A (ja) 通信装置、方法、及びプログラム
JP2017152787A (ja) 通信装置および通信システム