Q1. TCP 3-way handshake에 대해서 설명해주세요.
TCP 3-way Handshake는 TCP/IP 네트워크에서 안정적이고 연결 지향적인 통신을 설정하기 위한 절차입니다.
TCP의 3-way Handshaking 과정
[STEP 1]
우선 클라이언트가 서버에 연결을 요청하는 SYN 세그먼트를 보냅니다. 이 세그먼트에는 초기 순서 번호와 윈도우 크기 정보가 포함되어 있습니다. 클라이언트는 SYN를 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 됩니다.
[STEP 2]
서버는 SYN 요청을 받고 클라이언트에게 요청을 수락한다는 ACK과 SYN Flag가 설정된 세그먼트를 클라이언트에게 보냅니다. 이 세그먼트는 서버의 초기 순서 번호와 클라이언트의 초기 순서 번호에 대한 응답(ACK = 클라이언트의 초기 순서 번호 + 1)을 포함합니다. 그리고 나서 서버는 클라이언트가 다시 ACK으로 응답을 기다리는 SYN_RECEIVED 상태가 됩니다.
[STEP 3]
클라이언트는 서버의 응답을 확인하고, ACK Flag가 설정된 세그먼트를 서버에 보냅니다. 이 세그먼트는 서버의 순서 번호에 대한 응답(ACK = 서버의 초기 순서 번호 + 1)을 포함합니다. 이 절차가 완료되면 클라이언트와 서버 간에 신뢰할 수 있는 연결이 설정되고, 데이터 전송이 시작될 수 있습니다. 이때 서버와 클라이언트는 모두 ESTABLISHED 상태가 됩니다.
Q2. TCP 4-way handshake에 대해서 설명해주세요.
3-Way handshake는 TCP의 연결을 초기화 할 때 사용된다면, 4-Way handshake는 세션을 종료하기 위해 수행되는 절차입니다.
TCP의 4-way Handshaking 과정
[STEP 1]
클라이언트가 연결을 종료하겠다는 FIN Flag를 전송합니다.
[STEP 2]
서버는 일단 확인 메세지를 보내고 자신의 통신이 끝날 때까지 기다리는데 이 상태가 TIME_WAIT 상태입니다.
[STEP 3]
서버가 통신이 끝났으면 연결이 종료되었다고 클라이언트에게 FIN Flag를 전송합니다.
[STEP 4]
클라이언트는 확인했다는 메세지를 보냅니다.
Q3. 리버스 프록시와 포워드 프록시의 차이점에 대해 설명해주세요.
포워드 프록시는 주로 클라이언트 측에 위치하여, 사용자가 인터넷에 접근할 때 중개자 역할을 합니다.
예를 들어, 회사 내부 네트워크에서 근무하는 직원이 외부 웹사이트에 접속하려고 할 때, 포워드 프록시 서버를 통해 요청이 전달됩니다. 이 과정에서 사용자의 실제 IP 주소는 숨겨지고, 프록시 서버의 IP 주소가 대신 사용됩니다.
사용자의 실제 IP를 숨김으로써 개인정보 보호와 보안 측면에서 큰 장점을 제공합니다.
또한 캐싱을 통해 네트워크 성능을 향상시킵니다. 자주 요청되는 웹 페이지나 파일을 프록시 서버에 저장해두면, 동일한 요청이 다시 들어올 때 빠르게 응답할 수 있어 네트워크 대역폭을 절약할 수 있습니다.
이와 함께 보안 강화 기능도 포워드 프록시의 중요한 역할 중 하나입니다. 악성 웹사이트나 불법적인 콘텐츠에 대한 접근을 차단하여 네트워크 보안을 강화하고, 바이러스나 악성 코드의 유입을 예방할 수 있습니다.
리버스 프록시는 서버 측에 위치하여 외부에서 들어오는 클라이언트의 요청을 내부 서버로 전달하는 역할을 합니다. 리버스 프록시의 핵심 기능 중 하나는 로드 밸런싱입니다. 다수의 백엔드 서버로 트래픽을 분산시켜 서버 과부하를 방지하고, 서비스의 고가용성을 유지할 수 있습니다.
또한 외부에서 직접 백엔드 서버에 접근하지 못하게 하여 DDoS 공격이나 해킹 시도로부터 서버를 보호할 수 있습니다.
SSL 종료는 리버스 프록시의 또 다른 중요한 기능입니다. SSL/TLS 암호화를 리버스 프록시에서 처리함으로써 백엔드 서버의 부담을 줄이고, 중앙에서 인증서를 관리할 수 있습니다.
또한, 리버스 프록시는 캐싱 및 콘텐츠 최적화 기능을 통해 정적 콘텐츠를 캐싱하여 응답 속도를 향상시키고 서버 부하를 줄일 수 있습니다.
Q4. 클래스풀 IP 주소 체계에 대해서 설명해주세요.
클래스풀 주소 체계(Classful Addressing) 은 IP 주소를 규격화된 크기별로 구분시키는 방식입니다. IP 주소를 클래스(A,B,C 등)별로 규격화(유형화)시켜, 쉽게 식별할 수 있도록 합니다.
클래스풀 주소 체계는 클래스별로 네트워크 크기가 고정되어 있기 때문에 다수의 IP 주소가 낭비될 수 있다는 한계점이 존재합니다. 예를 들어, 특정 조직에 컴퓨터가 255개라면 C 클래스 주소를 사용하지 못하고, B 클래스를 사용해야 하는데요. 이러한 상황에서 IP 주소의 낭비가 발생할 수 있습니다. 이러한 문제를 해결하고, 더욱 유동적인 방식으로 네트워크를 구획할 수 있도록 클래스리스 주소 체계가 등장했습니다.
Q5. 클래스리스 주소 체계는 무엇인가요?
클래스리스 주소 체계는(Classless Addressing) 클래스가 아닌 서브넷 마스크를 이용해 네트워크 주소와 호스트 주소를 구분하는 IP 주소 체계입니다. 이때, 서브넷 마스크는 네트워크 구분을 위한 비트열을 의미합니다. 해당 비트열에서 네트워크 주소는 연속된 1(이진수), 호스트 주소는 연속된 0(이진수)으로 표현합니다. 특정 IP 주소와 서브넷 마스크를 비트연산을 수행하면, 네트워크 주소를 알아낼 수 있습니다. 예를 들어, 서브넷 마스크가 255.255.255.0, IP 주소가 168.168.168.168인 경우, 비트연산을 수행하면 네트워크 주소인 168.168.168.0 를 알아낼 수 있습니다. 이 경우, 1옥텟을 호스트 주소로 사용할 수 있습니다.
서브넷 마스크를 표기할 때는 CIDR(Classless Inter Domain Routing Notation) 표기법을 사용할 수 있는데요. IP 주소/서브넷 마스크 비트열의 1의 수 형식으로 표현합니다. IP 주소가 168.168.168.168이며, 서브넷 마스크가 255.255.255.0인 경우에는 168.168.168.168/24 와 같이 표기할 수 있습니다.
Q6. NAT 기능을 사용하는 이유를 알고 계신가요?
사설 IP 주소만을 가지고 외부 네트워크와 통신하기 어렵기 때문에 이 문제를 해결하기 위해서 라우터 혹은 공유기의 NAT(Network Address Translation) 기능을 사용하는데요. NAT는 IP 주소를 변환하는 기술입니다. 해당 기능을 사용하면, 사설 IP 주소를 외부 네트워크에 사용되는 공인 IP 주소로 변환하여 외부 네트워크와 통신할 수 있습니다.
예를 들어, 사설 네트워크에서 출발한 패킷에 존재하는 사설 IP 주소(송신지)가 라우터를 거쳐 공인 IP로 변경됩니다. 그리고, 외부 네트워크로부터 출발한 패킷에 존재하는 공인 IP 주소(수신지)는 NAT 기능을 통해서, 사설 IP 주소로 변경되고 사설 네트워크 속 호스트에게 전달됩니다. NAT에서 주소 변환을 하기 위해서 내부적으로 공인 IP 주소와 사설 IP 주소가 대응되어 있는 NAT 변환 테이블을 사용합니다.
Q7. 정적 IP 주소 할당 방식과 동적 IP 주소 할당 방식의 차이점을 설명해주세요.
네트워크에서 호스트에게 IP를 할당하는 방식은 크게 정적 할당 방식과 동적 할당 방식이 존재합니다.
정적 할당 방식은 호스트에게 IP를 할당할 때 수동으로 설정하는 것을 의미합니다. 일반적으로 정적으로 IP를 할당하기 위해서는 부여하고자 하는 IP 주소, 자신의 네트워크의 서브넷마스크, 자신의 게이트웨이, DNS 주소가 필요합니다. 만약, IP 주소를 정적으로만 할당한다면 호스트의 수가 많아질수록 IP 할당이 번거로워질 수 있으며, 중복 IP를 입력하는 등 실수를 유발할 수 있습니다. 이러한 경우에 동적 할당 방식을 사용할 수 있는데요.
동적 할당은 호스트 IP를 자동으로 할당하는 방식이라는 점에서 정적 할당 방식과 차이가 있습니다. 동적 할당 방식은 주로 DHCP(Dynamic Host Configuration Protocol) 을 사용합니다. 동적 할당 방식은 DHCP를 이용해 현재 사용하지 않는 IP를 호스트에게 임대해줍니다. 따라서, 동적 할당 방식을 사용하는 경우에는 IP 주소가 고정적이지 않으며, 바뀔 가능성이 존재합니다.
Q8. DHCP를 이용한 IP 주소 할당 과정은 어떻게 되나요?
DHCP를 이용한 동적 할당 방식은 호스트와 DHCP 서버(일반적으로 라우터)간에 통신으로 이루어집니다. 크게 4가지 단계로 나누어 IP 주소를 할당합니다.
- Discover 단계에서 호스트는 Discover 메시지를 브로드캐스팅하여 DHCP 서버를 찾습니다.
- Offer 단계에서 DHCP 서버는 Offer 메시지를 호스트에게 전송합니다. Offer 메시지에는 호스트에게 할당해 줄 IP 주소와 임대 기간이 포함되어 있습니다.
- Request 단계에서 호스트는 DHCP Offer 메시지에 대한 응답을 수행합니다. 호스트는 Request Message를 브로드캐스팅합니다.
- Acknowledgment 단계에서 DHCP 서버는 ACK 메시지를 호스트에게 전송하여 IP 임대를 승인합니다.
Q9. DNS란 무엇인가요?
IP 주소는 변환될 수 있으며, 기억하기 어렵기 때문에 대부분의 웹 서비스는 도메인 주소를 사용합니다. DNS(Domain Name System) 는 도메인 주소에 대응되는 원격 호스트 IP 주소를 관리하고 질의할 수 있는 시스템 혹은 이를 이용하기 위한 프로토콜을 의미합니다.
Q10. 네트워크에서 회선 교환 방식과 패킷 교환 방식은 어떤 차이점이 있나요?
네트워크에서 회선 교환 방식(Circuit Switching) 이란 특정 사용자를 위한 회선의 경로를 미리 설정하고 이 경로를 이용해서 호스트끼리 메시지를 주고받는 방식을 의미합니다. 회선 교환 방식은 미리 회선을 설정한다는 점에서 주어진 시간 동안에 전송되는 데이터의 양이 비교적 일정하고 안정적입니다. 다만, 회선 이용 효율이 떨어진다는 단점이 존재합니다. 회선 교환 방식의 대표적인 사례로는 유선 전화망이 있습니다.
반면, 패킷 교환 방식(Packet Switching) 은 목적지를 정해두고 메시지를 패킷으로 분할해서 보내고, 목적지에서 패킷을 조립해서 확인하는 방식입니다. 패킷 교환 방식에서 라우터는 주어진 패킷을 최적 경로로 전달하는 핵심적인 역할을 수행합니다. 이러한 특성으로 인해서 경로는 수시로 변경될 수 있고, 데이터를 전송하는 동안에만 네트워크 자원을 사용한다는 점에서 회선 교환 방식과 차이가 있습니다. 패킷 교환 방식은 회선 이용 효율이 높습니다. 하지만, 경로 탐색에서 지연이 발생하거나, 패킷을 위한 헤더로 인한 오버헤드가 발생할 수 있습니다.
Q11. 브로드캐스트가 무엇이며, 언제 사용하는지 설명해 주세요.
브로드캐스르란 네트워크 내 모든 호스트에게 패킷을 전송하는 방식을 말합니다. 브로드캐스트가 사용되는 대표적인 상황에는 ARP request를 보내는 상황이 있습니다.
Q12. 캡슐화가 무엇인지 설명해 주세요.
네트워크 송신 과정에서 네트워크 참조 모델의 상위 계층 패킷은 하위 계층의 트레일러가 되어 헤더가 덧붙는 과정이 반복됩니다. 네트워크를 통한 송신 과정에서 여러 프로토콜 헤더가 덧붙은 이 과정을 캡슐화라고 합니다.
Q13. MAC 주소와 IP 주소가 각각 무엇인지, 왜 두 주소를 함께 사용하는지 설명해 주세요.
MAC 주소는 네트워크 인터페이스에 할당되는 물리적 주소로, 로컬 네트워크 내에서 장치를 식별하는데 사용합니다. 그리고 IP 주소는 네트워크 간 통신에서 호스트를 식별하는 논리적 주소입니다. 한 호스트가 모든 네트워크, 모든 호스트의 MAC 주소를 기억하기 어렵고, MAC 주소만으로는 네트워크 간의 이동 경로 파악, 즉 라우팅이 불가능하기 때문에 IP 주소도 함께 사용하는 것입니다.
Q14. 포트 번호란 무엇이며, 왜 포트 번호가 존재해야 하는지 설명해 보세요.
포트 번호는 컴퓨터 네트워크에서 특정 프로세스를 식별하기 위해 사용하는 숫자입니다. IP 주소가 네트워크 상의 특정 장치를 식별하는 역할이라면, 포트 번호는 그 장치 내에서 실행 중인 특정 프로세스를 식별하는 역할을 합니다. 프토 번호 없이 IP 주소만으로는 패킷을 최종적으로 주고받을 프로세스를 식별할 수 없기 때문에 포트 번호를 사용합니다.
Q15. 서브네팅을 하는 이유를 설명해 주세요.
서브네팅은 IP 주소를 토대로 네트워크를 더 작은 서브네트워크로 나누기 위해 사용합니다. 서브네팅을 통해 IP주소와 네트워크를 효율적으로 구획하고 관리할 수 있습니다.
Q16. TCP와 UDP의 차이점이 무엇인지, 두 방식을 사용하는 경우가 어떻게 다른지 설명해 주세요.
TCP와 UDP의 차이점은 신뢰성과 연결 방식에 있습니다. TCP는 신뢰할 수 있는 연결형 프로토콜로, 데이터를 전송하기 전에 연결을 수립하고 상태 관리, 흐름 제어, 오류 제어, 혼잡 제어 등의 기능을 통해 데이터의 신뢰성과 순서를 보장합니다. 반면, UDP는 신뢰할 수 없는 비연결형 프로토콜로, 연결 수립 과정 없이 빠르게 데이터를 전송할 수 있지만, 데이터의 신뢰성과 순서를 보장하지는 않습니다.
Q17. HTTP가 스테이트풀한지, 스테이트리스한지에 대해 그 이유와 함께 설명해 주세요.
HTTP는 스테이트리스 프로토콜입니다. 즉, 서버가 클라이언트의 상태를 기억하지 않기 때문에 클라이언트의 모든 HTTP 요청이 독립적으로 처리되며, 각 요청은 이전 요청과 무관하게 다뤄집니다. HTTP가 스테이트리스한 이유는 서버가 클라이언트 다수의 상태를 유지하는 부담을 줄이기 위함입니다. 클라이언트의 상태를 유지하려면 서버 간의 상태 정보를 공유해야 하므로 복잡하고 번거롭습니다. 또한 스테이트리스한 특성은 서버를 쉽게 추가하거나 대체할 수 있어 확장성과 견고함을 높일 수 있습니다.
Q18. 웹 브라우저 상에 ‘https://www.google.com’을 입력해 웹사이트가 뜨기까지의 과정을 설명해 주세요.
가장 먼저 로컬 DNS 서버에 ‘www.google.com’에 해당하는 IP 주소가 캐시되어 있는지를 확인합니다. 만약 로컬 DNS 서버가 해당 IP 주소를 저장하고 있다면 해당 IP 주소를 응답하고, 저장하고 있지 않다면 루트 DNS 서버부터 ‘com’ 최상위 도메인(TLD) 서버, google 도메인 서버 등 도메인 네임을 순차적으로 질의하여 IP 주소를 얻어 냅니다.
그리고 클라인트가 IP 주소를 알게 되면 해당 IP 주소로 TCP 연결을 설정합니다. 이 과정에서 TCP의 쓰리 웨이 핸드셰이크가 수행됩니다. 클라이언트가 서버에 SYN 패킷을 보내고, 서버가 SYN-ACK 패킷으로 응답하면 다시 클라이언트가 ACK 패킷을 보내 연결을 확인합니다.
TCP 연결이 설정되면 HTTP 요청을 보냅니다. HTTPS의 경우 SSL/TLS 핸드셰이크가 추가로 수행되어 보안 연결을 설정합니다. 이후 클라이언트는 GET 요청을 통해 리소스를 요청하고, 서버는 필요한 데이터를 준비하여 HTTP 응답으로 보냅니다.
Q19. HTTP가 스테이트리스하다면 [오늘 하루 그만보기]와 같은 기능은 어떻게 구현할 수 있나요?
[오늘 하루 그만보기] 기능은 쿠키를 사용해 구현할 수 있습니다. 쿠키는 클라이언트의 상태를 유지하지 않는 스테이트리스 프로토콜의 한계를 보완하는 수단입니다.
Q20. HTTP 1.1과 HTTP 2.0의 차이점을 설명해 주세요.
HTTP 2.0은 HTTP 1.1의 데이터 송수신 방식과 성능을 개선한 버전입니다. 지속 연결을 처음 공식적으로 지원한 HTTP 1.1은 평문으로 메시지를 주고받는 반면, HTTP 2.0은 바이너리 데이터를 기반으로 송수신하고, 헤더 압축과 서버 푸시 기능을 제공하여 성능을 향상시켰습니다. 또한 HTTP 2.0은 멀티플렉싱을 통해 여러 요청을 병렬로 처리하여 HOL 블로킹 문제를 완화했습니다.
Q21. 리다이렉션의 정확한 의미를 설명해 주세요.
리다이렉션은 웹 서버가 클라이언트에게 요청한 자원이 다른 위치로 이동했음을 알리고, 해당 위치로 클라인트를 자동으로 이동시키는 동작을 의미합니다.
Q22. HTTP 요청 메시지를 보낸 클라이언트들이 이전에 접속한 URL을 알고 싶을 때는 어떻게 해야 할까요?
Referer 헤더를 확인하면 됩니다. Referer 헤더에는 클라이언트가 HTTP 요청 메시지를 보낼 때 머물렀던 URL이 명시되어 있어 이전에 접속한 URL을 확인할 수 있습니다.
Q23. HTTP 캐시가 오래될 경우 원본 데이터와의 차이가 발생할 수 있습니다. 이 문제를 해결하는 방법을 설명해 주세요.
캐시된 데이터와 원본 데이터가 불일치할 경우, 클라이언트는 If-Modified-Since 헤더나 If-None-Match 헤더를 사용해 서버에 원본 데이터의 변경 여부를 확인할 수 있습니다. 이때 If-Modified-Since 헤더는 특정 날짜 이후의 변경 여부를 확인하고, If-None-Match 헤더는 자원의 버전 식별자인 Etag 값을 사용해 변경 여부를 확인합니다. 서버는 버전 변경이 없으면 304 상태 코드로 알리고, 변경이 있으면 새로운 자원을 반환합니다.
이 페이지는 면접 준비를 위한 정리 페이지입니다.