Network 통신 정리

Park Jae Hong·2022년 8월 11일
0

네트워크 통신 방식

: TCP/UDP를 사용하는 소켓방식의 연결성 통신 , HTTP, HTTPS, SMTP 등의 프로토콜을 이용한 비연결성 통신

TCP/UDP를 사용하는 소켓방식의 연결성 통신

: 소켓을 이용한 네트워크 통신 방식은 보통 저수준(Low-level) 통신을 통하여 구현된다. 앱과 서버가 연결되면 한쪽에서 명시적으로 끊을 때까지 지속해서 연결을 유지하는 방식으로, 연결이 이루어진 단계, 열결이 유지되고 있는 단계, 연결이 종료된 단계 등으로 상태를 구분할 수 있다.
(소켓을 이용한 연결 방식은 완전한 데이터 전송을 보장하나 속도가 덜 빠른 TCP와 데이터의 유실 가능성은 있지만 속도가 빠른 UDP로 구분된다.)

  • 장점
    : 연결을 종료하기 전까지는 한번 연결된 통신을 계속 유지하므로 재연결할 필요 없이 실시간으로 원하는 메세지를 주고 받을 수 있는 장점이 있다.
  • 단점
    : 연결을 계속 유지하는 만큼 네트워크 대역을 많이 소모하고, 서버 부하도 크다는 단점이 있다

HTTP, HTTPS, SMTP 등의 프로토콜을 이용한 비연결성 통신

: 비연결성 통신은 소켓방식과 달리 프로토콜을 이용하여 메세지를 주고 받는 방식을 의미
(HTTP/HTTPS 등의 프로토콜이 대표적인데요. 주로 웹 서비스에서 이용되고, 요청이 들어오면 이에 맞는 응답을 보낸 후 바로 연결을 종료한다. 때문에 매번 요청할 때마다 연결해야 하므로 소켓 방식에 비해 상대적으로 데이터를 주고 받는 속도에 제약이 있지만, 필요할 때만 연결하여 요청을 처리한 후 연결을 유지하지 않고 종료하므로 네트워크 대역 소모와 서버 부하를 낮출 수 있다.)

JSON (JavaScript Object Notation) 방식

: JSON은 마크업 방식으로 인해 데이터 용량이 지나치게 커진다는 단점을 가진 XML 방식을 보완하기 위해 나온 경량화된 데이터 교환 방식을 의미.

데이터 구조

  • 여러가지 속성을 다양하게 정의할 수있는 집합 구조인 JSON 객체

  • 비슷한 형식이 반복되는 리스트 구조인 JSON 배열

JSON 객체

: {키:데이터} 형태로 이루어진 사전(Dictionary)식 데이터 집합. 중괄호를 이용하며 묶고, 인접한 데이터와 키를 구별할 때는 쉼표로 구별합니다. JSON 객체에는 문자열 이외에 정수나 실수, 논리값도 사용할 수 있으며, 문자열을 표현할 때만 큰따옴표를 붙여줍니다.
(JSON 객체 예시 : { “Language” : “Kotlin”, “rating” : 10})

JSON 배열
: 순서를 가지는 값들의 집합. 비슷한 데이터들을 나열하기에 적합하며, 나열할 수 있는 값들 또한 매우 다양합니다. 대괄호를 이용하여 묶고, 인접한 값들은 쉼표로 구분한다.
(JSON 배열 예시 : [“a” , ”b” , ”c”])


DNS 서버의 기본 동작

: 클라이언트에서 조회 메시지를 받고 조최의 내용에 응답하는 형태로 정보를 회답하는 일

✔ 조회 메세지 정보

  • 이름 : 서버나 메일 배송 목적지(메일 주소에서 @ 뒷부분의 이름)와 같은 이름

  • 클래스 : DNS의 구조를 고안 했을때 인터넷 이외에도 네트워크에서의 이용까지 검토하여 이것을 식별하기 위해 클래스 라는 정보를 준비 ( 그러나 지금은 인터넷 이외의 네트워크는 소명 되었으므로 클래스는 항상 인터넷을 나타내는 ‘IN’ 이라는 값이 된다.)

  • 타입 : 이름에 어떤 타입의 정보가 지원되는지를 나타낸다. (Ex - 타입이 A(address) 이면 이름에 IP 주고가 지원되는 것을 나타내며, MX(Mail eXchange)이면 이름에 메일 배송 목적지가 지원 되는 것을 나타낸다. 또한 이 타입에 따라 클라이언트에 회답하는 정보의 내용이 달라짐.)

