>웹 프론트엔드 >HTML 튜토리얼 >웹서버에 대한 자세한 소개

웹서버에 대한 자세한 소개

PHP中文网
PHP中文网원래의
2017-06-21 10:58:281837검색

1. HTTP 프로토콜 소개

HTTP는 Hyper Text Transfer Protocol의 약자입니다. 이 개발은 HTTP/1.0 버전을 정의하는 RFC 1945 시리즈를 발표한 World Wide Web 컨소시엄과 IETF(Internet Engineering Task Force) 간의 협력의 결과입니다. 그 중 가장 유명한 것은 RFC 2616이다. RFC 2616은 오늘날 일반적으로 사용되는 버전인 HTTP 1.1을 정의합니다.

HTTP 프로토콜(HyperText Transfer Protocol, Hypertext Transfer Protocol)은 WWW 서버에서 로컬 브라우저로 하이퍼텍스트를 전송하는 데 사용되는 전송 프로토콜입니다. 브라우저를 더욱 효율적으로 만들고 네트워크 전송을 줄일 수 있습니다. 이는 컴퓨터가 하이퍼텍스트 문서를 정확하고 빠르게 전송하도록 보장할 뿐만 아니라 문서의 어느 부분이 전송되고 내용의 어느 부분이 먼저 표시되는지(예: 그래픽보다 텍스트) 등을 결정합니다.

  • HTTP는 데이터(HTML 파일, 이미지 파일, 쿼리 결과 등)를 전송하기 위한 TCP/IP 기반의 통신 프로토콜입니다.

  • HTTP는 요청과 응답으로 구성된 애플리케이션 계층 프로토콜이며 표준 클라이언트-서버 모델입니다.

  • HTTP는 상태 비저장 프로토콜입니다.

![HTTP 프로토콜에 대한 깊은 이해.jpg 업로드에 실패했습니다. 다시 시도해 주세요.]


HTTP 프로토콜에는 항상 요청을 시작하는 클라이언트와 응답을 보내는 서버가 포함됩니다.


이는 HTTP 프로토콜의 사용을 제한하며 클라이언트가 요청을 시작하지 않으면 서버가 클라이언트에 메시지를 푸시하는 것이 불가능합니다.
HTTP 프로토콜은 상태 비저장 프로토콜입니다. 이 요청과 동일한 클라이언트의 이전 요청 간에는 일치하지 않습니다.

2.http 프로토콜 분석

1. 브라우저 요청


http 요청 방법


데이터베이스의 CRUD 추가, 삭제, 수정 및 확인 작업에 대응할 수 있습니다.

  1. CREATE: PUT

  2. READ: GET

  3. UPDATE: POST

  4. DELETE: DELETE

2. 서버 응답은 헤더와 본문(본문은 선택 사항) 두 부분으로 나뉩니다. 네트워크 참조 헤더의 가장 중요한 줄은 다음과 같습니다.

HTTP/1.1 200 OK

200은 성공적인 응답을 나타내고 다음 OK는 설명입니다.
반환된 값이 200이 아니면 다음과 같은 다른 기능이 있는 경우가 많습니다.

    실패한 응답에는 404 찾을 수 없음: 웹페이지가 존재하지 않습니다.
  • 500 내부 서버 오류: 서버에 내부 오류가 있습니다.
  • ...etc.. 잠깐...
HTTP 상태 코드.jpg


Content-Type: text/html
Content-Type은 응답 내용을 나타내며, 여기서 text/html은 HTML 웹 페이지를 나타냅니다.

3. 브라우저 파싱 프로세스

브라우저가 Sina 홈페이지의 HTML 소스 코드를 읽으면 HTML을 파싱하고 페이지를 표시한 다음 HTML의 다양한 링크를 기반으로 Sina 서버에 HTTP 요청을 보냅니다. 해당 사진, 비디오, 플래시, JavaScript 스크립트, CSS 및 기타 리소스에 연결하고 마지막으로 전체 페이지를 표시합니다.

