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는 아래 글에서 설명한다.
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는 아래 글에서 설명한다.
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 |