Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Swiftに適したサーバーアーキテクチャを再考して実装までしてみる
Search
Yuki Takei
December 19, 2016
Technology
7
2.8k
Swiftに適したサーバーアーキテクチャを再考して実装までしてみる
Yuki Takei(noppoMan) @Tokyo-Server-Side Swift Meetup#5 Dec, 19, 2016
Yuki Takei
December 19, 2016
Tweet
Share
More Decks by Yuki Takei
See All by Yuki Takei
VAR モデルによる OSS プロジェクト同士が生存性に与える 影響の分析
noppoman
0
330
Server Side Swift の個人的な利用シーン
noppoman
2
600
Serverless Server Side Swift
noppoman
2
1.6k
Practical Hexaville(ja)
noppoman
0
490
実践Server Side Swift
noppoman
13
4.2k
Server Side Swiftを使った サービス開発とその運用を考える
noppoman
4
1.4k
Swift3 Framework Slimane and Server Side Swift (ja)
noppoman
2
2.3k
About Deploying and Process Management for Slimane
noppoman
2
430
Server Side Framework Slimaneの紹介
noppoman
1
1.1k
Other Decks in Technology
See All in Technology
FinOps_Demo
tkhresk
0
130
はてなの開発20年史と DevOpsの歩み / DevOpsDays Tokyo 2025 Keynote
daiksy
5
1.3k
Amebaにおける Platform Engineeringの実践
kumorn5s
6
890
.mdc駆動ナレッジマネジメント/.mdc-driven knowledge management
yodakeisuke
24
10k
AIエージェント開発における「攻めの品質改善」と「守りの品質保証」 / 2024.04.09 GPU UNITE 新年会 2025
smiyawaki0820
0
390
Tokyo dbt Meetup #13 dbtと連携するBI製品&機能ざっくり紹介
sagara
0
420
アジャイル脅威モデリング#1(脅威モデリングナイト#8)
masakane55
3
140
AIで進化するソフトウェアテスト:mablの最新生成AI機能でQAを加速!
mfunaki
0
110
GitHub MCP Serverを使って Pull Requestを作る、レビューする
hiyokose
2
700
低レイヤを知りたいPHPerのためのCコンパイラ作成入門 / Building a C Compiler for PHPers Who Want to Dive into Low-Level Programming
tomzoh
0
200
Amazon CloudWatch Application Signals ではじめるバーンレートアラーム / Burn rate alarm with Amazon CloudWatch Application Signals
ymotongpoo
5
290
改めて学ぶ Trait の使い方 / phpcon odawara 2025
meihei3
1
550
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
5
520
Build The Right Thing And Hit Your Dates
maggiecrowley
35
2.6k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
380
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.2k
Scaling GitHub
holman
459
140k
Unsuck your backbone
ammeep
670
57k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.1k
GraphQLの誤解/rethinking-graphql
sonatard
71
10k
Transcript
Swiftʹదͨ͠αʔόʔΞʔΩςΫ νϟΛ࠶ߟ࣮ͯ͠·Ͱͯ͠ΈΔ Yuki Takei(noppoMan) @Tokyo-Server-Side Swift Meetup#5 Dec, 19, 2016
TSSS Meetupɺ ͳΜͱͿΓͷ։࠵Ͱ͢ʂ
ࣗݾհ
Swift͕OpenԽ͔ͯ͠Βɺ ৭ʑͳϥΠϒϥϦΛ࡞ͬͯެ։͍ͯ͠·͢ɻ
OSS • Slimane -> Web Framework • Skelton -> Event
Driven HTTP Server • Suv -> Async Net, I/O Platform (libuv based)
Slimaneͷ։ൃணख͔Βૣ͍͜ͱʹ͏1 (࠷ۙ͋·Γͬͯͳ͍ͷͰ͕͢ɺɺ)
͔ͭͯɺSwift͕ຬʹLinuxͰಈ͔ͣ
Server-Side-SwiftͷΩʔϓϨΠϠʔͨͪϑϨʔϜϫʔΫͳͲ ͷେ෦ΛࣗલͰ࡞͍ͬͯ·ͨ͠ɻ
͔͠͠
Swift3͕ϦϦʔε͞ΕͯɺServer SideͰSwiftͷඪ४APIΛੵ ۃతʹ͍ͬͯ͜͏ͱ͍ͬͨྲྀΕʹͳ͖͍ͬͯͯ·͢ɻ
ͦ͜ͰɺࠓͷServe Side Swiftʹదͨ͠ αʔόʔΞʔΩςΫνϟͱҰମͲΜͳͷͳͷ͔ʁ
ͦΕΛࣗͳΓʹ࠶ߟ͠ɺ࣮ͯ͠Έ·ͨ͠ɻ ͱ͍͏͓Ͱ͢ɻ
·ͣɺࠓճͷൃදͷωλͱͳΔϥΠϒϥϦͷ͝հͰ͢
None
• Swift3͕ඪ४Ͱఏڙ͢ΔAPIΛੵۃతʹͬͨωοτ ϫʔΫϥΠϒϥϦ • ϑϨʔϜϫʔΫͰͳ͘ɺ͋͘·ͰωοτϫʔΫϓϩ άϥϛϯάڥ • جຊతʹಉظI/OͷAPIΛఏڙ (callbackΛۃྗഉআ) •
ඇಉظϓϩάϥϛϯάಠࣗͷAPIΛར༻͢Δ(ޙड़) • ݱࡏHTTP(S)ɺTCPͷServer/ClientͱIP(v4, 6)Λఏڙ Prorsumͱʁ
ͰૣɺSwiftʹదͨ͠αʔόʔΞʔΩςΫνϟͱԿͳͷ͔ ୳͍͖͍ͬͯͨͱࢥ͍·͢ɻ
ͦͷલʹɺͲΜͳछྨͷαʔόʔΞʔΩςΫνϟ͕͋ͬͨͷ͔ɺ ͓͢͜͠͞Β͍Ͱ͢ɻ
දతͳαʔόʔΞʔΩςΫνϟ • ϚϧνεϨουϞσϧ • ϚϧνϓϩηεϞσϧ • Πϕϯτۦಈ • ϋΠϒϦουϞσϧ
ϚϧνεϨουϞσϧ main process worker thread worker thread worker thread client
client client thread ϦΫΤετຖʹthreadΛ࡞Γ(࠷ۙPool͕ओྲྀ)ɺͦͷthread্ͰϦΫΤετΛࡹ͘ɻ ϓϩηεͱҧ͍ϝϞϦΛڞ༗Ͱ͖ΔɻʢϩοΫʹΑΔഉଞ੍ޚඞਢʣ C10K͕ʹͳͬͨɻ thread thread
ϚϧνϓϩηεϞσϧ ਤϚϧνεϨουʹࣅ͍ͯΔ͕ɺϓϩηεΛϑΥʔΫͯ͠ϝϞϦۭؒΛ͚Δɻ ϑΥʔΫͨ͠ϓϩηεͰϦΫΤετΛࡹ͍͍ͯ͘ɻ ࢠؒͷ௨৴υϝΠϯιέοτΛ͏ main process worker process fork worker
process worker process client client client fork fork
ΠϕϯτۦಈϞσϧ γϯάϧίΞ্ʹΠϕϯτϧʔϓΛ࡞͠ɺιέοτϑΝΠϧγεςϜ ͷॻ͖ࠐΈ࣌ʹΠϕϯτ(callback)ΛൃՐ͢ΔɻγϯάϧίΞͷͨΊɺ ϨʔείϯσΟγϣϯdeadlockΛؾʹ͢Δඞཁ͕ແ͍͕ɺϚϧνίΞ Λ׆͔͢͜ͱ͕ग़དྷͳ͍ɻC10KΛղܾͨ͠ main process select, epoll, kqueue
client client client
ϋΠϒϦοτϞσϧ Πϕϯτۦಈ+WorkerThread OR WorkerProcessϞσϧͳͲෳͷΞʔΩςΫ νϟΛΈ߹Θͤͨͷ(͜ͷݴ༿͕࣮ࡏ͢Δ͔ෆ໌) Node.jsͰClusterϞδϡʔϧΛར༻͢Δ͜ͱͰɺΠϕϯτۦಈ+WorkerProcess ϞσϧΛఏڙ͢Δɻ͜ΕʹΑΓɺϚϧνίΞΛ׆͔͢͜ͱ͕ՄೳͱͳΔɻ master client worker
worker uv_loop uv_loop uv_loop passing fds passing fds fork fork client
͜ͷɺSlimanelibuvϕʔεͷͨΊɺNode.jsͱશ͘Ұॹͷ Πϕϯτۦಈ+WorkerProcessϞσϧΛ࠾༻͍ͯ͠·ͨ͠ɻ
ϋΠϒϦοτϞσϧ Πϕϯτۦಈ+WorkerThread OR WorkerProcessϞσϧͳͲෳͷΞʔΩςΫ νϟΛΈ߹Θͤͨͷ(͜ͷݴ༿͕࣮ࡏ͢Δ͔ෆ໌) Node.jsͰClusterϞδϡʔϧΛར༻͢Δ͜ͱͰɺΠϕϯτۦಈ+WorkerProcess ϞσϧΛఏڙ͢Δɻ͜ΕʹΑΓɺϚϧνίΞΛ׆͔͢͜ͱ͕ՄೳͱͳΔɻ master client worker
worker uv_loop uv_loop uv_loop passing fds passing fds fork fork client
ϋΠϒϦοτϞσϧ Πϕϯτۦಈ+WorkerThread OR WorkerProcessϞσϧͳͲෳͷΞʔΩςΫ νϟΛΈ߹Θͤͨͷ(͜ͷݴ༿͕࣮ࡏ͢Δ͔ෆ໌) Node.jsͰClusterϞδϡʔϧΛར༻͢Δ͜ͱͰɺΠϕϯτۦಈ+WorkerProcess ϞσϧΛఏڙ͢Δɻ͜ΕʹΑΓɺϚϧνίΞΛ׆͔͢͜ͱ͕ՄೳͱͳΔɻ master client worker
worker uv_loop uv_loop uv_loop passing fds passing fds fork fork client ͜ΕͰ͢Ͷ
ͰɺProrsumͱ͍͏ͱʁ
ProrsumͷΞʔΩςΫνϟΛඥղ͘લʹɺ ·ͣSwiftͷඇಉظI/Oฒྻॲཧͷํ๏ΛֶͿඞཁ͕͋Γͦ ͏Ͱ͢
SwiftͰɺiOSͳͲͰUIඳըΛࢭΊͯ͠·͏Α͏ͳॏ͍ॲཧΛ ॻ͘ࡍʹɺGCDͱ͍͏APIΛ͍͔ͬͯͨͱࢥ͍·͢
Grand Central Dispatch(GCD) • DispatchQueue • DispatchSource • DispatchGroup •
DispatchSemaphore ௨ৗΞϓϦέʔγϣϯதʹهड़͢ΔεϨουཧ༻ͷίʔυΛɺ γεςϜϨϕϧͰ࣮ͨ͠ͷ (By Apple ฒߦϓϩάϥϛϯάΨΠυ) https://developer.apple.com/jp/documentation/ConcurrencyProgrammingGuide.pdf දతͳͷҎԼʁ
ཁɺThreadͷཧฒྻϓϩάϥϛϯάθϩ͔Β࣮ ͢ΔͱେมͳͷͰɺγεςϜଆʢLinuxͰ͋ΕϥΠϒϥϦ ଆʣͰ࣮ͨ͠ͷΛɺϓϩάϥϚʹ͍͘͢ఏڙ͠· ͢Αͱ͍͏ͷɻ
Dispatch Queue • λεΫΛqueuingͯ͠ɺ͋ΔThread্Ͱඇಉظ/ಉظత ʹ࣮ߦ͢Δ͜ͱ͕ग़དྷΔAPI • mainQueue, GlobalQueueɺϢʔβʔ࡞Queueʹ͔ ΕΔ •
SerialͱConcurrentͷattribute͕͋Δ • queueʹରͯ͠༏ઌॱҐͷίϯτϩʔϧ͕Մೳ • ҰͭͷQueue࣮ߦྃ·ͰϒϩοΫ͞ΕΔ
Dispatch Queue Serial Task Task Task Task Task queue.async {}
Concurrent Task Task Task Task Task Task Task Task queue.async {} executing waiting balancing
Dispatch Source • ϑΝΠϧهड़ࢠͳͲΛࢹͯ͠ɺԿ͔ͷΠϕϯτ ΛػʹొࡁΈͷcallbackΛݺͼग़ͨ͢ΊͷAPI • ΠϕϯτυϦϒϯͳϓϩάϥϛϯά͕ॻ͚Δ • OSґଘͳඇಉظؔΛ͏·͘ϥοϓͯ͘͠Εͯ ͍Δ(libevʹ͍ۙ)
• ίʔυΛಡΜͩΒɺMacͰkqueueΛͬͯ ϑΝΠϧهड़ࢠΛࢹ͍ͯͨ͠
Dispatch SourceͰࢹՄೳͳͷͷҰ෦ • Timer • Signal • FileSystem • Socket
• MemoryPressure
ͨͱ͑ɺϑΝΠϧͷॻ͖ࠐΈΛݕͯ͠ɺϓ ϩάϥϜΛ࠶ίϯύΠϧ͢ΔΑ͏ͳϓϩάϥϜͳ Ͳ͕؆୯ʹॻ͚ΔΑ͏ʹͳΓ·͢ɻ (LinuxͰݱঢ়epoll͍ͬͯͳ͍ͨΊɺKituraࣗલͰepoll Λॻ͍ͯ·ͨ͠স)
͜͜·ͰநԽ͞ΕͨAPI͕͋ΔͷͰɺ GCDΛ׆͔ͨ͠ΞʔΩςΫνϟ͕SwiftͰྑͦ͞͏Ͱ͢
ͦΕΒΛ౿·͑ɺࠓճܾ·ͬͨΞʔΩςΫνϟ͕ͪ͜Β
ProrsumͷαʔόʔΞʔΩςΫνϟ DispatchSource + DispatchQueueΛͬͨ Πϕϯτۦಈ + WorkerThreadͷϋΠϒϦοτϞσϧ main thread DispatchSourceͰɺ
listeningSocketΛࢹ Queue Queue Queue Queue Queue Queue Queue Queue Queue client DispatchQueue(concurrent) nonblocking I/O blocking I/O
GCDʹΑΓɺΠϕϯτۦಈϞσϧͷϚϧνίΞΛ׆͔ͤͳ͍ Λ1ϓϩηε͚ͩͰղܾͰ͖·ͨ͠ɻ (CPUΛ͍Ε͍ͯͳ͍ͱ͍͏ผ͕·ͩ͋Δ…)
·ͨɺγϯάϧϓϩηεͱ͍͏͜ͱͰ Slimaneʹൺͯϓϩηεཧඇৗʹ؆୯ʹ
͔͠͠ɺ·ͨ৽ͨͳ͕ൃੜ
SlimaneશͳΠϕϯτۦಈαʔόʔͩͬͨͷͰɺɺ
None
CallBack Hell!!
None
callbackͷ • ͦͦSwiftඪ४ͰඇಉظύϥμΠϜʹऑ͍ (Promise FutureɺAsync/Await͕ݴޠػೳʹͳ͍) • ΤϥʔϋϯυϦϯά͕͍͠(callbackຖʹΤϥʔॲཧ͕ඞཁ) • try catchͱ૬ੑѱ͍
• ॥ࢀরΛ࡞Γ͍͢ʢΩϟϓνϟϦετΛॻ͖ΕΔʣ • return͠Εͯcallback͕2ճݺΕΔ • @escapingͱ͔ɺ(T)->Voidͱ͔Կճॻ͘ͷ໘
͔͠͠ɺɺ
GCDɺඇಉظॲཧͷ݁ՌΛblockͰड͚औΔͱ͍͏Ξ ϓϩʔνΛ࠾༻͍ͯ͠·ͨ͠ɺɺ ʢͱ͍͑ɺ͜ΕʹΑΓɺϨʔείϯσΟγϣϯͳͲΛ͋·Γؾʹ͠ͳͯ͘ྑ͘ͳ Γ·͢ɻʣ
block = callback
·ɺ·͔͞ww
None
None
͑ɺ݁ہwww
ͪΐͬɺͯΑ͒
SwiftͰαʔόʔॻ͘ͷ͖͋ΒΊΑ͏͔ͳ… ) DispatchGroupDispatchSemaphore Ͱ͋ΔఔcallbackΛແ͘͢͜ͱग़དྷ·͢
ͨͩɺΈ͞ͳΜࢥ͍ग़͍ͯͩ͘͠͞ɻ
ඇಉظͷϑϩʔ੍ޚΛcallbackҎ֎Ͱղܾͨ͋͠ͷݴޠΛ
None
……….
GoݴޠͩΑʔ
Goݴޠͱ GoϓϩάϥϛϯάݴޠͷͻͱͭɻGoogleʹΑͬͯ։ൃ ͞Ε͓ͯΓ[4]ɺઃܭʹϩϒɾύΠΫɺέϯɾτϯϓιϯΒ ͕ؔΘ͍ͬͯΔɻ ओͳಛͱͯ͠ɺܰྔεϨοσΟϯάͷͨΊͷػೳɺ PythonͷΑ͏ͳಈతܕ͚ݴޠͷΑ͏ͳϓϩάϥϛϯάͷ ༰қੑɺͳͲ͕͋ΔɻGoॲཧܥͱͯ͠ίϯύΠϥͷΈ͕ ։ൃ͞Ε͍ͯΔɻ Wikipedia, Go
(ϓϩάϥϛϯάݴޠ)ΑΓ
Goݴޠͷฒߦ/ฒྻॲཧ GoݴޠͰGoroutineΛͬͯɺฒߦ/ฒྻॲཧΛ࣮ݱ͍ͯ͠·͢ɻ ฒߦ(Concurrent) ฒྻ(parallel)
Goroutine GoroutineෳThread্ʹଟॏԽ͞ΕͨCoroutineͷΑ͏ͳಈ࡞Λ͢Δɻ Ұͭͷgoroutine͕͍࣌ؒϒϩοΫ͢Α͏ͳؔͰɺผͷgoroutineʹhand off͠ ͯॲཧΛଓߦ͢ΔͨΊɺCPUΛ༨ΒͤͣʹޮతʹϓϩάϥϜΛ࣮ߦͰ͖Δ G1 G2 G3 G4 G5
sleep(1) G6 G4 G5 sleep(1) G6 G8 G4 G7 G9 thread1 thread2 thread3
Channel GorotuineThreadؒΛ·͍ͨͰ࣮ߦ͞ΕΔͨΊɺGoroutineಉ࢜ͰҰͭͷมΞΫ ηε͢ΔͱRace Condition͕ൃੜͯ͠͠·͏ɻ ͦΕΛ͙ͨΊʹɺGoͰChannelͱ͍͏ػೳ͕ఏڙ͞Ε͓ͯΓɺͦΕΛͬͯ Λૹड৴͢Δ G1 G2 G3 send
send send main thread receive Channel
ίʔυ ͜ͷϓϩάϥϜͷ݁ՌɺHello WorldͱWorld HelloͷͲͪΒ ͔ʹͳΓ·͢
goroutineͰ͔֬ʹthreadΛͬͨฒྻॲཧʢඇಉظॲཧʣ ͕ߦΘΕ͍ͯΔ͜ͱ͕Θ͔Γ·ͨ͠ɻ
None
ඇಉظͰ͋ΔͷʹɺίʔυͱͯಉظతͰ͢ΑͶɻ
ͳͥͳΒɺChannelͷૹड৴ϒϩοΫ͞ΕΔ͔ΒͰ͢ɻ
= ChannelΛͬͨഉଞ੍ޚͰ͢Ͷ
DispatchQueueThreadϕʔεͰͨ͠ɻ
ͱ͍͏͜ͱʂ
Goroutine+ChannelͷΠϯλʔϑΣʔεΛ͑ɺ SwiftͰඇಉظॲཧ͕ಉظతʹॻ͚ͦ͏Ͱ͢ɻ (Context switchOSଆͰ͕͢..)
ͦ͜ͰɺProrsumʹGoroutineͱChannelͷΑ͏ͳػೳΛ࣮͠ ͯΈ·ͨ͠
None
None
None
None
ChannelʹΑΓɺϓϩάϥϚDispatchQueueؒͷͷڞ༗࣌ ʹɺഉଞ੍ޚ͔Β։์͞Ε·͢
• ݱঢ়ͨͩͷDispatchQueue.asyncͷΤΠϦΞε • serial͔ɺconcurrent͔࣮ߦ࣌ʹબՄೳ • GoͷΑ͏ʹϒϩοΩϯάॲཧΛۭ͖εϨουʹ context switch࣮ͤͯ͞ߦ͢ΔΑ͏ͳ࠷దԽ͞ Ε͍ͯͳ͍ •
ThreadϕʔεͳͷͰɺGoroutineΑΓͪΖΜ Ϧιʔεͷރׇૣ͍ Prorsumͷgo()ʹؔͯ͠
• ࣮MutexLockΛͬͨ୯ͳΔδΣωϦοΫͳڞ༗ϝϞϦ • lock͕͔͔ΔͨΊɺ͍ա͗ͨΒੑೳྼԽ͢Δ • BufferLinkedListͰ࣮͞Ε͍ͯΔ • Buffer capacityΛӽ͑ͯૹ৴͢Δͱthrow͢Δ •
Goͱҧ͍ɺtry catchͰΤϥʔͷัଊ͕Մೳ • Processؒͷ௨৴Ͱ͖ͳ͍(ErlangͷActorͳͲͱશ ʹผ) ProrsumͷChannelʹؔͯ͠
ͰɺProrsumͰΞϓϦέʔγϣϯΛॻ͍ͯɺGCDͱChannel ͷΈ߹Θ͕࣮ͤ༻తͳͷ͔ݟͯΈ·͠ΐ͏
ࠓճɺJSON-RPC ServerΛॻ͍ͯΈ·ͨ͠
None
ಈ࡞σϞ
ιʔείʔυͷղઆ
ؾʹͳΔύϑΥʔϚϯε
ࠓճɺGoɺKituraɺNode.jsͦͯ͠Prorsum ͰϕϯνϚʔΫରܾΛͯ͠Έ·ͨ͠ɻ
Benchmarking Request/sec 0 17500 35000 52500 70000 Prorsum Kitura Go
1.7 HTTP Server Express 14,769 64,768 17,144 29,436 ɾwrk -d 30s -t 4 -c 20 ɾResponded with the 10 length of random JSON array ɾMachine: MacOS Sierra, 8 logical cores, 8GB RAM
• Go͗͢ (´ʀωʀʆ)ŲƄƂŕ • KituraͱExpressϑϨʔϜϫʔΫͳͷͰɺ͜ͷϕϯν ϚʔΫࣗମશʹFairͰͳ͍ • Prorsum2Ґͱ͍͏݁Ռ͕ͩɺϦΫΤετͷread/writeΛ ϊϯϒϩοΩϯάʹ͢ΕɺGOʹ͏গ͠ബͦ͠͏ •
Node.jsͱಉҎ্ͳύϑΥʔϚϯεɺ΄΅Swiftඪ४Ͱ ग़Δ • ࠓճ࠶ߟͨ͠ΞʔΩςΫνϟɺҰԠޭʁ ײ
࠷ޙʹ
swift-server/work-groupʹͯҎԼͷϥΠϒϥϦΛ Swiftඪ४Ͱ͑ΔΑ͏ʹ༷ࡦఆதͰ͢ɻ • RFC 7230-7235(HTTP/1.1) • RFC 6455 (WebSocket) •
RFC 7540(HTTP/2.0) • TCP/IP(v6,v4), UDP including I/O • TLS/Encryption https://github.com/swift-server/work-group
• ͓ͦΒ͘ݱߦͷϑϨʔϜϫʔΫެࣜαʔόʔAPI ʹ͔ͬͬͯ͘Δͱࢥ͍·͢ɻ • ؤுͬͯࣗ࡞ͯ͠ɺެ͕ࣜग़ͨλΠϛϯάͰ࣌ ؒͷແବʹͳΔՄೳੑ͕͋Γ·͢ɻ • ಛʹTLSHTTPपΓRFCଟྔͰɺ࣮ෳࡶ ͳͨΊ·Ͱʹ݁ߏͳ͕͔͔࣌ؒΓ·͢ɻ
3rd partiyͷϥΠϒϥΛԼखʹ૿͢ΑΓɺServer- Work-GroupͷٞʹࢀՃͯ͠ɺ͍͍ඪ४ϥΠϒϥϦΛ ࡞͍ͬͯ͘΄͏͕ݐઃతͰ͢ɻ (ͦͯ͠ɺૣ͘ຊ൪αʔϏεͰ͑ΔΑ͏ʹ…
ProrsumHTTPTLSपΓɺެࣜ൛ʹReplace͢Δ༧ఆͰ͢ɻ
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