Application Layer → Transport Layer → Network Layer,
또는 Network Layer → Transport Layer → Application Layer 의 과정에서
Transport Layer에 해당하는 내용이다.
Multiplexing(sender측)
- Application Layer(socket을 통해)에서 받은 데이터를 segment로 나눈다.
- 데이터에 port 정보와 header 정보를 추가하여 Network Layer로 내려 보낸다.
- Transport Layer → Network Layer
Demultiplexing(receiver측)
- port 정보와 IP주소를 통해 올바른 Application Layer(socket)을 찾는다.
- Application Layer로 데이터를 올린다.
- Transport Layer → Application Layer
UDP 또는 TCP 를 통해 Multiplexing과 Demultiplexing 작업을 진행한다.
UDP(User Datagram Protocol)
- “no frills”, “bare bones” → “best effort” , 즉 필수적인 기능만을 수행하는 프로토콜이다.
- “connectionless”
- 송, 수신자 간의 handshake를 진행하지 않는다.
- Flow Control이 없기에 속도가 빠르다.
- 헤더 크기가 작고, 구현이 간단하다.
- 데이터 전송시 오류가 발생해도 재전송하지 않는다.
- 데이터 손실이 발생할 수 있다.
- 전송되는 세그먼트의 순서가 바뀔 수 있다.
- 신뢰성이 낮다.
- 신뢰성 : 전송되는 데이터 패킷들의 순서, 패킷 유실 여부 등을 검사하여
송신 측이 보낸 모든 데이터가 수신 측에 온전하게 전달이 될 수 있는지
- 신뢰성 : 전송되는 데이터 패킷들의 순서, 패킷 유실 여부 등을 검사하여
- 사용 예시 - 신뢰성보다 속도가 중요한 경우
- 동영상 스트리밍 서비스
- DNS(도메인 주소 관리)
- SNMP(네트워크 관리)
- HTTP/3
UDP Segment(= UDP Datagram)
- Application Layer에서 내려온 데이터를 일정 크기로 분할하고 UDP Header를 추가한 것
- UDP Header + data

Source Port Number
- 송신자 포트 번호
Destination Port Number
- 수신자 포트 번호
Length
- 헤더와 데이터를 합한 세그먼트의 전체 길이
Checksum
- 데이터가 이동하면서 값이 변했는지를 검사하기 위해 사용한다.
- 사용 방식

송신자 측
- UDP segment의 정보를 모두 16비트 단위로 나누고, 전부 더한다.
- 16 자리를 넘어가는 carry-bit를 마지막 자리에 다시 더해 최종 sum을 만든다.
- sum에 1의 보수를 취하고, 이 값을 checksum 필드에 저장한다.
수신자 측
- 송신자와 같은 방식을 진행한다.
- 수신자가 계산한 checksum과 checksum 필드의 값을 비교한다.
- 다르다면 오류가 발생했다는 것을 알 수 있다.
- 전송 오류를 완벽하게 발견하는것은 아니다.
- 반례

(10) , (01) → (01) , (10) 로 오류가 있었어도 더한 값은 (11) 로 같기 때문에 오류를 발견하지 못할 수 있다.
TCP(Transmission Control Protocol)
TCP/IP 프로토콜에서 발전되고 나눠진 프로토콜이다.
- Point to Point(1 대 1 통신)
- 양방향 통신(Full-Duplex)
- 신뢰성있는 데이터 통신을 가능하게 한다.
- error, loss 발생 시 재전송한다.
- 데이터 전송을 하기 전에 송-수신 간 connection을 연결한다.
- 3-way-handshake
- Cumulative ACKs(누적 승인 방식)를 사용한다.
- 누적된 정상 데이터 중 가장 마지막 데이터에 대한 승인 번호를 보내주는 방식
- pipeline을 이용한다.
- Window Size 만큼 데이터를 전송한다.
- Flow Control, Congestion Control 을 한다.
- Timer를 사용해 time-out을 확인한다.
- SampleRTT, EstimatedRTT, DevRTT를 사용하여 적당한 Time-out Interval을 구한다.
💡 RTT(Round Trip Time) : 패킷이 목적지에 도달하고 나서 해당 패킷에 대한 응답이 출발지로 다시 돌아오기까지의 시간
TCP Segment
- Application Layer에서 내려온 데이터를 일정 크기로 분할하고 TCP Header를 추가한 것
- TCP Header + data

