[CS] 네트워크

kiwonkim·2021년 10월 8일
0

네트워크란

컴퓨터들이 통신기술을 활용해 그물망처럼 연결된 통신 이용 형태



TCP/IP 5 계층

네트워크 통신이 일어나는 과정을 단계별로 알 수 있고, 문제가 생긴 지점을 파악해 유지보수를 용이하게 하기 위해 나눈 것이다.


1) 물리계층

데이터를 전기적 신호로 변환해 주고받는 역할 수행한다.


2) 데이터 링크 계층

물리적으로 연결된 노드간 데이터 송수신하는 역할 수행한다.
Mac 주소를 이용해 통신한다.


3) 네트워크 계층

IP 주소를 활용해 목적지까지 데이터를 전송한다.
중간 라우터들이 네트워크 계층까지 구현되어 있기에, 라우터를 통해 최적의 경로를 파악 후 전달한다.


4) 전송 계층

TCP/UDP 를 통해 신뢰성 있는 데이터 전송을 담당한다.
응용계층과의 포트를 열어두고, 포트번호를 통해 데이터를 응용계층으로 전달한다.


5) 응용 계층

일반적인 응용 서비스를 수행하는 계층이다.



TCP 와 UDP

  • 전송계층 프로토콜로서 IP의 상위 프로토콜이다.

  • IP 주소는 장비까지 식별 가능하나 프로그램 식별은 불가능하다. 이를 보완하기 위해 포트번호라는 값을 갖으며, 상위 Application 을 식별한다.

  • IP주소+포트번호를 소켓이라하며 네트워크 종단점이 된다.

  • ICMP는 오류 발생여부만을 알려주며 이를 해결하기 위해 TCP와 UDP가 등장하였다.


TCP(Transmission Control Protocol)

  • 데이터의 신뢰성과 순서를 보장한다.

  • 연결 후 데이터를 송수신하는 연결형 프로토콜이다.

  • 흐름제어, 혼잡제어로 데이터 전송속도를 유동적으로 조절한다.

  • HTTP 통신, 파일전송 등에 활용된다.


UDP(User Datagram Protocol)

  • 비신뢰성 프로토콜로서 Ack 확인이나 재전송도 수행하지 않는다.

  • 연결을 맺지 않고 송수신하는 비연결형 프로토콜이다.

  • 크기가 작은 요청만 가능하며, TCP 보다 빠른 속도를 갖는다.

  • 실시간 스트리밍이나, DNS 에 활용된다. DNS는 신뢰성을 Application 계층에서 담당한다.



TCP의 3 & 4 way handshake


3 way handshake

TCP는 신뢰성 있는 송수신을 보장하기 위해 송수신 전에 연결을 수행하는데, 그 연결과정을 3 way handshake라 한다.

  1. 클라이언트가 서버에 SYN을 보낸다.

  2. 서버가 SYN을 받고, 클라이언트에게 ACK와 SYN을 보낸다.

  3. 클라이언트가 서버에게 ACK을 보내면 연결이 완료되고 데이터 송수신이 수행된다.


4 way handshake

TCP는 연결 후 데이터 송수신을 진행한 뒤 연결 해제를 수행한다. 이 연결 해제 과정을 4 way handshake라한다.

  1. 클라이언트가 서버에 FIN을 보낸다.

  2. 서버가 FIN을 받고 클라이언트에게 ACK를 보낸 뒤, 아직 클라이언트에게 남은 데이터를 모두 보내기 위해 CLOSE_WAIT 상태에 들어간다.

  3. 서버가 클라이언트에게 FIN을 보낸다.

  4. 클라이언트는 FIN을 받고 서버에게 ACK를 보낸 뒤, 아직 이전에 보낸 서버의 데이터가 도착하지 않았을 수 있으므로 TIME_WAIT 상태에 들어간다.
    서버가 ACK을 받으면 소켓이 닫히고 연결이 종료된다.



