connect는 WebRTC를 이용해 상대방에게 데이터를 전송한다. WebRTC는 UDP 기반이기 때문에 TCP보다 안정성이 떨어진다. 주로 많이 쓰는 HTTP 정도의 속도를 목표로 잡았다.
패킷 분할
데이터의 용량이 약 100KB 이상일 때 datachannel로 send하면 아무런 오류도 뜨지 않고 죽어버리는 일이 발생했다. 이상한 게 한쪽 데이터 채널이 죽어도 다른쪽 데이터 채널이 살아있다는 것이다. 그래서 다른 쪽은 여전히 데이터를 보낼 수 있고, 데이터 채널이 죽었는데도 데이터를 수신받을 수 있다.
그러나 여전한 문제
패킷 분할을 해도 11메가 이상의 파일은 깨져서 전송되었다. 20메가 파일을 보내면 11메가로 전송되는 것이다. 여기서 파일이 전송되어 다운로드되는 과정은 다음과 같다.
- 자바스크립트로 브리지에 파일을 요청한다.
- 브리지는 파일 데이터를 base64로 인코딩해서 반환한다.
- 파일을 16000바이트 씩 잘라서 송신한다. 마지막 패킷은 특수한 표시를 한다.
- 수신한 패킷을 합치고 디코딩하여 바이트로 변환한다.
- 화면에 용량을 표시한다.
- blob으로 변환하여 a태그로 다운받는다.
위에서 문제가 발생할 수 있는 과정은 2,3,4,6 번으로 보인다. 시간 부족으로 더 파보진 못했다. UDP로 파일을 전송하는 것이 과연 옳바른 선택일까? WebRTC는 파일 전송에 적절하지 않을 수도 있을 것 같다. WebRTC도 어느정도 안정성을 보장하기 위해 패킷이 손실되면 최대 몇번까지 보낼것인지에 대한 설정이 있다. 아니면 TCP 기반의 P2P로 다시 접근해야할지도.