Source Port Number
- 송신자 포트번호
Dest Port Number
- 수신자 포트번호
Sequence Number
- Segment에 있는 첫 번째 바이트의 바이트 스트림 번호다.
- TCP는 데이터를 단지 순서대로 정렬되어 있는 바이트 스트림으로 본다.
- ex) 0 ~ 999, 1000 ~ 1999의 Segment를 보낼 때 각 seq# = 0, 1000
- TCP 연결, 종료 시에는 Sequence Number를 임의의 랜덤 값으로 설정한다.
- Sequence Number가 노출되면 공격자가 위조 패킷을 보낼 수 있어 보안을 위해 랜덤 값으로 설정한다.
- 추가 내용
Connection을 맺을 때 사용하는 포트(port)는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용된다. 따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용하는 가능성이 존재한다. 서버 측에서는 패킷의 SYN을 보고 패킷을 구분하게 되는데 난수가 아닌 순차적인 number가 전송된다면 이전의 connection으로부터 오는 패킷으로 인식할 수 있다.
- 이러한 문제가 발생할 가능성을 줄이기 위해서 난수로 ISN을 설정하는 것이다.
Acknowledgement Number
- 받고 싶은 다음 바이트 번호를 의미한다.
- ex) 0 ~ 999, 1000 ~ 1999의 세그먼트를 받았을 때 ack# = 각각 1000, 2000
Header Length
- TCP 헤더의 길이를 나타낸다.
Control bits
- ACK(Acknowledgement)
- 패킷을 받았다는 응답을 할 때 사용한다.
- Acknowledgement Number가 유효한지를 나타낸다.
- 최초 연결의 첫 번째 세그먼트를 제외한 모든 Segment의 ACK 비트는 1로 설정한다.
- 최초 연결의 첫 번째 Handshake 과정에서는 응답할 요청이 없기 때문이다.
- SYN(Synchronize Sequence Number)
- 연결을 요청할 때 SYN bit를 사용한다.
- 연결을 요청하는 경우에 SYN bit를 1로 설정한다.
- 따라서, SYN bit = 1 이면 TCP 연결을 요청하는 과정인 것을 알 수 있다.
- 다른 모든 경우에는 SYN bit를 0으로 설정한다.
- 연결 요청에 응답하는 마지막 Handshake의 Segment에서도 SYN bit를 0으로 설정한다.
- FIN(Finish)
- 세션 연결을 종료시킬 때 사용되며, 더 이상 전송할 데이터가 없음을 의미한다.
- 4-Way Handshake 과정에서 사용된다.
- RST(Reset)
- 세션 연결을 종료 시킬 때 사용한다.
- 양방향에서 동시에 일어나는 중단 작업이다.
- 비 정상적인 세션 연결 끊기에 해당한다.
- 이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시 연결을 끊고자 할 때 사용한다.
- PSH
- 수신자가 데이터를 상위 계층에 즉시 전달해야 함을 가리킨다.
- URG
- 송신 측 상위 계층 개체가 ‘긴급’으로 표시하는 데이터임을 가리킨다.
- 긴급 데이터의 마지막 바이트의 위치는 URG Data Pointer에 의해 가리켜진다.
Receive Window
- Flow Control에 사용된다.
Checksum
- UDP와 동일하다.
Options
- 송신자와 수신자가 최대 세그먼트 크기(MSS)를 협상하거나 고속 네트워크에서 사용하기 위한 Window 확장 요소로 이용된다.
- 타임스탬프 옵션도 정의된다.
TCP 연결
TCP는 데이터 전송 이전에 송신자와 수신자가 연결하는 작업이 필요하다.
이 작업을 3-Way Handshake 라고 한다.
3-Way Handshake는 아래 글에서 설명한다.
3-Way Handshake - 수정 중
3-Way Handshake TCP/IP 프로토콜을 이용해서 통신하는 응용프로그램은 데이터를 주고받기 전에 먼저 연결을 진행한다. 3-Way Handshake는 이 연결 과정을 의미한다. 연결을 먼저 요청하는 Host를 “Client”,
hojunking.tistory.com
TCP 데이터 전송 방식
ACK number와 Seq Number를 이용하며 데이터를 주고받는다.
정상적 데이터 전송이 이루어지는 경우

