이번 주는 4장 전송 계층, TCP/UDP를 배웠다. 이번 주에는 해당 챕터의 몇몇 문제를 풀어보고, 풀이와 관련된 개념을 정리할 것이다.
1. 전송 계층
1.1. IP?
1.2. IP의 한계
1.3. 전송 계층
1.3.1. 전송 계층의 역할
1.3.2. 포트
1.3.2.1. 포트의 정의
1.3.2.2. 포트의 분류
1.3.3. NAT
1.3.4. 포트 포워딩
1.3.5. ICMP
2. TCP와 UDP
2.1. TCP
2.1.1. TCP 통신 단계
2.1.1.1. MSS(Maximum Segment Size)
2.1.1.2. TCP 세그먼트 구조
2.1.1.3. 제어 비트
2.1.1.4. 순서 번호와 확인 응답 번호
2.1.2. TCP 연결 수립과 종료
2.1.3. 연결 종료
2.1.4. TCP 상태
2.2 UDP
2.2.1. UDP 데이터그램 구조
2.3. TCP, UDP의 전송 방식 차이
3. 후기
1. 전송 계층
우선 전송 계층과 관련된 문제는 아래와 같다.
IP와 연관된 통신 특성으로 알맞은 단어를 <보기>에서 골라 보세요.
<보기> 신뢰성, 연결형, 비신뢰성, 비연결형
답은 비신뢰성, 비연결형이다. 이유를 알아보기 위해 관련 지식을 알아가보자.
1.1. IP?
우선 IP에 대해 간략하게 정리해보자. IP는 네트워크 계층의 가장 핵심적인 프로토콜이라 정의할 수 있다.
1.2. IP의 한계
IP의 특징들을 간단히 정리하면 아래와 같다.
* IP 단편화
* IP 주소 지정
* 비신뢰성 프로토콜
- 최선형 전달. (IP 프로토콜이 패킷이 수신지까지 제대로 전송되었다는 보장을 하지 않음.)
- 패킷 손실을 감수하더라도 빠른 전송을 우선시하기 위함.
* 비연결형 프로토콜
- 송수신 호스트 간 사전 연결 수립 작업을 거치지 않음.
- 패킷 손실을 감수하더라도 빠른 전송을 우선시하기 위함.
=> IP를 통한 패킷의 전달은 신뢰성이 없고 연결을 수립하는 과정이 없는 통신이다.
=> 그러므로 전송 계층의 존재가 중요하다.
1.3. 전송 계층
이제 전송 계층의 존재 이유에 대해 간단히 알았으니 전송 계층의 역할에 대해 알아보자.
1.3.1. 전송 계층의 역할
* 연결형 통신을 가능하게 함.
- 전송 계층의 연결형 프로토콜(대표적으로 TCP)은 두 호스트가 정보를 주고받기 전 연결을 수립한다.
- 송수신 동안에는 연결을 유지하고, 송수신이 끝나면 연결을 종료한다.
* 신뢰성 있는 통신을 가능하게 함.
- TCP는 패킷이 올바른 순서대로 확실히 전달하는 것을 보장한다. (재전송을 위한 오류 제어, 흐름 제어, 혼잡 제어 등등)
++ 연결형 통신과 신뢰성 있는 통신이 무조건 좋은 것은 아님.
(연결 수립과 제어 과정보다 빠른 데이터 전송이 더 우선시되는 상황이 존재하기 때문.)
++ 빠른 전송을 위해 UDP라는 전송 계층의 비연결형, 비신뢰성 프로토콜이 사용된다.
1.3.2. 포트
이제 전송 계층에서 전송된 정보 확인에 중요한 포트에 대해 알아보자.
1.3.2.1. 포트의 정의
= 응용 계층의 애플리케이션 프로세스를 식별하는 정보.
(호스트 내부의 실행 중인 특정 애플리케이션 프로세스까지 전달되어야 하기 때문.)
++ 프로세스 : 실행 중인 프로그램.
1.3.2.2. 포트의 분류
* 포트 번호
= 특정 애플리케이션을 식별하게 하는 포트별로 할당된 번호. (패킷 내 수신지 포트, 송신지 포트를 통해 송수신지 호스트의 애플리케이션 식별.)
= 16비트로 표현 가능.
= 0~1023 : 잘 알려진 포트. (범용적으로 사용되는 애플리케이션 프로토콜이 일반적으로 사용하는 포트 번호.)
= 1026~49151 : 등록된 포트. (잘 알려진 포트에 비해서는 덜 범용적. 흔히 사용되는 애플리케이션 프로토콜에 할당하기 위해 사용.)
= 49152~65535 : 동적 포트 / 사설 포트 / 임시 포트. (특별히 관리되지 않는 포트 번호. 인터넷 할당 번호 관리 기관(IANA)에 의해 할당된 애플리케이션 프로토콜이 없음.)
++ 서버로 동작하는 프로그램의 포트 번호는 암묵적으로 정해진 경우 많음.
++ 클라이언트로 동작하는 프로그램은 동적 포트 번호 중 임의의 번호가 할당되는 경우 많음. (웹 브라우저)
=> IP 주소, 포트 번호가 함께 주어지면 특정 호스트에서 실행 중인 특정 애플리케이션 프로세스를 식별 가능하다.
1.3.3. NAT
추가로 IP 주소 변환에 사용되는 기술인 NAT에 대해 알아보자.
* 정의
= IP 주소를 변환하는 기술로, 네트워크 내부에서 사용되는 사설 IP 주소와 네트워크 외부에서 사용되는 공인 IP 주소를 변환하는 데 사용된다.
* NAT 변환 테이블
= IP 주소 변환 과정에서 사용되는 데이터 테이블.
= 변환의 대상이 되는 IP 주소 쌍이 일대일로 대응되어 명시되어 있음. (사설 IP, 공인 IP의 주소가 많기 때문에 해당 방법으로 변환은 무리가 있음.)
=> 현재는 일대일 대응 방식이 아닌 대부분 NAPT를 이용해 다수의 사설 IP 주소를 적은 수인 공인 IP 주소로 변경하는 방식으로 사용.
* NAPT(APT)
= 포트 기반의 NAT.
= 공인 IP 주소 부족 수 문제를 개선한 기술.
= 포트를 활용해 하나의 공인 IP 주소를 여러 사설 IP 주소가 공유할 수 있또록 하는 NAT의 일종.
= NAT 테이블에 변환할 IP 주소 쌍, 포트 번호를 함께 기록하고 변환.
=> 사용할 IP 주소가 같더라도 포트 번호가 다르면 네트워크 내부의 호스트를 특정 가능해짐.
1.3.4. 포트 포워딩
= 네트워크 내 특정 호스트에 IP 주소와 포트 번호를 미리 할당하고, 해당 IP 주소:포트 번호로써 해당 호스트에게 패킷을 전달하는 기능.
= 네트워크 내부의 서버를 외부에서 접속할 수 있또록 접속 정보를 공개하기 위해 자주 사용.
1.3.5. ICMP
= IP 패킷의 전송 과정에 대한 피드백 메세지를 얻기 위해 사용하는 프로토콜.
= IP의 비신뢰성 전송 특성과 비연결성 전송 특성을 보완하기 위한 네트워크 계층의 프로토콜.
= ICMP 메세지 : 타입(ICMP 메세지의 유형 번호로 명시)+코드(구체적인 메세지 내용 번호로 명시)
(전송 과정에서 발생한 문제 상황에 대한 오류 보고, 네트워크에 대한 진단 정보 등으로 분류됨.)
= IP의 비신뢰성을 보완하기 위한 도우미일 뿐, 완전한 신뢰성을 보장하기는 어려움.
2. TCP와 UDP
해당 챕터의 문제는 아래와 같다.
다음은 TCP 쓰리 웨이 핸드셰이크 과정을 나타내는 그림입니다. 괄호 안에 들어갈 말을 <보기>에서 골라 보세요.
<보기> SYN, ACK, FIN
(그림 추가)
정답은 ACK이다. 해당 문제의 정답을 도출하기 위해 차근차근 알아보자.
2.1. TCP
TCP 쓰리 웨이 핸드셰이크에 대해 알려면 우선 TCP에 대해 알아야 한다.
* 정의
= 신뢰할 수 있는 통신을 위한 연결형 프로토콜.
2.1.1. TCP 통신 단계
세 단계로 나누면 아래와 같다.
연결 수립 -> 데이터 송수신 -> 연결 종료
↑
(재전송을 통한 오류 제어, 흐름 제어, 혼잡 제어)
= 통신(데이터 송수신)하기 전 연결을 수립하고 통신이 끝나면 연결을 종료.
2.1.1.1. MSS(Maximum Segment Size)
= TCP로 전송가능한 최대 페이로드 크기. (TCP 헤더 크기 제외. MTU와 대조적.)
2.1.1.2. TCP 세그먼트 구조
TCP 기본 동작을 위한 기본 필드들을 기준으로 살펴보자.

