HTTP协议详解

一、什么是HTTP协议

总结一下:

①超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础,用于从万维网向本地浏览器传送数据的协议。

②HTTP协议是基于TCP/IP通信协议来传送数据(图片,视频,文字等媒体资源)

二、HTTP特点

① 简单快速,客户端向服务端请求服务时,只需要发送请求和url路径。通常使用的HTTP请求有GET,POST,PUT,PATCH等。(下面会介绍下GET和POST两种请求的区别)同时由于,HTTP比较简单,因此HTTP的服务器程序一般较小,使得通信速度也很快。

② 数据对象灵活:HTTP可以允许传递任意类型的对象,由Content-Type决定,类型有text/html,text/xml,text/png,application/json等,post主流的类型为Json格式,目前用于前后端分离,接口开发。

③ 无连接:当服务器完成响应后,客户端收到相应后,就会释放连接,这样可以节省传输时间。

④ 无状态:无状态是指服务端处理了上一次的信息后,并不会记忆,当发送下一次请求后,需要重新处理,所以再次请求需要包含全部的数据。这样可能就会导致每次发送请求报文中的数据包很大。

三、url介绍

url别名统一资源定位符,就拿我的博客写笔记的url举例吧

http://syz.cn/home_page

(暂时没用上域名)

说明:

① http :表示使用的HTTP协议,在传输过程中没有对数据加密,而HTTPS协议会对数据传输时进行加密,然后发送到服务器,相对于HTTP来说更加安全。

③ syz.cn :这里是域名,syz.cn,当然也可以使用ip进行访问,不过为了安全还是买一个域名,用DNS进行解析绑定到ip上。

③ home_page:该部分是路由,虚拟目录部分,从第一个’/‘到最后一个’/‘为止。

另外还有些比如?后面跟着get传递来的参数。

四、HTTP的Request请求

客户端发送一个HTTP请求到服务器的请求过程:

{width=”100%” align=”center”}

利用网上一个一段request内容,自己想要获取的话可以使用wireshark抓包工具,或者使用charles(曾经我使用它爬过微信的小程序)

1
2
3
4
5
6
7
GET /562f25980001b1b106000338.jpg HTTP/1.1
Host img.mukewang.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/*,*/*;q=0.8
Referer http://www.imooc.com/
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8

我们可以分析一下:
第一行:请求方法,目前的HTTP版本都为1.1
第二行:请求目的地
第三行:浏览器的一些基本配置,标志什么浏览器等等
第四行:接收的类型
第五行:参考的地址
第六行:接受的编码类型
第七行:接受的语言

主要分为四个部分:
①请求行(第一行,包括请求方法,请求的资源和HTTP版本)
②请求报文头(包括一些额外的附加信息,在爬虫中一般复制浏览器中的相应部分就行了)
③空行:请求头后面必须要有空行
④请求报文主体:指的是数据,上面例子中因为get方法,可能不需要带参数

五、HTTP的Response相应

1
2
3
4
5
6
7
8
9
10
HTTP/1.1 200 OK
Date: Jan, 22 May 2020 06:07:21 GMT
Content-Type: text/html; charset=UTF-8

<html>
<head></head>
<body>

</body>
</html>

同样的相应也分成四个部分:
① 状态行:即包含了协议类型HTTP/1.1,状态码200,表示成功返回
② 消息报头:包含了日期和响应数据类型以及编码方式
③ 空行:必须要有空行
④ 相应主体:即响应返回的html内容。

六、HTTP状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作,比如301永久重定向,302临时重定向
4xx:客户端错误–请求有语法错误或请求无法实现,权限不够等
5xx:服务器端错误–服务器未能实现合法的请求

具体的响应码参考文档:

https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

七、HTTP请求方法

上面的HTTP特点中刚才提到了HTTP请求方法:主要有GET,POST,PUT,PATCH,DELETE

GET主要用来获取数据.
POST主要用来提交表单,或者提交数据进行处理,用的比较多,主要用于新建
PUT主要用来更新全部的数据字段,主要用于更新
PATHC主要用于局部更新
DELETE主要用于删除数据

八、HTTP的工作原理

HTTP请求的相应步骤:

1.建立TCP套接字

客户端与服务端之间建立TCP套接字连接。

2.发送HTTP请求报文

通过TCP套接字,客户端向服务端发送HTTP请求。请求报文主要由4部分组成:请求行,请求头,空白行,请求主体

3.服务器处理请求返回HTTP响应

这里举个django的请求例子:web服务器解析请求—->中间件处理—–>定位到相应的路由—–>调用视图函数—–>返回响应。
同样响应报文段也由4部分组成:状态行,相应头,空白行,相应主体

4.释放TCP连接

若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;
若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

客户端解析HTML内容


之前网上看到一些面试的题目,很多面试题都会考察有关HTTP协议的问题,以及在求职的要求时,都需要熟悉HTTP协议,
下面主要记录两道面试的常见题目:

** 九、分析GET和POST请求的区别:**

请求服务的url表示及安全性

①GET请求会将参数放到url中传递,在?后分割url和参数,会以16进制的形式传递,而且只允许是ASCII格式,
中文的话会通过BASE64加密成ASCII格式,如果是敏感的信息,那么就会很不安全。

②POST请求的参数会包含在HTTP请求包的数据包中,所以并不会暴露早url中,常用于提交隐私数据。

③GET的安全性比POST低,GET请求可以可以从历史记录或缓存中查看。而POST不会

长度限制

HTTP协议对数据的大小和url的长度不会有限制,主要的限制由不同的浏览器指定的

① GET是通过url传值的,所以对url的长度有限制,不同的浏览器有不同的限制

② POST因为不是通过url传递数据,因此不会有对url产生长度限制。

浏览器回退问题

① GET方法进行浏览器回退,是无害的,因为GET可以从缓存中拿出数据。

② POST回退浏览器会再次发送请求,每次都要创建新的资源。

十、当你敲好URL回车,会发生什么?

1.浏览器首先向DNS服务器请求解析出域名所对应的IP地址

2.根据解析出的IP地址,加上端口号,与服务端建立TCP套接字连接

3.客户端发送HTTP请求报文段,经过三次握手,在第三次的时候将请求报文段发送给服务端

4.服务器接收HTTP请求,进行解析处理,进行资源定位,经过中间件,调用相应的视图函数,做出响应返回给客户端。

5.服务端根据connection的模式,决定是否主动释放TCP连接。

5.客户端接收服务端响应的响应报文段,并进行解析,依次解析状态行,看状态码是否请求成功,然后解析响应头,响应头
会告诉客户端html文本和字符集,接着客户端根据字符集和html文本,格式化html,最后呈现给用户