- 연결(3-Way Handshake)이 완료된 이후 데이터를 전송한다.
- 데이터를 전송할 때, 헤더에 ACK Number와 Sequence Number를 설정하여 전송한다.
- Sequence Number : 전송할 Segment의 첫 번째 바이트 번호를 전송한다.
- ACK number : Sequence Number + length 로 설정한다.
- 다음 차례에 상대방이 보내야할 Sequence Number를 의미한다.
문제가 발생한 경우 (손실, Time Out)

- Packet Loss가 발생했다.
- Sender는 ACK를 받지 못하고 Time-Out이 발생했다.
- 따라서, 이전 Segment를 재전송하게 된다.
TCP 연결 해제
데이터 전송이 끝나고, TCP 연결을 해제할 때 4-Way Handshake을 사용한다.
4-Way Handshake는 아래 글에서 설명한다.
4-Way Handshake - 수정 중
12. 4-Way Handshake에 대해 설명해 주세요. Termination의 종류 TCP는 대부분의 connection-oriented 프로토콜과 같은 두 가지 연결 해제 방식이 있다. Graceful connection release(정상적인 연결 해제) 정상적인 연결
hojunking.tistory.com
Flow Control (흐름 제어)
수신측의 데이터 처리 속도보다 송신자의 데이터 전송 속도가 빠른 상황에 문제가 생긴다.
수신자의 데이터 버퍼가 계속해서 차게 되고 초과된 데이터는 손실될 수 있다.
해결방법
1. Stop and Wait
1개씩 패킷을 전송하고, 매번 전송한 패킷에 대해 확인 응답을 받아야만 그 다음 패킷을 전송하는 방법이다.

- 시간이 매우 오래걸린다.
2. Go Back N
데이터를 연속적으로 보내고 그 중 어느 데이터부터 오류가 발생했는지 검사하는 방식이다.

- 오류가 발생하면 오류가 발생한 패킷(N)부터 이후 패킷(N~)을 다시 전송한다.
- Sliding Window와 함께 쓰인다.
💡 Sliding Window
ACK를 받은 만큼 오른쪽으로 옮겨서(Sliding) 수신측에서 설정한 윈도우 크기만큼 전송한다.
3. Selective Repeat
Go Back N 방식과 유사하지만 오류가 발생한 데이터만 요청하는 방식이다.

- 수신자는 순서가 잘못된 패킷을 버퍼에 저장한다.
- 이후 손실된 패킷이 들어오면 합쳐 작업을 진행한다.
Congestion Control(혼잡 제어)
다양한 데이터가 네트워크를 통해 전달되는데, 특정 라우터에 데이터가 몰릴 수 있다.
전송이 지연되면서 송신자가 재전송을 하게되고 이는 혼잡을 더욱 가중시켜 오버플로우 또는 데이터 손실을 발생하게 한다.
해결 방법
1. AIMD(Additive Increase / Multiplicative Decrease)

- 패킷을 하나씩 보내고 문제가 발생하지 않았다면 Window Size를 1씩 증가시키는 방식이다.
- 전송이 실패하였다면 Window Size를 절반으로 줄인다.
- Window Size가 1씩 증가하기 때문에 정상속도까지 오랜 시간이 걸린다.
2. Slow Start

- 1개의 패킷으로 시작하여 문제가 발생하지 않았다면 Window Size를 2배로 증가하는 방식이다.
- AIMD에 비해 정상 속도에 빠르게 접근할 수 있다.
- 현재 대부분 AIMD와 slow start를 혼합해 사용한다.
질문
Q. 왜 HTTP는 TCP를 사용하나요?
HTTP는 신뢰성을 보장하지 않는다.
따라서, 신뢰성을 보장하는 TCP를 사용한다.
Q. 그렇다면, 왜 HTTP/3 에서는 UDP(QUIC) 를 사용하나요? 위에서 언급한 UDP의 문제가 해결되었나요?
UDP는 헤더에 필드가 거의 없다. 따라서, 새로운 필드를 추가하기 쉽고, TCP보다 확장성이 높다. 이를 통해 QUIC(Quick UDP Internet Connection)를 만들었다.
시간단축

