HTTP协议学习---(二)基础篇

1 首次建立链接的过程
注意,图中三次握手正常会走两次或者多次,因为http1传输效率比较低,所以浏览器一般会对一个地址利用多个端口建立多个连接,这个链接在开始只是被打开,但没有传输数据。其中握手相关的ACK等消息都是TCP消息,不是http。
在这里插入图片描述

2 http协议基础
请求整体由 起始行+请求头+空行+实体 组成。
在这里插入图片描述

请求中的起始行称为请求行,由三部分组成:
例:GET / HTTP/1.1
①请求方法:是一个动词,如 GET/POST,表示对资源的操作;
②请求目标:通常是一个 URI,标记了请求方法要操作的资源;
③版本号:表示报文使用的 HTTP 协议版本。
响应中的起始行成为状态行,也有三部分组成:
例:HTTP/1.1 404 Not Found
①版本号:表示报文使用的 HTTP 协议版本;
②状态码:一个三位数,用代码的形式表示处理的结果,比如 200 是成功,500 是服务器错误;
③原因:作为数字状态码补充,是更详细的解释文字,帮助人理解原因。
请求行这三个部分通常使用空格(space)来分隔,最后要用 CRLF 换行表示结束。

请求头与响应头注意:
①字段名不区分大小写,例如“Host”也可以写成“host”,但首字母大写的可读性更好;
②字段名里不允许出现空格,可以使用连字符“-”,但不能使用下划线“_”(_这个不绝对,只是规范)。例如,“test-name”是合法的字段名,而“test name”“test_name”是不正确的字段名; ③字段名后面必须紧接着“:”,不能有空格,而“:”后的字段值前可以有多个空格;
④字段的顺序是没有意义的,可以任意排列不影响语义;
⑤字段原则上不能重复,除非这个字段本身的语义允许,例如 Set-Cookie。
⑥Host 字段,它属于请求字段,只能出现在请求头里,它同时也是唯一一个 HTTP/1.1 规范里要求必须出现的字段。
⑦Server 字段是响应字段,只能出现在响应头里。它告诉客户端当前正在提供 Web 服务的软件名称和版本号。一般选择隐藏或者返回其他定义的值,防止利用当前版本漏洞进行攻击
⑧Content-Length,它表示报文里 body 的长度,也就是请求头或响应头空行后面数据的长度。服务器看到这个字段,就知道了后续有多少数据,可以直接接收。如果没有这个字段,那么 body 就是不定长的,需要使用 Transfer-Encoding: chunked 方式分段传输。

补充:
nginx中默认请求头大小不能超过8K,可以使用large_client_header_buffers修改
在拼接http报文时多加了一个空行,则空行之后都被认为是body。

3 http协议请求方式
GET/HEAD——从服务器获取资源
HEAD和GET类似,也是从服务器获取资源,但是不会返回请求的实体数据,只有响应头(元信息),是GET的简易版,如果不需要资源的话,可以避免传输body数据的浪费。
POST/PUT ——向服务器提交数据,数据在body里
PUT和POST作用类似,有微妙不同,通常POST标识新建,PUT标识修改
DELETE ——删除资源,危险性大,很少用
CONNECT——要求服务器为客户端和另一台远程服务器建立一条特殊的链接,这时Web服务器充当代理的角色
OPTIONS——要求服务器列出可对资源实行的操作方法,在响应头Allow字段里返回。目前绝大部分ajax都会利用这个来判定跨域问题
TRACE——用于对HTTP链路的测试或诊断,可以显示出请求 - 响应的传输路径。存在漏洞,会泄露网站的信息,所以通常也是禁止使用

4 http协议URI
URI常用的形式
scheme:// host:port path ? query
URI的完整格式
scheme:// user:[email protected] host:port path ? query #fragment
User:[email protected] : 身份信息,但是不推荐这样使用,泄露重要信息
#fragment :片段标识符。标识URI所定位的资源内部的一个锚点,浏览器可以跳 转到它指示的位置。服务器看不到#fragment
URI的编码
直接把非ASCII 码或特殊字符转换成十六进制字节值,然后前面加一个“%”,中 文、日文等通常使用UTF-8 编码后再转义。

5 http协议状态码
状态码在响应报文里表示了服务器对请求的处理结果;
状态码后的原因短语是简单的文字描述,可以自定义;
状态码是十进制的三位数,分为五类,从 100 到 599;
1xx类状态属于提示,是协议处理的中间状态,少用
101 Switching Protocols表示客户端要求更换协议,服务器同意后返回101,之后改用新的协议进行通信。
2××类状态码表示成功
200表示请求成功
204与200基本相同,但是响应头之后没有body数据
206 断点续传常用,头字段中的Content-Range用来表示获取多少字节的内容
3××类状态码表示重定向
301永久重定向,浏览器会缓存重定向后的地址
302临时重定向,仅本次请求适用,浏览器不会缓存
304 它用于 If-Modified-Since 等条件请求,表示资源未修改,用于缓存控制。它不具有通常的跳转含义,但可以理解成“重定向已到缓存的文件”
4××类状态码表示客户端错误
太多了
5××类状态码表示服务器错误
500 服务器异常,原因多样
501表示功能暂不支持
502表示服务器正常,但是服务器访问其他资源时失败
503 服务器繁忙,处理不完请求,稍后重试

6 http协议特点
HTTP 是灵活可扩展的,可以任意添加头字段实现任意功能;
HTTP 是可靠传输协议,基于 TCP/IP 协议“尽量”保证数据的送达(旨在网络正常的情况下,要保证100%可达就得用消息队列了);
HTTP 是应用层协议,比 FTP、SSH 等更通用功能更多,能够传输任意数据;
HTTP 使用了请求 - 应答模式,客户端主动发起请求,服务器被动回复请求;
HTTP 本质上是无状态的,每个请求都是互相独立、毫无关联的,协议不要求客户端或服务器记录请求相关的信息。

7 http协议优缺点 HTTP 最大的优点是简单、灵活和易于扩展; HTTP 拥有成熟的软硬件环境,应用的非常广泛,是互联网的基础设施; HTTP 是无状态的,可以轻松实现集群化,扩展性能,但有时也需要用 Cookie 技术来实现“有状态”; HTTP 是明文传输,数据完全肉眼可见,能够方便地研究分析,但也容易被窃听; HTTP 是不安全的,无法验证通信双方的身份,也不能判断报文是否被窜改; HTTP 的性能不算差,但不完全适应现在的互联网,还有很大的提升空间。