HTTP协议
概念
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的
应用层协议
。HTTP是万维网的数据通信的基础。
设计HTTP最初的目的是
为了提供一种发布和接收HTML页面的方法
。
HTTP的发展是由蒂姆·伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。
1999年6月公布的 RFC 2616,定义了HTTP协议中现今广泛使用的一个版本——HTTP 1.1。
- 应用层协议(TCP/IP四层模型)
- 最初是用来传输HTML网页的用以浏览器和服务器通信的一种协议
- Web网站提供的资源和服务以URL的形式存在
URL
统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
模式/协议(scheme):它告诉浏览器如何处理将要打开的文件。最常用的模式是超文本传输协议(HyperText Transfer Protocol,缩写为HTTP),这个协议可以用来访问网络。其他的还有 https/ftp/file...
port 如果HTTP服务器使用的非80端口 则需要手动指定 比如http://www.itcastcpp.cn:8080
对于HTTP服务所提供的URL而言 如果端口是80则可以省略
http://user.hostname.com:80/ 也可以写为 http://user.hostname.com/
anchor锚点 这个参数会被浏览器所记住; 将收到的html网页翻到对应的位置
URL示例:
http://127.0.0.1:8080/path/?userid=110#1ftp://g:g@tv.dl1234.com:3100/xxxx30.mkv https://docs.python.org/2/library/re.html#module-re
HTTP协议通信过程
看文字
一次完整的HTTP请求过程大概是这样的:
- 浏览器中输入url地址
- 浏览器TCP三次握手建立连接
- 浏览器向服务端发送具有一定格式的HTTP请求
- 服务端接收请求后解析HTTP请求
- 处理完成返回一个具有一定格式HTTP响应给客户端
- 浏览器收到的之后会解析响应(执行js代码 显示html等等操作)
- 选一个合适的时机断开TCP连接
HTTP请求说明
最主要的头两行分析如下,第一行:
GET / HTTP/1.1
GET表示一个读取请求,将从服务器获得网页数据,/表示URL的路径,URL总是以/开头,/就表示首页,最后的HTTP/1.1指示采用的HTTP协议版本是1.1。目前HTTP协议的版本就是1.1,但是大部分服务器也支持1.0版本,主要区别在于1.1版本允许多个HTTP请求复用一个TCP连接,以加快传输速度。
从第二行开始,每一行都类似于Xxx: abcdefg:
Host: www.sina.com
表示请求的域名是www.sina.com。如果一台服务器有多个网站,服务器就需要通过Host来区分浏览器请求的是哪个网站。
HTTP响应说明
继续往下找到Response Headers,点击view source,显示服务器返回的原始响应数据:
HTTP响应分为Header和Body两部分(Body是可选项),我们在Network中看到的Header最重要的几行如下:
HTTP/1.1 200 OK
200表示一个成功的响应,后面的OK是说明。
如果返回的不是200,那么往往有其他的功能,例如
- 失败的响应有404 Not Found:网页不存在
- 500 Internal Server Error:服务器内部出错
- ...等等...
Content-Type: text/html
总结
- 浏览器向服务器发送HTTP请求
方法可以使用GET 或者 POST
路径 /index.html
域名 有header中Host执行 比如 Host: www.sina.com
头部 根据需求采用
- 服务器返回HTTP响应
响应状态 包括状态码和状态说明 比如 200 OK
响应数据类型 表示根据用户请求响应的对应的数据的类型 由Content-Type头部指定
其他header根据需求采用
通常HTTP响应都带有body 包含响应的内容 比如一个html数据 一个图片的二进制数据
- 如果浏览器发现在完成第一个请求的时候还缺少其他的相关资源 会重复第1 2两步
每个HTTP请求和响应都遵循通信的格式,一个HTTP包含header和body两部分,其中body是可选的.目前,HTTP协议是一种对人类友好的文本协议.
HTTP GET请求格式
GET URL HTTP/1.1\r\n Header1: Value1\r\n Headern: Valuen\r\n \r\n
每一行行末都是一个\r\n 必须遵守.
HTTP POST请求格式
POST URL HTTP/1.1\r\n # 请求行request line Header1: Value1\r\n # 请求头request header Headern: Valuen\r\n \r\n request_body
可见在header和body之间始终都有\r\n\r\n来进行分割
HTTP响应的格式
响应格式:
HTTP/1.1 METHOD satus_code resonse_phrases# 响应状态行\r\n响应头\r\n\r\n响应体
注意: 响应体中的数据由响应头中的Content-Type确定
网页文件 CSS文件 js文件 图片文件
当存在Content-Encoding时 body数据时被压缩的 最常见的就是使用gzip
所以当获取的响应中Content-Encoding存在时 就需要先将body解压然后再进行处理
请求行结构
方法 资源名或资源路径 HTTP协议版本号 METHOD RESOURCE_PATH(NAME) HTTP/X.X
响应行结构
HTTP版本 方法 状态码 状态说明HTTP/X.X METHOD status_code reason_phrases
HTTP版本
主要有
1.0/1.1/2.0
, 现行最流行版本是1.1
请求方法(method)
HTTP1.0定义了三种请求方法:
GET, POST
和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
HTTP响应状态码(响应码)
用来表明HTTP请求是否已经成功完成.HTTP响应类型一共分五大类:
1xx 表示消息响应
2xx 表示成功响应 表示成功地接收请求
3xx 表示重定向(为完成请求 客户需进一步细化请求)
4xx 表示客户端错误
5xx 表示服务器端错误