| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- LimitRange
- namespace
- Replicaset
- 도커
- OverTheWire
- 핸드셰이크
- 해커톤
- 하둡
- 빅데이터
- dns
- 고가용성
- configmap
- 네트워크
- 클라우드
- 온프레미스
- 웹 스토리지
- 혼잡제어
- 클라우드 네이티브 5회차
- Web
- ResourceQuota
- 네트워크 가상화
- k8s
- Urn
- 리소스 풀링
- cronjob
- goorm
- 다중화
- daemonset
- docker
- 해시
- Today
- Total
NakedFlower 님의 블로그
TCP, UDP, 포트 포워딩 본문
포트 포워딩

네트워크 내 특정 호스트에 IP 주소와 포트 번호를 미리 할당하고,
[해당 IP주소 : 포트번호 ]로써
해당 호스트에게 패킷을 전달하는 기능

공인 IP 주소 : 1234로 전송한 패킷은 192.168.100.100:1025로 전달
공인 IP 주소 : 4321로 전송한 패킷은 192.168.100.101:1026으로 전달
ICMP: IP프로토콜의 한계를 보완해주는 프로토콜
IP의 신뢰할 수 없는 비연결형 통신
- IP의 전송 특성을 보완하는 ICMP
- IP 패킷 전송 과정에 대한 피드백 메시지 제공
- 피드백 메시지?
- 전송 과정에서 발생한 문제 상황에 대한 오류 보고
- 네트워크에 대한 진단 정보(네트워크상의 정보 제공)
1. 전송과정에서 발생한 문제 상황에 대한 오류 보고
ICMP 메시지 = 타입(type) + 코드(code)
- 타입: ICMP 메시지 유형 번호
- 코드: 구체적인 메시지 내용 번호
| 타입 이름(타입 번호) | 코드 번호 | 코드 설명 |
| 수신지 도달 불가 (3) | 0 | 네트워크 도달 불가 |
| 1 | 호스트 도달 불가 | |
| 2 | 프로토콜 도달 불가: 수신자에서 특정 프로토콜을 사용할 수 없음 | |
| 3 | 포트 도달 불가 | |
| 4 | 단편화가 필요하지만 DF가 1로 설정되어 단편화할 수 없음 | |
| 시간 초과 (11) | 0 | TTL 만료 |
2. 네트워크에 대한 진단 정보(네트워크상의 정보 제공)
| 타입 이름(타입 번호) | 코드 번호 | 코드 설명 |
| 에코 요청 (8) | 0 | 에코 요청 |
| 에코 응답 (0) | 0 | 에코 요청에 대한 응답 |
| 라우터 광고 (9) | 0 | 라우터 광고: 라우터가 호스트에게 자신을 알림 |
ICMP는 IP의 보조일뿐 : 신뢰성의 완전 보장X
IP의 한계를 극복하려면 전송 계층의 TCP를 이용해야 함
전송 계층의 가장 중요한 프로토콜 : TCP와 UDP
- TCP(Transmission Control Protocol)
- 신뢰할 수 있는 통신을 위한 연결형 프로토콜
- UDP(User Datagram Protocol)
- TCP보다 신뢰성은 떨어지지만 비교적 빠른 통신이 가능한 비연결형 프로토콜
TCP(연결 지향형 프로토콜) 통신 단계
- TCP는 통신(데이터 송수신)하기 전에 연결을 수립하고 통신이 끝나면 연결을 종료
- 패킷을 주고 받기 전에 호스트 간에 연결을 수립
- 연결을 바탕으로 데이터 송수신이 이루어짐 -> 신뢰성 있는 전송을 위해 -> 재전송을 통한 오류제어, 흐름 제어, 혼잡 제어와 같은 기능 제공
- 송수신이 끝나면 연결 종료

MSS(Maximum Segment Size)
- TCP로 주고 받는 패킷 사이즈 : Segment
- 즉, MSS : TCP로 전송할 수 있는 최대 페이로드 크기(TCP헤더 크기 제외)

