首页 > 其他分享 >HTTP协议和web静态服务器

HTTP协议和web静态服务器

时间:2023-03-16 15:45:08浏览次数:34  
标签:web HTTP 请求 响应 服务器 response socket

一、HTTP协议

1、HTTP协议的定义

  • 网络协议

    • 网络协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则。

  • HTTP协议

    • HTTP协议(超文本传输协议)是一种网络通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。默认端口:80

  • HTTPS协议

    • HTTPS协议是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。默认端口:443

  • HTTP协议的主要特点

    • 支持客户/服务器模式

    • 简单快速:客户向服务器发送请求时,只需传送请求方法和路径。请求方法常用的有GET、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

    • 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

    • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

    • 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

  • HTTPS协议的主要特点

    • 内容加密:采用混合加密技术,中间者无法直接查看明文内容。

    • 验证身份:通过证书认证客户端访问的是自己的服务器。

    • 保护数据完整性:防止传输的内容被中间人冒充或者篡改。

    • SSL证书需要购买申请,功能越强大的证书费用越高。

    • SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。

    • HTTPS连接缓存不如HTTP高效,流量成本高。

    • HTTPS协议握手阶段比较费时,对网站的响应速度有影响,影响用户体验。

2、HTTP协议的组成

 

  • 请求行

    • 请求行由请求方法字段(GET/POST)、URL字段和HTTP协议版本组成。

  • URL字段

    • URL字段也称为请求地址

  • HTTP协议的请求方法

    • HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。

    • 常用的方法:

      • GET方法:浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源。

      • POST方法:要求被请求服务器接受附在请求后面的数据,常用于提交表单。

  • GET和POST区别

    • 从参数的传递方面来看,GET请求的参数是直接拼接在地址栏URL的后面,而POST请求的参数是放到请求体里面的;

    • 从长度限制方面来看,GET请求有具体的长度限制,一般不超过1024KB,而POST理论上没有,但是浏览器一般都有一个界限;

    • 从安全方面来看,GET请求相较于POST,因为数据都是明文显示在URL上面的,所以安全和私密性不如POST;

    • 从本质上来说,GET和POST都是TCP连接,并无实质的区别.但是由于HTTP/浏览器的限定,导致它们在应用过程中体现出了一些不同.GET产生一个数据包,POST产生两个数据包.对于GET请求,浏览器会把http header 和 data 一并发出去,服务器响应200(返回数据).而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200

  • 请求头部

    • 请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号 “ : ” 分隔。

    • 请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

      • User-Agent:产生请求的浏览器类型。

      • Accept:客户端可识别的内容类型列表。

    • Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

      • Content-Type:请求体的MIME类型。MIME类型:描述消息内容类型的因特网标准,常见的有application/json、image/jpeg、application/octet-stream等。

 

  • 请求正文

  • 请求正文向服务器提交的请求数据,GET请求的参数一般是放在请求行后的键值对,post请求的参数类型多样(表单、json、xml、图片等)

  • 响应行

  • 响应行由响应状态码、响应信息和HTTP协议版本字段3个字段组成

  • 响应状态码

    • 响应状态码由三位数字组成,第一个数字定义了响应的类别,且有五种类型

      • 1xx:指示信息--表示请求已接收,继续处理

      • 2xx:成功--表示请求已被成功接收、理解、接受

      • 3xx:重定向--要完成请求必须进行更进一步的操作

      • 4xx:客户端错误--请求有语法错误或请求无法实现

      • 5xx:服务器端错误--服务器未能实现合法的请求

  • 常见的响应状态码

    • 200 - 请求成功,已经正常处理完毕

    • 301 - 请求永久重定向,转移到其它URL

    • 302 - 请求临时重定向

    • 304 - 请求被重定向到客户端本地缓存

    • 400 - 客户端请求存在语法错误

    • 401 - 客户端请求没有经过授权

    • 403 - 客户端的请求被服务器拒绝,一般为客户端没有访问权限

    • 404 - 客户端请求的URL在服务端不存在

    • 500 - 服务端永久错误

    • 503 - 服务端目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。

  • 响应头

    • 响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。

    • 常见的响应头:

      • Content-Length:表示内容长度

      • Content- Type:表示后面的文档属于什么MIME类型

      • Server:服务器通过这个头告诉浏览器服务器的类型

  • 响应正文

    • 响应正文就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是图片就是图片等。

