zoukankan      html  css  js  c++  java
  • HTTP详解

    HTTP详解

    零、预备知识

    URI

    • 统一资源标识符(Uniform Resource Identifier,URI)
    • 是一个用于标识某一互联网资源名称的字符串
    • 分为URL和URI

    URL(通常用来作为网址)

    • (Uniform Resource Locator,统一资源定位符)
    • 每一信息资源都有统一的且在网上唯一的地址,即你可以通过它确定一个 [唯一的] 地址(网址)

    URN

    • 统一资源名(URN,Uniform Resource Name)
    • 通过它可以确定一个 [唯一的] 资源

    举例

    一个URL http://www.baidu.com/s?wd=hello%rsv_spt=1#5

    • 这个网址可以拆成以下几个部分
      • http:// :协议
      • www.baidu.com:域名,其中.com是顶级域名(一级),baidu是二级域名,www是三级域名,所以baidu.com 和 它不是同一个域名,但它们共有二级域名
      • /s:路径
      • ?wd=hello&rsv_spt=1:查询参数
      • 5:锚点

    DNS

    • (Domain Name System) 域名系统(服务)协议
    • 用户输入域名, 路由帮你去问通讯公司, 通讯公司(如电信)再告诉你IP
    • 即DNS作用就是,输入域名 输出IP

    一、简介

      HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。(超文本是啥?超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。超文本更是一种用户界面范式,用以显示文本及与文本之间相关的内容。)

      HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。(TCP/IP是啥?传输控制/网络协议;TCP/IP协议不仅仅指的是TCP和IP两个协议,而是指一个由FTP、FMTP、TCP、UDP、IP等协议构成的协议簇)

    二、HTTP协议的作用

    HTTP是一个客户端和服务器端请求和应答的标准(TCP)

    • 客户端是终端用户,服务器端是网站;

    • 通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。(我们称这个客户端)叫用户代理(user agent);

    • 应答的服务器上存储着(一些)资源,比如HTML文件和图像。(我们称)这个应答服务器为源服务器(origin server);

    • 在用户代理和源服务器中间可能存在多个中间层,比如代理,网关,或者隧道(tunnels);

    • 尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。 事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。

    HTTP和HTTPS的区别

    • HTTPS协议可以理解为HTTP协议的升级,就是在HTTP的基础上增加了数据加密
    • 在数据进行传输之前,对数据进行加密,然后再发送到服务器
    • 这样,就算数据被第三者所截获,但是由于数据是加密的,所以你的个人信息让然是安全的

    三、HTTP与Server交互

    1) 步骤

      http的作用就是直到浏览器和服务器如何进行沟通(毕竟是协议嘛)

    • HTTP客户端(浏览器)负责发起请求,建立一个到服务器指定端口(默认是80端口) 的TCP连接
    • 服务器在80端口接受请求
    • 一旦收到请求,服务器负责返回内容(响应)
    • 浏览器负责下载响应内容

    2) 请求

    a. 请求示例

    • 输入 curl -s -v -H "Try: xxx" -- "https://www.baidu.com"

    (在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具,会得到请求和响应的格式及内容)> GET / HTTP/1.1

    > GET / HTTP/1.1
    请求方式 资源路径 协议/版本
    > Host: www.baidu.com
    要访问的域名(请求的服务器主机名)
    > User-Agent: curl/7.65.3
    访问的软件(发起请求的工具)
    > Accept: */*
    接收内容(这里是接收发过来的任何内容)
    > Try: xxx
    请求内容
    >
    
    • 输入 curl -X POST -s -v -H "Try: xxx" -- "https://www.baidu.com"
      • 这里只是将请求方式改成了POST
    > POST / HTTP/1.1
    > Host: www.baidu.com
    > User-Agent: curl/7.65.3
    > Accept: */*
    > Try: xxx
    >
    
    • 输入 curl -X POST -d "1234567890" -s -v -H "Try: xxx" -- "https://www.baidu.com"
      • 多了一个参数 -d
    > POST / HTTP/1.1
    > Host: www.baidu.com
    > User-Agent: curl/7.65.3
    > Accept: */*
    > Try: xxx
    > Content-Length: 10
    请求体的长度
    > Content-Type: application/x-www-form-urlencoded
    请求的与实体对应的MIME信息。如果是post请求,会有这个头,默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码
    >
    

    b. 请求格式

    • 请求行
      • 请求方式 资源路径 协议/版本
    • 请求头
      • 一堆的key: value
      • Content-Type Content-Length

    img

    • 请求体--要上传的内容

    • 请求最多包含四部分,最少包含三部分(第四部分可以为空)

    • 第三部分是一个回车

    • 请求方式

      • GET:向特定的资源发出请求
      • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改
      • PUT:向指定资源位置上传其最新内容(整体更新)
      • PATCH:向指定资源位置上传其最新内容(局部更新)
      • DELETE:删除某个资源
      • HEAD:和GET方法类似,不过进要求服务器返回头部信息, 不需要传输任何实际内容
      • OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性
      • TRACE:回显服务器收到的请求,主要用于测试或诊断
    • 这里的路径包括[查询参数], 但不包括[锚点]

    • 没写路径的话就默认为 /

    • 第二部分中的Comtent-Type标注了第四部分的格式

    3) 响应

    a. 响应示例

    • 输入 curl -s -v -H "Try: xxx" -- "https://www.baidu.com"
    < HTTP/1.1 200 OK
    协议/版本 状态码 状态描述
    < Accept-Ranges: bytes
    < Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
    < Connection: keep-alive
    < Content-Length: 2443
    响应长度
    < Content-Type: text/html
    响应格式
    < Date: Fri, 03 Jul 2020 09:23:44 GMT
    < Etag: "58860402-98b"
    < Last-Modified: Mon, 23 Jan 2017 13:24:18 GMT
    < Pragma: no-cache
    < Server: bfe/1.0.8.18
    < Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
    <
    
    
    • 输入 curl -X POST -d "1234567890" -s -v -H "Try: xxx" -- "https://www.baidu.com"
    < HTTP/1.1 302 Found
    < Connection: keep-alive
    < Content-Length: 17931
    < Content-Type: text/html
    < Date: Fri, 03 Jul 2020 09:20:12 GMT
    < Etag: "54d9748e-460b"
    < Server: bfe/1.0.8.18
    <
    
    

    b. 状态码

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

    • 2xx:成功,表示请求已被成功接受,处理。

      • 200 OK:客户端请求(GET)成功

      • 201 Created: 常用于POST,PUT 请求,表明请求已经成功,并新建了一个资源。并在响应体中返回路径

      • 202 Accepted: 请求已经接收到,但没有响应,稍后也不会返回一个异步请求结果。 该状态码适用于等待其他进程处理或者批处理的场景

      • 203 No-Authoritative Information: 表明响应返回的元信息(meta-infomation)和最初的服务器不同,而是从本地或者第三方获取的。

        主要用于其他资源的镜像和备份。除了前面的情况,首选还是200。

      • 204 No Content:无内容。服务器成功处理(POST),但未返回内容。一般用在只是客户端向服务器发送信息,而服务器不用向客户端返回什么信息的情况。不会刷新页面

      • 205 Reset Content: 告诉用户代理(浏览器)重置发送该请求的文档

      • 206 Partial Content:服务器已经完成了部分GET请求(客户端进行了范围请求)。响应报文中包含Content-Range指定范围的实体内容

    • 3xx:重定向(失败)

      • 301 Moved Permanently:永久重定向,表示请求的资源已经永久的搬到了其他位置。
      • 302 Found:临时重定向,表示请求的资源临时搬到了其他位置
      • 303 See Other:临时重定向,应使用GET定向获取请求资源。303功能与302一样,区别只是303明确客户端应该使用GET访问
      • 307 Temporary Redirect:临时重定向,和302有着相同含义。POST不会变成GET
      • 304 Not Modified:表示客户端发送附带条件的请求(GET方法请求报文中的IF…)时,条件不满足。304状态码或许不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应, 即这次请求和之前缓存的
    • 4xx:客户端错误(失败, 访问者出错)

      • 400 Bad Request:客户端请求有语法错误,服务器无法理解。
      • 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
      • 403 Forbidden:服务器收到请求,但是拒绝提供服务
      • 404 Not Found:请求资源不存在, URL无效或者URL有效但是没有资源。比如,输入了错误的url
      • 406 Not Acceptable: 资源类型不符合服务器要求
      • 407 Proxy Authorization Required: 需要代理授权
      • 415 Unsupported media type:不支持的媒体类型
      • 426 Upgrade Required: 告诉客户端需要升级通信协议。
    • 5xx:服务器端错误,服务器未能实现合法的请求

      • 500 Internal Server Error:服务器发生不可预期的错误
      • 502 Bad Gateway: 服务器作为网关使用时,收到上游服务器返回的无效响应
      • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
      • 504 Gateway Timeout: 网关超时。服务器作为网关或者代理,不能及时从上游服务器获取响应返回给客户端
      • 505 Http Version Not Supported: 发出的请求http版本服务器不支持。如果请求通过http2发送,服务器不支持http2.0,就会返回该状态码
  • 相关阅读:
    怎样用c/c++编程连接mysql数据库?
    c#中转义符总结
    制作文件系统出错运行mkubimagemlc2
    面试中常考的C函数库中的字符串处理函数
    移动支付模式再添新军:指纹支付
    面试中常考的单链表处理
    选购冰箱勿被概念迷惑:并非功能越多越好
    地址转换
    JavaScriptGarden/
    配置非安装版的mysql 5.5
  • 原文地址:https://www.cnblogs.com/TRY0929/p/13234323.html
Copyright © 2011-2022 走看看