1. OSI 7계층
- 1계층 : 물리 계층
- 전기적 신호를 전달하는 역할
- 신호 단위 : 0, 1
- ex) 허브, 리피터
- 2계층 : 데이터 링크 계층
- 1계층 정보의 오류를 파악하고 재전송하는 역할
- 해당 데이터에 MAC 주소를 부착하여 3계층으로 전송
- 신호 단위 : 프레임
- ex) 브릿지, 스위치, 이더넷
- 3계층 : 네트워크 계층
- 데이터를 전달할 주소를 지정하는 역할
- 라우터를 통해 전송할 IP 주소를 선택하여, 해당 주소에 데이터를 전달
- 해당 데이터에는 IP 헤더를 부착함.
- 신호 단위 : 패킷
- ex) 라우터
- 4계층 : 전송 계층
- 목적지까지 신뢰할 수 있는 데이터를 보내는 역할
- 종류
- 연결형 통신(TCP)
- 비연결형 통신(UDP)
- 4계층에서 데이터를 붙이는 헤더들
- Port 번호
- TCP or UDP
- 5계층 : 세션 계층
- 두 대상 간에 데이터 교환이 일어나는 장소(상호작용이 발생하는 장소)
- 세션과 관련된 모든 서비스 발생
- 세션 유지, 세션 중단 등
- 6계층 : 표현 계층
- 전송 데이터의 타입 결정
- 예시 : .jpg, .avi 등
- 7계층 : 응용 계층
- 해당 데이터가 PC 프로그램 안에서 사용되는 단계
※세션
- 두 대상의 연결 여부
※TCP, UDP
- 데이터 전송 프로토콜 방법임
- TCP
- 데이터의 손실, 결함 없이 대상 PC에 전달하는 기법
- 예시 : 이메일
- UDP
- 데이터의 손상을 신경쓰지 않고 대상 PC에 데이터 전달
- 예시 : 동영상
※Port 번호
- 해당 PC에서 실행할 프로그램 주소를 나타냄
※IP 주소
- 데이터를 주고받기 위한 장소를 나타내는 주소
- IP 주소를 추적하여, 실행할 PC로 이동
※이더넷
- 컴퓨터 네트워크 기술
- 기기 간에 데이터를 주고받는 하나의 규칙임
- 이더넷 스위치를 통해, 네트워크에 연결됟 기기들은 MAC 주소를 가지고 서로 데이터를 주고받는다.
※MAC 주소
- 이더넷 기반 기기에 등록된 고유 ID
2. 계층 구조를 나눈 이유
- 데이터의 흐름을 한 눈에 파악하기 쉽다
- 독립적인 계층 구조 설계 시, 장애가 발생하는 계층 단계만 수리하면 되는 이점을 지닌다.
3. TCP, UDP 설명
- TCP
- 데이터의 손실 없이 전달하는 방법
- 원리
- 3-way HandShaking으로 연결 진행
- 4-way HandShaking으로 연결 해제
- 특징
- 흐름 제어
- 혼잡 제어
- 장점
- 높은 신뢰성
- 단점
- 비교적 낮은 속도
- 예시
- 파일전송
- UDP
- 데이터의 손상을 신경쓰지 않고 대상 PC에 데이터 전달
- 3, 4-way handShaking 사용 X
- 장점
- 비교적 빠른 속도
- 단점
- 낮은 신뢰성
- 예시
- 동영상 스트리밍
※3-way HandShaking
- 클라이언트 → 서버 : SYN 패킷을 보냄
- SYN 패킷 : 연결 요청 신호
- 서버 → 클라이언트 : SYN + ACK 패킷을 보냄
- ACK 패킷 : 연결을 인지했고 승인한다는 신호
- 클라이언트 → 서버 : ACK 패킷을 보냄
- 연결을 완료했고, 데이터를 보낼 상태가 됐다는 의미
※4-way HandShaking
- 클라이언트 → 서버 : FIN 패킷 보냄
- FIN 패킷 : 연결 종료 신호(데이터를 보내지 않겠다는 의미)
- 서버 → 클라이언트 : ACK 패킷 보냄
- ACK 패킷 : 신호 인지
- ACK 패킷 전송 이후, 서버는 클라이언트에게 남은 데이터 전송을 끝마친다.
- 데이터 전송이 끝나면 3단계로 넘어간다.
- 서버 → 클라이언트 : FIN 패킷 보냄
- 클라이언트→서버 : ACK 패킷 보냄
(5. 클라이언트는 time-wait 상태가 됨)
- time-wait
- 혹시 모를 상대방의 수신 정보를 받기 위해서 기다리는 상태
※흐름 제어
- 송수신측 사이의 패킷 전달 수를 조절하는 것
- 원리
- A→B로 데이터 전달 시, B는 A에게 자신이 데이터 처리가 가능한 상태인지를 계속 보냄
- 이를 통해, A의 데이터 전달 속도를 조절 가능
- 흐름 제어를 하는 이유
- 데이터 처리가 안된 상태에서 무수히 많은 데이터를 받게 되면 손실되는 데이터가 발생하기 때문
※혼잡 제어
- 네트워크 내에서 이동하는 패킷의 수를 조절하는 것
- 존재 이유
- 네트워크에 과도한 패킷 전송이 발생할 시, 네트워크 속도 저하 발생
4. 흐름 제어, 혼잡 제어 설명
- 흐름 제어
- 송수신 사이의 패킷 전달 수를 조절하는 것
- 송신처(보내는 곳)의 데이터 전송 속도가 수신처(받는 곳)보다 빠를 시, 데이터 손실이 발생할 수 있음. 따라서, 해당 상황이 발생했을 때, 송신처의 데이터 전송 속도를 조절함.
- 혼잡 제어
- 네트워크 내에서 이동하는 패킷의 수를 조절하는 것
- 네트워크에 과도한 패킷 전송이 발생할 시, 네트워크 속도 저하 발생하므로 혼잡 제어가 필요함
5. 흐름 제어, 혼잡 제어 방법
- 흐름 제어 방법 종류
- Stop and wait
- 매번 전송한 패킷에 대해서 ACK신호(응답 신호)를 받은 경우에만 다음 패킷을 보냄.
- sliding window
- 수신측에 보낼 데이터의 양을 동적으로 변환함
- 원리
- 3-way handshaking 과정에서 수신측의 ACK 패킷을 통해, 송신측은 초기 윈도우 크기를 설정
- ※윈도우 : 송신측이 한 번에 보낼 수 있는 데이터 크기
- 송신측은 데이터를 보내고, 수신측의 ACK 패킷 신호에 따라 윈도우의 크기를 변경함
- Stop and wait
- 혼잡 제어 방법 종류
- AIMD
- 원리
- 패킷을 1개씩 전송.
- 전송 후, 이상 없으면 윈도우 크기 증가(패킷 전송량 증가)
- 패킷 전송 실패 또는 일정 시간 넘으면 윈도우 크기를 절반으로 감소
- 원리
- Slow Start
- 원리
- 윈도우 크기를 지수적으로 증가(1, 2, 4, …)
- 패킷 전송에 문제 발생 시, 윈도우 크기를 1로 조정
- 이후, 윈도우 크기는 문제가 발생한 윈도우 크기의 절반까지는 지수적으로 증가
- 그 이후부터는 윈도우 크기를 1씩 증가
- 원리
- Fast Recovery
- 원리
- 윈도우 크기를 지수적으로 증가
- 패킷 전송에 문제 발생 시, 윈도우 크기를 절반으로 조정
- 그 이후는 AIMD 방식을 따름
- 원리
- AIMD
6. TCP의 연결 과정과 끊는 과정
- 연결(3-way HandShaking)
- 클라이언트 → 서버 : SYN 패킷을 보냄
- SYN 패킷 : 연결 요청 신호
- 서버 → 클라이언트 : SYN + ACK 패킷을 보냄
- ACK 패킷 : 연결을 인지했고 승인한다는 신호
- 클라이언트 → 서버 : ACK 패킷을 보냄
- 연결을 완료했고, 데이터를 보낼 상태가 됐다는 의미
- 클라이언트 → 서버 : SYN 패킷을 보냄
- 끊기(4-way HandShaking)
- 클라이언트 → 서버 : FIN 패킷 보냄
- FIN 패킷 : 연결 종료 신호(데이터를 보내지 않겠다는 의미)
- 서버 → 클라이언트 : ACK 패킷 보냄
- ACK 패킷 : 신호 인지
- ACK 패킷 전송 이후, 서버는 클라이언트에게 남은 데이터 전송을 끝마친다.
- 데이터 전송이 끝나면 3단계로 넘어간다.
- 서버 → 클라이언트 : FIN 패킷 보냄
- 클라이언트→서버 : ACK 패킷 보냄
- time-wait
- 혹시 모를 상대방의 수신 정보를 받기 위해서 기다리는 상태
- 클라이언트 → 서버 : FIN 패킷 보냄
7. TCP의 연결 과정과 끊는 과정의 차이가 나타나는 이유
- 서버의 데이터 전송이 끝나지 않았을 수 있기 때문
- 따라서, 서버는 클라이언트의 FIN 신호에 대한 ACK 신호를 보내고
- 서버의 데이터 전송이 끝난 이후에 FIN 신호를 클라이언트에 보냄.
8. 만약 Server에서 Fin 플래그를 전송하기 전에 전송한 패킷이 라우팅 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN 패킷보다 늦게 도착하는 상황이 발생하면 어떻게 될까요?
- 클라이언트는 4-way handshaking 이후, time-wait 상태가 된다.
- 따라서, 클라이언트는 서버의 패킷을 받아들일 수 있다.
9. 초기 Sequence Number인 ISN을 0부터 시작하지 않고 난수를 생성해서 설정하는 이유가 있나요?
- 수신자 입장에서 이전 커넥션의 포켓으로 오해할 수 있기 때문이다.
- 이유(예시)
- 클라이언트와 서버는 A 커넥션을 맺었다.(클라이언트가 SYN 포캣을 보냄으로써 시작)
- 클라이언트는 마지막으로 100번 위치의 시퀀스 번호를 가지는 포켓을 보냈다.
- (포켓 크기는 50)
- 서버는 100~149 위치의 포켓을 받았으니, 다음 차례의 포켓은 150번 위치를 받을 차례였다
- (150번 위치를 기다리는 이유는 149번 다음에 200번의 시퀀스 번호가 들어올 시, 150~199번의 포켓이 중간에 소실됐다는 것을 알아채기 위함임)
- 클라이언트는 서버와 B 커넥션을 맺었다.(클라이언트가 SYN 포캣을 보냄으로써 시작)
- A 커넥션과 완전히 동일한 환경(IP, 주소 등)이었고, ISN 번호를 150번으로 지정하였다.
- 서버 입장에서는 A 커넥션의 포켓이 이어서 들어온 것으로 착각할 가능성이 있다.
- 따라서 A 커넥션과 연관되지 않은 난수로 ISN을 설정해야한다.
- 클라이언트와 서버는 A 커넥션을 맺었다.(클라이언트가 SYN 포캣을 보냄으로써 시작)
**※**SYN 패킷
- 연결 요청 신호
**※**Sequence Number
- 데이터 덩어리(포켓 모음집)에서 해당 포켓의 시작 지점
- 포켓의 시작 지점과 포켓의 크기를 통해, 포켓 간의 구분이 가능해짐
**※**ISN
- 처음(커넥션 시작) 서버에 보내기 위해서 사용될 처음 시퀀스 번호
10. UDP는 항상 신뢰성을 보장하지 않는가?
- UDP에 기능을 추가하여, 신뢰성을 보장할 수 있다.
- UDP는 데이터 전송을 제외한 나머지 기능이 정의돼있지 않은 상태다.
- 따라서, UDP에 신뢰성과 관련한 기능들을 추가하여 신뢰성을 보장할 수 있다.
- 예시
- HTTP/3에서 사용하는 QUIC 프로토콜
- QUIC는 UDP 기반
- 하지만 TCP의 기능들(신뢰성, 순서 보장, 흐름 제어)을 추가
- HTTP/3에서 사용하는 QUIC 프로토콜