情報通信システム(11) http://www10.plala.or.jp/katofmly/chiba-u/ 2015年7月7日 火曜日 午後4時10分~5時40分 NTT-IT Corp. 加藤 洋一 本日のテーマは「パケット伝送」 千葉大学 11- 2 • ここにディジタル伝送路がある。送信側から1ビ ット送ると受信側で1ビット受信できる。 • この伝送路を使って、意味のあるデータを送り たい。 – データ=テキスト、画像、その他いろいろな情報。 区切りがあるものもあるし、単に流れるものもある。 • どういうことを考えなければならないか? – 多くの約束事 ディジタルデータを伝送しよう 千葉大学 11- 3 • さて、どのように送る? – ビット区切りが必要、バイトになる、バイトをまとめ るとパケットになる(小包) – 誤り、誤り訂正、 ….010010 0100…. ….010010 0100…. Sender Receiver 送信側から1ビット送ると、受信側で1ビット受け取る パケット伝送 千葉大学 11- 4 • バイトの切れ目を見つけた。次に、データを 一塊として扱う「パケット」という概念を導入し よう。 • パケットに必要な「決め事」は? – 形式、型、長さ、ヘッダーを使う、その形式 • ヘッダーに入れたい情報? – パケットの長さ、型、どこに向かうか?相手先アド レス ヘッダー 内容 パケット伝送 千葉大学 11- 5 • パケットを異なる受信先に届けたい。どのよう に伝送システムを作れば便利で効率的か考 える。 – まず、郵便局に送る。郵便局から目的地へ送ら れる。複数の集配局。 – 住所が必要 – 最大容量。まとめて送る。お得意様。 – 相手が見つからないとき。相手を見つける。 – パケット送ると返事が返る – 誤りをどうするか?なくなることもある。 • どういう事項について検討する? 伝送路ではエラーがある、盗聴がある • 受信先に確実にデータを届けたい • 盗聴させない 千葉大学 11- 6 千葉大学 11- 7 インターネット(あるいはIPネットワーク) • 本日は、インターネットの仕組みを見てみましょう 音 画像 インターネット (パケット網) ビデオ テキスト データ Webサーバー 「TCP/IP」というパケッ ト伝送インタフェース Web、メール、その他なんでも。。。 Webサーバー 千葉大学 11- 8 プロトコルと通信レイヤー • インターネットは、様々なプロトコルの集積で成立し ています。 – 「プロトコル」とは通信の決め事のこと。 • 電圧とビットの対応(1Vは’1’で-1Vは’0’など) • ビットと文字の対応(01000001は’A’という文字) • “GET /index.html HTTP/1.1”で‘index.html’というWebページの 要求を表す、など • 通信レイヤー(層)とは、ディジタル通信の考え方を 整理したもの – 通信レイヤーごとに別のプロトコル、つまり「決め事」があ ります。 – 通信レイヤーには、物理層、データリンク層、ネットワーク 層、トランスポート層、アプリケーション層などがあります。 千葉大学 11- 9 プロトコルと通信レイヤー • 通信レイヤー:物理層 – 情報は、電気か、電波か、光で運ばれる – ディジタルデータを電気か光の信号にマッピングし、伝送路を通じて送 ること。QAMなどの変調方式も物理層の一つ。 ディジタルビット列 ディジタルビット列 0100100100 光ファイバー 0100100100 同軸ケーブル ツイストペアケーブル 2 2 1 2 -1 4 6 8 10 加入者電話線 1 2 4 6 8 10 -1 -2 -2 何らかの伝 送装置(ある いは部品) 何らかの伝 送装置(ある いは部品) 大気中:電波 物理層 千葉大学 11- 10 プロトコルと通信レイヤー • データリンク層 – 物理層で繋がれたディジタル伝送の一区間を使って、ビット列、あるいは、 ビットのかたまり(パケット)をやり取りする • 後述するEthernetの場合には、ハブを介することで複数の物理層にまたがった データリンク層を構成します。 – データリンクでの機器の識別は、MACアドレスで行います。 データリンク1 0100100100 データリンク2 0100100100 0100100100 物理層1 異なる物理層へ2箇所で接続 物理層2 0100100100 千葉大学 11- 11 プロトコルと通信レイヤー • ネットワーク層 – データ(パケット)を目的地まで届ける – パケットとは、ある長さのデータのかたまり – 目的地まで、複数のデータリンクを使う場合もある データリンク ルーター2 Cあてのパケットだ。 Cに送ろう。 A C Bからパケットが来た ‘00100100111’ ルーター1 ルーター3 Cあてのパケットだ。 ルーター2に送ろう。 ‘00100100111’ B パケットをCに送りたい ネットワーク D 千葉大学 11- 12 プロトコルと通信層 • トランスポート層 – データ伝送の確実性を保証する(しないものもある) • ACKパケット – 「ポート」という概念で、パケットを受け取るべきアプリケー ションプログラムを指定する。 Webブラウザー ネットワーク メールリーダー 80 Webサーバープログラム 25 メールサーバープログラム ひとつのサーバーに Webサーバーとメール サーバーが動いている 千葉大学 11- 13 プロトコルと通信レイヤー アプリケーション層(アプリケーション毎の決め事) Web、メール、Web会議、ストリーミングビデオ HTTPサーバーポート HTMLページBの返送を要求 するリクエストをディジタル データで表現 ネットワーク サーバーAにあ るHTMLページ Bを見たい HTMLページBへの要求が 来た。ページBをハードディ スクから読み取り、要求元 へ返信しよう。 千葉大学 11- 14 プロトコルと通信レイヤー レイヤー 役目 インターネット アプリケーション層 通信の端点となるプログラムな HTTPサーバー、 ど メールサーバー トランスポート層 データをあるコンピューターの プログラムから別のコンピュー ターのプログラムまで届ける TCP、UDP ネットワーク層 パケットを目的地まで運ぶ IP データリンク層 ひとつのネットワーク内でデー タを伝送する Ethernet MACレイ ヤー、PPP 物理層 電気あるいは光の信号でビット Ethernet物理層など やパケットを伝送する 千葉大学 11- 15 Ethernet(イサーネット) • イサーネットは、物理層とデータリンク層にま たがるディジタル伝送方式 – オフィスや家庭のLANはほとんどEthernet – 10Base2、10Base5、10BaseT、100BaseT、 1000BaseT、1000BaseFXなどいろいろな種 類がある – Etherとは「エーテル」のこと。その昔、(一部の物 理学者によって)、光を伝達する媒体で、宇宙全 体を満たしていると考えられていた 千葉大学 11- 16 Ethernetの物理層 • Ethernetの物理層は「ベースバンド」符号化 – 10BaseT では、「マンチェスタ符号化」が使われている いろいろなベースバンド符号化 0 NRZ(Non-Return-to-Zero) ディジタル回路で用いられる RZ(Return-to-Zero) 必ずゼロに戻る NRZI(NRZ-Inversion) 1が来る度に極性反転 AMI(バイポーラ) 1の極性を交互に マンチェスタ LHが0、HLが1 H L 0 1 0 1 1 0 千葉大学 11- 17 10BaseTではなぜマンチェスタ符号化? • 「そう決めたから」というのが最も確かな答え と思われる。もちろん、下記のような理由は あったであろう。 – マンチェスタ符号化では信号からクロックの抽出 が簡単 • ただし、信号クロックは、ビットレートの倍となる – 回路的にも簡単に作れる 千葉大学 11- 18 10BaseTのデータリンク • 送るべきディジタル信号がないときは、何も出さない(信号線は0ボルト) • 以下のようなパケット(データの集まり、Etherパケット、あるいは、Etherフ レーム)を単位にデータを伝送 • ビットクロックは10MHz(マンチェスタ符号化のため、最大クロックは 20MHzとなる)。1ビット伝送は、0.1マイクロ秒。 プリアンブル 8 ヘッダー 14 or 18 データ 46-1500 トレイラー 4 単位は「バイト」 プリアンブル:「これから信号を出しますよ」というお知らせ(82Hが7つ、83Hがひとつ) ヘッダー:あて先アドレス(6バイト)、送信元アドレス(6バイト)、データ長(2バイト) データ:任意のデータ。バイト単位。 トレイラー:チェックサム トレイラーの後は、最小12バイト分の休止期間を取る(12*8*0.1=9.6マイクロ秒期間)。 アドレス(MACアドレス):6バイト、全てのEthernet機器は異なるMACアドレスを持つ (ことになっている) 慣習上、16進表記で以下のように表記する 00-02-00-32-FC-BA or 00:02:00:32:FC:BA 千葉大学 11- 19 16進表記 • 4ビット(2の4乗、即ち0から15までを表せる)を0, 1, 2, 3, 4, 5,6,7,8,9、A(10), B(11), C(12), D(13), E(14), F(15)で表す • 1バイトは、2つの16進表記で、A0(192)、FF(255)、 60(96)、1F(31) などのように表す。 • 先頭に’0x’をつける場合もある。0x00000001で4バ イトの1を表している。0x1001で2バイトの4097を 表している(後ろにHをつけることもある。‘80H’な ど)。 • では、0x7FFFは10進でいくつか? 千葉大学 11- 20 データの発生からケーブルに信号を流すまで なにかしらのデータ 送るべきデータが発生する データをバイト列で表す 10 4A A4 B5 00 FC … ここから先がEthernet プリアンブル、ヘッダー、トレイラーを付加する プリアンブル ヘッダー バイト列からビット列へ変換 ビット列をマンチェスタ符号へ変換 電気信号に変えてケーブルから送り出す データ トレイラー 101010101101001010001001001011 千葉大学 11- 21 10BaseTの伝送方式 送るべき信号のないときはケーブル には何も流れていない (実際には接続確認信号が時々流 れている) UTPケーブル コンピューター ハブ 無信号状態であることを確認! データを送るときは、まず、ケーブル が無信号状態であることを確認する。 UTPケーブル コンピューター プリアンブルから始まるデータ を流す UTPケーブル コンピューター ハブ ハブ 千葉大学 11- 22 ハブ(スイッチングハブ)の動作 ハブ(16ポート) MACアドレス 00-02-04-88-fc-10 00-02-00-4c-02-10 MACアドレス 00-02-00-4c-fc-10 へデータを送出 MACアドレス 00-02-00-4c-02-10 MACアドレス 00-02-10-4c-fc-10 ハブの各ポートとコンピューター(あるいは他の機器)とは1対1で接続され る。 ハブは、ポート毎に、接続されている機器のMACアドレスを記憶している (機器から送られてくるETHERパケットの送信元アドレスを覚える)。 ハブは、ETHERパケットを受け取ると、あて先アドレスを見て該当するポー トから同じETHERパケットを送出する。 千葉大学 11- 23 信号の複製だけを行うハブ(ダムハブ) ハブ(16ポート) MACアドレス 00-02-04-88-fc-10 00-02-00-4c-02-10 MACアドレス 00-02-00-4c-fc-10 へデータを送出 MACアドレス 00-02-00-4c-02-10 MACアドレス 00-02-10-4c-fc-10 スイッチ機能を持たず、あるポートから受け取ったデータを全てのポートに送出す るハブもある(古いタイプ)。 CSMA/CD (Carrier Sense Multiple Access/Collision Detection) (1)伝送路があいていることを確認して送信開始 (2)もし他のコンピューターとたまたま送信がぶつかったら、ランダム時間待つ (3)コンピューターは、常に全パケットを監視し、自分宛のものだけを処理する 伝送路の使用効率は落ちる(一台のコンピュータが全てのネットワークを占有して しまう) 千葉大学 11- 24 ハブ同士の接続/Ethernetの範囲 ハブ同士を接続することもできる。ある機器から別の機器までの 間に最大3個まで。 ポート毎に複数のMACアドレスを記憶することができる。 ひとつのEthernetの範囲は、MACアドレスによってEtherパケット が届く範囲。これを「Etherセグメント」という。 Ethernetはデータリンク層以下(つまりデータリンク層と物理層)の 方式。Etherセグメントを越えた通信には「ネットワーク層」が必要。 千葉大学 11- 25 いろいろなEthernet • 現在の主流は、100BaseTや1000BaseT(GbE)。 – ケーブルの外見やプラグなどは10BaseTと同じ。 • ケーブルの心材は少し太くなり、周波数特性の良いものを使う。 • 100BaseTでは10BaseT同様、8芯のうち4芯(1,2がペア、3,6が ペア、4,5,7,8は未使用)を使用。 • 1000BaseTでは8芯全て使用。しかもひとつのペアを送信受信で 兼用する。 – 電気的な伝送方法は10Baseと全く異なる。 • 当然、パルスのクロックが早い。100BaseTでも1000BaseTでも 125MHz。 • 無信号時にも何かしらのパルス(信号)が流れている – 光ファイバを物理媒体としたもの、無線LANなども使われ るものもある(MACアドレスをもち、Etherフレームで伝送 が行われる) 千葉大学 11- 26 そのほかのデータリンク層および物理層 • 物理層には以下のようなものがある – ADSL – 電話線とモデム • データリンク層には以下のようなものがある – PPP • 元々はモデムなどで利用されている方式。WAN(Wide Area Network)に向く。ADSLやFTTHでも一部で使用されている。 – ATM • データを53バイトの小さなパケットで送る方式 • 生のATMレイヤーの上に、MACレイヤーを乗せる – フレームリレー 千葉大学 11- 27 ネットワーク層:IP • ネットワーク層は、IP(インターネットプロトコル)を用 いるのがほとんど。 • パケットの構造は以下のように簡単 – 必須の部分のみ説明します IPパケット ヘッダ部 データ部 ヘッダ部は、通常20バイト 自分のアドレス: 4バイト(32ビット) あて先アドレス:4バイト(32ビット) データ長:2バイト(つまり、データは最大でも65000バイトほど) TTL:2バイト(後述) ヘッダのチェックサム:2バイト その他:6バイト(固定的なものやまれにしか使用されない情報) 千葉大学 11- 28 IPパケットは、データリンク層の「データ」 • 上位層のパケット全体が、ひとつ下位の層の データとなる。 IPパケット データリンク層 (Ethernetフレー ム) ヘッダ部 8 データ部 14 or 18 プリアンブル ヘッダー 46-1500 データ 4 トレイラー 千葉大学 11- 29 IPパケットの伝わり方 あるEtherセグメント(例えばオフィス) ルーター サーバーAまで パケットを送る ルーターをひとつ経由す るごとにTTLが1引かれる。 TTLが0になるとパケット は破棄される。 ルーター間を結ぶ データリンク インターネット ルーター間のデータリンクで、距離があ る場合には、PPP、ATM、フレームリ レー、光接続のEthernet、などが用いら れる。物理層は、ISDN、フレームリレー、 光接続のEthernetなど。 データセンターのEtherセグメント A 千葉大学 11- 30 IPパケットの伝わり方は、「バケツリレー」 • ルーターの基本的な動作は以下のよう ポートA 他のルーターやハブなど(直 接、端末装置、例えばPC、を 接続することもある) ポートB ポートX あるポートにIPパケットを受信 あて先IPアドレスをパケットヘッダー から読み取る ルーティングテーブルを探索 あて先アドレスに対応するポート からパケットを出力 ルーティングテーブル アドレスaaaからczzまではポートAから出力 アドレスdzzからkfzまではポートBから出力 : 「ポート」は、「インタフェース」ともいう 千葉大学 11- 31 IPアドレス • IPアドレスは、4バイト(32ビット) – 次世代のIPであるIPV6では16バイト(128ビット) • インターネット上の機器はユニークなアドレスを持つ • 以下のような構造を持つ 32ビット ネットワークの識別 機器の識別 分け方は基本的に任意、「ネットマスク」で区分けを表す ルーター Etherセグメント=ネットワーク 4つのバイトに区切って、以下のように表す IPアドレスの例: 129.60.34.230 千葉大学 11- 32 ひとつのネットワーク内でのIPの伝送 • IPパケットを送るには、相手先のMACアドレスを知る必要が ある。 • ARP(Address Resolution Protocol)でMACアドレスとIPア ドレスの変換を行う ARPリクエスト(IPアドレスが指定されている)をブロードキャスト 指定されたIPアドレスを持っている機器は、ARP応答を返す arp コマンド ARP応答を受け取りARPテーブルに追加 それは私です ハブ(16ポート) IPアドレス 192.168.0.21 IPアドレス192.168.0.11 IPアドレス 192.168.0.12 「IPアドレスIPアドレス 192.168.0.21を 持つ機器は返事をしてください」 IPアドレス 192.168.0.22 千葉大学 11- 33 他のネットワークへのIPパケットの伝送 • ネットワーク内の「デフォルトゲートウェイ」へIPパケットを送 る • 「デフォルトゲートウェイ」通常ルーターである。ルーターは、 ルーティングテーブルを参照し、IPパケットを別なルーター等 へ送る ネットワーク=データリンク層でデータが届く範囲 デフォルトゲートウェイ ルーター サーバーAまで パケットを送る 千葉大学 11- 34 ルーティング Netmask=255.255.255.0 129.60.32.0 129.60.33.0 B 129.60.33.1 A 129.60.32.1 ルーター1 C 129.60.34.1 129.60.32.10 129.60.35.10 129.60.35.0 129.60.34.2 129.60.34.0 129.60.35.1 Etherセグメント=ネットワーク ルーターは、インタフェースごとにIPアドレスを持つ tracert ルーター1のルー ティングテーブル 129.60.32.0 Aへ 129.60.33.0 Bへ 129.60.34.0 Cへ 129.60.35.0 Cへ 千葉大学 11- 35 トランスポート層:UDP • パケットを他の機器のアプリケーションまで届 ける 自ポート番号 データの長さ データ 16ビット 16ビット 16ビット 16ビット あて先ポート番号 チェックサム UDPヘッダー IPパケット ヘッダ部 データ部 千葉大学 11- 36 トランスポート層:TCP • IPパケットは、通信エラーがあるとパケットが破棄される • 通信エラーを吸収する。 – ACK、再送 ヘッダー部 データ http://apricot.ese.yamanashi.ac.jp/~itoyo/lecture/network/network05/index05.htm#no3 千葉大学 11- 37 TCPとUDP TCP UDP コネクションという概念が コネクションレス ある IPパケットが紛失しても再 IPパケットが紛失したもな 送によりデータの完全性 にもしない を保障する仕組みがある Web、メールなどに利用さ VoIP、ビデオ送信などに れている 用いられる 千葉大学 11- 38 名前とIPアドレス:DNS • インターネットでは、IPアドレスの代わりに「ド メインネーム」という名前が使われる • DNSというサーバーが、名前とIPアドレスの 変換をしてくれる www.meetingplaza.com nslookupを試す 210.172.40.212 千葉大学 11- 39 アプリケーション層:Web • トランスポートはTCPを使う。 • ポート番号は80。 • 電文ヘッダーは、テキスト。 要求電文フォーマット GET/ HTTP1.1 Accept: image/gif, image/jpeg, … Accept-Language: ja Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.0) Host: www.google.co.jp Connection: Keep-Alive Cookie: PREF=ID=… (改行コードが2つ) 千葉大学 11- 40 アプリケーション層:Web • 結果電文 HTTP1.1 200 OK Chache-Control: private Content-Type:html/text Content-Encoding: gzip Server: gws/2.1 Content-Lenngth: 1650 Date: Mon, 04 Jul 2005 03:11:04 GMT (改行コード2つ) (データ。この場合には、gzipで圧縮されたテキストデータ) Etherealで確認 http://www.ethereal.com/ 千葉大学 11- 41 ソケットインタフェース • ソケットインタフェースは、TCPやUDPで通信 を行うプログラムのためのライブラリ # # socket_recv.py # import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind( ('localhost', 5012) ) while 1: recv_data = s.recvfrom(2000) print recv_data if recv_data[0] == 'exit': break s.close() UDPソケットを生成 UDPにポート5012 を割り当てる ポートからデータを 読み、プリントする ‘exit’という文字列 が来たら終了 千葉大学 11- 42 データ構造のまとめ レイヤー化されたプロトコルの層をプロトコルスタックという。以下は、Ethernetを 使ったインターネットのプロトコルスタック HTTPなど ヘッダ部 データ部 アプリケーション TCPあるいはUDP ヘッダ部 データ部 トランスポート IPパケット ヘッダ部 データ部 ネットワーク Etherフレーム 8 プリアンブル 14 or 18 ヘッダー 46-1500 データ ビット列へ変換、マンチェスタ符号化、伝送路へ データリンク 4 トレイラー 物理層 千葉大学 11- 43 暗号について • 暗号化(Encryption)の一般的方法 – 暗号をかける前の元のディジタルデータを「平文」といいます。 暗号を適用するディジタルデータ(平文) 暗号化の「鍵」 暗号化 暗号化されたディジタルデータ(暗号文) 暗号化されたディジタルデータ(暗号文) 暗号を解く「鍵」 復号 元のデータ(平文) 暗号化の鍵=暗号を解く鍵 の場合を「共通鍵方式」といいます。 暗号化の鍵が公開されていて、暗号を解く鍵が秘密の場合を、「公開鍵方式」といいます。 千葉大学 11- 44 暗号化の方法 • 暗号方式にはいろいろなものがある。よく使われる アルゴリズムの要素の一部を紹介しまします。 – 平文を数十から数百ビット程度のブロックに区切り、ブ ロック毎に暗号化を行う。 – ビットの入れ替え、反転などを行う操作を施す(対応表を 用意する)。簡単な例では、ビットローテートがある(シフト するビット数を決めておく)。対応表やビットシフト量は、鍵 により適宜動的に決定される 暗号化 復号 1011001100110101 0110101001101101 ビット操作対応表 0110101001101101 鍵 ビット操作逆対応表 1011001100110101 鍵 千葉大学 11- 45 暗号化の方法 – 排他的論理和 • 一般の論理和は、 0+0 =0, 0+1 =1, 1+0 =1, 1+1 =1 • ちなみに、論理積は 0×0=0, 0×1=0, 1×0=0, 1×1=1 排他的論理和(エクスクルーシブOR) 0 0 1 1 1 0 1 0 0=1 1=0 0=1 1=0 0=0 1=0 0=1 1=1 同じ値との排他的論 理和を2回繰り返すと 元に戻る 同じ値 暗号化 復号 平文 暗号文 鍵 暗号文 鍵(暗号化と同じもの) 平文 千葉大学 11- 46 暗号化の方法 – 対応表によるビット操作と排他的論理和を組み合 わせた方式(DESなどに見られる方式) 平文:64ビット 2つの32ビット データに分ける 32ビット 32ビット ビット操作表を 鍵で変更する 鍵 ビット操作表 32ビットデータ を入れ替える 32ビット 32ビット この操作を何 回か繰り返す 千葉大学 11- 47 公開鍵方式 • 公開鍵方式の要素 – 公開してある鍵 • 公開鍵は、受信者ごとに異なる。 • 誰でも、公開鍵によってその受信者向けの暗号文を作 ることができる – 公開鍵に対応する秘密鍵 • 受信者だけが知っている • 復号に用いる • 公開鍵方式では、暗号化のための鍵を秘密 にしておく必要がない。 – 一方、共通鍵方式では、暗号側と復号側で同じ 鍵が必要。鍵はどうやって相手に知らせるか、と いう問題が常につきまとう。 千葉大学 11- 48 公開鍵方式 • RSA公開鍵暗号という方式が標準的に用い られている。 – RSAの易しい解説は下記URLを参照のこと。 • http://www.maitou.gr.jp/rsa/rsa01.php – RSAはSSL(Secure Socket Layer)に利用され ている。 • Webブラウザーで、鍵がロックされているアイコンが出 ているときは、RSAが利用されている。 – RSA方式は計算量がとても多い。そこで、実際の 暗号方式は別の共通鍵方式を用い、その鍵の配 送にRSAを使っている。 千葉大学 11- 49 RSA方式 • 大きな数字(桁数が100以上)の数で、2つの 素数の積である数があったとき、その2つの 素数を知ることは計算量的に困難であること に基づく。 • 2種類の使い方がある – 暗号化の鍵を公開。復号の鍵を秘密に持つ – 暗号化は秘密。復号の鍵を公開。 千葉大学 11- 50 公開鍵方式の運用 • 鍵が公開されていると「なりすまし」という問題がある。 – この公開鍵は本当にこの受信者のものなのか?誰かが「なりすまし ている」とすると、自分の重要な情報を悪意のある第三者へ送ってし まう危険がある。 • そのために、鍵を認証する「認証局」がある。 署名の確認(認証局の署名を 公開復号鍵で復号) 暗号送信者 公開鍵で暗号化 認証局 公開鍵と認証 局の署名 秘密鍵で復号 暗号受信者 www.abc.co.jp www.abc.co.jp用の公 開鍵と秘密鍵。認証局 の署名 秘密鍵は安全に保管
© Copyright 2024 ExpyDoc