这是我参与「第四届青训营 」笔记创作活动的第7天。
HTTP的报文结构
TCP在传输的时候分为TCP头和数据部分
HTTP也是类似的,也是header+body,具体是指
起始行+头部+空行+实体
起始行
-
请求报文
GET /home HTTP 1.1
也就是:方法+路径+HTTP版本
-
响应报文
HTTP/1.1 200 OK
响应报文的起始行也叫做状态行
由HTTP版本+状态码+原因组成
头部
格式
Field Name:FieldValue CRLF
- 字段名不区分大小写
- 字段名不可以出现空格和
_下划线 - 字段名后面必须紧挨
:
空行
用来区分请求头和请求行,状态行和状态头
如果你在头部加了一个空行,那么我们就会认为,空行后面的全部是请求头或者时响应头
实体
在请求报文里,就是请求体,在响应报文里,就是响应体
HTTP的请求方法
HTTP1.1
- GET
- HEAD
- POST
- PUT
- DELETE
- CONNECT
- OPTIONS
- TRACE
GET和POST的区别
-
GET是用来发送请求,获取数据
-
POST是用来发送表单,提交数据
-
缓存角度:GET请求会被浏览器主动缓存下来,但是POST不会
-
编码角度:GET请求只能进行URL编码,接受ASCII字符,POST没有限制
-
参数角度:GET一般放在URL,在URL可以看到,但是POST放在请求体中,很适合传输敏感信息
-
幂等性角度:GET是幂等的,POST不是(幂等性是指,执行相同的操作,结果也相同)
-
TCP角度:GET会一次性将请求报文发出去,但是POST会分为两个TCP数据包,首先发送
Header,如果响应为100,那么发body
URI
URI不是URL,网址是URL
URI = URL+URN
URI组成
scheme://host:port path?query#fragment
scheme:表示协议名,比如Http,Https,file,后面紧跟://
host:port:表示主机名和端口
path:表示请求路径
query:参数,key=val多个之间用&
这个 URI 中,https即scheme部分,www.baidu.com为host:port部分(注意,http 和 https 的默认端口分别为80、443),/s为path部分,而wd=HTTP&rsv_spt=1就是query部分
URI支持ASCII编码,对于不是ASCII的会采用十六进制,在前面加%
状态码
| 1XX | 表示协议处理的中间状态,还需要后续状态 |
|---|---|
| 2XX | 表示成功状态 |
| 3XX | 重定向状态,资源位置发生了改变,需要重新请求 |
| 4XX | 请求报文出错 |
| 5XX | 服务端报错 |
HTTP特点
-
灵活可扩展
不仅可以传输文本,也可以传输图片,视频等任意数据
-
可靠传输
HTTP基于TCP/IP,所以它有TCP的特性
-
请求应答
-
无状态
Accept字段
数据格式
Accept有一个字段是Content-Type
-
text: text/html, text/plain, text/css 等
-
image: image/gif, image/jpeg, image/png 等
-
audio/video: audio/mpeg, video/mp4 等
-
application: application/json, application/javascript, application/pdf, application/octet-stream
压缩方式
我们的数据是会进行压缩的,Content-Encoding,字段就是表示采用怎么样的压缩方式,Accept-Encoding,字段表示接受什么样的压缩方式
- gzip: 当今最流行的压缩格式
- deflate: 另外一种著名的压缩格式
- br: 一种专门为 HTTP 发明的压缩算法
一般发送端的压缩方式和接收端的压缩方式是一样的
支持语言
Content-Language:发送的语言
Accept-Language:接受的语言
// 发送端
Content-Language: zh-CN, zh, en
// 接收端
Accept-Language: zh-CN, zh, en
字符集
Accept-Charset:接收端接受的字符集
Content-Type:发送端的字符集,之际使用charset属性指定charset=utf-8
// 发送端
Content-Type: text/html; charset=utf-8
// 接收端
Accept-Charset: charset=utf-8
总结
HTTp1.1解决HTTP的队头阻塞问题
什么是队头阻塞
因为HTTP的传输是基于一发一收模式,就是请求应答的模式,一旦我们前面的请求过多,那么后面就会进行拥挤,则就是队头阻塞
并发连接
对于一个域名可以分配多个长连接,那么相当于增加了任务队列,不至于一个队伍的任务阻塞其他所有任务
域名分片
一个域名最多可以并发6次长连接
我们可以多建几个二级域名,这样他们指向的还是同一个服务器,那是可以并发的长连接多了,事实上也更好的解决了队头阻塞问题
content1.baidu.com,content2.baidu.com,content3.baidu.com我们就分出了几个子域名
你对Cookie了解多少
Cookie简介
因为HTTP是无状态的,每次的HTTp请求都是独立的,默认不保留状态信息
HTTP为此引入了Cookie.同一个域名下发送请求,都会携带相同的 Cookie,服务器拿到 Cookie 进行解析。而服务端可以通过响应头中的Set-Cookie字段来对客户端写入Cookie。
Cookie属性
生命周期
通过Expires和Max-Age属性设置
Expires:过期时间Max-Age:一段时间间隔
如果Cookie过期,则这个Cookie会被删除,并不会发送给服务器
作用域
Domain和path
当发送请求时,发现域名或路径和属性不匹配,那么Cookie就不会带上
对于路径而言,/表示域名下的任意路径都可以访问
安全相关
如果带上Secure,说明只能通过 HTTPS 传输 cookie。
如果带上了Http-only,那么就是只允许http协议传输,不通过js访问,这是预防XSS的重要手段
Cookie缺点
-
容量太小,cookie只有4KB,只能用来存储少量数据
-
性能浪费,只要是同一域名下,不管你需不需要,我都会携带cookie,这样请求次数处增加,就会对性能造成浪费
这时候我们可以使用
Domain和Path来指定作用域 -
安全问题,cookie是以纯文本的形式在浏览器和服务器传输的。很容易被获取到,然后篡改,然后继续发给服务器,这很危险