= 송신지 포트(source port), 수신지 포트(destination port) : 송신지, 수신지 애플리케이션을 식별하는 포트 번호가 명시된느 필드.
= 순서 번호(sequence number) : 순서 번호가 명시되는 필드. (순서 번호 : 송수신되는 세그먼트 데이터의 첫 바이트에 부여되는 번호. 올바른 순서 보장 가능.)
= 확인 응답 번호(acknowledgment number): 상대 호스트가 보낸 세그먼트에 대한 응답. 다음으로 수신하기를 기대되는 순서 번호 명시.
= 제어 비트(control bits) : 플래그 비트(flag bit)와 동의어. 현재 세그먼트에 대한 부가 정보를 나타냄.
= 윈도우(window) : 수신 윈도우의 크기 명시. (수신 위동: 한 번에 수신하고자 하는 데이터의 양)
2.1.1.3. 제어 비트
* 제어 비트 필드(대표적으로 사용되는 비트들만 설명)
= ACK : 세그먼트의 승인을 나타내기 위한 비트
= SYN : 연결 수립을 위한 비트
= FIN : 연결 종료를 위한 비트
2.1.1.4. 순서 번호와 확인 응답 번호
TCP의 신뢰성 보장을 위해 사용되는 중요한 필드이다.
* 순서 번호
= 세그먼트의 올바른 송수신 순서를 보장하기 위한 번호.
= 세그먼트 데이터의 첫 바이트에 부여되는 번호.
= 초기 순서 번호+송신한 바이트 수 (초기 순서 번호 : SYN 플래그가 1로 설정된 세그먼트에 할당되는 순서 번호. 가장 먼저 보내게 될 세그먼트의 번호.)
(++ 데이터를 송신하는 동안 순서 번호는 송신한 바이트를 더해 가는 형태로 누적값 형태를 가짐.)
* 확인 응답 번호
= 수신자가 다음으로 받기를 기대하는 순서 번호.
= 일반적으로 '수신한 순서 번호 + 1'로 설정.
= 값을 보내기 위해 제어 비트에서 ACK 플래그를 1로 설정해야 가능.
2.1.2. TCP 연결 수립과 종료
이제 TCP의 통신 과정에 대해 자세히 알아보자.
* 연결 수립 : 쓰리 웨이 핸드셰이크
과정은 아래와 같다.