二、搭建python自带静态web服务器

1、什么是静态web服务器?

  静态web服务器是指可以为发出请求的浏览器提供静态文档的程序。平时我们浏览百度新闻数据的时候,每天的新闻数据都会发生变化,那访问的这个页面就是动态的。而静态的Web服务器,页面的数据不会发生变化。

2、如何搭建python自带的静态web服务器

  搭建python自带的静态web服务器使用命令:

python -m http.server
  • -m:表示运行包里面的模块,执行这个命令时,需要进入指定静态文件的目录,然后通过浏览器就能访问对应的html文件

  • 端口号不指定默认是8000

  • 搭建步骤

    • 在终端首先进入到指定静态文件的目录

    • 输入命令:python -m http.server [端口号],不指定端口号的话默认是8000

3、访问本地的静态文件

  在浏览器中访问本地的html文件

  首先在命令行进入该文件所在目录,然后启动静态服务器:

4、查看浏览器和搭建的web静态服务器的通信过程

三、静态web服务器-返回固定页面数据

1、开发自己的静态web服务器

  在开发前,先写一个大概的实现步骤,分步骤实现程序的框架雏形,如下:

  • 实现步骤

    • 编写一个TCP服务端程序。

    • 获取浏览器发送的http请求报文数据。

    • 读取固定页面数据,把页面数据组装成HTTP响应数据发送给浏览器。

    • HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字。

2、返回固定页面数据的代码示例

import socket


if __name__ == '__main__':
    # 创建tcp服务端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用, 程序退出端口立即释放
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定端口号
    tcp_server_socket.bind(("", 9000))
    # 设置监听
    tcp_server_socket.listen(128)
    while True:
        # 等待接受客户端的连接请求
        new_socket, ip_port = tcp_server_socket.accept()
        # 代码执行到此,说明连接建立成功
        recv_client_data = new_socket.recv(4096)
        # 对二进制数据进行解码
        recv_client_content = recv_client_data.decode("utf-8")
        print(recv_client_content)

        with open("static/index.html", "rb") as file:
            # 读取文件数据
            file_data = file.read()


        # 响应行
        response_line = "HTTP/1.1 200 OK\r\n"
        # 响应头
        response_header = "Server: PWS1.0\r\n"
        # 响应体
        response_body = file_data

        # 拼接响应报文
        response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
        # 发送数据
        new_socket.send(response_data)

        # 关闭服务与客户端的套接字
        new_socket.close()

四、静态web服务器-返回指定页面数据

1、静态web服务器的问题。

  目前的web服务器,不管用户访问什么页面,返回的都是固定页面的数据,接下来需要根据用户的请求返回指定页面的数据。

返回指定页面数据的实现步骤:

  1. 获取用户请求资源的路径。

  2. 根据请求资源的路劲,读取指定文件的数据。

  3. 组装指定文件数据的响应报文,发送给浏览器。

  4. 判断亲贵的文件在服务端不存在,组装404状态的响应报文,发送给浏览器。

2、返回指定页面数据的代码示例

import socket


