5分钟带你快速理解Http协议
HTTP协议
什么是HTTP协议
HTTP(Hyper Text Transfer Protocol)协议又叫超文本传输协议,是建立在TCP/IP协议之上的用来传递数据的协议。它不涉及数据包的传递,主要规定了客户端和服务端的通信格式,默认端口号为80。
HTTP协议的特点
简单快速
灵活
允许任意类型的数据对象
无连接
每次只处理一个请求,且服务端处理完一个请求返回给客户端后立即断开连接,采用这种方式节约时间
无状态
HTTP协=协议是无状态的,它本身不对不同请求的状态进行保存,也就是说每两种请求之间的是相互隔离的。
HTTP报文
HTTP报文分为请求报文和响应报文
请求报文
请求报文包含 请求头(request line) 请求头(header) 空行 请求体四个部分组成。
请求行:用来说明请求类型,要访问的url和HTTP协议版本
请求方法的种类以及作用:
GET:请求指定页面信息,返回页面主体
HEAD:请求指定页面,只用来获取报头
POST:向指定资源提交数据处理请求(例如提交表单和上传文件),数据被包含在请求体中
PUT:更新指定数据
DELETE:删除指定数据 GET和POST请求的区别:
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET请求会被浏览器主动缓存,而POST不会,除非手动设置。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST没有限制。
GET参数通过URL传递,POST放在Request body中
请求头:由关键字 / 值对组成,每行一对,关键字和值用英文冒号“:”分隔。
请求头部通知服务器有关于客户端请求的信息。它包含许多有关的客户端环境和请求正文的有用信息。其中比如:
Host:表示主机名,虚拟主机。
Connection:HTTP/1.1增加的,使用keepalive,即持久连接,一个连接可以发多个请求。
User-Agent:请求发出者,兼容性以及定制化需求。
空行:用来声明请求头和请求体的分隔
请求体:包含我们请求的多个参数如登录时post发送的用户名和密码
响应报文
响应报文包含 响应头 响应行 空行 响应体。(与请求报文最明显的区别就在于响应头中用状态码代替了请求信息)
状态行:包含请求的状态码,每个状态码包含三个数字,第一个数值代表相应的类别
1xx:提示信息:表示请求正在处理
2xx:成功信息:表示请求成功
3xx:重定向信息: 常见的有301和302
4xx:客户端错误信息:常见403禁止访问,404 not found等,一般是语法错误或请求无法实现
5xx:服务器错误:通常因为后端服务器崩溃
HTTP请求大致流程
客户端发送请求报文
DNS解析请求头中的域名(url)返回服务器的域名
TCP协议对请求报文进行分隔成报文段方便发送
IP协议通过ip连接上服务器
TCP协议拿到报文进行重组
HTTP协议对报文进行解析返回响应报文
【补充】 HTTP的长连接和短连接
如上HTTP请求报文中有一个参数为【connection:keepalive】,那这个表示的就是长连接的意思。
目前我们所用的HTTP协议版本都是HTTP1.1版,而在这之前所用的HTTP1.0和0.9版所采用的都是短连接。
那什么是长连接?什么又是短连接呢?
# 短连接指的是HTTP请求发给TCP 之后就断开了连接,在HTTP1.1版本出来之前大多数网页的内容几乎都由文字和css,
js代码组成,所以一次请求就足够了,然后随着时的发展网页上的图片越来越多,我们发送一次请求过后发现内容中包含了大量的图片连接没办法又得重复去发送请求连接TCP,
这样频繁的断开连接的反复操作浪费了大量资源,于是HTTP1.1版本问世后改变了这种连接方式,添加长连接状态。 # 长连接就是我们在HTTP报文中见到的keepalive,他会一直保存和tcp之间的联系,直到HTTP请求回来的资源完全被加载完毕后才会断开。
最新文章
- openresty 前端开发入门一
- MVC基础
- java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z 的解决
- Windows下配置Git服务器和客户端 超全
- 高性能MySQL笔记:第1章 MySQL架构
- jquery ajax 用 data 和 headers 向 java RESTful 传递参数区别
- reactjs入门到实战(十)----one-first_app
- 【转载】图解:二叉搜索树算法(BST)
- H264/AVC视频解码时AVC1和H264的区别
- hdu 4578 Transformation
- 正确地黑C
- ubuntu 安装mysql, 以及全然又一次安装的方法
- CF History(区间合并)
- springmvc 之 SpringMVC视图解析器
- leetcode算法: Find All Duplicates in an Array
- 我的Python笔记
- hive新功能cube和rollup
- 微服务应用新趋势:Service Mesh、AIOps和中台化
- Easyui-textbox得到焦点方法
- python制作电脑定时关机办公神器,另含其它两种方式,无需编程!
热门文章
- logAB = logA + logB; A,B>;0
- android 开发-数据存储之共享参数
- Javascript Number
- Google地址
- android-上下文菜单的创建 - 随心
- javascript的Array.prototype.map()和jQuery的jQuery.map()
- [Git] Create a new repository on the command line
- iOS开发资料
- http请求头和相应头的作用
- Android SDK下载OpenMobile api