| WebSocket 구현 정리 |
Tech 14/04/12 23:20 ( Translate this page  )
글 주소 : https://ohyung.net/673
1. WebSocket 정의
http://tools.ietf.org/html/rfc6455 
http://en.wikipedia.org/wiki/WebSocket 

2. WebSocket 접속 Request/Response Handshake 관련
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com 
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat


2. 접속 관련해서 중요한것.
요청측(Client) , 반응측(Server) 역시나 Key 와 Version 그리고 101 Switching
Origin 은 구분자로 쓰기엔 그렇지만 (변조 때문) 그렇다고 안보기에도 애매;
그리고 Upgrade, Connection 도 있어야 뭐 101 해주지;
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Origin: http://example.com 

Upgrade: websocket
Connection: Upgrade


HTTP/1.1 101 Switching Protocols
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=


3. Server 쪽에서 Response 하는 방법
1. Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
dGhlIHNhbXBsZSBub25jZQ== 를 받았다.
2. GUID(258EAFA5-E914-47DA-95CA-C5AB0DC85B11)를 붙여서 문자열을 만든다.
dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
3. GUID가 붙은 Key를 SHA1 HASHING -> Binaray 형식으로 만든다.
4. Binary SHA1 Hashing 된 Key 값을 다시 Base64 Encoding 을 거친다.
5. s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 의 값을 얻으면 그것을 보낸다.
6. Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 로 보낸다.


4. 구현 관련 Socket 설명. C Base 설명.
1. socket();
2. bind();
3. listen();
4. accept()
5. 여기서 Data가 들어오게 된다. 루프를 걸고 recv() 으로 읽는다.
6. recv 로 읽은 값을 파싱해서 http status 를 보낸다. ( 오! HTTPD 완성! )
7. 정상적으로 연결 되었다면 recv 루프에서 WebSocket Frame 형식의 Data 가 온다.
8. Data 를 파싱한다.
9. 적절히 반응을 해준다. JSON 이 편하겠지? 하지만 우린 C 개발자니까 ㅜㅜ 어려워 ㅜㅜ
10. 종료를 해야 한다면 루프를 빠져 나오고 close()


5. WebSocket Framing Data

1. FIN - 지금 받은 Data 가 끝인지 뒤에 뭔가 더 오는지 확인.
2. RSV 1~3 안써 ;
3. opcode 중요함. data 속성 text 인지 binaray 인지 종료인지 등등.
4. MASK 클라가 서버로 보낼때는 항상 1임.
5. Payload len 126 보다 적으면 payload len 가 그냥 length.
126 이면 뒤에 따라오는 16 bits 가 값. 0 ~ 0xFFFF(65536) 값 가능.
127 이면 64 bits 가 Payload data length. 0 ~ 0xFFFFFFFFFFFFFFFF
6. Masking-Key 4 bytes 임. 앞에서 클라가 MASK 1 해줬으니 이거 저장해둠.
7. Paylaod data 잘 받아두고 .
8. payloaddata[i] ^= masking-key[i%4] 해서 전체 length 로 masking 처리 해주면 payloaddata 에 정상적인 데이터 보임~


6. Data 방식.
xml 도 좋고 JSON 도 좋고. 뭐 JSON 이 제일 편할거다.
하지만 나는 C 개발자이고 아 다 필요없고 JSON 파서 연결해야해;
없으면? 또 파서 만들어야해 ㅜㅜ

아 나도 오픈소스 쓰고 싶다 ㅜㅜ
태그 :
| 이 포스트에 대한 이용규약 |
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 라이센스 에 따라 이용하실 수 있습니다.
This work is licensed under a Creative Commons Attribution 2.0 Korea LicenseLink in a new window.

| 트랙백 |
트랙백 주소 :: https://ohyung.net/rserver.php?mode=tb&sl=673