3. 요약

1. HTTP 요청 프로세스

Sina 홈페이지에 따라 HTTP 요청 프로세스를 요약해 보겠습니다.

1단계: 브라우저는 먼저 서버에 HTTP 요청을 보냅니다.

방법: GET 또는 POST, GET만 리소스를 요청하면 POST에는 사용자 데이터가 함께 제공됩니다.
경로: /full/url/path;
도메인 이름: 호스트 헤더로 지정: 호스트: www.sina.com
및 기타 관련 헤더; POST인 경우 요청에는 사용자 데이터가 포함된 본문도 포함됩니다.

2단계: 서버가 브라우저에 HTTP 응답을 반환합니다. 응답에는 다음이 포함됩니다.
응답 코드: 200은 성공을 나타내고, 3xx는 리디렉션을 나타내고, 4xx는 나타냅니다. 클라이언트가 보낸 요청에 오류가 있음을 나타냅니다.

응답 유형: Content-Type 및 기타 관련 헤더에 의해 지정됩니다.
일반적으로 서버의 HTTP 응답은 콘텐츠를 전달합니다. , 응답 내용이 포함된 Body가 있습니다. 웹 페이지의 HTML 소스 코드가 Body에 있습니다.

3단계: 브라우저가 서버에서 사진과 같은 다른 리소스를 계속 요청해야 하는 경우 다른 HTTP 요청을 수행하고 1단계와 2단계를 반복합니다.

웹에서 채택한 HTTP 프로토콜은 매우 간단한 요청-응답 모델을 채택하여 개발을 크게 단순화합니다. 페이지를 작성할 때 HTTP 요청에 HTML만 보내면 되며 사진, 동영상 등을 첨부하는 방법을 고려할 필요가 없습니다. 브라우저가 사진과 동영상을 요청해야 하면 또 다른 HTTP 요청을 보냅니다. 따라서 HTTP 요청은 하나의 리소스만 처리합니다(TCP 프로토콜에서는 짧은 연결로 이해될 수 있습니다. 각 링크는 하나의 리소스만 얻습니다. 더 필요한 경우 여러 링크를 설정해야 합니다)
HTTP 프로토콜도 강력합니다. 브라우저가 홈 페이지를 요청하지만 Sina는 HTML로 다른 서버의 리소스를 연결할 수 있습니다. - orient/strip%7CimageView2/2/w/1240)을 통해 요청압력을 여러 서버로 분산시키며, 하나의 사이트가 다른 사이트로 연결될 수 있고, 수많은 사이트가 서로 연결되어 월드와이드웹(World Wide Web)을 이루게 된다. WWW로.


2.HTTP 형식

