小谈HTTP协议
HTTP协议
概述
HTTP协议又叫超文本传输协议 , 超文本就是html文件 , 所以说HTTP协议主要就是传输html文件的协议 . HTTP协议是一种用于分布式 , 协作式和超媒体信息系统的应用层协议 , 是万维网的数据通信的基础 ; 并且有很多应用 , 最著名的就是用于web浏览器和web服务器之间的双工通信 . 迄今为止 , 虽然HTTP/2是最新标准, 但是被应用最广泛的一个版本是 HTTP1.1
HTTP是一个客户端和服务端请求和应答的标准( TCP ) , 默认端口是80 . 采用了请求/响应模型 : 客户端向服务器发送一个请求报文 , 请求报文包含请求的方法 , URL , 协议版本 , 请求头部和请求数据 ; 服务器以一个状态行作为响应 , 响应的内容包括协议的版本 , 成功或者错误代码 , 服务器信息 , 响应头部和响应数据 . 也可以换个说法 : 一个请求报文由请求行 , 请求头部 , 空行和请求数据四部分组成 ; 一个响应由状态行 , 响应头部 , 空行和响应数据四部分组成 .
下面介绍一下 在浏览器地址栏键入URL , 按下回车键之后 经历的流程 :
- 浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址 ;
- 解析出IP地址后 , 根据该IP地址和默认端口80 , 与服务器建立TCP链接 ;
- 浏览器发出读取文件( URL中域名后面部分对应的文件 )的HTTP请求 , 该请求报文作为TCP三次握手的第三个报文的数据发送给服务器 ;
- 服务器对浏览器请求做出响应 , 并把对应的html文本发送给浏览器 ;
- 释放TCP连接 ;
- 浏览器将html文本并显示内容 ;
HTTP请求方法
在HTTP/1.1协议中定义了八中方法( 也叫"动作" )来以不同方式操作指定的资源
GET
向指定的资源发出" 显示 "请求 . 使用GET方法应该只用在读取数据 , 而不是被用于产生" 副作用 "的操作中 , 例如在Web Application中 . 其中一个原因就是GET可能会被网络蜘蛛等随意访问 .
GET方法就是在做 : 获取数据 ; 数据本身会在地址栏上面显示 .
HEAD
与GET方法一样 , 都是向服务器发出指定的资源的请求 , 只不过服务器将不传回资源的本文部分 . 他的好处在于 , 使用这个方法可以在不必传输全部内容的情况下 , 就可以获取其中" 关于该资源的信息 "( 元信息或元数据 ) .
POST
向指定资源提交数据 , 请求服务器进行处理( 例如提交表单或者上传文件 ) . 数据被包含在请求本文中 , 这个请求可能会创建新的资源或修改现有资源 , 或二者皆有 .
POST方法就是在做 : 提交数据 ; 数据本身不会显示 .
PUT
向指定资源位置上传其最新内容 .
DELETE
请求服务器删除Request-URL所标识的资源 .
TRACE
回显服务器收到的请求 , 主要用于测试或者诊断 .
OPTIONS
这个方法可使服务器传回该资源所支持的所有HTTP请求方法 . 用*来代替资源名称 , 向Web服务器发送OPTIONS请求 , 可以测试服务器功能是否正常运作 .
CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 . 通常用于SSL加密服务器的链接( 经由非加密的HTTP代理服务器 ) .
HTTP状态码
所有HTTP响应的第一行都是状态行 , 依次是当前HTTP版本号 , 3位数字组成的状态代码 , 以及描述状态的短语 , 彼此由空格分隔 .
状态代码的第一个数字代表当前响应的类型 :
- 1xx消息 -- 请求已被服务器接收 , 继续处理 ;
- 2xx成功 -- 请求已成功被服务器接收 , 理解并接受 ;
- 3xx重定向 -- 需要后续操作才能完成这一请求 ;
- 4xx请求错误 -- 请求含有词法错误或者无法被执行 ;
- 5xx服务器错误 -- 服务器在处理某个正确请求时发生错误 ;
URL
超文本传输协议( HTTP )的统一资源定位符( URL )将从因特网获取信息的五个基本元素包括在一个简单的地址中 :
- 传送协议
- 层级URL标记符号 -- "//" 固定不变 ;
- 访问资源需要的凭证 -- 可省略 ;
- 服务器 -- 通常为域名 , 有时也是IP ;
- 端口号 -- 以数字方式表示 , 若为HTTP的默认端口号"80", 可省略 ; HTTPS的默认端口是"443" ;
- 路径 -- 以"/"字符区别路径中的每一个目录名称 ;
- 查询 -- GET模式的窗口体参数 , 以"?"字符为起点 , 每个参数以"&"隔开 , 再以"="分开参数名称与数据 , 通常以UTF8的URL编码 , 避开字符冲突的问题 ;
- 片段 -- 以"#"字符为起点 , 比如: 在一个页面内跳转的路径(
<a name="#_label4" ></a>) ;
HTTP请求格式
# 第一行就是请求行;
# 第二行到空行之间都是请求头部,都是一个个键值对;
# 空行是请求数据(为什么是空?因为get请求没有请求数据,post请求才有);
'GET / HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
'

浙公网安备 33010602011771号