概述
HTTP 和 TCP 的关系
HTTP 是在 TCP 传输协议上层的应用层协议,主要解决如何包装数据的问题,关于 TCP/IP 和 HTTP 协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只使用(传输层)TCP/IP 协议,但是如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如 HTTP、FTP、TELNET 等,也可以自己定义应用层协议,Web 使用 HTTP 协议作应用层协议,以封装 HTTP 文本信息,然后使用 TCP/IP 做传输层协议将它发到网络上”。
HTTP 协议和 TCP 协议
1、HTTP 访问到服务器的过程
从在浏览器中输入一个网址直到请求到达服务器的过程中如下图。
2、长连接
在 HTTP1.0 版本中,每一个请求都需要在 TCP 协议中经历 “三次握手四次挥手”,在 HTTP1.1 中有了长连接,这个问题得到了改善,可以通过创建的一次 TCP 连接,进行多次请求响应,并在结束后关闭 TCP 连接。
HTTP1.0 版本:
HTTP1.1 长连接版本:
3、管线化
在不同的浏览器中对于访问同一个域名,都有一个最大的请求数限制,数量大小因浏览器而异,如果请求数量大于最大请求数限制,则需要排队等待其他请求结束。
管线化技术,在超出最大请求数限制,客户端继续发送请求到服务端,而不需要其他请求得到响应的时候才能进行,实现并行发送请求,CDN
是比较典型的解决方式,将静态资源分发到不同 ip
下的服务器,请求资源是通过不同的代理服务器去同时获取,可以提高页面初始化响应的速度。
4、URI 和 URL
URI:是统一资源标识符,在某个规则下能把这个资源独一无二标示出来,类似人的身份证号;
URL:统一资源定位符,表示资源的地点,URL 是使用浏览器访问 Web 页面时需要输入的网页地址。
URL 的组成:
username:password@www.pandashen.com:80/2018/07/09/…
http
:协议类型;username:password
:登录信息(如 Github,不安全);www.pandashen.com
:服务器地址(与前面用 @ 连接);80
:服务器端口号(与前面用 : 连接);/2018/07/09/index.html
:带层次的文件路径;uid=1&name=panda
:查询字符串(与前面用 ? 连接);ch1
:片段标识符(hash 值,与前面使用 # 连接)。
HTTP 的组成
请求的一方叫客户端,响应的一方叫服务器端,通过请求和响应达成通信,HTTP 是一种无状态的协议。
1、请求报文
请求报文包含请求行、请求首部和请求体三个部分。
请求行由三个部分组成,并写在同一行,分别为请求方法、请求路径(域名和端口号后面的部分)和协议/版本号。
请求方法:
- GET:获取资源
- POST:向服务器端发送数据,传输实体主体
- PUT:传输文件
- HEAD:获取报文首部
- DELETE:删除文件
- OPTIONS:询问支持的方法
- TRACE:追踪路径
追踪路径方式如下图:
请求体内的内容为向服务端发送的数据,首部分为通用首部、请求首部、响应首部和实体首部四种,在后面详细说明。
2、响应报文
响应报文同样包含三个部分,响应行、响应首部和响应体。
响应行由三个部分组成,并写在同一行,分别为协议/版本号、状态码和状态码原因短语。
HTTP 响应状态码
状态码负责表示客户端请求的返回结果、标记服务器端是否正常、通知出现的错误。
1、状态码类别
类别 | 原因短语 |
---|---|
1XX | Informational(信息性状态码) |
2XX | Success(成功状态码) |
3XX | Redirection(重定向) |
4XX | Client Error(客户端错误状态码) |
5XX | Server Error(服务器错误状态吗) |
2、常见状态码
(1) 成功
状态码 | 原因短语 | 原因解释 |
---|---|---|
200 | OK | 客户端发过来的数据被正常处理 |
204 | Not Content | 正常响应,没有实体 |
206 | Partial Content | 范围请求,返回部分数据,响应报文中由 Content-Range 指定实体内容 |
(2) 重定向
状态码 | 原因短语 | 原因解释 |
---|---|---|
301 | Moved Permanently | 永久重定向 |
302 | Found | 临时重定向,规范要求方法名不变,但是都会改变成 GET |
303 | See Other | 和 302 类似,但必须用 GET 方法 |
304 | Not Modified | 状态未改变,配合(If-Match、If-Modified-Since、If-None_Match、If-Range、If-Unmodified-Since) |
307 | Temporary Redirect | 临时重定向,不该改变请求方法 |
(3) 客户端错误
状态码 | 原因短语 | 原因解释 |
---|---|---|
400 | Bad Request | 请求报文语法错误 |
401 | Unauthorized | 需要认证 |
403 | Forbidden | 服务器拒绝访问对应的资源 |
404 | Not Found | 服务器上无法找到资源 |
(4) 服务器错误
状态码 | 原因短语 | 原因解释 |
---|---|---|
500 | Internal Server Error | 服务器故障 |
503 | Service Unavailable | 服务器处于超负载或正在停机维护 |
HTTP 首部
HTTP 首部字段是 HTTP 报文首部的重要部分,在客户端和服务器进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用。
HTTP 首部主要分为通用首部、请求首部、响应首部和实体首部四种:
- 通用首部字段:请求和响应报文两方都会使用的首部字段;
- 请求首部字段:从客户端向服务器发送请求报文时使用的首部字段,补充了请求的附加内容,客户端信息,响应内容相关优先级等信息;
- 响应首部字段:从服务器向客户端返回响应报文时使用的首部字段;补充了响应的附加内容,也会要求客户端附加额外的内容信息;
- 实体首部字段:针对请求报文和响应报文的实体部分使用的首部,补充了资源内容的更新时间等与实体有关的信息。
1、通用首部字段
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存行为 |
Connection | 链接的管理 |
Date | 报文日期 |
Pragma | 报文指令 |
Trailer | 报文尾部的首部 |
Trasfer-Encoding | 指定报文主体的传输编码方式 |
Upgrade | 升级为其他协议 |
Via | 代理服务器信息 |
Warning | 错误通知 |
2、请求首部字段
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的编码 |
Accept-Langulage | 优先的语言 |
Authorization | Web 认证信息 |
Expect | 期待服务器的特定行为 |
From | 用户的电子邮箱地址 |
Host | 请求资源所在的服务器 |
If-Match | 比较实体标记 |
If-Modified-Since | 比较资源的更新时间 |
If-None-Match | 比较实体标记 |
If-Range | 资源未更新时发送实体 Byte 的范围请求 |
If-Unmodified-Since | 比较资源的更新时间( 与 If-Modified-Since相反 ) |
Max-Forwards | 最大传输跳数 |
Proxy-Authorization | 代理服务器需要客户端认证 |
Range | 实体字节范围请求 |
Referer | 请求中的URI的原始获取方 |
TE | 传输编码的优先级 |
User-Agent | HTTP 客户端程序的信息 |
3、响应首部字段
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围 |
Age | 资源的创建时间 |
ETag | 资源的匹配信息 |
Location | 客户端重定向至指定的 URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 再次发送请求的时机 |
Server | 服务器的信息 |
Vary | 代理服务器缓存的管理信息 |
www-Authenticate | 服务器对客户端的认证 |
4、实体首部字段
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的 HTTP 方法 |
Content-Encoding | 实体的编码方式 |
Content-Language | 实体的自然语言 |
Content-Length | 实体的内容大小(字节为单位) |
Content-Location | 替代对应资源的 URI |
Content-MD5 | 实体的报文摘要 |
Content-Range | 实体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体过期时间 |
Last-Modified | 资源的最后修改时间 |
总结
本篇重点介绍关于 HTTP 协议的一点基础知识,关于请求、响应以及报文对应的信息及内容,也可以用作查询使用。
原文出自:https://www.pandashen.com
最后
以上就是舒心小蝴蝶为你收集整理的老生常谈——HTTP的全部内容,希望文章能够帮你解决老生常谈——HTTP所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复