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 |
|
我们可以分析一下:
第一行:请求方法,目前的HTTP版本都为1.1
第二行:请求目的地
第三行:浏览器的一些基本配置,标志什么浏览器等等
第四行:接收的类型
第五行:参考的地址
第六行:接受的编码类型
第七行:接受的语言
主要分为四个部分:
①请求行(第一行,包括请求方法,请求的资源和HTTP版本)
②请求报文头(包括一些额外的附加信息,在爬虫中一般复制浏览器中的相应部分就行了)
③空行:请求头后面必须要有空行
④请求报文主体:指的是数据,上面例子中因为get方法,可能不需要带参数
五、HTTP的Response相应
1 |
|
同样的相应也分成四个部分:
① 状态行:即包含了协议类型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,最后呈现给用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!