HTTP 프로 토 콜 소개 및 웹 서버 구축 경험

HTTP 프로 토 콜 소개 및 웹 서버 구축 경험
1. HTTP 개념
HTTP (하이퍼텍스트 전송 프로 토 콜, HyperText Transfer Protocal).인터넷 응용 이 가장 광범 위 한 네트워크 응용 층 프로 토 콜 은 네트워크 전송 을 줄 이 고 브 라 우 저 를 더욱 효율적으로 할 수 있다.일반적으로 HTTP 정 보 는 클 라 이언 트 가 서버 에 요청 한 메시지 와 서버 가 클 라 이언 트 에 대한 응답 메 시 지 를 포함한다.
2. 요청 메시지
방향: 브 라 우 저 → 서버, 주요 내용 은 네 부분 을 포함 합 니 다.
  • 요청 행: 요청 유형, 방문 할 자원, 그리고 사용 할 http 버 전 설명
  • 요청 헤더: 서버 가 사용 할 추가 정보 설명
  • 빈 줄: 요청 데이터 가 없 더 라 도 있어 야 합 니 다
  • 요청 데이터: 주체 라 고도 부 르 며 임의의 다른 데 이 터 를 추가 할 수 있 습 니 다
  • HTTP协议简介及web服务器搭建经验_第1张图片
    (첫 번 째 줄 은 요청 행, 2 - 8 행위 요청 헤드, 9 줄 은 빈 줄 표지 요청 헤드 의 끝)
    2.1 청구 방법
  • GET 가 작성 한 페이지 정 보 를 요청 하고 실체 주체
  • 로 되 돌려 줍 니 다.
  • POST 는 지정 한 자원 에 데 이 터 를 제출 하여 처리 요청 (예 를 들 어 폼 을 제출 하거나 파일 을 업로드 하 는 것) 을 하고 데 이 터 는 요청 체 에 포함 된다.POST 요청 은 새로운 자원 의 구축 이나 기 존 자원 의 수정 을 초래 할 수 있 습 니 다
  • HEAD 는 get 요청 과 유사 합 니 다. 되 돌아 오 는 응답 에 구체 적 인 내용 이 없 을 뿐 헤더 가 져 오기
  • PUT 가 클 라 이언 트 에서 서버 로 전송 한 데이터 가 지정 한 문서 의 내용 을 대체 합 니 다
  • DELETE 는 서버 에 지정 한 페이지 삭 제 를 요청 합 니 다
  • CONNECT HTTP / 1.1 프로 토 콜 에 연결 을 파이프 방식 으로 변경 할 수 있 는 프 록 시 서버
  • OPTIONS 는 클 라 이언 트 가 서버 의 성능 을 볼 수 있 도록 합 니 다
  • TRACE 리 턴 서버 에서 받 은 요청 은 주로 테스트 또는 판단
  • 에 사 용 됩 니 다.
    3. 응답 메시지
    방향: 서버 → 브 라 우 저, 주요 내용 은 네 부분 을 포함 합 니 다.
  • 상태 줄: HTTP 프로 토 콜 버 전 번호, 상태 코드, 상태 정보
  • 포함
  • 메시지 헤더: 클 라 이언 트 가 사용 하고 자 하 는 추가 정보 설명
  • 공 행: 있어 야 합 니 다
  • 응답 본문: 서버 가 클 라 이언 트 에 게 되 돌려 준 텍스트 정보
  • HTTP协议简介及web服务器搭建经验_第2张图片
    (각 줄 의 끝 은 \ r 를 사용 하고 9 줄 의 빈 줄 도 프로 토 콜 헤더 의 일부분 입 니 다)
    3.1 상태 코드
    상태 코드 는 세 자리 숫자 로 표시 되 고 첫 번 째 숫자 는 응답 하 는 유형 을 정의 하 며 모두 다섯 가지 유형 으로 나 뉜 다.
  • 1xx: 지시 정보 – 요청 이 접수 되 었 음 을 표시 하고 계속 처리
  • 2xx: 성공 – 요청 이 성공 적 으로 접수 되 었 음 을 나타 낸다
  • 3xx: 방향 을 바 꾸 기 – 요청 을 완성 하려 면 더 많은 작업 을 해 야 합 니 다
  • 4xx: 클 라 이언 트 오류 – 문법 오류 요청 또는 요청 이 실 현 될 수 없습니다
  • 5xx: 서버 쪽 오류 – 서버 가 합 법 적 인 요청 을 수행 하지 못 했 습 니 다
  • 일반적인 상태 코드:
    상태 코드
    속뜻
    200 OK
    클 라 이언 트 요청 성공
    400 Bad Request
    클 라 이언 트 요청 에 문법 오류 가 있어 서버 에서 이해 할 수 없습니다.
    401 Unauthorized
    요청 이 인증 되 지 않 음
    403 Forbidden
    서버 에서 요청 을 받 았 으 나 서비스 제공 을 거부 하 였 습 니 다.
    404 Not Found
    요청 한 자원 이 존재 하지 않 습 니 다. 예 를 들 어 잘못된 URL 을 입력 했 습 니 다.
    500 Internal Server Error
    서버 에 예측 할 수 없 는 오류 가 발생 했 습 니 다.
    503 Server Unavailable
    서버 는 현재 클 라 이언 트 의 요청 을 처리 할 수 없습니다.
    3.2 네트워크 파일 형식
    파일 형식
    HTTP 문법
    일반 파일
    text/plain;charset=ios-8859-1
    *.html
    text/html;charset=ios-8859-1
    *.jpg
    image/jpeq
    *.gif
    image/gif
    *.png
    image/png
    *.wav
    audio/wav
    *.avi
    video/x-msvidio
    *.mov
    video/quicktime
    *.mp3
    audio/mpeg
    3.3 인 코딩 형식
    부호화 형식
    묘사 하 다.
    charset = iso-8859-1
    서구 의 인 코딩 은 사이트 가 영문 인 코딩 을 채택 한 다 는 것 을 설명 한다.
    charset = gb2312
    사이트 에서 사용 하 는 인 코딩 은 간 체 중국어 임 을 설명 한다.
    charset = utf-8
    세계 적 으로 통용 되 는 언어 인 코딩 으로 중국어, 일본어 등 세계 적 으로 통용 되 는 언어 를 사용 할 수 있다.
    charset = euc-kr
    사이트
    charset = big5
    사이트 에서 사용 하 는 인 코딩 은 번 체 중국어 임 을 설명 한다.
    4. HTTP 전송 프로 세 스
  • 서버 getline () 에서 http 프로 토 콜 첫 줄 을 가 져 옵 니 다.
  • 첫 줄 에서 GET, 파일 이름, 프로 토 콜 버 전 을 분리 하여 사용자 가 요청 한 파일 이름 을 가 져 옵 니 다.
  • stat () 를 이용 하여 파일 이 존재 하 는 지 판단 합 니 다.
  • 파일 의 유형 을 판단 합 니 다.
  • 파일 이 라면 open → read → 서버 에 다시 씁 니 다.
  • 먼저 HTTP 응답 프로 토 콜 헤더: http / 1.1 200 OK Content - Type: text / plain;charset = iso-8859-1
  • 파일 데 이 터 를 작성 합 니 다.

  • 5. 웹 서버 구축 경험 치
    5.1 정규 표현 식 파일 이름 가 져 오기
    //          、           ,          sscanf    
    char method[16], path[256], protocol[16];
    sscanf(buf, "%[^ ] %[^ ] %[^ ]", method, path, protocol);
    

    5.2 파일 존재 여부 판단
    //stat                    (    ll       )
    int ret = stat(file, &sbuf);
    if(ret != 0)
    {
        //        ,    404    ,  URL    
        perror("stat judge err!");
    }
    if(S_ISREG(sbuf.st_mode))
    {
        //       
        printf("Request regular file!
    "
    ); // , ,respond 、 http_respond(cfd, 200, "OK", "Content-Type:audio/mpeg",sbuf.st_size); // send_file(cfd, file); }

    5.3 자원 은 일시 적 으로 오류 해결 을 사용 할 수 없습니다.
    //  io         EAGAIN EINTR  ,            
    while((n = read(fd, buf, sizeof(buf))) > 0)
    {
        ret = send(cfd, buf, n, 0);
        if(ret == -1)
        {
        	//         ,                
            printf("errno = %d
    "
    , errno); if(errno == EAGAIN) { printf("errno:EAGAIN!
    "
    ); continue; } else if(errno == EINTR) { printf("errno:EINTR!
    "
    ); continue; } else { perror("send to client err!"); exit(1); } } }

    5.4 브 라 우 저 요청 ico
  • 브 라 우 저 는 그림 을 요청 하 는 동시에 ico 아이콘 을 요청 하여 브 라 우 저 탭 텍스트 부분의 전단 에 있 는 작은 아이콘 을 표시 합 니 다.아이콘 파일 의 이름 고정: favicon. ico, 서버 가 브 라 우 저 에 접근 할 대상 디 렉 터 리 에 배치 합 니 다.

  • 5.5 디 렉 터 리 검색 함수
  • 함수 원형:
    int scandir(const char *dirp, struct dirent ***namelist,
                int (*filter)(const struct dirent *),
                int (*compar)(const struct dirent **, const struct dirent **));
    
    //       ,          
    int alphasort(const struct dirent **a, const struct dirent **b);
    int versionsort(const struct dirent **a, const struct dirent **b);
    
  • 기능: 디 렉 터 리 재 귀적
  • 인자: dirp: 접근 할 디 렉 터 리 이름 struct dirent:
    struct dirent {
        ino_t          d_ino;       /* inode number */
        off_t          d_off;       /* not an offset; see NOTES */
        unsigned short d_reclen;    /* length of this record */
        unsigned char  d_type;      /* type of file; not supported
                                       by all filesystem types */
        char           d_name[256]; /* filename */
    };
    
    filter: 필터, 일반적인 상황 에서 NULL compar: 일반적인 상황 에서 하위 alphasort
  • 반환 값: 정확: dirent 배열 의 요소 수량 오류: - 1, errno 설정

  • 5.6 한자 의 코딩
  • 한자 가 있 는 파일 에 접근 할 때 이 URL 을 해당 하 는 브 라 우 저 주소 표시 줄 에 복사 하면 브 라 우 저 에 해당 하 는 인 코딩
  • 을 볼 수 있 습 니 다.
  • 명령 행 은 유 니 코드 명령 을 사용 하여 한자 에 대응 하 는 유 니 코드 인 코딩 을 볼 수 있 습 니 다.
  • 한자 가 있 는 파일 에 접근 할 때 서버 리 턴 을 할 때 인 코딩 작업 을 하고 브 라 우 저 에서 자원 디 렉 터 리 의 한자 파일 을 요청 할 때 디 코딩 작업 을 해 야 합 니 다.

  • 5.7 telnet 디 버 깅
  • telnet 명령 을 사용 하여 ip 와 포트 번 호 를 이용 하여 브 라 우 저의 행 위 를 모 의 하고 터미널 에서 방문 한 서버 를 디 버 깅 하여 서버 가 브 라 우 저 에 게 보 낸 http 프로 토 콜 데 이 터 를 쉽게 볼 수 있 습 니 다.
  • telnet 127.0.0.1 9876 //  
    GET /hello.c http/1.1 //       ,  
    
  • 좋은 웹페이지 즐겨찾기