[CS] TCP, 3-way handshake (with 기술면접 질문)

박상원·2022년 10월 21일
1

Computer Science

목록 보기
1/1

TCP에 대한 정보는 아래로 스크롤해주세요

왜 이해가 중요할까

최근 면접을 진행하면서 다양한 질문이 나오는데, 신입 개발자들에게서 특징적으로 예상질문을 외운듯한 느낌을 받는 부분은 CS(Computer Science) 이다. 사실 CS는 외우는 과목일지도 모르지만, 전반적인 컴퓨터 과학이라는 분야를 이해하지 않는다면 쓸모가 없는 지식으로 남을 수 밖에 없다. 특히나 가장 인기가 많을만한 서비스분야의 개발자 면접에서는 더욱 그렇다 얉은 지식으로 역질문세례를 받을 수 있기 때문에 질문 외의 다량의 지식이 과연 얼마나 면접자에게 이득일까?

단순히 면접을 통과하기 위함으로 CS를 공부하는게 맞을지부터 생각해야한다. 물론 단순한 지식을 암기하면서 통과는 가능할 것이다. "나는 이런 지식도 알아." 하지만 해당 지식을 안다고해서 앞뒤 이해가 없이 암기하는건 그냥 모르고 logical 한 분야만 잘한 것보다 오히려 마이너스 요인이 될 수 있다. 우리의 경우만 그럴지 몰라도, 서비스 개발자 면접은 CS 지식보다 실제 문제해결하는 접근에 초점을 많이 맞추는 것 같다.

요즘 신입개발자는 50:50으로 전공/비전공자인 것으로 보인다. 최근 늘어난 비전공자 커리큘럼의 확대로 다양한 지원자가 늘어서 오히려 현업 회사 입장에서는 좋지만, 좋은 개발자를 구분하는 것도 더 어려워졌다.

그럼 본론으로 돌아와서 면접에서 CS 질문에 대한 대답은 어떻게 하면 좋을까.

지난 면접 중 개인블로그에 CS 공부를 많이하셨고, 기록을 남기신 분이 있었서 간단하게 하나를 질문드린적이 있다. 그리고 질문들 중 TCP 에 대한 답변이 나온적이 있다. 브라우저부터 서버까지의 어떤 일이 발생하느냐는 질문에서 답변이 네트워크의 모든 라이프사이클을 설명하는 답변하면서 TCP 를 말씀하셨고 바로 3 way handshake 를 언급하셨다. 비전공자로서 TCP와 3-way handshake 를 알고있다는 것만으로도 솔깃했다. 그러고 이어진 3-way handshake 의 질문을 했고 TCP 에서 용도가 무엇이냐라는 질문이 이어졌다.

답변은 단순히 TCP 통신을 위한 세션 연결의 확인을 위함이라고 답변을 들었다. 틀린 답은 아니다. 그런 용도로 정의를 할 수 있지만, 다양한 블로그의 CS 지식과 동일한 답변을 들은게 전부였다. 이것만으로 면접의 합.불을 결정할 수 없었지만 대부분의 답변이 이런식의 단순하게 다른 기술정리 블로그에서 볼법한 지식 서술이었기 때문에 문제가 될 수 있었다.

트랜스포트 프로토콜

TCP 를 이해하기 위해선 트랜프포트 프로토콜의 이해가 필요하다. 트랜스포트 프로토콜은 TCP/IP 프로토콜 중 하나의 계층이며 호스트 종점(E2E)간 연결관리와 흐름제어를 처리해준다. 오늘 주제인 TCP가 이 계층에 속하여 처리를 수행하게 된다. 트랜스포트 계층은 TCP 와 UDP 로 구성되어있고 TCP의 가장 기본적인 기능은 신뢰성 있도록 Stream 형태의 연결 서비스를 제공한다. TCP가 지원하는 응용 계층으로는. FTP(File Transfer Protocol), HTTP(HyperText Transfer Protocol) 이 서비스로 있다. 위 면접 주제에서 나오는 도메인간 요청 과정이 바로 여기에 해당한다.

이 계층 덕분에 종점간 통신을 자유롭게 데이터를 전달할 수 있는 상태를 얻게된다. 트랜스포트 계층이 이용하는 IP 가 호스트간 논리적 통신을 제공하는 Best-Effort delivery 서비스이기 때문이다. IP는 비신뢰적인 서비스이기 때문에 호스트간 세그먼트의 무결성을 보장하지 않는다.