클라이언트 요청 정보
서버 응답 메시지
    각 HTTP 요청과 응답은 헤더와 본문의 두 부분으로 구성됩니다. 선택 사항입니다.
  • HTTP 프로토콜은 텍스트 프로토콜이므로 형식도 매우 간단합니다.
  • HTTP GET 요청 형식:

    GET /path HTTP/1.1
    Header1: Value1
    Header2: Value2
    Header3: Value3
    각 헤더는 한 줄이고 개행 문자는 rn이거나 os.linesep
    HTTP POST 요청 형식을 사용합니다.
    POST /path HTTP/1.1
    Header1: Value1
    Header2: Value2
    Header3: Value3

    body 데이터가 여기에 들어갑니다...

    두 개의 연속된 rn이 발견되면 Header 부분이 끝나고 이후의 모든 데이터는 Body입니다.

    HTTP 응답 형식:
    200 OK
    Header1: Value1
    Header2: Value2
    Header3: Value3

    body 데이터가 여기에 들어갑니다...

    HTTP 응답에 body가 포함되어 있으면 rnrn으로 구분됩니다.

    Body의 데이터 유형은 Content-Type 헤더에 따라 결정됩니다. 웹페이지인 경우 본문은 그림의 바이너리 데이터입니다.
    Content-Encoding이 있는 경우 Body 데이터가 압축됩니다. 가장 일반적인 압축 방법은 gzip입니다. 따라서 Content-Encoding: gzip이 표시되면 먼저 Body 데이터의 압축을 풀어야 실제 데이터를 얻을 수 있습니다. 압축의 목적은 Body의 크기를 줄이고 네트워크 전송 속도를 높이는 것입니다.

    4웹 정적 서버

    1. 고정 페이지 표시

    import socketimport multiprocessingimport osimport timedef serverHandler(clientSocket, clientAddr):'与请求的客户端进行交互'# 接收客户端发来的消息
        recvData = clientSocket.recv(1024).decode('utf-8')
        print(recvData)# 服务端向客户端发消息,作为响应
        responseLine = 'HTTP/1.1 200 OK' + os.linesep
        responseHeader = 'Server: laowang' + os.linesep
        responseHeader += 'Date: %s' % time.ctime() + os.linesep
        responseBody = '差一点一米八'
        sendData = (responseLine + responseHeader + os.linesep + responseBody).encode('gbk')
    
        clientSocket.send(sendData)# 关闭
        clientSocket.close()def main():'程序入口'# socket对象
        serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定的端口号,可以重复使用端口号#serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定
        serverSocket.bind(('', 8000))# 监听
        serverSocket.listen()while True:# 接收
            clientSocket, clientAddr = serverSocket.accept()
            print(clientSocket)# 开一个新的进程,执行交互
            multiprocessing.Process(target=serverHandler, args=(clientSocket, clientAddr)).start()# 关闭客户端对象
            clientSocket.close()if __name__ == '__main__':
        main()
클라이언트 브라우저 페이지
2. 필수 페이지 표시
import time,multiprocessing,socket,os,re

G_PATH = './html'

def serveHandler(clientSocket,clientAddr):
    recvData = clientSocket.recv(1024).decode('gbk')
    lineFirst = recvData.splitlines()[0]
    strFirst = re.split(r' +',lineFirst)
    fileName = strFirst[1]

    filePath = G_PATHif '/'== fileName:
        filePath += './index.html'else:
        filePath += fileNametry:file = Nonefile =open(filePath,'r',encoding='gbk')
        responseBody = file.read()

        responseLine = 'HTTP/1.1 200 OK' + os.linesep
        responseHeader = 'Server: ererbai' + os.linesep
        responseHeader += 'Date:%s' % time.ctime() + os.linesep
    except FileNotFoundError:
        responseLine = 'HTTP/1.1 404 NOT FOUND' + os.linesep
        responseHeader = 'Server: ererbai' + os.linesep
        responseHeader += 'Date:%s' % time.ctime() + os.linesep
        responseBody = '很抱歉,服务器中找不到你想要的内容'
    except Exception:
        responseLine = 'HTTP/1.1 500 ERROR' + os.linesep
        responseHeader = 'Server: ererbai' + os.linesep
        responseHeader += 'Date: %s' % time.ctime() + os.linesep
        responseBody = '服务器正在维护中,请稍后再试。'finally:if file!=None and not file.closed:file.close()

        senData = (responseLine + responseHeader + os.linesep + responseBody).encode('gbk')
        clientSocket.send(senData)
        clientSocket.close()


def main():
    serveSocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    serveSocket.bind(('',8000))
    serveSocket.listen()while True:
        clientSocket,clientAddr = serveSocket.accept()
        print(clientSocket)
        multiprocessing.Process(target=serveHandler,args=(clientSocket,clientAddr)).start()
        clientSocket.close()if __name__ == '__main__':
    main()

클라이언트 브라우저 홈페이지
클라이언트 브라우저 biye.html 페이지


학습 과정에서 문제가 발생하거나 학습 리소스를 얻고 싶다면 학습 교류 그룹에 오신 것을 환영합니다
343599877, 프론트 엔드를 함께 배우세요!

위 내용은 웹서버에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.