TCP의 흐름제어 / 혼잡제어


TCP는 신뢰성을 보장하여 중간에 loss 되는 데이터가 많을 경우 송신측의 데이터 전송속도를 조절하여 이를 방지한다. 데이터가 loss 되는 경우는 크게 두가지가 있는데 수신측의 처리속도가 느려 loss 되는 경우와 중간 네트워크가 과다하게 혼잡하여 loss 되는 경우이다.


흐름 제어

흐름제어란 송신측의 전송속도에 비해 수신측의 처리속도가 느려, 수신측의 윈도우에서 데이터 loss가 일어나는 것을 방지하는 것이다. 수신자가 송신자에게 자신의 윈도우 상태를 feedback하여, 패킷을 지나치게 많이 받는 것을 방지한다.


stop - and - wait 방식

매번 전송한 패킷에 대해 ACK를 받아야 다음 패킷을 전송하는 방식. 매 패킷마다 ACK를 대기하므로 오버헤드가 크다는 문제점이 있다.


Sliding Window 방식

  1. 수신측이 연결시 송신측에게 자신의 Receiving Window 크기를 알려준다.
  2. 송신측은 해당 윈도우 크기만큼 ACK없이 패킷을 전송한다.
  3. ACK가 도착하는대로 윈도우를 우측으로 옮겨 다음 패킷을 전송한다.

ACK가 들어오는 것에 따라 유동적으로 패킷을 송신함으로서, 수신측이 받을 수 있는 최대 윈도우 크기만큼 계속 데이터를 받을 수 있는 장점이 있다.


혼잡제어

송신측의 데이터는 네트워크를 통해 전달된다. 이 때 중간의 네트워크가 너무 혼잡하여 중간에서 패킷손실이 발생할 수도 있다. 그러면 송신측은 ACK를 받지 못해 타이머가 종료되어 재전송을 수행할 것이고, 이는 네트워크 혼잡 가중을 불러와 악순환에 빠질 수 있다. 중간 네트워크 혼잡 정도에 따라 송신측이 보내는 양의 데이터를 조절하는 것이 혼잡제어이다.


  1. 우선 송신측은 최초에 1MSS 만큼만 데이터를 전송한다. 이 때 ACK가 제대로 도착하면 ACK 없이 보낼 수 있는 데이터의 양을 2의 지수승으로 증가시켜가며 보낸다. 이 구간이 Slow Start 구간이다.
  2. 중복 ACK가 세개 도착(3 Duplicated ACKs)하는 경우, 중간 패킷이 하나 손실되었으나 그 다음 패킷들은 제대로 보내지고 있다고 판단된다. 이 때 즉시 재전송을 수행한다.(Fast Retransmit)
  3. 중복 ACK 도착이라는 것은 다음 패킷들은 제대로 도착하였다는 것이므로 윈도우 크기를 1이 아닌 절반으로 줄인다. 그 후 선형적으로 혼잡 윈도우를 증가시킨다.(Fast Recovery)
  4. 전송 ACK가 도착하지 않은 채로 송신측의 타이머가 종료되면 네트워크가 혼잡하여 패킷들의 손실이 발생했다고 판단. 혼잡윈도우 크기를 1로 줄이고, 현재 윈도우 크기 절반을 Threshold로 설정한다. Slow Start도중 이 임계점에 도달하면 혼잡 윈도우를 선형적으로 증가시킨다. 이 선형증가 구간을 Congestion Avoidance구간 이라고한다.


HTTP란

인터넷 상에서 서버와 클라이언트가 데이터를 주고 받기 위한 프로토콜이다. Application 레벨의 프로토콜로서 TCP/IP 위에서 동작한다. 상태를 유지하지 않는 Stateless 프로토콜이라는 특징이 있으며, Method, Path, Version, Headers, Body로 구성된다.

