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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Yuki Takei
December 19, 2016
Technology
7
2.9k
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
460
Server Side Swift の個人的な利用シーン
noppoman
2
650
Serverless Server Side Swift
noppoman
2
1.7k
Practical Hexaville(ja)
noppoman
0
530
実践Server Side Swift
noppoman
13
4.4k
Server Side Swiftを使った サービス開発とその運用を考える
noppoman
4
1.4k
Swift3 Framework Slimane and Server Side Swift (ja)
noppoman
2
2.4k
About Deploying and Process Management for Slimane
noppoman
2
490
Server Side Framework Slimaneの紹介
noppoman
1
1.2k
Other Decks in Technology
See All in Technology
Claude Codeの進化と各機能の活かし方
oikon48
12
3.4k
生成AI活用によるPRレビュー改善の歩み
lycorptech_jp
PRO
5
2.1k
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
4k
「ヒットする」+「近い」を同時にかなえるスマートサジェストの作り方.pdf
nakasho
0
110
作りっぱなしで終わらせない! 価値を出し続ける AI エージェントのための「信頼性」設計 / Designing Reliability for AI Agents that Deliver Continuous Value
aoto
PRO
1
130
プロジェクトマネジメントをチームに宿す -ゼロからはじめるチームプロジェクトマネジメントは活動1年未満のチームの教科書です- / 20260304 Shigeki Morizane
shift_evolve
PRO
1
120
バクラクのSREにおけるAgentic AIへの挑戦/Our Journey with Agentic AI
taddy_919
2
1k
LY Tableauでの Tableau x AIの実践 (at Tableau Now! - 2026-02-26)
yoshitakaarakawa
0
1.3k
Security Diaries of an Open Source IAM
ahus1
0
200
vLLM Community Meetup Tokyo #3 オープニングトーク
jpishikawa
0
120
Webアクセシビリティ技術と実装の実際
tomokusaba
0
210
生成AIの利用とセキュリティ /gen-ai-and-security
mizutani
1
1.2k
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
57
14k
It's Worth the Effort
3n
188
29k
How to Talk to Developers About Accessibility
jct
2
140
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.1k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.2k
Agile that works and the tools we love
rasmusluckow
331
21k
Unsuck your backbone
ammeep
672
58k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
210
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
140
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
67
37k
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͢Δ༧ఆͰ͢ɻ
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