- 전송 계층은 UDP를 사용하여 TCP 3방향 핸드셰이크에서 하나의 1-RTT 지연을 줄인다.
- 최신 버전의 TLS 프로토콜 채택인 TLS 1.3은 클라이언트가 TLS 핸드셰이크가 완료되기 전에 애플리케이션 데이터를 보낼 수 있도록 하여 1-RTT 및 0-RTT를 모두 지원한다. QUIC 프로토콜을 사용하면 첫 번째 핸드셰이크 협상에 1-RTT가 걸리지만 이전에 연결된 클라이언트는 캐시된 정보를 사용하여 0-1 RTT만으로 TLS 연결을 복원할 수 있다.
신뢰성 확보

- QUIC은 연결에서 여러 스트림을 다중화하는 개념을 도입했다. QUIC은 각 스트림에 대해 별도의 흐름 제어를 설계하고 구현함으로써 전체 연결에 영향을 미치는 HOL(head-of-line) 차단 문제를 해결했다.
참고
도서 : Computer Networking : A top-Down Approach by James F. Kurose, Keith W. Ross
슬라이딩 윈도우(Sliding Window) > 도리의 디지털라이프
Two-Way Handshake and Three-Way Handshake | Baeldung on Computer Science
[네트워크] TCP란? | TCP의 특징 | TCP RDT | tcp 3way handshake
TCP의 개념 (Transmission Control Protocol)
사이 좋게 네트워크를 나눠 쓰는 방법, TCP의 혼잡 제어
https://haesoo9410.tistory.com/340
https://www.cdnetworks.com/ko/media-delivery-blog/what-is-quic/
'Computer Science > Computer Network' 카테고리의 다른 글
DHCP (0) | 2023.04.04 |
---|---|
IP(IPv4, IPv6), NAT (0) | 2023.04.03 |
OSI 7 계층 (0) | 2023.04.03 |
4-Way Handshake (0) | 2023.04.02 |
3-Way Handshake (0) | 2023.04.02 |
Application Layer → Transport Layer → Network Layer,
또는 Network Layer → Transport Layer → Application Layer 의 과정에서
Transport Layer에 해당하는 내용이다.
Multiplexing(sender측)
- Application Layer(socket을 통해)에서 받은 데이터를 segment로 나눈다.
- 데이터에 port 정보와 header 정보를 추가하여 Network Layer로 내려 보낸다.
- Transport Layer → Network Layer
Demultiplexing(receiver측)
- port 정보와 IP주소를 통해 올바른 Application Layer(socket)을 찾는다.
- Application Layer로 데이터를 올린다.
- Transport Layer → Application Layer
UDP 또는 TCP 를 통해 Multiplexing과 Demultiplexing 작업을 진행한다.
UDP(User Datagram Protocol)
- “no frills”, “bare bones” → “best effort” , 즉 필수적인 기능만을 수행하는 프로토콜이다.
- “connectionless”
- 송, 수신자 간의 handshake를 진행하지 않는다.
- Flow Control이 없기에 속도가 빠르다.
- 헤더 크기가 작고, 구현이 간단하다.
- 데이터 전송시 오류가 발생해도 재전송하지 않는다.
- 데이터 손실이 발생할 수 있다.
- 전송되는 세그먼트의 순서가 바뀔 수 있다.
- 신뢰성이 낮다.
- 신뢰성 : 전송되는 데이터 패킷들의 순서, 패킷 유실 여부 등을 검사하여
송신 측이 보낸 모든 데이터가 수신 측에 온전하게 전달이 될 수 있는지
- 신뢰성 : 전송되는 데이터 패킷들의 순서, 패킷 유실 여부 등을 검사하여
- 사용 예시 - 신뢰성보다 속도가 중요한 경우
- 동영상 스트리밍 서비스
- DNS(도메인 주소 관리)
- SNMP(네트워크 관리)
- HTTP/3
UDP Segment(= UDP Datagram)
- Application Layer에서 내려온 데이터를 일정 크기로 분할하고 UDP Header를 추가한 것
- UDP Header + data