추가로 RESTful API란 HTTP 통신에서 어떤 자원에 대한 CRUD 요청을 Resource와 Method로 표현하여 전달하는 방식이다.
ex) GET 127.0.0.1:8080/main.html -> 127.0.0.1:8080/main 파일에 GET요청.



HTTPS란

HTTPS

HTTP 암호화 되어있지 않은 평문을 통신하므로 중간에 노출될 우려가 있다. 따라서 HTTP에 보안기능을 추가한 프로토콜이 HTTPS 프로토콜이다.


대칭키와 비대칭키

암호화 방식에는 대칭키와 비대칭키가 있다. 대칭키는 암호화와 복호화에 같은 키를 사용하는 것이며, 비대칭키는 공개키와 비밀키 쌍을 활용해 암호화와 복호화를 하는 방식이다. 대칭키는 해킹위험이 있는 단점이, 비대칭키는 연산이 많아 속도가 느린 단점이 있다.


HTTPS 원리

클라이언트와 서버간에 은밀하게 대칭키를 공유할 수 있다면 속도도 빠르고 효율적인 암호화 통신이 가능할 것이다. HTTPS는 최초 대칭키 교환에 비대칭키를 활용함으로서 이를 가능케하였다.

  1. 서버는 대칭키와 비대칭키(공개키, 비밀키 쌍)을 생성한 후 신뢰 가능한 CA에 공개키를 맡긴다.
  2. CA는 서버에 대한 인증을 수행한 후 서버 공개키, 서버 이름, 서버 정보 등을 담은 인증서를 생성하고, 이를 CA기관의 비밀키로 암호화하여 서버측에 제공한다.
  3. 클라이언트의 최초 요청이 들어오면 서버는 CA에게 받은 인증서를 반환한다.
  4. 브라우저 내에는 CA의 공개키 정보가 담겨져있다. 따라서 인증서를 복호화하여 서버에 대한 정보들과 서버의 공개키를 얻는다. 클라이언트는 통신에 사용할 대칭키를 만든 후 서버 공개키로 암호화하여 서버로 전송한다.
  5. 서버 공개키로 암호화된 정보는 서버 비밀키로만 열 수 있다. 이를 바탕으로 대칭키를 얻고 클라이언트와 서버간 통신에 대칭키를 활용하여 암호화를 수행한다.


www.naver.com 입력시 일어나는일

주소창에 www.naver.com 을 입력하면 무슨일이 일어날까? 이를 순서대로 따라가보자.


  1. 우선 www.naver.com에 매핑되는 IP 주소를 찾아야한다. 이는 DNS 서버가 갖고있다. 먼저 Local DNS에 요청을 한다. DNS는 Recusive Query로 구현되어 있어 Local DNS 서버가 상위 서버들에게 재귀적 질문을하여 최종 IP주소를 받아온다. 우선 Root DNS 에게 물어보면, com DNS의 주소를 알려주고, com DNS 에게 물어보면 naver.com DNS 주소를 알려줘 받아온 정보를 local DNS 가 클라이언트에게 반환한다.

  2. 받아온 IP 주소로 HTTP 요청 메시지를 보낸다. 이 때 REST API 형태로 GET 222.122.195.6:8080/main.html 과 같은 꼴로 요청 메시지를 작성하게 될 것이다.

  3. TCP/IP 를 통해 HTTP 요청이 라우터와 여러 노드들을 거치며 서버의 IP와 8080포트에 도달한다.

  4. 서버는 요청 메시지에 해당하는 파일(Resource)을 요청작업(Method)에 맞게 처리한 뒤, 처리 결과로 HTTP 응답 메시지를 생성한다.

  5. TCP/IP 를 통해 HTTP 응답이 클라이언트의 IP와 포트에 도달한다.

  6. 응답 메시지에 따라 내용 자체가 출력되거나 파일이 브라우저에서 실행되며 사용자가 볼 수 있게 된다.

0개의 댓글

관련 채용 정보