TCP는 연결형 서비스로 종점간 연결 개설, 오류 발생시 패킷의 재전송, 순서확인, 중복제거, 흐름제어 등의 서비스를 총괄적으로 제공해준다. 덕분에 TCP는 신뢰할 수 있는 데이터 전송을 제공한다. TCP가 이용하는 응용계층의 서비스로 HTTP 가 있는데, 트랜스포트 프로토콜이 수신한 메세지를 전달한 응용 프로세스를 고유 번호로 구분하여 사용하는데 이 때 80 port 가 지정된다. 고유한 80번은 IP를 통해 받은 프로세스를 최종적으로 구분하기 위해 well-known 포트를 지정하여 쓰는 것이다.

지금까지 주절주절 이야기한 걸 정리하면 TCP 기능은 End-to-End 간 신뢰성 스트림을 형성하고 응용계층 프로세스에 투명한 데이터전송 채널을 제공하는 것이라 할 수 있다.

3-Way Handshake

TCP 에서는 연결설정을 통해 양방향 통신이 가능한 스트림을 생성하게 되는데, 한 번의 연결설정만으로도 송수신이 가능하게 된다.

이때 사용되는 것이 3-Way handshake 이다. 연결 요청을하면 다른 종점도 이를 확인하면서 새로운 연결 을 요청하게되고 처음 요구 측에서 확인을 하면서 연결이 되는 방식이다. 더 중요한 이유는 하위 계층인 인터넷 계층이 비연결형 서비스로 단순한 최선의 패킷 전송만 제공하므로 종점간 안정적인 연결을 신중하게 확인하기 위해서다.

방식은 다양한 블로그에도 설명이 되어있어 간단하게 적어본다. TCP에서 요구된 데이터(대용량)는 나뉘어 보내지고, 여러개의 데이터로 보내져야하는데 데이터 블록(패킷)에 실어 보내는 사용자의 데이터를 세그먼트라한다. TCP는 데이터를 쪼개어 패킷으로 보내며서 전송한 데이터의 양을 TCP Header에 바이트 단위로 기록하게 된다. 이 세그먼트가 몇번쨰 바이트까지 보낸지를 Sequence Number 로 사용한다. Acknowledgement Number 는 받고자 하는 순서가 적혀있다.

3-way handshake 를 설명할 때 나오는 용어는 ACK, SYN, seq number 가 나오며 ACK는 Ack number 가 유효함을 뜻하는 1비트로 표현되고, SYN은 연결요청시 사용되며 seq number값이 초기값인것을 표현하며 1비트다.

  1. SYN, seq number = x 를 서버로 요청

  2. 서버는 ACK, SYN, Ack Number = x + 1, seq number = y 설정 후 클라이언트로 전송

  3. ACK, Ack Number = y+1 서버로 전송

    위 세가지 요청을 처리하면 두 종점은 연결된다. 연결이 이뤄지면, 스트림이 형성되고 데이터 크기와 순서를 유지하면서 전송할 수 있다. (물론 과정에서 암호화가 추가될 수 있다)

    이외에도 흐름제어나 UDP와의 비교가 있겠지만 이 주제에서는 이 내용정도면 충분하다. 결국 TCP의 질문에 대답하려면 이정도의 수준의 대답이아니고서야 대부분의 면접관들은 예상질문을 잘 정리한 답변임을 단번에 눈치챈다. 그냥 자주듣는 답변일지도 모른다.

    즉, CS를 이제 막 공부하는 비전공자의 입장에서도 이정도의 수준을 아는것이 오히려 더 중요하다. 배우는 내용의 깊이가 전공자와 차이가 있을 것이 있는건 부정할 수 없다. 하지만 비전공자나 전공자 구분없이 모두 지식 관심의 차이고, 더 깊은 내용을 알아야하는 것이 개발자, 엔지니어로서 더 중요한 자세일 것이다. 개발자의 차이는 깊은 내용을 탐구하고자하는 자세가 필수다. 전공/비전공의 차이를 극복하기위해 단시간에 CS 지식을 얻는것은 어렵다. 하지만 답변을 할 때, 다양한걸 아는 것보다 흐름과 관계를 아는 답변이 더 가산점을 챙겨갈 수 있다는 것을 인지해야한다.

profile
BE Dev

0개의 댓글