⛳️ 인프런 - cs 지식의 정석 강의를 듣고 학습한 내용입니다.
TCP/IP 4계층
개념
TCP/IP는 인터넷에서 데이터를 주고받을 때 사용하는 프로토콜 모음으로, 데이터를 올바르게 전송하기 위해 계층별로 책임을 분리한 구조를 가진다.
TCP/IP 4계층
- 애플리케이션 계층
- HTTP, SMTP, SSH, FTP 등이 대표적
- 사용자와 가장 가까운 인터페이스 계층
- 웹 서비스, 이메일, 파일 전송 등의 애플리케이션 서비스를 처리
- 전송 계층
- TCP, UDP가 대표적.
- 데이터를 세그먼트(TCP)나 데이터그램(UDP)으로 나누고, 오류 없이 전달되도록 처리
- TCP는 신뢰성을 보장하며, UDP는 신뢰성 대신 속도를 우선
- 인터넷 계층
- IP, ICMP, ARP 등이 포함
- 데이터 패킷화 및 경로 설정
- 노드 간 데이터 전달을 담당
- 링크 계층
- 데이터 링크 계층과 물리 계층을 합친 계층
- 전선, 광섬유, 무선 등으로 데이터가 실제 네트워크를 통해 전송되는 방식을 정의
캡슐화와 비캡슐화
캡슐화
송신자가 데이터를 보낼 때, 각 계층에서 해당 계층의 헤더를 추가하는 과
- ex: TCP 계층에서 TCP 헤더 추가 → IP 계층에서 IP 헤더 추가 → 전송
비캡슐화
수신자가 데이터를 받을 때, 계층별로 헤더를 제거하며 데이터의 원본 형태를 복원하는 과정

PDU (Protocol Data Unit)
각 계층별 데이터 단위를 의미한다.
모든 계층에 전달되는 데이터가 쪼개져서 패킷으로 전달된다고 하는 것도 대강 맞는 말이지만, PDU에 따라 부르는게 더 정확한 표현이다.
- 애플리케이션 계층: 메시지
- 전송 계층: 세그먼트(TCP), 데이터그램(UDP)
- 인터넷 계층: 패킷 (세그먼트 + IP 헤더)
- 링크 계층: 프레임(데이터 링크 계층) → 비트(물리 계층)
세그먼트 : 적절한 크기로 쪼갠 조각 (세그먼트와 데이터그램의 의미는 같음)
패킷 : 세그먼트에 SP와 DP가 포함된 IP 헤더가 붙은 형태의 조각
프레임 : MAC주소 헤더와 CRC/체크섬 트레일러가 붙은 조각
CRC/체크섬 트레일러
데이터의 오류감지 위한 수학적 함수가 적용된 값들이 있는 필드로, 과도한 트래픽 등으로 인한 링크의 오류가 데이터를 손상하는 것을 감지하는 역할을 한다.
- CRC : CRC-1, CRC-16 등의 알고리즘으로 나온 값을 통해 데이터 전송 오류 감지
- 체크섬 : MD5, SHA-256 등의 알고리즘으로 나온 값을 통해 데이터 무결성 보장

참고: OSI 7계층

MTU와 MSS

