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只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。

特点

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

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

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

  • 无状态: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,就会返回该状态码
posted @ 2020-07-04 11:30  TRY0929  阅读(305)  评论(0编辑  收藏  举报