자신만의 BitTorrent 구축하기
(app.codecrafters.io)- CodeCrafters의 BitTorrent 챌린지는 P2P 파일 공유 프로토콜을 직접 구현해 공개적으로 사용 가능한 파일을 다운로드하는 과정을 다룸
- 학습 흐름은 bencode 디코딩에서 시작해.torrent 파일 파싱, info hash 계산, 피어 발견, 핸드셰이크, 조각 다운로드로 이어짐
- 기본 BitTorrent 11단계와 Magnet Links 8단계를 합쳐 총 19개 단계로 구성됨
- 단계 구조와 지침은 무료로 볼 수 있지만, 코드 제출과 솔루션 열람에는 CodeCrafters Membership이 필요함
- 무료로 먼저 체험하려면 이번 달 무료 챌린지인 Build your own Shell을 선택할 수 있음
BitTorrent 클라이언트 구현 목표
- Build your own BitTorrent는 BitTorrent를 대량 데이터 배포용 P2P 파일 공유 프로토콜로 보고, 이를 직접 구현하는 CodeCrafters 챌린지임
- 최종 목표는 BitTorrent 프로토콜로 공개적으로 사용 가능한 파일을 다운로드할 수 있는 BitTorrent 클라이언트를 만드는 것임
- 과정 중에 BitTorrent 프로토콜과 .torrent 파일의 동작 방식을 함께 학습함
단계 구성과 난이도
-
기본 BitTorrent 단계
- bencode 디코딩부터 torrent 파일 처리, 피어 연결, 파일 다운로드까지 순서대로 구현함
- Decode bencoded strings: Very easy
- Decode bencoded integers: Easy
- Decode bencoded lists: Easy
- Decode bencoded dictionaries: Easy
- Parse torrent file: Easy
- Calculate info hash: Medium
- Piece hashes: Easy
- Discover peers: Medium
- Peer handshake: Medium
- Download a piece: Hard
- Download the whole file: Hard
-
Magnet Links 단계
- magnet link 파싱에서 시작해 확장 핸드셰이크, 메타데이터 교환, 조각 및 전체 파일 다운로드까지 다룸
- Parse magnet link: Easy
- Announce extension support: Easy
- Send extension handshake: Easy
- Receive extension handshake: Easy
- Request metadata: Easy
- Receive metadata: Easy
- Download a piece: Hard
- Download the whole file: Hard
이용 조건
- 이 챌린지는 CodeCrafters Membership이 필요함
- 전체 챌린지 구조와 단계 지침은 무료로 학습 가능함
- 코드 제출과 솔루션 열람에는 멤버십이 필요함
- 무료 챌린지를 원하면 이번 달 무료로 제공되는 Build your own Shell을 시도할 수 있음
댓글과 토론
Hacker News 의견들
-
안녕하세요! Codecrafters의 Build your own BitTorrent 챌린지를 만든 Sarp입니다
배경을 조금 이야기하자면, FAANG 직장에서 해고된 뒤 다시 돌아가고 싶은 의욕이 거의 없었고, 코딩 흥미를 되살릴 만한 재미있는 프로그래밍 프로젝트를 찾기 시작했음
디지털 노마드 생활 중 Nomadlist에서 Codecrafters를 발견했고, 코드를 Git에 푸시해서 단계별 테스트를 통과하는 방식이 마음에 들었음. 게임화된 진행 방식이 집중에 도움이 됐고, SQLite, Git, Redis처럼 쓰던 소프트웨어를 더 깊게 파볼 수 있었음. 챌린지를 하려고 Go도 새로 배웠음
사이트의 모든 챌린지를 끝내고 할 일이 없어졌을 때, 투표가 많던 아이디어 중 하나인 BitTorrent 클라이언트를 만들기로 했음
BitTorrent 클라이언트를 만들며 BitTorrent 프로토콜, 토렌트 파일 구조, 인코딩 문제, 네트워크 요청 파이프라이닝, 바이너리 값의 URL 인코딩, Go의 채널 사용 등 많은 것을 배웠음
챌린지에 대한 피드백을 받고 싶고, 질문도 기꺼이 답하겠음- 초대 전용 트래커들은 자기 비공개 트래커에서 어떤 토렌트 클라이언트를 쓸 수 있고 없는지 꽤 엄격하게 정하는 경우가 흔함. 더 넓게 채택되려면 이 장벽을 어떻게 넘을 수 있을지 궁금함
- BitTorrent 클라이언트 만드는 법을 어떻게 배웠는지 궁금함. Codecrafters나 무언가를 직접 만들게 안내하는 책의 아이디어는 좋아하지만, 시작점을 못 잡으면 늘 힘들었음
- 마침 BitTorrent 관련 프로젝트를 막 시작했음. 클라이언트를 직접 구현하진 않을 것 같지만, 어쩌면 할 수도 있고, 적어도 .torrent 파일과 magnet 링크 생성은 구현해야 해서 프로토콜을 조금 배우는 중임
이런 게 올라와서 흥미롭고, 진행하는 데 도움이 될지도 모르겠음 - “사이트의 모든 챌린지를 끝내고 할 일이 없어졌을 때, 투표가 많던 아이디어 중 하나인 BitTorrent 클라이언트를 만들기로 했다”는 부분을 보면, 지금은 Codecrafters에 고용된 건지 궁금함
- 챌린지 자체에 대한 피드백인지는 모르겠지만,
Cargo.toml에 의존성을 추가할 수 없어서 조금 아쉬웠음
bencode 챌린지 일부를 nom으로 풀어보고 싶었는데, 어쩌면 과한 선택이지만 재미로 해보려던 것이었고 지금은 불가능함
원격 빌더의 부하나 실행 시간이 걱정이라면, 이 문제를 피할 수 있도록 테스트 케이스를 로컬에서 실행할 방법이 있으면 좋겠음
-
Jon Gjengset[1]이 지금 자신의 YT 채널[2]에서 같은 챌린지를 Rust로 라이브 코딩하고 있음
[1]: https://thesquareplanet.com/
[2]: https://www.youtube.com/watch?v=jSTkEPPiULs- 아, 그게 저입니다!
더 나은 링크는 https://www.youtube.com/watch?v=jf_ddGnum_4이고, 챕터 표시가 있으며 중간의 정전 부분도 잘라냈음 :p - YouTube가 막힌 사람들을 위해 Twitch에도 라이브스트림 사본이 있음
[0] https://www.twitch.tv/videos/1954769913 - 그가 코딩하는 걸 보는 건 놀라움. Rust 말고 Python으로 코딩하는 전문가들도 또 있는지 궁금함
- 아, 그게 저입니다!
-
왜 로그인이 필요한지 모르겠음. 이게 유료 튜토리얼인가?
무료 튜토리얼은 여기 있음
JS - https://allenkim67.github.io/programming/2016/05/04/how-to-m...
GO - https://blog.jse.li/posts/torrent/
Python - https://markuseliasson.se/article/bittorrent-in-python/- 여기 있는 튜토리얼들도 유용할 수 있음
https://github.com/codecrafters-io/build-your-own-x - 이건 튜토리얼이나 강의가 아니라, 각 단계마다 서버 측 테스트가 붙은 단계별 안내 프로젝트임
- 여기 있는 튜토리얼들도 유용할 수 있음
-
대체 왜 아무 설명 없이 내 GitHub 계정 접근 권한을 요구하는지 모르겠음
- 공정하게 말하면 이메일 읽기 권한만 요청한다고 되어 있긴 하지만, 나도 그 단계 이후로는 진행하지 않았음
- 이유 중 하나는 Codecrafters가 학습 사이트이고, 사용자 코드를 직접 호스팅하지 않고 GitHub에 저장하기 때문인 것 같음. 이 글은 Codecrafters에 있는 한 프로젝트에 대한 것임
그래도 왜 필요한지는 설명해야 함 - 일반적인 이메일 가입 같은 대안을 제공하지 않고, GitHub를 인증 제공자로만 쓰는 것처럼 보임. 보통 이런 사이트들은 여러 선택지를 제공함
- 인증에 필요함. 원문 링크는 app.codecrafters.io로 가고, codecrafters.io는 마케팅 페이지임 :)
- 챌린지 코드를 자기 Git에 올리면, 그 구현에 대해 몇 가지 테스트가 실행되는 구조임
-
이상하게도 업로드 부분이 빠져 있음. 피어라면 동등한 참여자이므로 데이터가 양방향으로 흘러야 함. 그렇지 않으면 BitTorrent는 작동하지 않을 것임
- 맞음. 챌린지 범위를 줄이려고 처음에는 제외했음. 이미 11단계라 꽤 길기 때문임
업로드 기능은 챌린지 확장으로 추가할 계획이고, 커뮤니티에서 투표가 많이 나온 확장 아이디어 중 하나임 - 맞음, “Seeding files”는 확장 기능임: https://app.codecrafters.io/vote/challenge-extension-ideas?c...
아직 지원되지는 않지만 곧 제공될 예정이고, 새 확장은 사용자 투표에 따라 추가하고 있음
- 맞음. 챌린지 범위를 줄이려고 처음에는 제외했음. 이미 11단계라 꽤 길기 때문임
-
JavaScript를 쓰는 사람이라면 Feross가 만든 WebTorrent가 있고, 이건 프로토콜을 브라우저 탭 안으로 가져왔음
코드베이스가 읽기 정말 좋음. 많은 개발자는 코드를 읽는 것보다 쓰는 데 더 능숙한데, 코드 읽기 능력을 단련하고 싶다면 WebTorrent 코드베이스만큼 시작하기 좋은 곳을 많이 보지 못했음. 읽는 재미로는 redis와 비슷한 급에 둠
https://github.com/webtorrent/webtorrent -
이 아이디어가 정말 마음에 듦! 예전에 Erlang을 배우고 싶었고 친구는 Crystal을 배우고 싶어 해서, 완전히 커스텀 클라이언트로 서로 파일을 공유할 수 있게 만들어보자고 했음
기본 프로토콜과 몇 가지 확장으로 파일을 주고받을 수 있게 됐을 때 정말 재미있었음. 그 확장들을 BEP라고 부르는 게 맞나?
새 언어를 배우는 방식 중 아마 제일 좋아하는 방법임. 이해하고 구현하기에 충분히 단순하기 때문임- CodeCrafters에도 Crystal 지원이 있음. Build your own Redis를 할 수 있음
-
해가 갈수록 설레게 하는 작은 프로젝트 아이디어가 점점 줄어드는데, 이건 그런 아이디어 중 하나임
CodeCrafters는 처음 들었지만, 데이터베이스 만들기 같은 학술적인 챌린지 아이디어가 마음에 듦. 컴파일러 만들기도 들어가면 좋겠음- Build your own Interpreter가 작업 중임
https://twitter.com/codecraftersio/status/168850373608654028...
- Build your own Interpreter가 작업 중임
-
Go로 BitTorrent 클라이언트를 만들던 글이 떠오름: https://blog.jse.li/posts/torrent/
-
몇 년 전 이전 직장에서, 직원들이 저렴한 넷북에서 쓸 수 있는 커스텀 Linux 라이브 OS를 만들고 지원했음
업데이트 배포를 위해 내부용 토렌트 서버를 처음부터 직접 만들었고, 이미지 업데이트 배포에 사용했음
표준에 맞춰 소프트웨어를 만들고 기본 클라이언트들과 동작하게 한 첫 경험 중 하나라 좋은 학습 과정이었음