
종단간 통신 ( 송신자와 수신자 간에 직접 데이터를 주고받는 방식 )에서 신뢰성을 보장하는 연결 지향형 프로토콜로, 데이터가 순서대로, 오류 없이 전달
프로토콜 : 컴퓨터나 네트워크 장치들이 데이터를 원활하게 주고받기 위해 정한 통신 규칙 및 약속 ( 데이터 전송 방식 정의, 데이터 순서 및 오류 제어 , 네트워크 흐름 및 혼잡 제어 )
3-way handshaking 과정을 통해 연결을 설정
4-way handshaking 과정을 통해 연결을 해제
데이터 전송 전 호스트 간의 연결이 필요
데이터의 전송 순서를 보장
데이터 처리 속도를 조절하여 수신자의 버퍼 오버플로우를 방지
네트워크 내의 패킷 수가 과도하게 증가하지 않도록 방지
신뢰성이 높은 전송을 하기 때문에 UDP보다 속도가 느림
전이중(Full-Duplex) : 전송이 양방향으로 동시에 일어날 수 있다.
점대점(Point to Point) : 각 연결이 정확히 2개의 종단점을 가지고 있음
3-way handshaking 과정
TCP 프로토콜로 통신하기 위해 데이터 전송 전 상호 연결을 하는 과정
발신자와 수신자 사이의 논리적인 접속 ( 세션 )을 성립하는 과정
SYN : 연결 확인을 보내는 무작위의 숫자 값
ACK : Client 혹은 Server로부터 받은 SYN에 1을 더해 응답하는 ACK
CLOESD : 연결 수집 전 기본 상태 ( 연결 x )
LISTEN : 포트가 열린 상태로 연결 요청 대기
SYN_SENT : SYN을 전송한 상태
SYN_RECEIVED : SYN 요청을 받고 상대방의 응답을 기다리는 상태
ESTABLISHED : 연결 수립이 완료된 상태 , 서로 데이터를 교환할 수 있는 상태
SYN(n)을 보내고 SYN_SENT 상태로 전환SYN(n)을 받은 서버는 SYN_RECIEVED로 전환하고 SYN(m)과 응답 ACK(n+1)를 Client로 전송SYN(m)과 응답 ACK(n+1)를 받은 Client는 ESTABLISHED로 전환하고 서버에 ACK(m+1) 응답ACK를 받은 서버는 ESTABLISHED 상태로 전환
`FIN-WAIT-1 : 자신이 보낸 FIN에 대한 ACK를 기다리거나 상대방의 FIN을 기다림`
`FIN-WAIT-2 : 자신이 보낸 FIN에 대한 ACK를 받았고, 상대방의 FIN을 기다림`
`CLOSE-WAIT : 상대방의 FIN(종료 요청)을 받은 상태, 상대방 FIN에 대한 ACK를 보내고 어플리케이션에 종료를 알림`
`LAST-ACK : COLSE-WAIT 상태를 처리 후 자신의 FIN 요청을 보낸 후 FIN에 대한 ACK를 기다리는 상태`
`TIME-WAIT : 모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태. 새 연결과 겹치지 않도록 일정 시간 기다린 후 CLOSED로 전이`
1. 먼저 close를 실행한 Client가 FIN을 보내고 FIN-WAIT-1 상태로 대기
2. 서버는 CLOSED-WAIT으로 바꾸고 응답 ACK를 전달 후 해당 포트에 연결된 APP에게 close 요청
3. ACK를 받은 Client는 상태를 FIN-WAIT-2로 변경
4. close 요청을 받은 서버 애플리케이션은 종료 프로세스를 진행 후 FIN을 Client로 전송 후 LAST_ACK 상태로 전환
5. FIN을 받은 Client는 ACK를 서버에 전송 후 TIME-WAIT 상태로 전환
`(TIME-WAIT: 먼저 연결을 끊는 쪽에서 생성되는 소켓으로, 혹시 모를 전송 실패에 대비하기 위해 존재하며, TIME-WAIT이 없다면, 패킷의 손실이 발생하거나 통신자 간 연결 해제가 제대로 되지 않을 수 있음)`
TCP Flag
송신자와 수신자가 데이터를 주고받을 때 패킷의 순서와 무결성을 유지하는 데 중요한 역할
패킷이 손상된 경우
수신자는 손상된 패킷의 시퀀스 넘버를 포함한 ACK을 송신자에게 전송
송신자는 ACK을 확인한 후, 손상된 패킷부터 다시 재전송하여 데이터의 무결성을 보장
이미 다음 패킷들이 전송되었더라도, 문제가 생긴 패킷부터 다시 전송하여 올바른 순서로 데이터를 전송
송신자가 Seq: 1000, Seq: 2000, Seq: 3000 패킷을 차례로 전송
Seq: 2000 패킷이 손상됨
수신자는 "ACK 2000"을 송신자에게 보냄
송신자는 이미 Seq: 3000까지 보냈더라도, 다시 Seq: 2000부터 재전송
패킷이 유실된 경우
라우터의 버퍼 오버플로우 또는 네트워크 장애로 인해 완전히 유실되는 경우
패킷이 유실되면 수신자는 ACK을 보낼 수 없는데, 이때 송신자는 일정 시간 동안 ACK를 받지 못하면 타임 아웃 ( timer exception )을 발생 후 해당 패킷부터 다시 재전송
송신자가 Seq: 1000, Seq: 2000, Seq: 3000 패킷을 차례로 전송
seq: 2000 패킷이 유실됨
수신자는 Seq: 2000을 받지 못했기 때문에 "ACK 2000"을 보낼 수 없음
송신자는 일정 시간이 지나도 "ACK 2000"을 받지 못하면, Seq: 2000부터 다시 재전송
TCP의 흐름 제어 방법
송신자가 패킷을 보내는 속도보다 수신자의 패킷 처리 속도가 느리면 수신자 측의 받음 패킷
을 저장하는 버퍼 공간의 크기를 초과해 패킷이 유실 될 수 있음
Stop and Wait
매번 전송한 패킷에 대해 확인 응답을 받아야만 그 다음 패킷을 전송하는 방법
( 성능 문제 발생 )
Sliding Window
수신자가 정한 Window Size ( 일반적으로 수신자의 버퍼 크기 )만큼 ACK 없이 패킷을
연속으로 전송하는 방식
송신자는 윈도우 크기만큼 패킷을 보내고 ACK을 받으면 윈도우를 이동하여 다음 패킷을 전송
장점: 한 번에 여러 개의 패킷을 전송할 수 있어 데이터 전송 효율이 향상됨
Ex (윈도우 크기 = 4)
송신자: 1, 2, 3, 4번 패킷을 전송
수신자: ACK 1을 보냄 → 윈도우 이동 가능!
송신자: 5번 패킷을 추가로 전송
수신자: ACK 2, ACK 3, ACK 4를 보냄 → 윈도우 계속 이동 가능!
송신자: 6, 7, 8번 패킷을 추가로 전송
Go-Back-N (GBN)
Sliding Window를 기반으로 오류 발생시 특정 방식으로 패킷을 재전송하는 프로토콜
Selective Repeat ( 선택적 재전송 )
Go-Back-N과 다르게 특정 패킷만 재전송하여 불필요한 데이터 전송을 줄이는 방식
1. 송신자 & 수신자 모두 버퍼를 가짐
- 수신자는 순서가 맞지 않는 패킷도 버퍼에 저장하고, 순서가 맞는 경우 상위 계층으로 전달
- 송신자는 각 패킷마다 개별 타이머를 관리 ( 오버헤드 발생 가능 )
2. 개별 패킷의 타임아웃 관리
- 송신자는 모든 패킷에 대한 타이머를 가짐
- 특정 패킷만 유실되면 해당 패킷만 재전송 ( Go-Back-N보다 효율적 )
3. ACK을 순서대로 받지 않아도 됨
- 수신자는 순서가 맞는 패킷만 상위 계층으로 전달
- 순서가 맞지 않는 패킷은 버퍼에 저장하고 기다림
4. 송신자의 동작
- ACK을 순서대로 받지 못하면 윈도우 이동을 멈추고 대기
- 타임아웃이 발생한 특정 패킷만 선택적으로 재전송
- 해당 패킷의 ACK을 받으면 윈도우 이동 후 다음 패킷 전송
5. 윈도우 크기 제한
- 시퀀스 넘버 크기의 절반보다 윈도우 크기가 크면 문제가 발생할 수 있음
- 시퀀스 넘버가 겹치는 경우, 패킷 순서를 잘못 해석할 가능성이 생김
Sliding Window : 한 번에 여러 개의 패킷을 전송하여 전송 효율을 높이는 방식
Go-Back-N : 오류 발생 시 윈도우 내 모든 패킷을 재전송하는 방식으로, Stop & Wait보다는 성능이 좋지만 불필요한 재전송이 발생할 수 있음
Selective Repeat : 불필요한 패킷 재전송을 방지하지만, 구현이 더 복잡하고 오버헤드가 발생할 수 있는 방식
TCP의 혼잡 제어 : 안정적인 네트워크 구축을 위해 필요한 기능
네트워크 환경에 따라 패킷 유실 또는 ACK의 지연이 발생하면 송신자는 손실된 패킷을
재전송 하게 되는데 이러한 재전송이 지속되면 네트워크 부하가 증가하여 성능 저하 발생 ..
Go Back N 기법에서는 오류가 발생한 패킷 이후의 모든 패킷을 다시 전송하므로, 혼잡 상황에서는 오버헤드가 커질 수 있음
이를 해결하기 위해 윈도우 크기( 단위 시간당 패킷 전송량 )를 조절하여 혼잡을 제어
즉, 혼잡 제어는 Go Back N의 기본 개념을 활용하여 **네트워크 상태에 따라 패킷 전송량을 조절**함으로써 성능 저하를 방지하고 네트워크의 안정성을 유지하는 역할을
AIMD ( Additive Increse/Multicative Decrease )
합 증가 / 곱 감소 방식
초기에 패킷을 하나씩 보내고 문제가 없다면 윈도우의 크기를 1씩 증가시키며 전송
만약 전송에 실패할 경우 윈도우의 크기를 반으로 줄임
윈도우의 크기를 조금씩 늘리기 때문에 네트워크의 모든 대역을 활용하여 제대로 된 속도로 통신하기까지 시간이 오래 걸림
혼잡이 발생한 후에 대역폭을 줄이는 방식
Slow Start
윈도우의 크기를 2배수로 늘려가며 증가시키는 방식
단, 문제 발생 시 윈도우 크기를 1로 초기화
한번 문제가 발생할 경우 혼잡이 발생하는 지점을 예측할 수 있기에 혼잡이 발생한 윈도우 크기에 도달하면 1씩 윈도우 크기를 증가시킴
Fast Retransmit
TCP에서 패킷이 순서대로 도착하지 않는 경우 , 수신자는 마지막으로 정상적으로 받은 패킷의 다음 순번( 시퀀스 넘버 )을 ACK 패킷에 담아 전송
같은 ACK ( 중복 ACK )가 3개 이상 연속으로 수신되면, 송신자는 해당 패킷이 손실된 것으로 판단하고 즉시 재전송( Fast Retransmit )을 수행
일반적인 재전송은 타임아웃(Timeout)이 발생한 후에 이루어짐 → 전송 속도가 느려짐
하지만 Fast Retransmit을 사용하면 타임아웃을 기다리지 않고 더 빠르게 재전송 가능
즉, 결과적으로 전송 속도를 유지하면서 네트워크 성능을 향상시킬 수 있음
```llvm
송신자가 1, 2, 3, 4, 5번 패킷을 보냄
수신자가 1, 2번 정상 수신 , 3번 패킷이 손실됨
4, 5번 패킷이 도착했지만, 3번이 없으므로 정상적으로 처리 불가
수신자는 마지막으로 받은 정상 패킷(2번)의 다음 패킷(3번)을 요청하는 ACK(ACK 3)를
반복해서 보냄
송신자는 중복된 ACK 3개(ACK 3, ACK 3, ACK 3)를 받으면, 3번 패킷이 유실된 것으로 판단
타임아웃을 기다리지 않고 3번 패킷을 즉시 재전송
```
만약 타임아웃이 발생하면, TCP는 네트워크가 혼잡한 것으로 판단하고 혼잡 제어를 수행
하지만, Fast Retransmit은 혼잡 때문이 아니라 단순한 패킷 유실로 판단하여, 타임아웃 없이 재전송만 수행
즉, Fast Retransmit은 혼잡 회피보다는 빠른 복구를 위한 메커니즘 이를 통해 네트워크 지연을 줄이고 전송 속도를 유지하는 효과를 얻을 수 있음
TCP의 혼잡 제어 방식
`TCP의 혼잡 제어 방식은 기본적으로 **Slow Start**(지수 증가)와 **AIMD**(선형 증가 & 배수 감소)를 조합하여 윈도우 크기를 조절`
ssthresh( Slow Start Threshold ) : Slow Start와 혼잡 회피의 경계를 결정하는 임계값
즉, 윈도우 크기가 ssthresh보다 작으면 slow start , 크면 혼잡 회피로 동작
```llvm
초기 상태
TCP 연결이 시작될 때, 윈도우 크기(cwnd)는 1이고 ssthresh는 초기값( 대체로 큼 )으로 설정
Slow Start(지수 증가) 방식으로 윈도우 크기 증가
1. ssthresh 도달 후 혼잡 회피
윈도우 크기(cwnd)가 ssthresh 이상이 되면 → 증가 속도를 조절하기 위해 혼잡 회피(선형 증가)로 전환
2. 혼잡 발생 시 ssthresh 조정
타임아웃 발생: 네트워크 혼잡으로 판단 → ssthresh = 현재 cwnd의 절반으로 설정, 윈도우
크기는 1로 리셋 (TCP Tahoe 방식)
중복 ACK 3개 수신: ssthresh를 절반으로 줄이고, 윈도우 크기를 ssthresh로 설정 (TCP Reno 방식)
```
**TCP Tahoe**
- 혼잡 발생 시(타임아웃 또는 3중 중복 ACK 발생) 윈도우 크기를 1로 초기화하고
, ssthresh를 기존의 절반으로 줄임
- 이후 다시 Slow Start(지수 증가)로 윈도우 크기를 증가시키므로 오버헤드가 큼
**TCP Reno**
- 3중 중복 ACK 발생 시 ssthresh를 절반으로 줄이고 현재 윈도우 크기를 ssthresh 값으로 설정한 후 AIMD 방식으로 증가
- 타임아웃 발생 시 ssthresh를 절반으로 줄이고 윈도우 크기를 1로 초기화하여 다시 Slow Start로 증가
`Tahoe는 항상 윈도우 크기를 1로 초기화하지만, Reno는 3중 중복 ACK일 경우 AIMD 방식으로 윈도우 크기를 유지하며 증가`
TCP의 단점
데이터 전송을 위해 신경쓸 것이 많기에 전송속도가 느림