Source Port Number
- 송신자 포트 번호
Destination Port Number
- 수신자 포트 번호
Length
- 헤더와 데이터를 합한 세그먼트의 전체 길이
Checksum
- 데이터가 이동하면서 값이 변했는지를 검사하기 위해 사용한다.
- 사용 방식

송신자 측
- UDP segment의 정보를 모두 16비트 단위로 나누고, 전부 더한다.
- 16 자리를 넘어가는 carry-bit를 마지막 자리에 다시 더해 최종 sum을 만든다.
- sum에 1의 보수를 취하고, 이 값을 checksum 필드에 저장한다.
수신자 측
- 송신자와 같은 방식을 진행한다.
- 수신자가 계산한 checksum과 checksum 필드의 값을 비교한다.
- 다르다면 오류가 발생했다는 것을 알 수 있다.
- 전송 오류를 완벽하게 발견하는것은 아니다.
- 반례

(10) , (01) → (01) , (10) 로 오류가 있었어도 더한 값은 (11) 로 같기 때문에 오류를 발견하지 못할 수 있다.
TCP(Transmission Control Protocol)
TCP/IP 프로토콜에서 발전되고 나눠진 프로토콜이다.
- Point to Point(1 대 1 통신)
- 양방향 통신(Full-Duplex)
- 신뢰성있는 데이터 통신을 가능하게 한다.
- error, loss 발생 시 재전송한다.
- 데이터 전송을 하기 전에 송-수신 간 connection을 연결한다.
- 3-way-handshake
- Cumulative ACKs(누적 승인 방식)를 사용한다.
- 누적된 정상 데이터 중 가장 마지막 데이터에 대한 승인 번호를 보내주는 방식
- pipeline을 이용한다.
- Window Size 만큼 데이터를 전송한다.
- Flow Control, Congestion Control 을 한다.
- Timer를 사용해 time-out을 확인한다.
- SampleRTT, EstimatedRTT, DevRTT를 사용하여 적당한 Time-out Interval을 구한다.
💡 RTT(Round Trip Time) : 패킷이 목적지에 도달하고 나서 해당 패킷에 대한 응답이 출발지로 다시 돌아오기까지의 시간
TCP Segment
- Application Layer에서 내려온 데이터를 일정 크기로 분할하고 TCP Header를 추가한 것
- TCP Header + data