(위 그림에는 클라이언트, 서버라고 설명되어 있지만 임의의 호스트 간에서도 발생하므로 각각 호스트 A, 호스트 B라고 치환해서 설명하겠다.)
| 송수신 방향 | 세그먼트 | 세그먼트에 포함된 주요 정보 |
| A -> B | SYN | * 호스트 A의 초기 순서 번호 * 1로 설정된 SYN 비트 |
| B -> A | SYN + ACK | * 호스트 B의 초기 순서 번호 * 호스트 A가 전송한 세그먼트에 대한 확인 응답 번호 * 1로 설정된 SYN 비트 * 1로 설정된 ACK 비트 |
| A -> B | ACK | * 호스트 A의 다음 순서 번호 * 호스트 B가 전송한 세그먼트에 대한 확인 응답 번호 * 1로 설정된 ACK 비트 |
++ 액티브 오픈(active open) : 처음 연결을 시작하는 호스트의 연결 수립 과정. 보통 서버-클라이언트에서 클라이언트에 의해 수행.
++ 패시브 오픈(passive open) : 연결 요청을 받고 나서 요청에 따른 연결 수립 과정. 보통 서버에 의해 수행.
2.1.3. 연결 종료
요약하면 TCP가 연결을 종료하는 과정은 송수신 호스트가 각각 한 번씩 FIN, ACK를 주고받으며 이루어진다.
과정은 아래와 같다.