송신지 포트, 수신지 포트
- 송수신하는 포트 번호 (실행중인 어플리케이션 프로세스를 식별하는 번호) (16비트로 표현 가능)
- 순서 번호(sequence number)
- 순서 번호가 명시되는 필드
- 순서 번호
- 송수신되는 세그먼트 데이터의 첫 바이트에 부여되는 번호
- 세그먼트의 올바른 송수신 순서를 보장하기 위한 번호
- 확인 응답 번호(acknowledgment number)
- 상대 호스트가 보낸 세그먼트에 대한 응답
- 다음으로 수신하기를 기대하는 순서 번호가 명시
예를 들어 응용 계층으로부터 1900바이트 크기의 데이터를 전달받았다고 가정


순서 번호 = 초기 순서 번호 + 송신한 바이트 수
- 초기 순서 번호(ISN, Initial Sequence Number)는 무작위 값
- 세그먼트 B의 순서 번호는 초기 순서 번호인 100에서 500바이트 떨어진 셈이므로 600
- 세그먼트 C의 순서 번호는 초기 순서 번호로부터 1000바이트 떨어진 1100
- 세그먼트 D의 순서 번호는 초기 순서 번호로부터 1500바이트 떨어진 1600
확인응답 번호에는
- 수신자가 다음으로 받기를 기대하는 순서 번호 (일반적으로 '수신한 순서 번호 + 1')
- 확인 응답 번호 값을 보내기 위해서는 제어 비트에서 승인을 나타내는 비트인 ACK플래그를 1로 설정 ("이 세그먼트는 확인응답번호를 포함하고 있습니다"를 나타내는 ACK라고 하는 비트를 1로 설정한 다음에 보내야함)
- ACK플래그가 1로 설정된 세그먼트를 ACK세그먼트라고 부르기도 함
TCP 연결 수립과 종료
연결 수립 (3-way handshake)

제어비트(ACK, SYN, FIN 등)
- 여러개의 비트의 조합으로 이루어진 필드
- 각각의 비트는 각각의 고유한 의미를 가지고 있음
- ACK : 세그먼트의 승인을 나타내기 위한 비트
- SYN : 연결을 수립하기 위한 비트
- FIN : 연결을 종료하기 위한 비트
- TCP 연결 수립
송수신 방향 세그먼트 세그먼트에 포함된 주요 정보 비유 A → B SYN 세그먼트 • 호스트 A의 초기 순서 번호 • 1로 설정된 SYN 비트 '연결 시작합니다.' B → A SYN + ACK 세그먼트 • 호스트 B의 초기 순서 번호 • 호스트 A가 전송한 세그먼트에 대한 확인 응답 번호 • 1로 설정된 SYN 비트 • 1로 설정된 ACK 비트 '네, 확인했습니다. 연결 시작해요' A → B ACK 세그먼트 • 호스트 A의 다음 순서 번호 • 호스트 B가 전송한 세그먼트에 대한 확인 응답 번호 • 1로 설정된 ACK 비트 '네, 확인했습니다.'
- 액티브 오픈: 연결 시작 호스트의 연결 수립 과정
- 패시브 오픈: 연결 수락 호스트의 연결 수립 과정
연결 종료 (4-way handshake)
→ 송수신 호스트가 각자 한번씩 FIN과 ACK를 주고받으며 TCP가 연결 종료

TCP 연결 종료 과정
| 송수신 방향 | 세그먼트 | 세그먼트에 포함된 주요 정보 | 비유 |
| A → B | FIN 세그먼트 | • 1로 설정된 FIN 비트 | '연결 끊을게요.' |
| B → A | ACK 세그먼트 | • 호스트 A가 전송한 세그먼트에 대한 확인 응답 번호 • 1로 설정된 ACK 비트 | '네, 확인했습니다.' |
| B → A | FIN 세그먼트 | • 1로 설정된 FIN 비트 | '이제 연결 끊어요.' |
| A → B | ACK 세그먼트 | • 호스트 B가 전송한 세그먼트에 대한 확인 응답 번호 • 1로 설정된 ACK 비트 | '네, 확인했습니다.' |
- 액티브 클로즈 : 종료 시작 호스트의 종료 과정
- 패시브 클로즈 : 종료 수락 호스트의 종료 과정
TCP 상태
상태(state) : 햔제 어떤 통신 과정에 있는지를 나타내는 정보
- 스테이트풀 프로토콜(TCP) <-> 스테이트리스 프로토콜(대표적인 예로 UDP, HTTP)


