남기야 WebSocket은 Socket을 대신할 수 없어

namm'm'm·2025년 7월 22일
10

Project

목록 보기
4/6

한줄요약

커널에서 네트워크 계층에 접근할 수 있는 도구가 소켓이며, 그중에서 TCP프로토콜에 접근하는 소켓이 TCP소켓이다. WebSocket은 TCP소켓을 활용한 웹 전용 프로토콜이다.

소켓 (기본)
  ↓
TCP소켓
  ↓
WebSocket

Socket

소켓(socket)은 OS 커널에 구현되어 있는 프로토콜 요소에 대한 추상화된 인터페이스

장치파일의 일종으로 이해할 수 있다.

일반 파일에 대한 개념이 대부분 적용된다.

File I/O 시스템의 관점으로 소켓을 바라보자.


          -----------------
          | process       |
          |               |
          -----------------
user mode        ⬇️
------------------------------
kernel mode   [ TCP ]
              [  IP ]
                 ⬇️
S/W         [ Driver ]
-------------------------------
H/W              ⬇️
             [   hw  ]

TCP Socket

process : 주체가 되어 뭔가를 함 ( open, create, close, delete, read write … )이런거함.

대상체 파일이 TCP스택에 대한 추상화된 인터페이스를 제공할 때 이 파일의 이름을 TCP Socket 이라 부른다.

TCP Network 대상이니까 write하는걸 Send 라고 칭하며, read하는걸 receive한다고 함.

파일 열고닫을 때 fopen fclose 하는 것처럼 socket함수를 통해 열고닫고함 (단, TCP특성상 추가적인 뭔가를 더해주긴함)

  • 예를들어, TCP 소켓: socket()bind()/listen()/accept() 또는 connect()send()/recv()close()

TCP Socket에서의 데이터 전송단위

  • 애플리케이션 데이터(Stream) 이 발생하며, file append mode 처럼 덕지덕지 데이터가 연결된 상태로 전송이 된다.
  • TCP(L4)에서 Stream이 너무 기니까 적당히 자르는게 세그멘테이션하며, Segment 단위로 전송한다.
  • IP(L3)에서 받아온 Segment 를 IP 헤더로 "캡슐화”해서 IP 패킷단위로 전송


WebSocket은 뭔데

  • 기존의 HTTP 통신은 단방향/비연결성 통신이므로, 단점이 존재한다.
  • webSocket은 양방향/실시간 통신을 가능하게 해준다. by TCP소켓
  • 클라이언트(브라우저)에서 http://localhost... 대신 ws://localhost... 로 호출시작
  • 브라우저가 HTTP업그레이드 요청을 HTTP형태로 서버에 전송하면, 서버가 연결해 주고, 이후부터 WebSocket 프로토콜이 사용됨.
  • 아래의 그림은 연결요청하는 과정
user    -----------------------------------------------------------------------------------
        |  사용자가 연결버튼 클릭 => websocket API => 브라우저 내장 WebSocket 기능 활성화      |
        -----------------------------------------------------------------------------------
           ⬇️            
           ⬇️              
           ⬇️                 
      첫 HTTP 요청     
           ⬇️                                                        
           ⬇️(HTTP)                                                   
           ⬇️                                                         
server   ----------------------------------------------------------------------
         |  WebSocket라이브러리 => 연결 => application layer에서 프로토콜 처리 시작    |
         ----------------------------------------------------------------------
  • 아래의 그림은 user(사용자)가 서버로 메세지 보내는 과정에 대한 그림
user    -----------------------------------------------------------
        |  websocket API => 브라우저 내장 WebSocket 기능 활성화      |
        -----------------------------------------------------------
           ⬇️                 ⬇️ 1️⃣
           ⬇️                 ⬇️(Frame > Strame)
           ⬇️0️⃣               ⬇️                                 4️⃣5️⃣
      첫 HTTP 요청完    사용자의 커널 TCP 🙋‍♀️📞     <연결>     📞🙋 서버 커널 TCP 소켓
           ⬇️              2️⃣3️⃣                                   ⬇️
           ⬇️(HTTP)                                                ⬇️(Steam)
           ⬇️                                                    6️⃣⬇️         ⬆️7️⃣(서버응답은 반대로)
server   ----------------------------------------------------------------------
         |  WebSocket라이브러리 => 연결 => application layer에서 프로토콜 처리    |
         ----------------------------------------------------------------------

즉, 사용자가 서버로 메세지 보내는 과정

  1. 브라우저 WebSocket: Frame → Stream 변환하여 사용자 커널 TCP에 전달
  2. 사용자 커널 TCP: Stream → Segment 변환하여 IP 스택에 전달
  3. 사용자 커널 IP: Segment → Packet 변환하여 서버로 전송
  4. 서버 커널 IP: Packet → Segment 변환하여 서버 커널 TCP에 전달
  5. 서버 커널 TCP: Segment → Stream 변환하여 서버 WebSocket 라이브러리에 전달
  6. 서버 WebSocket 라이브러리: Stream → Frame 변환하여 애플리케이션에 전달
  7. 서버에서 사용자에게 다시 응답할 때는 정반대 과정임.

WebSocket 데이터단위

  • HTTP의 Request/Response or Stream이 아닌 Frame 단위
  • 6가지의 Frame이 사용된다
    • 0x0: 연속 프레임 (continuation frame)
    • 0x1: 텍스트 프레임 (UTF-8 텍스트)
    • 0x2: 바이너리 프레임 (이미지, 파일 등)
    • 0x8: 연결 종료 (close frame)
    • 0x9: 핑 (ping frame) - 연결 확인
    • 0xA: 퐁 (pong frame) - 핑에 대한 응답

참고 영상

소켓 01 00 소켓의 본질에 대한 이해

0개의 댓글