기술면접을 준비하며 기본적인 CS지식에 대해 공부하고있다. 자료구조나 알고리즘 뿐만 아니라 네트워크와 관련된 기본적인 지식들을 공부하며 정리해봤다.
우리는 인터넷을 사용하면서 http라는 단어를 굉장히 많이 보게된다. 이는 인터넷을 사용하면서 웹에서 데이터를 주고받을때 사용하는 프로토콜을 말한다.
하지만 http는 별다른 보안대책이 없기때문에 이를 보완한 https가 등장했다. https의 s는 SSL (Secure Socket Layer)를 의미하는데 http를 통한 통신 이전에 보안소켓 레이어를 거쳐 데이터가 암호화 되어 전송될 수 있도록 만들어준다.
https는 데이터를 전송하기 전 hand shake라는 과정을 거친 후 데이터를 전송하게 되며, 이 과정을 통해 클라이언트와 서버가 안전하게 연결된다.
hand shake과정을 살펴보면 다음과 같은 단계로 연결이 이루어진다.
- 서버와 클라이언트가 연결되면 서버에서는
공개키 암호화를 위해 생성한 공개키가 포함된 인증서를 클라이언트로 전송한다.
- 클라이언트가 인증서를 전달받으면 해당 인증서가 신뢰할 수 있는지 검사한뒤 신뢰가 가능한 경우
대칭키 암호화를 위해 임시로세션키라는 암호화키를 생성한 다음 전달받은 공개키로 암호화를 한 뒤 서버로 전달한다.
- 서버에서 암호화된
세션키를 전달받으면개인키를 통해 복호화를 진행해 데이터를 전송할때세션키를 통해 암호화해 전송한다.
위처럼 hand shake과정을 거치게 되면 기존 http통신을 안전하게 할 수 있게 된다.
인터넷이 너무 흔한 요즘 IP라는 단어는 너무나 보편적인 단어가 되었다. 그래서 IP가 정확히 뭘까?
IP는 인터넷을 사용하며 데이터를 전송할때 사용하는 프로토콜로 데이터를 어디에서 어디로, 어떻게 전송할 것인가?를 결정한다.
IP프로토콜로 데이터를 전송하는 과정은 다음과 같다.
- 데이터를
패킷이라는 작은 단위로 나누어 전송하게 된다.
라우터에서 보내는 컴퓨터의IP 주소와 받는 컴퓨터의IP 주소를 확인해 최적의 전송 경로를 찾는다.
각각의 컴퓨터들은 고유한 IP 주소를 가지게 되고 이를 식별해 데이터를 전송/수신 할 수 있게 되는 것이다.
보통 TCP/IP와 같이 사용되는데 TCP역시 데이터 전송시에 사용되는 프로토콜의 하나이다.
IP는 네트워크레이어 에서 작동되는 프로토콜로 네트워크에 연결된 컴퓨터 간에 '데이터를 어떻게 전송할 것인가'를 결정한다.
TCP는 전송레이어에서 작동되는 프로토콜로 '데이터를 어떻게 정확하게 보내는가?'에 대해 초점이 맞춰진 프로토콜이다.
IP는 데이터를 어떻게 보내는지만을 결정하기 때문에 패킷으로 분할된 데이터가 어떤순서로 전송되는지, 유실되는것은 없는지에 대해서는 규제하지 않는다. 그래서 TCP를 사용해 데이터의 신뢰성을 높인다.
TCP는 여러가지 방법을 통해 전송하는 데이터와 전송받은 데이터를 같게 만드는, 즉 신뢰성을 높이는 역할을 한다.
- 서버와 클라이언트가 연결 될 시
3-way hand shake를 통해 확실하게 연결이 되었음을 확인한다.
- 서버와 클라이언트가 연결되어 있는 동안
패킷들을 전송하며, 수신한 패킷들의 순서가 다를 경우 재조립하고, 유실된 패킷들은 재전송을 통해 전성된 데이터와 수신한 데이터가 일치하도록 관리한다.
- 모든 전송이 끝나면
4-way hand shake를 통해 서버와 클라이언트의 연결을 확실하게 해제한다.
이처럼 TCP는 다양한 방법을 통해 데이터의 신뢰성을 높이는 프로토콜이며, 여러가지 검증과정을 거치기 때문에 느리다는 단점이 있다.
따라서 이메일전송, 파일전송과 같이 속도와 관계없이 정확한 데이터를 전달해야하는 경우 주로 사용되는 프로토콜이다.
TCP가 신뢰성을 위한 프로토콜이라면 UDP는 속도를 위한 프로토콜이다. UDP역시 TCP와 같이 전송레이어에서 작동하며, 속도를 위해 TCP와 같은 신뢰성 확인 절차를 거치지 않는다.
즉 연결을 확인하기위한 hand shake과정이나 소실된 패킷 재전송, 순서확인과 같은 과정을 거치지 않기 때문에 보다 빠른 속도로 전송이 가능한 것이다.
이러한 특성때문에 UDP는 데이터가 정확히 전달되지 않아도 되지만 빠르게 전송되어야하는 인터넷 전화나 스트리밍과 같은 서비스에서 사용된다.
TCP프로토콜 사용시 서버와 클라이언트의 연결을 보장하는 방법이다. 말그대로 서로가 연결되었다는 것을 확인하고 나서 데이터를 전송하기위해, 서로가 연결을 확인하는 것이다.
그 과정은 다음과 같다.
- 서버와 클라이언트가 연결되면 클라이언트가 연결을 시작하겠다는 의미의
syn패킷을 서버로 전송한다.
syn패킷을 전달받은 서버에서는 연결에 대한 답변으로ack패킷을 만들어 전송하며 다시 연결을 시작하겠다는syn패킷을 함께 전송한다. (syn-ack패킷 전송)
- 클라이언트에서
syn-ack패킷을 받으면 다시 연결되었다는 답변으로ack패킷을 서버로 전송한다.
- 서버에서
ack패킷을 전달받으면 연결이 제대로 되었다고 판단하고 이후부터 데이터 전송을 시작한다.
이처럼 '서버에 syn패킷 전송 - 클라이언트에 syn-ack패킷 전송 - 서버로 ack패킷 전송' 이라는 3단계를 거치기 때문에 3-way hand shake라고 부른다.
TCP프로토콜은 연결 뿐 아니라 연결이 해제될 때에도 확인하는 과정을 거치는데 이 과정이 4단계로 이루어져 4-way hand shake라고 부른다.
- 데이터 전송이 완료되면 클라이언트에서 서버로
fin패킷을 보낸다.
- 서버에서는
fin패킷에 대한 해답으로 더이상 데이터를 전송하지 않겠다는 의미의ack패킷을 보낸다.
- 서버 역시 모든 데이터를 전송하고 난 뒤 모든 데이터가 전송되었음을 알리기위해
fin패킷을 클라이언트로 전송한다.
- 클라이언트에서
fin패킷을 전송받으면 이에대한 해답으로ack패킷을 서버로 전송한다.
- 서버에서
ack패킷을 전달받으면 서버의 연결이 해지되었다는게 확인된다.