본문 바로가기
컴퓨터 사이언스/네트워크

애플리케이션 계층

by Chaein.P 2023. 2. 19.

애플리케이션 계층은 netword edge에 있는 host들이 동작하는 계층으로 우리가 주로 사용하고 있는 서비스들이 동작하는 계층이다.

클라이언트 서버 아키텍쳐

(1) 서버

  • 서버는 24시간 데이터를 제공해야하고
  • 고유한 IP 주소를 갖는다.

(2) 클라이언트

  • 서버와 통신하고
  • 네트워크에 영구적으로 연결되어있지는 않는다.
  • 동적인 IP 주소를 가질 수 있다.

애플리케이션에서 요구하는 전송 기능은 다음과 같은 것들이 있다.

  • data integrity : 데이터 신뢰성
  • timing : 적시성
  • throughput : 처리량
  • security : 보안

현재 전송 계층에서는(tcp) data integrity만 보장해주고 있다.

HTTP(Hypertext Transfer Protocol)

  • tcp 기반의 애플리케이션 프로토콜
  • request, response 메세지로 요청, 응답을 주고 받는다.
  • 무상태성
  • HTTP는 요청 응답 후에도 TCP 연결을 유지하는 persistent HTTP와 요청 응답 후 TCP 연결을 종료하는 non-persistent HTTP로 나뉜다.
  • non-persistent HTTP는 연결을 유지하지 않기 때문에 요청 응답 마다 tcp 커넥션을 계속 새로 연결해야한다.
  • 기본적으로 웹브라우저는 persistent HTTP를 사용한다.

Socket

OS에서 제공하는 Interface로 TCP, UDP와 같은 네트워크 통신을 위해 프로세스간 데이터 송수신을 지원한다.

SOCKET_STREAM

  • TCP socket을 의미한다.

SOCKET_DGRAM

  • UDP socket을 의미한다.

서버 SOCKET 생성 과정

  • socket 생성
  • 생성한 socket을 특정 포트(프로세스)에 bind
  • 동시 요청 수를 설정하고 listen 상태로 진입 (non-blocking)
  • 준비가 완료되면 client request가 들어올 때까지 accept 상태를 유지한다. (blocking)

클라이언트 SOCKET 생성 과정

  • socket 생성 후 바로 connect
  • 서버에 요청 송신

구현 코드

#include <studio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define PORT 3000
#define BACKLOG 10

main()
{
    int sockfd, new_fd;

    struct sockaddr_in my_addr;
    struct sockaddr_in their_addr;
    int sin_size;

    if ((sockfd = socket(PF_INET, SOCKET_STREAM, 0) == -1)) //PF_INET 은 IPv4를 의미
    {
        perror("socket");
        exit(1);
    }

    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(MTPORT);
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
    {
        perror("bind");
        exit(1);
    }

    if (listen(sockfd, BACKLOG) == -1)
    {
        perror("listen");
        exit(1);
    }

    while(1)
    {
        sin_size = sizeof(struct sockaddr_in);
        if ((new_fd = accept(sockfd, (struct sockaddr*)&their_addr, &sin_size)) == -1)
        {
            perror("accept");
            continue;
        }
        printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr))
    }
}

'컴퓨터 사이언스 > 네트워크' 카테고리의 다른 글

네트워크 계층 - 라우팅 알고리즘  (0) 2023.03.12
네트워크 계층- IP  (0) 2023.03.09
전송계층 - TCP  (0) 2023.03.07
전송 계층  (0) 2023.02.19
네트워크 구성  (0) 2023.02.17

댓글