今天中午学习了下http,之前没有系统性的学过,只知道它是超文本传输协议,但对其的一些基本知识还是感觉还是很陌生的。当我中午看见http这个词的时候,首先就想到的一个问题的就是,这是个协议是用来做什么的?
带着这个问题,我们查找了资料,http设计之初是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。现在http的作用已不局限于HTML的传输,图片文件,查询结果等数据也是可以传输的。它的通信过程是这样的:
那么,问题来了,我在web 浏览器中输入了网址之后到底发生了什么?它是如何到server的?server又是如何响应浏览器的请求的?我们来探究下这个过程。
一.http的请求响应流程
我们先输入网址以www.google.com为例,浏览器将显示google的首页。在这个过程中,通过Network的记录,我们就可以知道。在Network中,定位到第一条记录,点击,右侧将显示Request Headers,我们就可以看到浏览器发给google服务器的请求:
scheme:指定低层使用的协议(例如:http, https, ftp)
host:HTTP服务器的IP地址或者域名
port#:HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如http://www.mywebsite.com:8080/
path:访问资源的路径
Accept:我能接受这些类型的文件
User-Agent: 我使用的是何种操作系统上的哪个类型那个版本的浏览器
Accept-Encoding:承认接受何种方式的压缩文件
Cookie:发送存储在本机的cookies信息给服务器
服务器又返回给浏览器了什么内容?
200:表示一个响应的状态码
Content-Type:指示响应的内容,这里是text/html,表示HTML网页。
_ 请注意_:浏览器就是依靠Content-Type来判断响应的内容是网页还是图片,是视频还是音乐。浏览器并不靠URL来判断响应的内容,所以,即使URL是这样的,如: http://example.com/abc.jpg, 它也不一定就是图片。
所以,我们总结http的请求流程如下:
1.浏览器首先向服务器发送HTTP请求,请求包括:
- 方法:GET还是POST,GET仅请求资源,POST会附带用户数据;
- 路径:/full/url/path;
- 域名:由Host头指定:Host: www.google.com.cn;
以及其他相关的Header;
如果是POST,那么请求还包括一个Body,包含用户数据。
2.服务器向浏览器返回HTTP响应,
- 响应代码:如200。
- 响应类型:由Content-Type指定;
- 以及其他相关的Header;
通常服务器的HTTP响应会携带内容,也就是有一个Body,包含响应的内容,网页的HTML源码就在Body中。
3.如果浏览器还需要继续向服务器请求其他资源,比如图片,就再次发出HTTP请求,重复步骤1、2。
搞清楚了http数据传输的相关流程,接下来我们看下和http相关的基本概念:
二.http的特点:
1.无连接
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间
2.媒体独立
这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型
3.无状态
指的是协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
换而言之:无状态也就是说在同一个连接中,两个成功执行的请求之间是没有关系的。这就带来了一个问题,用户没办法在一个网站进行连续的交互,比如在一个电商网站里,用户把某个商品加入了购物车中,换了一个页面后再次添加商品,两次添加商品的请求没有联系,浏览器无法知道最终用户都选择了哪些商品。两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。
三.http的消息结构
1.客户端请求消息:三部分
第一部分叫Request line(请求行), 第二部分叫http header,第三部分是body。
(1)请求行:包括http请求的种类,请求资源的路径,http协议版本;
(2)http header:http头部信息;
(3)body:发送给服务器的query信息 当使用的是"GET" 方法的时候,body是为空的(GET只能读取服务器上的信息,post能写入)
在上图中,我们看见了URL ,那么问题问题来了,URL 该如何理解?
URL:
(1) 概念:URL—Uniform Resource Location统一资源定位符,说白了就是我们常说的“网址”
(2) 组成:Protocol(协议)+Host(主机)+Port(端口)+Query
示例URL:
http://www.mywebsite.com/sj/test;id=8079?name=sviergn&x=true#stuff
Schema: http
host: www.mywebsite.com
path: /sj/test
URL params: id=8079
Query String: name=sviergn&x=true
Anchor: stuff
2.服务端响应消息
也分为三部分,第一部分叫request line, 第二部分叫request header,第三部分是body。
(1)request line:协议版本、状态码、message
(2)request header:request头信息
(3)body:返回的请求资源主体
四.HTTP请求方法
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST,上面我们探究的过程中method告诉我们用到的是GET方法。
GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据
其他的方法如下图:
既然说道了get和post,那么常见的问题就来了,get和post 的区别是什么?在这里,我总结了一下它们的区别:
GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.
1. GET 提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456。POST方法是把提交的数据放在HTTP包的Body中。
2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
接下来是什么问题呢?在上面我们看见如浏览器若请求后,则返回了一个状态码200,那么200有何含义,还有其他的状态码?
五.状态码
状态码由三位数字组成,第一个数字定义了响应的类别
1XX 提示信息 - 表示请求已被成功接收,继续处理
2XX 成功 - 表示请求已被成功接收,理解,接受
3XX 重定向 - 要完成请求必须进行更进一步的处理
4XX 客户端错误 - 请求有语法错误或请求无法实现
5XX 服务器端错误 - 服务器未能实现合法的请求
常见的状态码,如下:
- 200 OK 请求被成功地完成,所请求的资源发送回客户端
- 302 Found 重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request
- 304 Not Modified 文档已经被缓存,直接从缓存调用
- 400 Bad Request 客户端请求与语法错误,不能被服务器所理解
- 403 Forbidden 服务器收到请求,但是拒绝提供服务
- 404 Not Found 请求资源不存在
- 500 Internal Server Error 服务器发生了不可预期的错误
- 503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
最后一个问题就是,就是网页中存在的Content-Type了。
六.Content-Type
内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。
若想了解详细的HTTP content-type ,请戳这个菜鸟网址
参考网址:
1.https://www.zybuluo.com/yangfch3/note/167490
2.https://www.zybuluo.com/yangfch3/note/113028
3.http://www.runoob.com/http/http-tutorial.html
4.http://www.w3school.com.cn/tags/html_ref_httpmethods.asp