1. MTU (Maximum Transmission Unit)
네트워크가 한 번에 전송할 수 있는 최대 PDU 크기
- ex: MTU가 1500일 때, 4000바이트 데이터를 보내려면 더 작게 분할 필요
보내려는 데이터가 MTU보다 크다면?
- IPv6: 분할 비허용.
- IPv4: 헤더의 Flag 필드에서 DF(Don't Fragment) 비트가 1로 설정되면 분할이 불가능

MTU 확인 방법
- window cmd: netsh interface ipv4 show interfaces 입력
- mac os 터미널: ifconfig 입력시 다음과 같이 확인해볼 수 있다.

2. MSS (Maximum Segment Size)
MTU는 IP헤더와 TCP헤더의 크기까지 합치지만, MSS는 데이터의 크기(payload의 크기)만을 나타냄.
즉 MSS = MTU - TCP/IP 헤더 크기

3. PMTUD (Path MTU Discovery)
- 패킷이 MTU보다 클 때, 패킷 분할이 불가능한 경우 발생
- 패킷이 목적지에 도달하지 못하면 경로 상의 MTU를 줄여가면서 다시 전송한다
- IPv6 환경에서 특히 중요
애플리케이션 계층 프로토콜
1. HTTP (Hypertext Transfer Protocol)
서버와 클라이언트 간 데이터 전송을 위한 프로토콜이다. 처음에는 서버와 브라우저간 데이터를 주고받는데 설계되었지만, 지금은 서버와 서버간 통신에도 많이 이용한다.
- 확장성: 표준화된 헤더 외에도 필요에 따라 추가적인 정보를 헤더에 포함시켜 요청이나 응답을 확장할 수 있다. HTTP가 다양한 상황에서 유연하게 동작할 수 있도록 만들어주는 핵심 장점 중 하나.
- Stateless: 요청-응답 간 상태 정보를 저장하지 않음

2. SSH (Secure Shell Protocol)
보안되지 않은 네트워크에서 데이터를 암호화하여 안전하게 전송하기 위한 암호화 네트워크 프로토콜
- ex: AWS 서버 인증에 사용되는 PEM 키
3. FTP (File Transfer Protocol)
노드 간 파일 전송하는 데에 사용되는 프로토콜이다. 현재는 보안이 강화된 FTPS, SFTP로 대체되고 있다.
4. SMTP (Simple Mail Transfer Protocol)
이메일 전송을 위한 표준 프로토콜로, 메일링 서비스를 직접 만든다면 smtp를 통해 보내야 함
예시 코드: JavaScript의 Nodemailer
라이브러리 내부 코드
코드를 보면 smtp를 사용하여 이메일을 보내는 것을 확인할 수 있다.
let transporter = nodemailer.createTransport({
host: "smtp.ethereal.email",
port: 587,
secure: false,
auth: {
user: testAccount.user,
pass: testAccount.pass,
},
});
전송 계층
TCP (Transmission Control Protocol)
- 특징:
- 신뢰성 있는 전송 (3-way handshake로 연결, 4-way handshake로 연결 해제)
- 가상회선 패킷 교환 방식으로, 패킷 순서가 보장된다.

- 오류 검사 방식이 다양하다.
- 재전송: 시간이 초과되면 서버에서 재전송 시도
- 체크섬: 송신된 데이터와 수신된 데이터의 체크섬 값을 비교해 무결성 평가
- 헤더: 20~60바이트 (가변)
UDP (User Datagram Protocol)
- 특징:
- 속도가 빠름 (단순 데이터그램 방식)
- 데이터그램 패킷 교환 방식으로, 순서 보장 없음

- 간단한 체크섬만 지원
- 헤더: 고정 길이 8바이트
TCP vs UDP 비교
특성 | TCP | UDP |
---|
패킷 교환방식 | 가상회선 방식 | 데이터그램 방식 |
신뢰성 | 있음 | 없음 |
오류검사 | 재전송, 체크섬 지원 | 체크섬만 지원 |
순서 보장 | 있음 | 없음 |
헤더 크기 | 20~60바이트 (가변) | 8바이트 (고정) |
연결 보장 | 3-way/4-way handshake | 연결 없음 |
브로드캐스트 | 지원하지 않음 | 지원 |
속도 | 상대적으로 느림 | 빠름 |

3-way Handshake
TCP 연결 설정 과정:
1. SYN: 클라이언트 → 서버로 연결 요청
2. SYN/ACK: 서버 → 클라이언트로 연결 승인
3. ACK: 클라이언트 → 서버로 확인 응답

4-way handshake
- 클라이언트가 연결을 닫으려고 할 때, FIN으로 설정된 세그먼트를 보낸 후 FIN_WAIT_1 상태로 들어감.
- 서버는 클라이언트로 ACK 세그먼트를 보내고 CLOSE_WAIT 상태로 들어감. 클라이언트가 세그먼트를 받으면 FIN_WAIT_2 상태로 들어감.
- 서버는 LAST_ACK 상태가 되며 일정 시간 이후, 클라이언트에 FIN 세그먼트를 보냄.
- 클라이언트는 TIME_WAIT 상태가 되고, 다시 서버로 ACK를 보냄. 그러면 서버는 CLOSED 상태가 되고, 클라이언트는 TIME_WAIT 시간을 대기한 후 연결이 닫힘.

TIME_WAIT이 필요한 이유
- 지연 패킷 처리: 연결 해제 과정에서도 어떤 패킷이 지연되어 올 수 있기 때문에 데이터 무결성을 보장하려면 대기시간이 필요함.
- 양쪽 연결 보장: 서버와 클라이언트 양쪽 모두가 CLOSED 상태가 되었는지 확인하는데, 이는 새 연결 시 중복 데이터 충돌을 방지하기 위함이다.
TIME_WAIT 시간
: 최대 세그먼트 생명값(MSL) * 2로, 운영체제(OS)에 따라 상이함
- 우분투: 60초
- 윈도우: 240초 (4분)
- 맥OS: 특정 설정값에 따라 다름
인터넷 계층
이 부분은 너무 중요해서 뒤에서 자세히 다룰 예정!
ICMP (Internet Control Message Protocol)
- 역할: 통신 상태 확인
- 특징:
- 데이터 교환용이 아닌 테스트용
- 독립적인 비연결형 프로토콜