def main():
    # 创建tcp服务端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用, 程序退出端口立即释放
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定端口号
    tcp_server_socket.bind(("", 9000))
    # 设置监听
    tcp_server_socket.listen(128)
    while True:
        # 等待接受客户端的连接请求
        new_socket, ip_port = tcp_server_socket.accept()
        # 代码执行到此,说明连接建立成功
        recv_client_data = new_socket.recv(4096)
        if len(recv_client_data) == 0:
            print("关闭浏览器了")
            new_socket.close()
            return

        # 对二进制数据进行解码
        recv_client_content = recv_client_data.decode("utf-8")
        print(recv_client_content)
        # 根据指定字符串进行分割,最大分割次数指定2
        request_list = recv_client_content.split(" ", maxsplit=2)
        # print("===")
        # print(request_list)
        # print("===")

        # 获取请求资源路径
        request_path = request_list[1]
        print(request_path)

        # 判断请求的是否是根目录,如果条件成立,指定首页数据返回
        if request_path == "/":
            request_path = "/index.html"

        try:
            # 动态打开指定文件
            with open("static" + request_path, "rb") as file:
                # 读取文件数据
                file_data = file.read()
        except Exception as e:
            # 请求资源不存在,返回404数据
            # 响应行
            response_line = "HTTP/1.1 404 Not Found\r\n"
            # 响应头
            response_header = "Server: PWS1.0\r\n"
            with open("static/error.html", "rb") as file:
                file_data = file.read()
            # 响应体
            response_body = file_data

            # 拼接响应报文
            response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
            # 发送数据
            new_socket.send(response_data)
        else:
            # 响应行
            response_line = "HTTP/1.1 200 OK\r\n"
            # 响应头
            response_header = "Server: PWS1.0\r\n"

            # 响应体
            response_body = file_data

            # 拼接响应报文
            response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
            # 发送数据
            new_socket.send(response_data)
        finally:
            # 关闭服务与客户端的套接字
            new_socket.close()


if __name__ == '__main__':
    main()

 

标签:web,HTTP,请求,响应,服务器,response,socket
From: https://www.cnblogs.com/LoLong/p/17222792.html

相关文章

  • Web安全day2
    ####sql注入就是web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是用户可控的,并且参数可以带入数据库查询SQL注入满足2个条件1.参数可控2.参数带入数据库......
  • WEB攻击模式库之命令注入学习总结
    1.命令注入的概念(what)1.1.有外部输入,外部输入校验不严格1.2.和命令语句结合1.3系统调用API执行2.注入条件和防范2.1.命令直接可控(无注入,防范:白名单)2.2.命令参数可......
  • 为什么市面上大多数是共享HTTP代理池
    众所周知,独享HTTP代理池是一个人使用的HTTP代理池,共享HTTP代理池是很多人使用的HTTP代理池。很多人都想使用独享HTTP代理池,但市面上大多数是共享HTTP代理池,很少有独享HTTP......
  • 为什么说HTTP代理可以提高爬虫工作效率
    在日常程序员的网络工作生活中,经常需要使用HTTP代理,在很多行业领域里,HTTP代理是工作中必不可少的一部分。很多人都使用过HTTP代理,它的速度比公司网络可能会慢一些,但大家......
  • 动态HTTP代理与静态相比有哪些优势
    HTTP代理可以分为动态HTTP代理和静态HTTP代理两种,市面上大多数的HTTP代理套餐都是动态HTTP代理,那么动态HTTP代理有哪些优势呢?动态HTTP代理的有效期相对于静态HTTP代......
  • maui BlazorWebView+本地html (vue、uniapp等都可以) 接入微信sdk 开发 Android ap
       之前没接触过Androidmaui开发,这几天刚摸索,有些不合理的地方欢迎指出。首先添加微信sdk的绑定库  nuget包:Chi.MauiBinding.Android.WeChat 项目地址:http......
  • swagger的API显示问题和IIS服务器配置
    SwaggerUI 这个页面,只在VisualStudio调试时显示。放到IIS上是不显示的。在IIS上的应用池,设置为“无托管”,并且安装ASP.NETCoreIIS模块:dotnet-hosting-6.0.14-win......
  • day94-javaweb-servlet路径问题
    servlet路径问题在web.xml中设置不同映射走的对应的路径<!--可以自定义后缀实现请求路径注意:*前面不能加项目映射的路径hello/sasasas.ggugu......
  • 容器化docker部署nginx代理的go-web应用
    通常我们的web应用程序部署的时候不会直接暴露,通过nginx反向代理,一是隐藏真实后端,二是通过nginx的epoll网络IO多路复用,获取高性能的网络访问。今天我们分享个通过nginx代......
  • nginx 配置 https 时找不到 pem 证书问题
    问题:在使用nginxdocker时的挂载卷为-v/root/ssl/letsencrypt/live/xxxxxxx:/etc/nginx/cert然后再nginx的default.conf中的证书位置为/etc/nginx/cert/fullchain.......