✔ 클라이언트 회답

: 조회 메시지(이름,클래스,타입) 에 해당하는 값(타입이 A 이면 IP, MX이면 메일 목적지)을 회답한다.

📌 기타 타입
PTR : IP 주소에서 이름을 조사할 때 사용
CNAME : 이름에 닉네임(alias)을 붙이기 위해 사용
NS : DNS 서버의 IP 주소를 등록할 때 사용
SOA : 도메인 자체의 속성 정보를 등록할 때 사용


데이터 송.수신 동작

: IP 주소의 상대에는 액세스 대상 웹 서버에 메시지를 송신하도록 OS의 내부에 있는 프로토콜 스택에 의뢰한다. (웹 서버에 보내는 HTTP 의 메시지는 디지털 데이터를 송신하도록 의뢰) 또한 디지털 데이터를 송.수신하는 동작은 브라우저뿐만 아니라 네트워크를 이용하는 어플리케이션 전체에 공통이므로 이 동작은 웹에 한정되지 않고 모든 네트워크 어플리케이션에 해당된다.

  • 데이터 송.수신 동작의 추적

    : DNS 서버에 IP 주소를 조회할 때와 같이 Socket 라이브러리에 들어있는 프로그램 부품을 이용하는데, IP 주소를 조회할 때처럼 프로그램 부품을 하나씩 호출하고 끝나지 않고 복수의 부품을 결정된 순번대로 호출해야 하므로 조금 복잡하다. 그러므로 데이터 송신의 동작 전체를 이해하지 않으면 어떤 의미인지 이해하기 어려워, 데이터 송.수신 동작 전체의 개념을 이해하는 것이 중요하다.

  • 데이터 송.수신 동작의 개념

    : 데이터를 송.수신하는 컴퓨터 사이에 데이터 통로가 있고, 이것을 통해 데이터가 흐르면서 상대측에 도착하는데, 한쪽 끝에서 파이프(데이터 통로)에 데이터를 쏟아부으면 파이프 안을 통해 반대쪽 끝까지 도착하고 거기에서 데이터를 추출할 수 있다. ( 양방향이기 때문에 어느쪽에 데이터를 넣어도 상관없다.)
    📌 파이프(데이터 통로)는 최초부터 존재하는 것이 아니므로 파이프를 연결하는 동작이 필요하다

  1. 소켓을 만든다. (소켓 작성 단계)
    : 서버쪽에서 소켓을 만들고, 소켓에 클라이언트가 파이프를 연결하기를 기다린다.
  2. 서버측의 소켓에 파이프를 연결한다. (접속 단계)
  3. 데이터를 송.수신한다. (송.수신 단계)
  4. 파이프를 분리하고 소켓을 말소한다. (연결 끊기 단계)
    : 어느 쪽을 분리해도 상관 없다.

✔ 위 네가지 동작을 실행하는 것은 OS 내부의 프로토콜 스택이다

: 브라우저 등의 애플리케이션은 자체에서 파이프를 연결하거나 거기에 데이터를 쏟아붓지 않고, 프로토콜 스택에 의뢰해서 파이프를 연결하거나 데이터를 쏟아붓는다.

  • 의뢰 동작은 Socket 라이브러리에 넣은 프로그램 부품을 호출하여 실행되지만, 데이터 송.수신용 프로그램 부품은 애플리케이션에서 의뢰받은 내용을 그대로 프로토콜 스택에 전달하는 중개역을 수행할 뿐 실질적인 작업은 하지 않는다.
    (즉, Socket 라이브러리와 프로토콜 스택을 한 몸인 것으로 보고 일체화된 동작을 설명하는 쪽이 이해하기 쉽다.)

✔ 소켓의 작성 단계

