TheRiver | blog

You have reached the world's edge, none but devils play past here

0%

http basis

概念

http(HyperText transfer protocol)是超文本传输协议

超文本: 文字,音频,视频等
传输:不同于路由协议,隧道协议,传输协议用于两方交换数据
协议:符合rfc规范的应用层协议

相关技术

  • web服务器
  • 爬虫
  • cdn
  • html/webservice/waf

报文

请求

1
2
3
4
request line: method + URI + version
head: k/v
CRLF
body

响应

1
2
3
4
status line: version + status code + reason
head: k/v
CRLF
body

常用头

通用字段

Data:通用字段,但一般放在响应头,代表报文创建时间

请求字段

host: 请求消息必带字段,代表了ip地址下的具体哪台主机,可用于路由重定向

User-Agent: 请求字段,描述客户端,比如chrome,实际作用不大

响应字段

server:响应字段,代表web服务器软件和版本,也可以随便写一个来隐藏服务器软件

实体字段

content-lenght:实体字段,代表body的长度,如果不带content-length则表示报文是不定长的,chunked类型

method

GET 读取下载数据 //幂等

HEAD 获取数据元信息 //幂等

POST 提交数据,偏向create,实际上创建修改都基本用POST //非幂等

PUT 和POST差不多,偏向update,实际多用POST替代 //幂等

DELETE 删除数据 //幂等

CONNECT 建立隧道,webf服务器可以因此作为代理

OPTIONS 列出可选方法

TRACE 追踪请求-响应的传输路径

uri

schema :// user:passwd@ host:port path ?query #fragment

https://www.nginx.com/resources/library/web-application-security/?utm_medium=nginxorg&utm_source=homepagehero&utm_campaign=ww-nx_sec&utm_content=eb&_ga=2.158505918.527586210.1614136337-596008434.1614136337

https://github.com/GHScan/TechNotes/blob/master/2017/Memory_Model.md#%E7%BC%96%E8%AF%91%E5%99%A8%E4%B8%AD%E7%9A%84%E4%BC%98%E5%8C%96%E6%8A%80%E6%9C%AF

上面的#代表锚点,直接到页面的一个标签处。因为有中文,这里也做了转义

状态码

1xx

提示信息,代表中间状态

101:切换协议

2xx

成功信息

204:响应里面没有body

206: 响应是分段传输的一部分

3xx

重定向

301: 永久重定向

302:临时重定向

304:缓存重定向

4xx

客户端错误

400:格式错误

404:未找到

403:禁止访问

5xx

服务器错误

503:服务器忙

数据类型和编码

http是超文本传输协议,支持文本,视音频等格式,所以需要带上文件类型,因为数据可能被压缩,也要带上压缩格式,文件类型符合MIME协议

text

  • text/html 超文本文档
  • text/plain 纯文本
  • text/css 样式表

audio

  • audio/mpeg

video

  • video/mp4

image

  • image/gif
  • image/jpeg

application

  • application/pdf
  • application/json

encoding

  • gzip
  • deflate
  • br

语言和字符集

  • en-US en-GB zh-CN
  • utf-8 gbk

内容协商

1
2
3
4
5
client                                          server
Accept: text/plain,application/pdf Content-Type: text/plain
Accept-Encoding: gzip, deflate, br Content-Encoding: gzip
Accept-Language: zh-CN Content-Language: zh-CN
Accept-Charset: gbk, utf-8 Content-Type: text/plain; charset=utf-8

分段和范围

感觉不重要,不记录了

长连接

Connection: keep-alive 表示长连接

Connection: close 关闭连接

队头阻塞

因为http是请求-应答模式,一条连接上,前一个请求阻塞了,会影响后面的请求,也就是队头阻塞

解决办法:

请求方并发多个连接,一般浏览器是开6个

响应方开启多主机,域名分片

cookie可以用来记录客户端的状态

Expire/Max-Age: 表示cookie的过期时间

HttpOnly: 表示cookie只适用于http协议,防止脚本攻击

Secure: 表示cookie智能通过https协议传输,但cookie本身是明文的

SameSite: 表示cookie只用于本站,防止跨站攻击

Priority: 表示cookie移除时的优先级

http特点

灵活可扩展

head支持自定义字段

可靠传输

下层是tcp/ip

应用层协议

在应用层协议中(ftp,ssh)表现突出

请求应答

契合c/s, b/s架构

无状态

因为请求应答,两次连接彼此独立,不会记录请求方的状态,但可以通过cookie来实现有状态

流程

浏览器输入 http://nginx.org/


1
2
3
4
5
6
查dns
三次握手
Get / HTTP/1.1 //拿index.html
Get /nginx.png HTTP/1.1 //拿网站图标,index里面的超链接
GET /favicon.ico HTTP/1.1 //拿浏览器那个小图标
挥手
----------- ending -----------