전송 계층
전송 계층에서는 가장 중요한 개념이 TCP와 UDP이다. TCP와 UDP는 매우 중요한 프로토콜이므로 잘 기억해두는 것이 좋다.
TCP/UDP의 목적과 특징
첫 번쨰로 포트를 통한 프로세스 식별이다. IP주소와 MAC주소는 패킷을 송수신하는 호스트를 특정지을 수 있었다.
하지만 사실 패킷의 최종 송수신 대상은 호스트가 아닌 호스트가 실행하는 프로세스이다. 그렇다면 네트워크를 통해 주고받는 패킷은 최종적으로 이러한 프로세스에 전달되어야 한다.
이때 필요한 것이 포트 번호
이다. 네트워크 패킷을 주고받는 프로세스에는 포트번호가 할당된다. IP주소와 포트 번호를 통해 식별을 할 수 있다는 것이다.
전송 계층의 핵심 프로토콜인 TCP와 UDP는 모두 포트를 통해 프로세스를 식별할 수 있다.
TCP와 UDP 헤더에는 모두 송신지 포트와 수신지 포트를 포함하고 있다.
포트 번호는 16비트로 0~ 65535번까지 포트를 할다알 수 있다.
잘 알려진 포트, 등록된 포트, 동적 포트라는 내용을 많이 들어봤을 것이다.
0~1023번 까지는 잘 알려진 포트로 대중적으로 사용하는 포트 번호들이다.
- 20,21 : FTP
- 22 : SSH
- 23 : TELNET
- 53 : DNS
- 67,68 : DHCP
- 80 : HTTP
- 443 : HTTPS
1024 ~ 49151번까지는 등록된 포트의 번호이다. 위 포트보다 덜 사용되지만 그래도 범용적인 포트들이다.
- 1194 : OpenVPN
- 1433 : MS SQL Server
- 3306 : MySQL Server
- 6379 : Redis
- 8080 : HTTP 대체
나머지 49152 ~ 65535는 사설포트 또는 임시포트라고 불리는 동적 포트
로, 비교적 자유롭게 사용이 가능한 포트이다.
NAT
NAT은 Network Address Translation으로 말 그대로 공인IP와 사설IP주소 간 변환을 위해사용되는 기술이다.
네트워크 내부에서 사설 주소를 사용하는 호스트가 외부 네트워크와 통신을 하기 위해서는 이러한 NAT기술이 필요하다.
대부분의 라우터와 가정용 공유기는 NAT 기능을 내장하고 있어 사설 IP주소 -> 공인 IP주소 변환 또는 반대로 변환이 가능하다.
하지만 문제점이 사설 IP하나하나 공인 IP에 대응시키면 공인IP가 부족할 수 있다. 이때 포트를 같이 사용하여 사설IP에서 들어오는 여러 개의 IP주소들을 하나의 포트로 묶어 통신하는 것이다.
이러한 포트 기반 NAT를 NAPT라고 한다.
신뢰성과 연결형 보장
TCP는 신뢰할 수 있는 통신으로 상태 관리, 흐름 제어, 오류 제어, 혼합 제어등의 기능을 제공하며 연결 수립,종료 과정을 확인 가능하다.
하지만 UDP는 이러한 기능을 제공하지 않는 비신뢰성, 비연결형 통신이다.
그래서 TCP는 UDP보다 느리지만 신뢰성을 갖고 있다는 특징이 있다.
UDP 헤더의 구조를 보면 송신지 포트, 수신지 포트, 길이, 체크섬이 있다.
길이는 UDP패킷의 바이트 크기가 명시되어 있고, 체크섬에는 송수신과정에서 데이터그램 훼손 여부를 알 수 있도록 명시되어 있다.
TCP 헤더는 더 많은 기능을 제공한다. UDP에 있는 헤더뿐만 아니라 순서 번호, 제어 비트, 확인 응답 번호 등 다양한 필드가 존재한다.
순서 번호
필드는 TCP 패킷의 올바른 송수신 순서를 보장하기 위해 세그멘트 첫 바이트에 매겨진 번호이다. 이 순서 번호를 통해 해당 세그먼트가 몇 번째 데이터인지 체크 가능하다.확인 응답 번호
는 상대 호스트가 보낸 세그먼트에 대한 응답으로, 다음으로 수신하길 기대하는 번호이다.
만약 내가 100번의 세그먼트를 보냈다면 상대방은 101번의 세그먼트를 받길 희망하므로 확인 응답 번호에 101을 담아 보낸다. 이때 이 세그먼트는 확인 응답 번호를 포함하고 있음을 전달하기 위해 ACK플래그를 1로 설정해야 한다.
ACK 플래그는 제어 비트에서 '승인'을 나타내는 비트이다.
제어 비트
는 현재 세그먼트에 대한 부가 정보를 나타내는 정보로 플래그 비트
라고도 부른다.
제어 비트는 기본적으로 8비트로 구서오디어 있ㅇ으며 각 자리마다 다른 의미를 가진다.
기본적으로 3가지 제어비트에 알고 있으면 된다.
- ACK : 세그먼트 승인을 나타내기 위한 비트
- SYN : 연결을 수립하기 위한 비트
- FIN : 연결을 종료하기 위한 비트
3-way Handshake
TCP는 연결 수립을 위해 쓰리 웨이 핸드쉐이크라는 과정을 거친다.
호스트 A가 B에게 통신을 요청한다고 했을떄 다음과 같이 진행된다.
- 송수신 방향 A-> B / SYN 세크먼트 전송
- Host A 는 SYN 비트가 1인 세그먼트를 B에게 전송한다. 세그먼트 순서 번호에는 호스트 A의 순서 번호가 포함되어 있다.
- 송수신 방향 B-> A / SYN + ACK 세그먼트 전송
- B는 ACK / SYN 비트가 1로 설정된 세그먼트를 A에게 전송한다.
- 세그먼트 순서 번호에는 B의 순서 번호와 세그먼트에 대한 확인 응답 번호가 포함되어 있다.
- ACK 세그먼트 전송
- A는 ACK 비트가 1로 설정된 세그먼트를 B에게 전송한다.
- 세그먼트의 순서 번호에는 호스트 A의 순서번호와 2에서 보낸 세그먼트에 대한 확인 응답 번호가 포함되어 있다.
처음 SYN 비트가 1로 설정된 패킷을 보내는 호스트가 요청을 하는 호스트이며 액티브 오픈
과정이라고 한다.
반대로 연결 요청을 수신한 뒤 그에 대한 연결을 수립하는 과정은 패시브 오픈
이라고 한다.
TCP의 오류 흐름 혼잡 제어
- 재전송을 통한 오류 제어
- TCP는 송수신 과정에서 잘못 전송된 세그먼트가 있을 경우, 이를 재전송하여 오류를 제어한다. 이때 잘못 전송된 세그먼트를 인지하는 방법은 중복된 ACK 세그먼트가 도착했을 때, 타임아웃이 발생했을때 주로 제어할 수 있다.
TCP 세그먼트를 송신하는 호스트는 모두 재전송 타이머라는 값을 유지하는데, 호스트는 세그먼트를 전송할때마다 이 재전송 타이멀르 시작한다. 이 카운트다운이 끝나면 타임아웃이라고하며 발생 시점까지 ACK 세그먼트를 받지 못하면 타임아웃이라고 간주하여 세그먼트를 재전송한다. - 흐름 제어
- 수신 호스트가 한 번에 n개의 바이트를 처리할 수 있다면 송신 호스트는 n개의 바이트를 넘지 않는 선에서 송신해야 한다.
흐름 제어
는 이 데이터를 처리할 수 있는 만큼 전송하는 것을 의미한다.
이 전송량은 TCP 수신 버퍼의 크기에 의해 결정되며 수신 세그먼트가 애플리케이션 프로세스에 읽히기 전에 임시 저장되는 공간으로, 커널에 정의되어 있다.
송신 호스트는 수신 호스트가 한 번에 처리할 수 있는 양을 알고 있어야 하는데 이를 위해서 TCP 헤더에는윈도우
라는 필드가 있다. 이 곳에 수신 윈도우 크기가 명시된다. - 혼잡 제어
- 많은 트래픽으로 패킷의 처리 속도가 느려지거나 유실 될 수 있는 상황을 제어하기 위한 기능이다. 네트워크 혼잡 여부는 세그먼트 전송 오류 판단과 기준이 같다. 중복된 ACK 세그먼트 도착, 타임아웃이 발생시 혼잡하다고 판단하게 된다.
네트워크의 혼잡 가능성을 검출한 송신 호스트는 최대 전송량이 아닌 혼잡 없이 전송할 수 있는 양만큼 송신하게 되며 이를혼잡 윈도우
라고 한다. 이 혼잡 윈도우 또한 모두 커널 내에 정의되어 있다.
TCP 종료
이를 포웨이 핸드 쉐이크라고 하며 과정은 다음과 같다.
- A->B / FIN 세그먼트
A는 FIN 비트가 1인 세그먼트를 B에게 전달 - B -> A / ACK 세그먼트
- B -> A / FIN 세그먼트
- A -> B / ACK 세그먼트
이전과 반대로 TCP 연결 과정에서 먼저 연결을 종료하려는 호스트는 액티브 클로즈
, 연결 종료 요청을 받는 호스트는 패시브 클로즈
과정을 수행한다.
'면접 준비 > Network' 카테고리의 다른 글
[CS 면접 지식 - Network] 네트워크 계층 (0) | 2025.01.24 |
---|---|
[CS 면접 지식 - Network] 물리 계층 (0) | 2025.01.24 |