Source Port Number
- 송신자 포트번호
Dest Port Number
- 수신자 포트번호
Sequence Number
- Segment에 있는 첫 번째 바이트의 바이트 스트림 번호다.
- TCP는 데이터를 단지 순서대로 정렬되어 있는 바이트 스트림으로 본다.
- ex) 0 ~ 999, 1000 ~ 1999의 Segment를 보낼 때 각 seq# = 0, 1000
- TCP 연결, 종료 시에는 Sequence Number를 임의의 랜덤 값으로 설정한다.
- Sequence Number가 노출되면 공격자가 위조 패킷을 보낼 수 있어 보안을 위해 랜덤 값으로 설정한다.
- 추가 내용
Connection을 맺을 때 사용하는 포트(port)는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용된다. 따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용하는 가능성이 존재한다. 서버 측에서는 패킷의 SYN을 보고 패킷을 구분하게 되는데 난수가 아닌 순차적인 number가 전송된다면 이전의 connection으로부터 오는 패킷으로 인식할 수 있다.
- 이러한 문제가 발생할 가능성을 줄이기 위해서 난수로 ISN을 설정하는 것이다.
Acknowledgement Number
- 받고 싶은 다음 바이트 번호를 의미한다.
- ex) 0 ~ 999, 1000 ~ 1999의 세그먼트를 받았을 때 ack# = 각각 1000, 2000
Header Length
- TCP 헤더의 길이를 나타낸다.
Control bits
- ACK(Acknowledgement)
- 패킷을 받았다는 응답을 할 때 사용한다.
- Acknowledgement Number가 유효한지를 나타낸다.
- 최초 연결의 첫 번째 세그먼트를 제외한 모든 Segment의 ACK 비트는 1로 설정한다.
- 최초 연결의 첫 번째 Handshake 과정에서는 응답할 요청이 없기 때문이다.
- SYN(Synchronize Sequence Number)
- 연결을 요청할 때 SYN bit를 사용한다.
- 연결을 요청하는 경우에 SYN bit를 1로 설정한다.
- 따라서, SYN bit = 1 이면 TCP 연결을 요청하는 과정인 것을 알 수 있다.
- 다른 모든 경우에는 SYN bit를 0으로 설정한다.
- 연결 요청에 응답하는 마지막 Handshake의 Segment에서도 SYN bit를 0으로 설정한다.
- FIN(Finish)
- 세션 연결을 종료시킬 때 사용되며, 더 이상 전송할 데이터가 없음을 의미한다.
- 4-Way Handshake 과정에서 사용된다.
- RST(Reset)
- 세션 연결을 종료 시킬 때 사용한다.
- 양방향에서 동시에 일어나는 중단 작업이다.
- 비 정상적인 세션 연결 끊기에 해당한다.
- 이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시 연결을 끊고자 할 때 사용한다.
- PSH
- 수신자가 데이터를 상위 계층에 즉시 전달해야 함을 가리킨다.
- URG
- 송신 측 상위 계층 개체가 ‘긴급’으로 표시하는 데이터임을 가리킨다.
- 긴급 데이터의 마지막 바이트의 위치는 URG Data Pointer에 의해 가리켜진다.
Receive Window
- Flow Control에 사용된다.
Checksum
- UDP와 동일하다.
Options
- 송신자와 수신자가 최대 세그먼트 크기(MSS)를 협상하거나 고속 네트워크에서 사용하기 위한 Window 확장 요소로 이용된다.
- 타임스탬프 옵션도 정의된다.
TCP 연결
TCP는 데이터 전송 이전에 송신자와 수신자가 연결하는 작업이 필요하다.
이 작업을 3-Way Handshake 라고 한다.
3-Way Handshake는 아래 글에서 설명한다.
3-Way Handshake - 수정 중
3-Way Handshake TCP/IP 프로토콜을 이용해서 통신하는 응용프로그램은 데이터를 주고받기 전에 먼저 연결을 진행한다. 3-Way Handshake는 이 연결 과정을 의미한다. 연결을 먼저 요청하는 Host를 “Client”,
hojunking.tistory.com
TCP 데이터 전송 방식
ACK number와 Seq Number를 이용하며 데이터를 주고받는다.
정상적 데이터 전송이 이루어지는 경우

- 연결(3-Way Handshake)이 완료된 이후 데이터를 전송한다.
- 데이터를 전송할 때, 헤더에 ACK Number와 Sequence Number를 설정하여 전송한다.
- Sequence Number : 전송할 Segment의 첫 번째 바이트 번호를 전송한다.
- ACK number : Sequence Number + length 로 설정한다.
- 다음 차례에 상대방이 보내야할 Sequence Number를 의미한다.
문제가 발생한 경우 (손실, Time Out)

- Packet Loss가 발생했다.
- Sender는 ACK를 받지 못하고 Time-Out이 발생했다.
- 따라서, 이전 Segment를 재전송하게 된다.
TCP 연결 해제
데이터 전송이 끝나고, TCP 연결을 해제할 때 4-Way Handshake을 사용한다.
4-Way Handshake는 아래 글에서 설명한다.
4-Way Handshake - 수정 중
12. 4-Way Handshake에 대해 설명해 주세요. Termination의 종류 TCP는 대부분의 connection-oriented 프로토콜과 같은 두 가지 연결 해제 방식이 있다. Graceful connection release(정상적인 연결 해제) 정상적인 연결
hojunking.tistory.com
Flow Control (흐름 제어)
수신측의 데이터 처리 속도보다 송신자의 데이터 전송 속도가 빠른 상황에 문제가 생긴다.
수신자의 데이터 버퍼가 계속해서 차게 되고 초과된 데이터는 손실될 수 있다.
해결방법
1. Stop and Wait
1개씩 패킷을 전송하고, 매번 전송한 패킷에 대해 확인 응답을 받아야만 그 다음 패킷을 전송하는 방법이다.

- 시간이 매우 오래걸린다.
2. Go Back N
데이터를 연속적으로 보내고 그 중 어느 데이터부터 오류가 발생했는지 검사하는 방식이다.

