📌 서버 → 클라이언트 데이터 송신 & 수신 과정 (자세한 설명)
🖥 서버 송신 과정
- 프로세스 메모리 준비
- 예: 1.4MB짜리 이미지 파일을 전송한다고 하면, 서버 프로세스는 메모리에 해당 데이터를 적재합니다.
- 이때 전송 단위는 64KB씩 잘라서 처리합니다.
- 소켓에 데이터 쓰기
- 서버 프로세스는 OS가 제공하는 소켓(파일처럼 다루는 통신 엔드포인트)에 send()를 호출하여 데이터를 씁니다.
- 이때 실제 데이터는 커널의 TCP 송신 버퍼에 복사됩니다.
- TCP 계층 처리 (커널 수준)
- TCP는 받은 데이터를 세그먼트 단위(64KB보다 작을 수도 있음) 로 분할합니다.
- 각 세그먼트에 순서 번호(Sequence Number) 를 붙여 수신자가 순서를 맞출 수 있도록 합니다.
- 흐름 제어를 위해 현재 클라이언트가 받을 수 있는 윈도우 크기(Window Size) 를 확인합니다.
- IP 계층 → 패킷화
- TCP 세그먼트를 IP 패킷으로 감쌉니다.
- 여기에는 송신자 IP, 수신자 IP 같은 네트워크 주소 정보가 포함됩니다.
- L2 계층 → 프레임화
- IP 패킷은 다시 프레임(Frame) 으로 감싸집니다.
- 프레임에는 MAC 주소(출발지/도착지) 가 붙습니다.
- NIC(Network Interface Card) 전송
- OS 커널은 이 프레임을 NIC로 전달합니다.
- NIC는 이진 데이터를 실제 전기 신호 / 광 신호 로 변환해 물리 네트워크로 전송합니다.
- 이 과정에서 NIC 드라이버가 소켓 버퍼 ↔ NIC 간 데이터 복사를 담당합니다.
💻 클라이언트 수신 과정
- NIC가 프레임 수신
- 클라이언트의 NIC가 서버로부터 도착한 프레임을 물리 신호로 받아들여 디지털 데이터로 복원합니다.
- NIC 드라이버가 이 데이터를 OS 커널에 전달합니다.
- L2 → L3 → L4 계층 처리
- 프레임에서 IP 패킷을 꺼내고, 다시 TCP 세그먼트를 추출합니다.
- TCP 계층은 세그먼트를 TCP 수신 버퍼에 저장합니다.
- 동시에 서버에 ACK(다음에 받을 세그먼트 번호) 를 보냅니다.
- ACK에는 현재 윈도우 크기(Window Size) 정보도 함께 담깁니다.
- 흐름 제어
- 만약 클라이언트의 TCP 버퍼가 가득 차면, Window Size가 줄어들고 서버는 전송 속도를 줄이거나 잠시 대기(wait)합니다.
- 이것이 TCP의 속도 저하 원인이 될 수 있습니다.
- 소켓 버퍼 전달
- 커널의 TCP 수신 버퍼에 있던 데이터는 클라이언트 프로세스의 소켓 버퍼로 전달됩니다.
- 애플리케이션이 read()를 호출하면 소켓 버퍼에서 데이터를 읽어 실제로 사용할 수 있습니다.
🔑 한 줄 요약
- 서버: 데이터를 64KB씩 잘라서 소켓 → TCP 버퍼 → NIC → 네트워크
- 클라이언트: NIC → TCP 버퍼 → 소켓 버퍼 → 애플리케이션
- TCP 흐름 제어: 클라이언트의 윈도우 크기(Window Size)와 ACK 로 속도를 맞춰 과부하를 방지
📌 TCP vs UDP (송수신 과정 차이)
1. 연결 방식
- TCP
- 연결지향적 (3-way handshake 필요)
- 데이터 전송 전 클라이언트-서버가 연결 상태를 확립해야 함
- UDP
- 비연결성 (handshake 없음)
- 바로 데이터그램(datagram)을 전송
2. 데이터 단위
- TCP
- 데이터 → 세그먼트로 나누어 순서 번호(Sequence Number) 부여
- 수신 측에서 순서대로 조립
- UDP
- 데이터 → 데이터그램 단위로 바로 전송
- 번호나 순서 관리 없음 (보낸 순서 ≠ 받는 순서 보장 안 됨)
3. 신뢰성
- TCP
- ACK(응답) 필수 → 받았는지 확인
- 손실 시 재전송 → 신뢰성 보장
- UDP
- ACK 없음 → 받았는지 확인 안 함
- 손실, 중복, 순서 뒤바뀜 가능
4. 흐름 제어 / 혼잡 제어
- TCP
- 윈도우 크기(Window Size)로 수신 버퍼 상황을 알려주고 속도 조절
- 혼잡 제어 알고리즘 (예: AIMD) 적용
- UDP
- 흐름 제어, 혼잡 제어 없음
- 애플리케이션이 직접 구현해야 함
5. 속도 & 오버헤드
- TCP
- 헤더 크기: 최소 20바이트
- 안정적이지만 상대적으로 느림
- UDP
- 헤더 크기: 8바이트
- 빠르지만 신뢰성 낮음
6. 적합한 사용 사례
- TCP: 신뢰성이 중요한 경우
- 웹 브라우징(HTTP/HTTPS), 이메일(SMTP), 파일 전송(FTP)
- UDP: 속도가 더 중요한 경우
- 영상 스트리밍, 온라인 게임, VoIP
반응형