TCP 상태의 유형
- 연결이 수립되지 않은 상태
- 연결 수립 과정에서 주로 볼 수 있는 상태
- 연결 종료 과정에서 주로 볼 수 있는 상태
| 상태 분류 | 주요 상태 |
| ① | CLOSED, LISTEN |
| ② | SYN-SENT, SYN-RECEIVED, ESTABLISHED |
| ③ | FIN-WAIT-1, CLOSE-WAIT, FIN-WAIT-2, LAST-ACK, TIME-WAIT, CLOSING |
연결이 수립되지 않은 상태
- CLOSED : 아무런 연결이 없는 상태
- LISTEN : 일종의 연결 대기 상태(SYN 세그먼트를 기다리는 상태)
- -> 서버로서 동작하는 패시브 오픈 호스트는 일반적으로 LISTEN 상태 유지
- -> LISTEN 호스트에게 SYN 세그먼트를 보내면 쓰리웨이 핸드셰이크 시작
연결 수립 상태
- SYN-SENT
- -> 연결 요청을 보낸 뒤 대기하는 상태
- -> 액티브 오픈 호스트가 SYN 세그먼트를 보낸 뒤 그에 대한 응답인 SYN + ACK 세그먼트를 기다리는 상태
- SYN_RECEIVED
- -> 패시브 오픈 호스트가 SYN + ACK 세그먼트를 보낸 뒤 그에 대한 ACK 세그먼트를 기다리는 상태
- ESTABLISHED
- -> 연결이 확립되었음을 나타내는 상태
연결 종료 상태
- FIN-WAIT-1
- -> 일반적인 TCP 연결 종료 과정에 있어 FIN-WAIT-1은 연결 종료의 첫 단계
- CLOSE-WAIT
- -> 종료 요청인 FIN세그먼트를 받은 패시브 클로즈 호스트가 그에 대한 응답으로 ACK세그먼트를 보낸 후 대기하는 상태
- FIN-WAIT-2
- -> FIN-WAIT-1 상태에서 ACK 세그먼트를 받고 상대 호스트의 FIN세그먼트를 기다리는 상태
- LAST-ACK
- -> CLOSE-WAIT 상태에서 FIN세그먼트를 전송한 뒤 이에 대한 ACK세그먼트를 기다리는 상태
- TIME-WAIT
- -> 액티브 클로즈 호스트가 FIN세그먼트를 수신한 뒤, 이에 대한 ACK 세그먼트를 전송한 뒤 접어드는 상태
- -> 패시브 클로즈 호스트는 마지막 ACK 세그먼트를 수신하면 CLOSED 상태로 전이
- -> TIME-WAIT 상태의 액티브 클로즈 호스트는 일정 시간을 기다린 뒤 CLOSED 상태로 전이
netstat 명령어를 통해 TCP의 상태 확인 가능
UDP

UDP는 IP헤더를 감싸는 일종의 껍데기와 같음
UDP 데이터그램의 구조
- UDP는 TCP와 달리 비연결형 통신을 수행하는 신뢰할 수 없는 프로토콜
- 그래서 연결 수립 및 해제, 재전송을 통한 오류 제어, 혼잡 제어, 흐름 제어 등을 수행하지 않음
- 상태를 유지하지도 않음 - 스테이트리스(stateless) 프로토콜
- UDP는 TCP에 비해 적은 오버헤드로 패킷을 빠르게 처리
- 주로 실시간 스트리밍 서비스, 인터넷 전화처럼 실시간성이 강조되는 상황에서 TCP보다 더 많이 쓰임
'CS > 네트워크' 카테고리의 다른 글
| Domain Name Server (0) | 2025.10.03 |
|---|---|
| 오류 제어, 흐름 제어, 혼잡 제어 (0) | 2025.10.03 |
| 전송 계층, NAT (0) | 2025.10.02 |
| 라우팅에 대하여 (0) | 2025.10.01 |
| IP의 핵심 기능 (0) | 2025.10.01 |