해당 글은 VSFe 깃허브 레포를 참고하여 작성한 글입니다. (아래 출처에 표기)
✅ TCP와 UDP의 차이에 대해 설명해 주세요.
▶ TCP(Transmission Control Protocol)
인터넷 상에서 데이터를 메시지의 형태로 보내기 위해 IP와 함께 사용하는 연결 지향적 프로토콜이다.
연결 지향적 프로토콜: 클라이언트와 서버가 연결된 상태에서 데이터를 주고받는 프로토콜
🔽 특징
- 연결 지향 방식으로 가상 회선 방식 제공: 연결 지향 방식으로 패킷 교환 방식을 사용한다. 3-way Handshake 과정을 통해 연결을 설정하고 4-way Handshake을 통해 해제한다.
가상 회선 방식: 발신지와 수신지를 연결하여 패킷을 전송하기 위한 논리적 경로를 배정하는 방식
패킷: 인터넷 내에서 데이터를 보내기 위한 경로배정(라우팅)을 효율적으로 하기 위해 데이터를 여러 개의 조각들로 나누어 전송하는데, 이 조각을 패킷이라고 한다.
- 신뢰성:
- 데이터 전달 보장: 수신자는 데이터 패킷을 확인(ACK)하여 송신자에게 전달 여부를 알린다.
- 데이터 순서 보장: 데이터가 순서대로 도착하지 않으면 재전송을 요청한다.
- 느린 속도: 신뢰성을 보장하기 때문에, UDP보다 비교적 속도가 느리다.
- 큰 오버헤드: 연결 설정 및 유지, 오류 검출, 재전송 등으로 인해 헤더 크기와 오버 헤드가 비교적 크다.
- 1:1 통신만 가능: 연결 지향 프로토콜이므로 클라이언트와 서버 간의 연결을 설정한 후 이 두 개의 엔드포인트(송신자와 수신자) 사이에서만 통신이 이루어진다.
- 흐름 제어: 송신자가 수신자의 버퍼 오버플로우를 방지하기 위해 데이터 전송 속도를 조절한다.
- 혼잡 제어: 네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지하기 위해 송신자가 전송 속도를 동적으로 조절한다.
- 전이중(Full-Duplex), 점대점(Point to Point) 방식
- 전이중(Full-Duplex): 전송이 양방향으로 동시에 일어날 수 있다.
- 점대점(Point to Point): 각 연결이 정확히 2개의 종단점을 가지고 있다.
▶ UDP(User Datagram Protocol)
데이터를 데이터그램 단위로 처리하는 비연결 지향적 프로토콜이다.
데이터그램: 독립적인 관계를 지니고, 비연결적이고, 신뢰성이 없고, 고정된 크기의 패킷이다.
🔽 특징
- 비연결 지향 방식으로 데이터그램 방식을 제공: 송신자와 수신자 간 연결 설정이 필요하지 않다. 데이터를 독립적인 패킷(Datagram)으로 전송한다.
- 비신뢰성:
- 데이터 전달 보장 X: 송신자는 데이터 패킷을 보낸 후 수신 여부를 확인하지 않는다.
- 데이터 순서 보장 X: 데이터 전송의 순서를 보장하지 않는다. 데이터가 손실되거나 순서가 뒤바뀔 수 있다.
- 빠른 속도: TCP보다 속도가 빠르다.
- 적은 오버헤드: 헤더 크기가 작고, 연결 설정 및 유지, 오류 검출, 재전송 등의 기능이 없어 오버헤드가 비교적 적다.
- N:N 통신 가능: 비연결 지향 프로토콜이므로 송신자가 여러 수신자에게 데이터를 전송할 수 있다.
▶ TCP와 UDP의 차이점
TCP | UDP | |
연결 방식 | 연결 지향 방식 | 비연결 지향 방식 |
패킷 교환 방식 | 가상 회선 방식 | 데이터그램 방식 |
전송 순서 | 전송 순서 보장 | 전송 순서 변동 가능 |
수신 여부 확인 | 수신 여부를 확인 | 수신 여부를 확인하지 않음 |
통신 방식 | Point to Point(1:1) | N:N 통신 |
신뢰성 | 높다 | 낮다 |
속도 | 느리다 | 빠르다 |
✅ Checksum이 무엇인가요?
체크섬(Checksum)은 데이터의 무결성을 확인하기 위해, 즉 데이터 전송 중의 오류를 감지하기 위해 사용하는 기술이다.
🔽 작동 원리
- 데이터를 전송하기 전에, 원본 데이터에서 계산된 고정 길이의 값(checksum)을 생성한다.
- 생성된 checksum 값은 데이터와 함께 수신자에게 전송된다.
- 데이터를 받은 수신자는 수신된 데이터에 대해 동일한 방식으로 새로운 checksum 값을 계산한다.
- 두 checksum을 비교한다. 두 값이 일치하면 데이터가 정확하게 전송된 것이고, 일치하지 않으면 데이터가 변조, 손상된 것이므로 데이터 재전송을 요청할 수 있다. (무결성 검증)
✅ TCP와 UDP 중 어느 프로토콜이 Checksum을 수행할까요?
TCP와 UDP 모두 Checksum을 수행한다. 하지만 TCP에서는 필수적이고, UDP는 선택적(Checksum 필드가 0이면 사용하지 않는 것)이다.
✅ 그렇다면, Checksum을 통해 오류를 정정할 수 있나요?
오류를 수정할 수는 없다. Checksum을 통해 데이터의 손상 여부를 확인할 수 있으나, 오류가 어디서 어떻게 발생했는지는 확인할 수 없기 때문에 손상된 데이터의 원래 값을 복원할 수는 없다.
✅ TCP가 신뢰성을 보장하는 방법에 대해 설명해 주세요.
- 데이터 순서 보장(신뢰성): 데이터 전송의 신뢰성을 보장한다. 송신된 각 데이터에 대해 수신 측으로부터 확인 응답(ACK)을 기다린다. ACK을 받지 못한 데이터에 대해 재전송을 요청한다.
- 순서 제어: 데이터가 올바른 순서로 도착할 수 있도록 보장한다. 송신된 데이터는 시퀀스 번호를 가진다.
- 흐름 제어: 송신자가 수신자의 버퍼 오버플로우를 방지하기 위해 데이터 전송 속도를 조절한다.
- 혼잡 제어: 네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지하기 위해 송신자가 전송 속도를 동적으로 조절한다.
- 오류 검출: Checksum을 사용하여 데이터의 무결성을 검증한다. 오류가 있는 데이터는 폐기되고, 송신 측에 재전송을 요청한다.
✅ TCP의 혼잡 제어 처리 방법에 대해 설명해 주세요.
- AIMD(Additive Increase / Multiplicative Decrease)
- 윈도우 크기(Window Size)를 1씩 증가시키다가 전송에 실패하면 윈도우 크기(Window Size)를 반으로 줄이는 방식이다.
- 윈도우 크기(Window Size)를 너무 조금씩 늘리기 때문에, 네트워크의 모든 대역을 활용하여 제대로 된 속도로 통신하기까지 시간이 오래 걸린다는 단점이 있다.
- 느린 시작(Slow Start)
- 윈도우 크기(Window Size)를 지수적으로 증가시키다가 혼잡이 감지되면 윈도우 크기(Window Size)를 1로 줄이는 방식이다.
- 빠른 재전송(Fast Retransmit)
- 패킷이 순서대로 잘 도착하지 않은 경우, 수신 측에서는 순서대로 잘 도착한 마지막 패킷의 다음 순번을 ACK 패킷에 실어 보낸다. 그리고 이런 중복 ACK을 3개 받으면 재전송이 이루어진다. 송신 측은 자신이 설정한 time out 시간이 지나지 않았어도 바로 해당 패킷을 재전송할 수 있다.
- 예: 시퀀스 번호 1, 2, 3, 4의 패킷이 있을 때, 시퀀스 번호 3번 패킷이 손실되었다면 수신 측은 1, 2번 패킷을 받고, 3번을 기다리다가 4번 패킷을 받게 된다. 그러면 수신 측은 4번 패킷을 받았을 때, 시퀀스 번호 3번 패킷을 아직 받지 못했다는 것을 알리기 위해 시퀀스 번호 3번 패킷에 대한 ACK을 다시 송신 측에 보낸다. 이것이 중복 ACK이다.
- 빠른 회복(Fast Recovery)
- 혼잡 상태가 되면 혼잡 윈도우 크기(Window Size)를 1로 줄이지 않고, 반으로 줄인 후 선형적으로 증가시킨다.
윈도우 크기(Window Size): 단위 시간 내 보내는 패킷의 수
✅ 왜 HTTP는 TCP를 사용하나요?
HTTP는 서버-클라이언트 모델 기반으로 통신을 제공하기 때문에 속도보다는 신뢰성이 더 좋은 TCP를 사용한다.
- 신뢰성: TCP는 데이터 전송의 신뢰성을 보장하므로, HTTP는 웹 페이지와 같은 중요한 데이터를 전송하는데, 데이터의 손실 없이 정확하게 전달할 수 있다.
- 연결 지향: TCP는 연결을 설정하고 유지하므로, HTTP의 지속적인 통신을 지원할 수 있다.
✅ 그렇다면, 왜 HTTP/3에서는 UDP를 사용하나요? 위에서 언급한 UDP의 문제가 해결되었나요?
HTTP/3.0은 QUIC 프로토콜을 사용하며, 이는 UDP를 기반으로 한다. QUIC은 UDP의 장점을 활용하면서도, UDP의 문제점들을 해결하기 위해 QUIC은 다음과 같은 기능이 추가했다.
- 신뢰성
- 데이터 확인: QUIC은 각 데이터 패킷이 제대로 수신되었는지 확인하기 위해 ACK 패킷을 사용한다.
- 재전송: 송신 측은 특정 시간 동안 ACK을 받지 못하면 패킷이 손실된 것으로 간주하고 해당 패킷을 재전송한다.
- 순서 제어: 빠른 재전송(Fast Retransmit) 기법을 사용하여 중복 ACK을 일정 수 이상 받으면 재전송한다.
- 멀티플렉싱(Multiplexing): QUIC은 하나의 연결 내 여러 개의 스트림을 독립적으로 전송할 수 있어, 한 스트림의 손실이나 지연이 다른 스트림에 영향을 주지 않는다.
- 연결 지향: QUIC은 Connection ID를 사용해 연결 지향적인 기능을 구현한다. 이는 네트워크 경로가 변경되더라도 연결을 유지할 수 있게 한다.
- 연결 지연(latency) 감소: QUIC은 0-RTT(Zero Round Trip Time) 연결 설정을 지원하여, 연결 설정 시간을 단축시키고 빠른 데이터 전송이 가능하다.
QUIC에 대한 개념들은 여기의 HTTP/3.0 부분을 참고하면 좋을 것 같다.
✅ 그런데, 브라우저는 어떤 서버가 TCP를 쓰는지 UDP를 쓰는지 어떻게 알 수 있나요?
브라우저는 URL과 프로토콜 버전을 통해 서버가 사용하는 프로토콜을 결정한다. 예를 들어, HTTP/1.1과 HTTP/2는 TCP를 사용하고, HTTP/3는 UDP 기반의 QUIC을 사용한다. 브라우저와 서버 간의 Handshake 과정에서 이 정보가 교환된다.
✅ 본인이 새로운 통신 프로토콜을 TCP나 UDP를 사용해서 구현한다고 하면, 어떤 기준으로 프로토콜을 선택하시겠어요?
- 신뢰성
- 데이터의 정확한 전달이 중요한 경우: TCP
- 데이터 손실을 감수할 수 있는 경우: UDP
- 지연 시간
- 지연이 중요한 경우(예: 실시간 스트리밍, 온라인 게임): UDP
- 지연이 덜 중요한 경우: TCP
- 데이터 순서
- 데이터의 순서가 중요한 경우: TCP
- 데이터의 순서가 덜 중요한 경우: UDP
- 연결 설정
- 연결 설정과 유지가 필요한 경우: TCP
- 연결 설정이 불필요하거나 과도한 경우: UDP
- 네트워크 환경
- 안정적인 네트워크 환경에서 주로 사용하는 경우: TCP
- 불안정한 네트워크 환경에서 사용하는 경우: UDP
안정적인 네트워크: 패킷 손실이 거의 없고, 전송 지연이 일정하며, 네트워크 혼잡이 적은 화경
불안정한 네트워크: 패킷 손실이 빈번하고, 전송 지연이 변동되며, 네트워크 혼잡이 발생하는 환경
📍 문제 출처
Tech-Interview / 03-NETWORK.md
📍 참고 자료
'Programming > Network' 카테고리의 다른 글
[Network] 프로토콜 스택 (0) | 2024.08.05 |
---|---|
[Network] 네트워크 (0) | 2024.08.05 |
[Network] HTTP/1.1, HTTP/2.0, HTTP/3.0 (0) | 2024.07.28 |
[Network] 소켓, 웹소켓, 포트 (0) | 2024.07.28 |
[Network] HTTP와 HTTPS의 보안 - 대칭키/공개키, SSL/TLS (0) | 2024.07.28 |