2018 - 03 - 20 (화)
면접질문
개발자로 진로를 결정하고 직무교육을 이수한뒤 첫번째 면접이었다. 면접 내용은 나에게는 너무 당황스러울 수 있는 내용이었다.. 물론 전공적인 지식을 어느정도 갖추고 있어야 되는것은 사실이지만 많이 부족하다고 생각했던터라 이렇게 정리하면서 다시 한번 네트워크 부분을 다잡게 되었다.
1)OSI 7 Layer 란 무엇인가?
전공관련 면접질문 중 가장 처음에 받았던 질문이었습니다. 저는 당시 정보처리기사 과목을 공부했었던 경험과 제 생각을 조합하여 대답하였으나 저의 부족함을 깨닫고 면접 후 [컴퓨터 네트워킹 하향식 접근] 이라는 책을 한권 사서 읽어보고 있는 중입니다.
우선 제가 당시 면접 때 답하였던 내용은 OSI 7 Layer 에서 웹개발자로서 인지하고 있어야할 부분은 Application layer ~ Transport layer라고 하였습니다. 추가하자면 OSI 7 계층 이란 양자가 통신할 때 보내는 패킷(데이터) ( 포트 넘버, IP, Checksum, etc…)를 캡슐화 / 역캡슐화 하는 단계라고 할 수 있을 것 같습니다.
2)TCP 와 UDP의 차이점을 말해보세요..
우선 양자 프로토콜의 공통점은 Transport Layer 의 프로토콜이라는 점입니다. 해당 계층의 경우 포트넘버를 부여하는 계층이기도 하며 어떻게 보면 특정 서비스의 성격? 에 맞게 잘 적용해야 하는 부분이기도 하다고 생각합니다. (속도가 중요시되는 경우는 UDP, 정확성이 중요시되는 부분은 TCP)
TCP와 UDP 의 차이점 중 가장 큰 차이점은 신뢰적인 전송의 유무라고 생각합니다. 사실 제가 면접당시 대답할 때에는 신뢰적인 전송을 가능케하는 TCP 프로토콜의 패킷의 헤더정보를 알지 못했습니다.
2-1) TCP
2-1-1)TCP의 경우 연결 지향형, 신뢰적 전송을 하게 됩니다.
2-1-1-1)이 신뢰적 전송을 가능하게 해주는 첫번째 요소는 체크썸 입니다. 체크썸은 출발지의 TCP 헤더 중 체크썸 필드에 3개의 16비트 워드가 있고 이 3개의 비트를 모두 더한 비트(16비트 크기)의 값을 보낸 후 목적지에서 체크썸 데이터를 포함한 총 4개의 16비트를 더하여 111111111111이 나오지 않고 이 중 하나라도 0이 나오면 오류가 발생했음을 인지하는 것입니다.
2-1-1-2)신뢰적 전송을 하게하는 두번째 요소는 Sequence number입니다. 패킷의 헤더정보에 해당 필드를 추가하여 중복여부를 판단하여 패킷을 폐기해준다.
2-1-1-3)세번째 요소는 ACK/NAK 필드입니다. 수신 측에서는 패킷의 정확한 수신 여부에 따른 응답메시지를 보내게 되는데 정상수신의 경우 ACK 비정상 수신의 경우 NAK 메시지를 보내게 됩니다.
2-1-1-4)네번째 요소는 타이머입니다. 패킷은 중간에 유실될 위험이 있습니다. 이러한 경우 언제까지 패킷의 도달을 기다릴 수 없기 때문에 타이머를 설정하여 일정 시간내에 패킷에 대한 ACK 응답이 오지않을 경우 이전의 패킷들을 수신 버퍼에 저장하고 이 후의 패킷에 대한 재전송 요청을 하게 됩니다.
2-1-2)이 외에도 TCP는 UDP에서 지원하지 않는 흐름제어, 혼잡제어 등의 기능을 제공해주고 있습니다.
2-1-2-1) 흐름 제어 (스피드 매칭 같은 것으로 수신 측의 버퍼 사이즈를 감안하여 윈도우 사이즈를 조절하는 것으로 TCP 헤더에 receive window 필드를 추가하여 수신 측과의 속도를 일치시켜 오버플로우 방지)
2-1-2-2) 혼잡 제어 (혼잡제어는 TCP송신자 측면에서 네트워크에서 혼잡이 발생할 경우를 억제하는 방법이다. 가령, 송신자는 네트워크 혼잡 정도에 따라 송신율을 높이거나 낮춘다. 이를 실현하기 위해 우선 송신 측은 Congestion window(cwnd) 라는 변수를 기록하는데, 이는 TCP 송신자가 네트워크로 트래픽을 전송할 수 있는 비율을 제한하도록 한다. )
2-2) UDP
2-1-1)UDP의 경우 비신뢰적 전송 및 최선형 전송을 하게 됩니다.
UDP는 사실상 Best effort service를 하는 IP 와 마찬가지로 보장해주는 부분이 없습니다. UDP의경우 체크썸은 하지만 이에 대한 재전송 요청을 하지는 않습니다. 그만큼 헤더에 들어가는 정보가 TCP에 비해 매우 간소화 되었지만 그 만큼 속도 측면에서 빠르다고 할 수 있습니다.
3)HTTP 프로토콜에 대해서 설명해보세요
웹에서 가장 중요한 부분이라고 해도 과언이 아닙니다. 우선 클라이언트와 서버는 HTTP 메시지를 통해 통신을 하게 되며 HTTP 는 TCP 전송 프로토콜을 사용하게 됩니다. 연결 지향형인 TCP 프로토콜은 3-way-handshaking 을 통해 웹서버와 클라이언트 연결이 완료 후에 클라이언트가 HTTP request를 보내게 됩니다. 여기 까지가 제가 알고있던 내용이었습니다.
3-1)HTTP 메시지 포맷
면접 당시 가장 당황했던 질문 이었던 것 같습니다. 사실 당시에 이 질문을 받고 집에 가면서 계속 구글링을 해보면서 찾아보았지만 질문을 제가 정확히 이해하지 못했는지 아니면 제가 답을 찾았어도 이해를 못하는건지 알 수 없었습니다. 현재 제가 이해한 답은 이러합니다. 예를 들어 메시지가 다음 같을 경우
EX)
GET/posting/webSocket.html HTTP/1.1
Host : shinhj7242.github.io
Connection : close
User-agent: mozilia/5.0
Accept-language : fr
즉, HTTP 정보에는 어떤 방식의 전송방법을 택하였는지 ( POST , GET, PUT, DELETE ) , 어떤 페이지URL를 요구하는지, HTTP 버전은 무엇인지, 호스트 도메인 주소가 어떠한지, 브라우저는 서버에게 지속적인 연결을 원하는지, 브라우저는 무엇인지, 사용자의 어떤 언어 버전을 원하는지에 대한 정보를 포함하고 있습니다. Transport layer에서 세그먼트(패킷) 을 구성하는 것처럼 해당 Application layer에서도 위의 정보(메시지)를 캡슐화 하여 하위 layer로 보내게 됩니다.
4) 프로세스와 스레드에 대해서 설명해보세요
저는 면접 당시 프로세스는 업무의 최소 단위이며 스레드는 프로세스 내에서 업무가 주어졌을 때 처리하는 연산장치라고 생각했습니다. 빗대어 말하면 프로세스는 업무가 되고 스레드는 일꾼 이었습니다. 이에 대해 정확한 지식을 가지고 있지 않던 터라 좀 더 상세히 설명을 하지 못한 것 같아 정리하게 되었습니다.
4-1) 프로세스란?
일반적인 정의로 “실행 중인 프로그램” 이라고 합니다. 또한 디스크에 저장되어 있던 어떤 프로그램이 메모리에 적재되어 운영체제의 제어를 받는 상태라고 합니다.
4-2) 스레드 란?
프로세스에서 실행 제어만 분리한 실행 단위로 프로세스안에 존재하여 1개 이상의 스레드는 공통의 목적 달성을 위해 병렬로 수행하게 됩니다. 즉 동시작업이 가능하다고 할 수 있고 이를 통해 사용자에 대한 응답성이 증가하며 효율적인 자원 관리를 할 수 있습니다.
4-2-1) 싱글 스레드와 멀티 스레드
우선 싱글 스레드는 하나의 스레드로 이루어져 처리하는 방식이고 멀티 스레드는 두개 이상의 스레드가 생성되어 처리하는 방식을 말합니다. 멀티 스레드는 여러 개의 스레드를 사용하여 동시 작업을 하기 때문에 “자원을 효율적으로 관리한다.”라고 할 수 있습니다. 싱글 스레드는 한 개의 스레드를 사용하기 때문에 실행 순서대로 처리가 된다. 즉, 동시작업은 불가능 하다.
4-3) 멀티 스레드와 멀티 프로세스
멀티 스레드는 멀티 프로세스와 비교 했을 때 더 효과적인 방법이라고 합니다. 우선 멀티 프로세스는 여러 개의 프로세스를 활용하기에 더 많은 비용이 들거라고 생각했고 들어간 비용에 부흥하는 품질을 제공할 것이라고 생각했습니다. 물론 요청이 많아질수록 CPU에 부담이 더 커지기는 하지만 충돌이 생기지 않는다는 장점이 있다고 하며 구현이 비교적 쉽다고 합니다. 이와 비교하여 멀티 스레드는 저 비용 고 효율이라고 생각했습니다. 우선 멀티 프로세스와 마찬가지로 여러 흐름을 동시에 처리할 수 있다는 장점을 가지고 있고 각각의 스레드가 프로세스 내의 메모리를 공유하기 때문에 좀 더 효율적인 자원관리가 가능하게 됩니다.