빠른 전송 속도를 목표로하는 비연결형 신뢰성 없는 전송 프로토콜
( 실시간 방송이나 온라인 게임 등에서 사용 )
[ 송신 측 ]
전송할 데이터의 값을 일정한 규칙(예: 모든 바이트를 더한 값)으로 계산하여 Checksum 값을 생성
데이터와 함께 Checksum 값을 전송
[ 수신 측 ]
받은 데이터로 다시 Checksum 값을 계산한 후, 송신 측이 보낸 Checksum 값과 비교
만약 두 값이 다르면 데이터가 손상되었음을 의미
UDP의 경우 오류가 검출되면 그냥 폐기(재전송 요청 없음)TCP보다 용량도 적고 속도도 빠르지만 데이터 전송의 신뢰성이 없고 때문에 데이터가 유실되거나
순서가 바뀔 위험이 존재가 있기에 데이터가 일부 유실되어도 서비스 이용에 큰 문제가 되지 않는
온라인 게임이나 실시간 방송에서 사용
UDP는 TCP 처럼 연결을 하지도 않고, 재전송 제어, 윈도우 제어, 혼잡 제어와 같은 기능이 x
또한 도중에 데이터의 순서가 바뀐다 하더라도 다시 정렬하지 x
그저 데이터를 전달하는 것이 UDP의 목적