超文本传输协议是一种应用层协议
HTTP
超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种应用层协议,在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来,而浏览器和服务器之间的传输协议是HTTP。1
请求消息结构
一个请求消息是由请求行、请求头字段、一个空行和消息主体构成2。如:
GET /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: example.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
userName=lideyu
password=123456
请求行
请求消息的第一行就是请求行,指明了请求方法、资源标示符和 HTTP 版本。
HTTP/1.1 协议中定义了八种请求方法:
- GET:读取资源数据,缺省请求方法
- POST:新建资源数据
- PUT:更新资源数据
- DELETE:删除资源数据
- HEAD:读取资源的元数据
- OPTIONS:读取该资源所支持的所有请求方法
- TRACE:回显服务器收到的请求,主要用于测试或诊断
- CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器
资源标识符包括URI、URL和URN。URL(Uniform Resource Locator) 统一资源定位符用于描述一个网络上的资源。基本格式:schema://host[:port#]/path/.../?query-string
。
- scheme 传输协议,HTTP、HTTPS等
- host 服务器,HTTP服务器的IP地址或域名
- port 端口号,HTTP服务器的默认端口是80,可以省略
- path 路径,访问资源的路径
- query-string 查询字符串,发送给HTTP服务器的数据,GET请求发送的数据显示在这里,如:url?name=zzl&age=10
- anchor 锚,用来定位到页面中的特定地方,如:url#title-1。以“#”字符为起点,后面为其值,对应页面中某元素的id或name属性
请求头字段
- Host:请求主机名,如:www.lideyu.com
- Accept:客户端支持哪些 Mine 类型,如:text/html
- Accept-Encoding:支持的编码类型,如:gzip, deflate, sdch
- Accept-Language:可接收的语言,如:en-US,en;q=0.8
- User-Agent:一个标识客户端的字符串,包括浏览器和操作系统等信息,如:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/38.0.2125.101 Safari/537.36
- Connection:客户端支持的连接方式,如:keep-alive为保持一段时间链接,默认为3000ms
- Cookie:Cookie,如sessionid=c8422b97-98e2-4bc6-aa31-9b667d6ca4a5; theme=4;
- Content-Type:如application/x-www-form-urlencoded,表单的数据类型,说明会使用url格式编码数据,url编码的数据都是以“%”为前缀,后面跟随两位的16进制;文件上传时使用multipart/form-data多重编码。
- Content-Length:请求体的长度为多少字节,如:13
- Referer:从哪个页面到的该页面,可用于统计来源和防盗链
- Upgrade:HTTP/1.1引入了Upgrade协议升级机制,支持WebSocket、将HTTP/1.1升级为HTTP/2等3
- If-Modified-Since:比较资源的更新时间,与Last-Modified相对应
- If-None-Match:比较实体标记,与ETag相对应
空行
即遇到连续两个\r\n
时,指示头字段区完成,消息主体开始。
消息主体
POST请求可以有消息体,GET请求不能有请求体。
响应消息结构
响应消息由一个状态行、响应头字段、一个空行、消息主体构成。如:
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
Content-Length: 88
Content-Type: text/html
Connection: Closed
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
状态行
由http版本、状态码、状态描述文字构成。 HTTP 状态码(HTTP Status Code)是用以表示网页服务器 HTTP 响应状态的3位数字代码,所有的状态码的第一个数字代表了响应的五种状态之一:
- 1xx:请求已被服务器接收,继续处理
- 2xx:请求已成功被服务器接收、理解、并接受
- 3xx:需要后续操作才能完成这一请求
- 4xx:请求含有词法错误或者无法被执行
- 5xx:服务器在处理某个正确请求时发生错误
常见状态码4:
- 200:服务器已成功处理了请求
- 204:请求已成功处理,但是没有内容返回
- 302:重定向,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头Location,它指定了新请求的URL地址
- 304:被请求的资源内容没有发生更改5
- 400:请求报文存在语法错误或参数错误,服务器不理解
- 401:未授权
- 403:对请求资源的访问被服务器拒绝了
- 404:服务器找不到你请求的资源
- 500:服务器内部错误
响应头字段
- Content-Type:指定MIME类型,如:Content-Type:text/html; charset=UTF-8
- Content-Encoding:数据的编码类型,如:gzip
- Connection:连接状态,如:closed,keep-alive等
- Content-Length: 响应体多少字节,如:88
- Server:服务器信息,如:Apache/2.2.14 (Win32)
- Date:响应时间,有8小时的时区差,如:Mon, 27 Jul 2009 12:28:53 GMT
- Last-Modified:最后修改时间,如:Wed, 22 Jul 2009 19:15:56 GMT
- Location:302重定向时通知客户端新的资源位置,如:http://www.github.com/login
- Set-Cookie:响应给客户端的Cookie,如:JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello
- Last-Modified:资源的最后修改日期时间
- ETag:资源的匹配信息
消息主体
消息主体是响应消息的承载数据。
GET/POST区别
- GET请求数据长度不能大于2KB,POST理论无限制,具体看服务器6
- GET请求参数在URL显示,没有请求体,参数会保存在浏览器历史中,安全性低;POST请求参数不显示在URL,有请求体,参数不会保存在浏览器历史中,安全性高
无连接、无状态
HTTP是一个无状态、无连接的协议7。
无连接是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,立即断开连接。采用这种方式可以节省传输时间。Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
无状态是指协议自身不对请求和响应之间的通信状态进行保存,对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送HTTP请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。
HTML设置响应头
HTML页面中通过<meta http-equiv="" content="">
指定响应头8。
缓存
刷新
设置为<meta http-equiv="Refresh" content="3;url=http://www.lideyu.com">
。
重定向原理(302状态码)
DNS寻址过程
在客户端和本地DNS服务器之间,包括了本地缓存、系统缓存(hosts文件)、路由器缓存11。
本地DNS服务器,即ISP(互联网服务提供商),电信、移动、联通之类的运营商。
从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。12
HTTPS
HTTPS(Hypertext Transfer Protocol over Secure Socket Layer, or HTTP over SSL,安全超文本传输协议)13,HTTP协议的安全版本。
HTTPS不是应用层的一种新协议,是在HTTP和TCP之间增加了一道SSL(Secure Socket Layer,安全套接层)协议处理数据,也可以通过TLS(Transport Layer Security,传输层安全协议)代替SSL。HTTP和HTTPS的端口不一样,80和443。
HTTP协议弊端:
-
通信使用明文,内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
HTTPS处理速度会变慢,一种是指通信慢,另一种是指由于大量消耗 CPU 及内存等资源,导致处理速度变慢,而且购买证书开销大,但是解决了传输过程中的安全性问题。