: DNS 서버에 조회를 보낼 때와 같이 Socket 라이브러리 프로그램 부품을 호출하는 것이 요점, DNS 서버의 경우 gethostbyname 이라는 이름의 프로그램 부품 (리졸버) 을 호출했지만, 이번에는 몇개의 프로그램 부품을 결정된 순번대로 호출한다.

  • 준비
  1. 클라이언트측의 소켓을 만드는 방법은 소켓 라이브러리의 socket이라는 프로그램 부품 호출
  2. socket을 호출한 후의 동작은 리졸버를 호출했을 때와 같이 socket 내부에 제어가 넘어가서 소켓을 만드는 동작을 실행한다.
  3. 이것이 끝나면 애플리케이션에 제어가 돌아온다. 
소켓이 생기면 디스크립터 가 돌아오고 애플리케이션은 이것을 받아 서 메모리에 기록해 둔다.

💡 디스크립터란 ?
애플리케이션에 번호표 같은 것으로 소켓을 식별하는 역할.
EX) 브라우저에서 2개의 창을 열어 2개의 웹 서버에 동시에 액세스하는 경우 2개의 데이터를 송.수신 동작이 동시에 진행되므로 2개의 소켓을 만들어야 합니다 그럼 하나하나의 소켓을 식별해야 하는데, 이것이 디스크립터이다.

  • 접속

  1. 만든 소켓을 서버측의 소켓에 접속하도록 프로토콜 스택에 의뢰한다.

  2. 애플리케이션은 Socket 라이브러리의 connect 프로그램 부품을 호출하여 이 의뢰 동작을 실행한다.
    (connect 를 호출 할 때 지정하는 값은 디스크립터, 서버 IP 주소, 포트 번호이다.)

  3. 최초의 디스크립터는 소켓을 만들 때 돌아온 디스크립터이고 여기서 지정한 디스크립터는 connect가 프로토콜 스택에 통지한다.

  4. 프로토콜 스택이 통지받은 디스크립터를 보고 어느 소켓을 서버측의 소켓에 접속할지 판단하여 접속 동작 실행.

📌 IP 주소는 네트워크에 존재하는 각 컴퓨터를 식별하기 위해 각각에 서로 다른 값을 할당한 것이고, IP 주소로는 소켓을 지정할수 없어 이때 필요한 것이 포트 번호이다.
또한 접속 상대측에서 소켓을 식별하기 위해 사용한다. 포트 번호는 종류에 따라 미리 결정된 값을 사용한다는 규칙이 있다. (웹은 80번 메일은 25)
Ex) 전화를 걸었을 때 “ㅇㅇ님 계십니까 ?” 라고 말하여 통화할 상대를 바꿔달라는 중간 과정이 포트 번호이다.

  • 송.수신
  1. 송신을 하기 위한 write 프로그램 부품을 호출.

  2. write를 호출할 때 디스크립터와 송신 데이터를 지정한다.

  3. 프로토콜 스택이 송신 데이터를 서버에게 송신하고 소켓에는 연결된 상대가 기록되어 있으므로 디스크립터로 소켓을 지정하면 연결된 상대가 판명되어 그곳을 향해 데이터를 송신한다.

  4. 이 때 송신 데이터는 네트워크를 통해 전부 그대로 액세스 대상의 서버에 도착하고 그러면 서버는 수신 동작을 실행하여 받은 데이터의 내용을 조사하고 처리하여 응답 메시지를 반송한다.

  5. 다음 송신하는 동작을 할수 있는데 수신할 때 Socket 라이브러리의 read라는 프로그램 부품을 통해 프로토콜 스택에 수신 동작을 의뢰하고 수신한 응답 메시지를 저장하기 위한 메모리 영역을 지정하는데 이 메모리 영역을 수신 버퍼라고 한다.

  6. 응답 메시지가 돌아올 때 read가 받아서 수신 버퍼에 저장하고 수신 버퍼는 애플리케이션 프로그램이 내부에 마련된 메모리 영역이므로 수신 버퍼에 메시지를 저장한 시점에서 메시지를 애플리케이션에 건내준다.


  • 종료
  1. 종료를 하기 위해 close 프로그램 부품을 호출 연결 끊기 단계로 들어가 의뢰한다. 그

  2. 소켓 사이를 연결한 파이프와 같은 것이 분리되고 소켓도 말소된다.

참고 : https://97chos.medium.com/201022-til-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%86%B5%EC%8B%A0-%EB%B0%A9%EC%8B%9D%EA%B3%BC-json-19efaef4a130

profile
The people who are crazy enough to think they can change the world are the ones who do. -Steve Jobs-

0개의 댓글