- 오류가 발생하면 오류가 발생한 패킷(N)부터 이후 패킷(N~)을 다시 전송한다.
- Sliding Window와 함께 쓰인다.
💡 Sliding Window
ACK를 받은 만큼 오른쪽으로 옮겨서(Sliding) 수신측에서 설정한 윈도우 크기만큼 전송한다.
3. Selective Repeat
Go Back N 방식과 유사하지만 오류가 발생한 데이터만 요청하는 방식이다.

- 수신자는 순서가 잘못된 패킷을 버퍼에 저장한다.
- 이후 손실된 패킷이 들어오면 합쳐 작업을 진행한다.
Congestion Control(혼잡 제어)
다양한 데이터가 네트워크를 통해 전달되는데, 특정 라우터에 데이터가 몰릴 수 있다.
전송이 지연되면서 송신자가 재전송을 하게되고 이는 혼잡을 더욱 가중시켜 오버플로우 또는 데이터 손실을 발생하게 한다.
해결 방법
1. AIMD(Additive Increase / Multiplicative Decrease)

- 패킷을 하나씩 보내고 문제가 발생하지 않았다면 Window Size를 1씩 증가시키는 방식이다.
- 전송이 실패하였다면 Window Size를 절반으로 줄인다.
- Window Size가 1씩 증가하기 때문에 정상속도까지 오랜 시간이 걸린다.
2. Slow Start

- 1개의 패킷으로 시작하여 문제가 발생하지 않았다면 Window Size를 2배로 증가하는 방식이다.
- AIMD에 비해 정상 속도에 빠르게 접근할 수 있다.
- 현재 대부분 AIMD와 slow start를 혼합해 사용한다.
질문
Q. 왜 HTTP는 TCP를 사용하나요?
HTTP는 신뢰성을 보장하지 않는다.
따라서, 신뢰성을 보장하는 TCP를 사용한다.
Q. 그렇다면, 왜 HTTP/3 에서는 UDP(QUIC) 를 사용하나요? 위에서 언급한 UDP의 문제가 해결되었나요?
UDP는 헤더에 필드가 거의 없다. 따라서, 새로운 필드를 추가하기 쉽고, TCP보다 확장성이 높다. 이를 통해 QUIC(Quick UDP Internet Connection)를 만들었다.
시간단축

- 전송 계층은 UDP를 사용하여 TCP 3방향 핸드셰이크에서 하나의 1-RTT 지연을 줄인다.
- 최신 버전의 TLS 프로토콜 채택인 TLS 1.3은 클라이언트가 TLS 핸드셰이크가 완료되기 전에 애플리케이션 데이터를 보낼 수 있도록 하여 1-RTT 및 0-RTT를 모두 지원한다. QUIC 프로토콜을 사용하면 첫 번째 핸드셰이크 협상에 1-RTT가 걸리지만 이전에 연결된 클라이언트는 캐시된 정보를 사용하여 0-1 RTT만으로 TLS 연결을 복원할 수 있다.
신뢰성 확보

- QUIC은 연결에서 여러 스트림을 다중화하는 개념을 도입했다. QUIC은 각 스트림에 대해 별도의 흐름 제어를 설계하고 구현함으로써 전체 연결에 영향을 미치는 HOL(head-of-line) 차단 문제를 해결했다.
참고
도서 : Computer Networking : A top-Down Approach by James F. Kurose, Keith W. Ross
슬라이딩 윈도우(Sliding Window) > 도리의 디지털라이프
Two-Way Handshake and Three-Way Handshake | Baeldung on Computer Science
[네트워크] TCP란? | TCP의 특징 | TCP RDT | tcp 3way handshake
TCP의 개념 (Transmission Control Protocol)
사이 좋게 네트워크를 나눠 쓰는 방법, TCP의 혼잡 제어
https://haesoo9410.tistory.com/340
https://www.cdnetworks.com/ko/media-delivery-blog/what-is-quic/
'Computer Science > Computer Network' 카테고리의 다른 글
DHCP (0) | 2023.04.04 |
---|---|
IP(IPv4, IPv6), NAT (0) | 2023.04.03 |
OSI 7 계층 (0) | 2023.04.03 |
4-Way Handshake (0) | 2023.04.02 |
3-Way Handshake (0) | 2023.04.02 |