HTTP实用指南|青训营笔记

92 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的第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多个之间用&

www.baidu.com/s?wd=HTTP&r…

这个 URI 中,httpsscheme部分,www.baidu.comhost:port部分(注意,http 和 https 的默认端口分别为80、443),/spath部分,而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会被删除,并不会发送给服务器

作用域

Domainpath

当发送请求时,发现域名或路径和属性不匹配,那么Cookie就不会带上

对于路径而言,/表示域名下的任意路径都可以访问

安全相关

如果带上Secure,说明只能通过 HTTPS 传输 cookie。

如果带上了Http-only,那么就是只允许http协议传输,不通过js访问,这是预防XSS的重要手段

Cookie缺点

  • 容量太小,cookie只有4KB,只能用来存储少量数据

  • 性能浪费,只要是同一域名下,不管你需不需要,我都会携带cookie,这样请求次数处增加,就会对性能造成浪费

    这时候我们可以使用DomainPath来指定作用域

  • 安全问题,cookie是以纯文本的形式在浏览器和服务器传输的。很容易被获取到,然后篡改,然后继续发给服务器,这很危险