| 송수신 방향 | 세그먼트 | 세그먼트에 포함된 주요 정보 |
| A -> B | FIN | * 1로 설정된 FIN 비트 |
| B-> A | ACK | * 호스트 A가 전송한 세그먼트에 대한 확인 응답 번호 * 1로 설정된 ACK 비트 |
| B-> A | FIN | * 1로 설정된 FIN 비트 |
| A-> B | ACK | * 호스트 B가 전송한 세그먼트에 대한 확인 응답 번호 * 1로 설정된 ACK 비트 |
++ 액티브 클로즈(active close) : 먼저 연결을 종료하려는 호스트에 의해 수행
++ 패시브 클로즈(paassive close) : 연결 종료 요청을 받아들이는 호스트에 의해 수행.
2.1.4. TCP 상태
여기서 상태는 현재 어떤 통신 과정에 있는지를 나타내는 정보로, TCP는 상태를 유지하고 활용하므로 스테이트풀(stateful) 프로토콜이라고도 불린다.
종류는 아래와 같다.
| 상태 분류 | 주요 상태 |
| 연결이 수립되지 않은 상태 | CLOSED, LISTEN |
| 연결 수립 과정에서 주로 볼 수 있는 상태 | SYN-SENT, SYN-RECEIVED, ESTABLISHED |
| 연결 종료 과정에서 주로 볼 수 있는 상태 | FIN-WAIT-1, CLOSE-WAIT, FIN-WAIT-2, LAST-ACK, TIME-WAIT, CLOSING |
설명은 아래와 같다.
= CLOSED : 아무 연결이 없는 상태.
= LISTEN : 연결 대기 상태. (패시브 오픈 호스트가 유지하는 상태.)
= SYN-SENT : 연결 요청을 보낸 후 대기하는 상태.
= SYN-RECEIVED : 패시브 오픈 호스트가 SYN + ACK 세그먼트를 보낸 뒤 그에 대한 ACK 세그먼트를 기다리는 상태.
= ESTABLISHED : 연결이 확립되어 데이터를 송수신할 수 있는 상태.
= FIN-WAIT-1 : 연결 종료의 첫 단계. FIN 세그먼트로 연결 종료 요청을 보낸 액티브 클로즈 호스트의 상태.
= CLOSE-WAIT : 종료 요청인 FIN 세그먼트를 받은 패시브 클로즈 호스트가 그에 대한 응답으로 ACK 세그먼트를 보낸 후 대기하는 상태.
= FIN-WAIT-2 : FIN-WAIT-1 상태에서 ACK 세그먼트를 받게 될 경우의 상태.
= LAST-ACK : CLOSE-WAIT 상태에서 FIN 세그먼트를 전송한 뒤 이에 대한 ACK 세그먼트를 기다리는 상태.
= TIME-WAIT : 액티브 클로즈 호스트가 FIN 세그먼트를 수신한 뒤, 이에 대한 ACK 세그먼트를 전송한 뒤의 상태.
(상대 호스트가 받아야 할 ACK 세그먼트가 올바르게 전송되지 않았을 경우 재전송하기 위해)
= CLOSING : 보통 동시에 연결을 종료하려 할 때 전이되는 상태. (서로가 자신의 FIN 세그먼트를 보내고 받은 뒤 각자 그에 대한 ACK 세그먼트를 보냈지만, 아직 자신의 FIN 세그먼트에 대한 ACK 세그먼트를 받지 못했을 때 접어드는 상태.)
2.2 UDP
UDP는 비연결성 통신을 수행하는 비신뢰성 프로토콜로, 스테이트리스(stateless) 프로토콜의 일종이다.
2.2.1. UDP 데이터그램 구조
구조는 아래와 같다.

= 송신지 포트(source port)와 수신지 포트(destination port) : 송수신지의 포트 번호가 담김.
= 길이(length) : 헤더를 포함한 UDP 데이터그램의 바이트
= 체크섬(checksum) : 데이터그램 전송 과정에서 오류가 발생했는지 검사하기 위한 필드. (데이터그램 훼손 여부의 정보이므로 신뢰성/비신뢰성과 관계가 없다.)
=> TCP에 비해 적은 오버헤드로 패킷을 빠르게 처리할 수 있다.
2.3. TCP, UDP의 전송 방식 차이
해당 프로토콜들의 전송 방식 차이를 그림으로 보면 아래와 같다.

= TCP : 정보를 하나씩 확실하게 전송하는 것을 지향.
= UDP : 수신지에 정보를 빠르게 전송하는 것을 지향하므로 패킷이 손실되거나 패킷의 순서가 바뀔 수 있음.
3. 후기
문제를 풀면서 내용을 정리하다 보니 이렇게 목차가 많고 쓸 내용이 많아졌다는 사실이 놀랍다..하지만 더 놀라운 것은 TCP의 신뢰성 보장을 위한 기능은 아직 정리하지 못했다는 것이다...해당 내용은 다음주 중으로 다시 읽으면서 내용을 정리해 봐야겠다.