AdventCalendar Day06 [슈퍼 루비 입문]

7476 단어 CHTTPAdventCalendar

소개



본 기사는 슈퍼 루비 입문 6일째의 기사입니다.

코멘트 받을 수 있는 분은, 가이드라인 를 읽어 주실 수 있으면 다행입니다.

목적



C 언어를 배운 후에 무엇을 할 수 있는지가 이미지하기 어렵다.

HTTP 서버를 C 언어로 자작하는 것으로, 구체적인 이미지를 붙인다.

목표


  • 소켓 통신 이해
  • Wireshark의 기본 사용법을 습득한다

  • HTTP



    애초에 HTTP란 무엇일까?

    HTTP는 통신 프로토콜이다. Hypertext Transfer Protocol의 이름대로 HTML 문서 등의 리소스를 전송하기 위한 애플리케이션 계층 프로토콜이다.

    man 명령



    man - format and display the on-line manual pages

    man 명령은 문서를 볼 수 있는 UNIX 명령입니다.
    $ man man (manコマンドのドキュメント)
    

    SOCKET(2)와 같은 표기를 본 적이 있을까? "2"는 섹션의 번호를 나타냅니다.

    섹션 번호의 대응은 아래 표와 같다.



    내용


    1
    일반 명령

    2
    시스템 호출

    3
    라이브러리 함수, 특히 표준 C 라이브러리 함수

    4
    특수 파일(주로/dev에 있는 장치) 및 드라이버

    5
    파일 형식과 그 사용법

    6
    게임과 스크린 세이버

    7
    기타

    8
    시스템 관리 명령 및 데몬



    예.
    $ man 2 socket
    

    Qiita나 블로그등에서 정보를 찾는 것은 편할지도 모르지만, 문서를 읽는 버릇을 빨리 붙여 두면 좋을 것이다.

    HTTP 서버



    HTTP 서버는 TCP/IP 통신 서버의 일종이다. 차이점은 HTTP 프로토콜 규칙에 따라 통신을 한다는 점이다.

    TCP 서버의 통신 순서를 이하에 나타낸다.
  • socket (2)를 실행해 TCP 소켓을 작성한다.
  • bind(2)를 실행하여 소켓을 등록한다.
  • listen(2) 을 실행해, 소켓 접속을 가능한 상태로 한다.
  • accept(2)를 실행하여 클라이언트 연결을 기다린다.
  • 접속 후, send(2)로 메세지를 클라이언트에 전한다.
  • close(2)를 실행하여 소켓 통신을 끊습니다.

  • 위의 절차에 따라 생성 된 HTTP 서버의 코드는 아래에 나와 있습니다.

    http_server.c
    
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h> 
    #include <unistd.h>
    
    int main(){
        int sock, ret, send_sock;
        struct sockaddr_in addr;
        struct sockaddr_in client;
        socklen_t length;
    
        sock = socket(AF_INET, SOCK_STREAM, 0);
    
        addr.sin_family = AF_INET;
        addr.sin_port = htons(8080);
        addr.sin_addr.s_addr = INADDR_ANY;
    
        ret = bind(sock,  (struct sockaddr *)&addr, sizeof(addr) );
    
        listen(sock, 5);
        while(1) {
            length = sizeof(client);
            send_sock = accept(sock , (struct sockaddr *)&client, &length);
            send(send_sock, "HTTP/1.0 200OK\r\n" "Content-Length:6\r\n"
    "Content-Type:text/html\r\n" "\r\n" "HELLO\n", 66, 0);
            close(send_sock);
        }
        close(sock);
    }
    
    gcc http_server.c
    ./a.out
    

    구현한 서버를 시작해 보자.

    적절한 브라우저에서 127.0.0.1:8080에 액세스하면 HELLO라는 문자가 표시되는지 확인합시다.

    HTTP 서버는 80번 포트라는 인식을 하고 있는 사람이 있을지도 모르지만, 80번 이외에서도 통신할 수 있는 것이다.

    Wireshark



    Wireshark는 네트워크를 흐르는 데이터를 포착하여 내용을 해석·표시하는 프로토콜 분석기(네트워크 분석기)의 하나.

    Wireshark에서 패킷을 들여다 보자.

    다음과 같이 filter를 걸자.
    ip.addr == 127.0.0.1 and tcp.port == 8080 and http
    





    HTTP 서버가 올바르게 통신하고 있는지 확인할 수 있을 것이다.

    연습


  • Youtube 통신을 Wireshark로 분석합니다.
  • and http를 제거하고 3 방향 핸드 셰이크를 관찰하십시오

  • 더 깊고 싶은 사람



  • 보안 미니 캠프 에 응모한다
  • Apache, Nginx와 같은 기존 웹 서버를 사용해보십시오.

    참고문헌



    Linux 네트워크 프로그래밍

    시간이 되었을 때 할 일


  • Wireshark는 그림을 사용하여 설명합니다
  • Chrome 및 Firefox의 Content-Length 사양의 원인을 찾는다. (Firefox 및 Chrome 소스 코드를 볼 필요가 있음)
  • 좋은 웹페이지 즐겨찾기