저는 임베디드 WebSocket 서버를 작성하고 관련 RFC에서 직접 작업하고 있습니다.
내 서버는 브라우저의 업그레이드 요청에 올바르게 응답하고 브라우저(샘플 자바스크립트)는 새로 설정된 소켓을 통해 짧은 메시지를 계속 보냅니다. 그래서 모든 것이 잘 작동합니다.
메시지는 짧으며(전체 프레임은 21바이트에 불과) 내 서버가 디코딩할 수 있는 모든 관련 필드를 포함합니다.
문제는 페이로드 길이를 포함해야 하는 비트 9~15에 있습니다.
다음은 WireShark에서 캡처된 메시지의 16진수 덤프입니다.
81 8f 11 ab d5 0b 5c ce a6 78 70 cc b0 2b 65 c4 f5 78 74 c5 b1
보시다시피 첫 번째 바이트에는 FIN(1비트), RSVD1(1비트), RSVD2(1비트), RSVD3(1비트) 및 4비트의 opcode가 포함됩니다. 여태까지는 그런대로 잘됐다.
8f
문제는 MASK 비트와 페이로드 길이가 포함되어 있다는 것입니다. MASK 비트는 1로 설정되어 있어 괜찮지만 전체 프레임 길이가 21바이트이고 페이로드 길이가 15바이트인 경우 나머지 7비트의 값은 71(0x47)입니다.
그럼 내가 뭘 잘못하고 있는 걸까요?
페이로드에 XOR 마스크를 적용하여 메시지를 디코딩할 수 있지만 디코딩 루프를 인계받아 15회 반복 대신 71회 반복을 수행하므로 길이가 문제입니다.
답변1
내 구조는 AMD64가 빅엔디안이 아니라 리틀엔디안이라는 점을 고려하지 않았습니다.