# P2P檔案分享
## TL;DR
EnhServer與TURN伺服器不會記錄你傳輸之資料,擔心隱私或資安問題請自行考慮後再決定是否使用本專案。
檔案最大應為 (2GiB - 2MiB) (已測試chrome/edge、firefox),若超過建議是採用壓縮檔分包個別傳輸。
註:
- Windows的GB是GiB,即1024^3 Bytes
- Linux的GB是1000^3 Bytes
## 使用須知
本專案使用WebRTC傳輸資料,藉由EnhServer協助使用者交換連線資訊,以順利建立連線。
本專案無需於EnhServer註冊帳號便可直接使用。
本專案由 **[雪姬](/profile/setsuki)** 提供STUN/TURNS伺服器,最大100Mbps總中轉頻寬。
伺服器可能並不算穩定,若有問題可至 [Discord 群組](https://discord.gg/seJwuzCbWq) 提醒我修復伺服器。
(TURNS為有加密之TURN伺服器,自建預設無加密,有需要可以使用ACME Client/Certbot向Let's encrypt申請證書以啟用加密)
若想要使用自有的STUN/TURN伺服器,請參閱 [Coturn Project on Github](https://github.com/coturn/coturn) 學習如何使用。
也可以自行建立自己的EnhServer,確保流量都可受自己控制,原始碼開源於 [EnhServer-monorepo on github](https://github.com/setsuk1/EnhServer-monorepo) 上。
## 起因
有時想臨時分享檔案,但又擔心透過雲端硬碟傳遞資料沒有隱私。
因此建立起此專案,可以不讓第三方擁有自己的資料。
雖然也可透過EnhServer提供之訊息交換功能傳遞分塊。
但一來會對EnhServer的頻寬與記憶體帶來挑戰,二來則是瀏覽器端不便對資料進行處理。
再加上會帶來一些些複雜度,於是便透過WebRTC簡化這個流程。
## 細節 (不關心可跳過)
首先先了解何為WebRTC。
WebRTC為於網路上實現之實時通訊。
需要兩類資料以建立連線:SDP資訊(offer/answer)與ICE資訊(IP、port、etc.)
首先使用者雙方須先交換SDP資訊,此部分如同連線之鑰匙與鎖,雙方不匹配就無法成功建立連線,該部分由EnhServer中轉。
當SDP交換完成時,雙方會各自向STUN/TURN伺服器取得可使用的連線資訊(ICE Candidate)。
之後會再透過EnhServer交換ICE資訊,並嘗試建立起連線。
而取得資訊可以透過兩類協議:STUN協議、TURN協議。
前者用來產生端到端連線,沒有任何中轉,但是對網路(NAT類型)有所要求。
後者則是透過一中轉伺服器轉發流量到對方一側,對NAT類型無要求,連線成功率提高許多,通常於STUN失敗時使用。
## References
MDN(Mozilla Developer Network Web docs)
- **[RTCPeerConnection API](https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/RTCPeerConnection)**
- **[RTCDataChannel API](https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel)**
- **[RTCDataChannel Example](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Simple_RTCDataChannel_sample)**
iT邦幫忙
- **[菜雞前端邁入網頁即時通訊(WebRTC)之旅](https://ithelp.ithome.com.tw/users/20129521/ironman/3138)**
## Authors
**[雪姬](/profile/setsuki)**
**[不會取名字](/profile/buhuechuminzu)**
# Changelog (P2PFileSharing)
## [v0.0.1](/view/P2PFileSharing/0.0.1) (2025-09-20)
#### Added
- 單檔分享功能
## Authors
**[setsuki](/profile/113450237497622599383@google)**