http

http所谓的“超文本传输协议”其实并不怎么管“传输”的事情。

http协议的核心部分是它传输的报文内容。

http是一个纯文本的协议,所以头数据都是ASCII码的文本,可以很容易地用肉眼

阅读,不用借助程序解析也能看懂。

起始行(start line) + 头部字段(header) = 请求头

消息正文又称为实体但是与header对应,很多时候就直接称为body

http协议规定报文必须有header并且header之后必须要有一个空行,但是可以没有body

在很多时候,特别是浏览器发送get请求的时候都是这样,http报文经常是只有header而没有body,相当于只发了一个超级“大头”过来,可以想象为:每时每刻网络上都有数不清的“大头儿子”在跑来跑去。不过这个大头也不能太大,虽然http协议对header的大小没有做限制,但是各个web服务器都不会允许过大的请求头,因为头部太大可能会占用大量的服务器资源,影响运行效率。

请求行简要描述了客户端想要如何操作服务器端的资源。

由三部分构成:

  • 请求方法
  • 请求目标
  • 版本号

这三个部分通常使用空格来分隔。

例如:GET / HTTP/1.1

  • GET是请求方法
  • /是请求目标
  • HTTP/1.1是版本号

意思就是: “服务器你好,我想获取网站根目录下的默认文件,我用的协议版本号是1.1请不要用1.0或者2.0回复我。

请求行或状态行再加上头部字段集合就构成了http报文里完整的请求头或响应头。

http头字段非常灵活,不仅可以使用标准里的host、connection等已经定义的头,也可以任意添加自定义头,这就给http协议带来了无限的扩展可能。

注意:

  • 字段名不区分大小写,但是首字母大写的可读性更好
  • 字段里不允许出现空格、下划线_,但是可以使用连字符

常用头字段

  • 通用字段
  • 请求字段
  • 响应字段
  • 实体字段: 实际上可以归为通用字段,但是专门用来描述body的额外信息

对http报文的解析和处理实际上就是对头字段的处理,理解了头字段也就理解了http报文

Host

属于请求字段,只能出现在请求头里,同时也是唯一一个http1.1规范里要求必须出现的字段,如果请求头部字段里没有这个host,那这就是一个错误的报文。host字段用来告诉服务器这个请求应该由哪个主机来处理,当一台计算机上托管了多个虚拟主机的时候,服务器端就需要用host字段来选择,有点像一个简单的“路由重定向”。

1:如果拼 HTTP 报文的时候,在头字段后多加了一个 CRLF,导致出现了一个空行,会发生什么?
在header 下面第一个空行以后都会被当作body 体

2:讲头字段时说“:”后的空格可以有多个,那为什么绝大多数情况下都只使用一个空格呢?
头部多一个空格就会多一个传输的字节,去掉无用的信息,保证传输的头部字节数尽量小