connect는 WebRTC를 이용해 상대방에게 데이터를 전송한다. WebRTC는 UDP 기반이기 때문에 TCP보다 안정성이 떨어진다. 주로 많이 쓰는 HTTP 정도의 속도를 목표로 잡았다.

패킷 분할

데이터의 용량이 약 100KB 이상일 때 datachannel로 send하면 아무런 오류도 뜨지 않고 죽어버리는 일이 발생했다. 이상한 게 한쪽 데이터 채널이 죽어도 다른쪽 데이터 채널이 살아있다는 것이다. 그래서 다른 쪽은 여전히 데이터를 보낼 수 있고, 데이터 채널이 죽었는데도 데이터를 수신받을 수 있다.

그러나 여전한 문제

패킷 분할을 해도 11메가 이상의 파일은 깨져서 전송되었다. 20메가 파일을 보내면 11메가로 전송되는 것이다. 여기서 파일이 전송되어 다운로드되는 과정은 다음과 같다.

  1. 자바스크립트로 브리지에 파일을 요청한다.
  2. 브리지는 파일 데이터를 base64로 인코딩해서 반환한다.
  3. 파일을 16000바이트 씩 잘라서 송신한다. 마지막 패킷은 특수한 표시를 한다.
  4. 수신한 패킷을 합치고 디코딩하여 바이트로 변환한다.
  5. 화면에 용량을 표시한다.
  6. blob으로 변환하여 a태그로 다운받는다.

위에서 문제가 발생할 수 있는 과정은 2,3,4,6 번으로 보인다. 시간 부족으로 더 파보진 못했다. UDP로 파일을 전송하는 것이 과연 옳바른 선택일까? WebRTC는 파일 전송에 적절하지 않을 수도 있을 것 같다. WebRTC도 어느정도 안정성을 보장하기 위해 패킷이 손실되면 최대 몇번까지 보낼것인지에 대한 설정이 있다. 아니면 TCP 기반의 P2P로 다시 접근해야할지도.