Http 协议概述
HTTP 协议是一个标准,定义了web客户端如何与服务器对话,以及数据如何从服务器传回客户端。
一、如何发起一个请求
发起一个HTTP 请求的过程就是 建立一个socket通信的过程。
浏览器在建立socket链接之前,必须根据浏览器地址栏的URL的域名DNS解析出IP地址,然后根据这个IP地址和默认的80端口与远程的服务器建立socket连接。
然后浏览器根据这个URL组装成一个get类型的HTTP请求头,通过outputStream.write发送到目标服务器,服务器等待inputStream.read返回数据,最后断开这个连接。
如何模拟浏览器发送HTTP请求? linux中的curl命令或者开源的HttpClient
基本的四个步骤
- 1、默认情况下,客户端在端口80打开与服务器的一个TCP连接,URL中可以指定其他端口
- 2、客户端向服务器发送消息(GET 请求),请求指定路径上的资源。这个请求包括一个首部,可选的内容,以及请求的数据
- 3、服务器向客户端发送响应。响应以响应码开头,后面是包含元数据的首部,一个空行以及所请求的文档或者错误信息
- 4、服务器关闭链接
二、HTTP 解析
常见的HTTP请求头和响应头
1、请求头
原始的请求头
#请求行(request line) 包括一个方法,资源的路径 http版本 GET /TestHttp/ HTTP/1.1 GET 方法,/TestHttp/资源的路径 HTTP/1.1 http版本 #被请求资源的Internet主机和端口号 Host: weixuan:8080 #客户端告诉服务器它的基本属性,使用的浏览器及版本,操作系统等 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 #告诉服务器 ,客户端可以处理那些数据类型,一般服务器忽略这一点 #text:表示人可读的文字,application二进制数据 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 #用于指定一种自然语言 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 #可接受的内容编码 Accept-Encoding: gzip, deflate #cookie Cookie: JSESSIONID=E4BB982F1928C825938CD50C0A82813B #当前连接是否保持 Connection: keep-alive
格式化之后的请求头
Accept :text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding :gzip, deflate Accept-Language :zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Connection :keep-alive Cookie : JSESSIONID=E4BB982F1928C825938CD50C0A82813B Host : weixuan:8080 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0
最后以一个空行结束,两个回车换行 \r\n\r\n
2、响应头
原始的响应头
#状态行 说明服务器使用的HTTP版本 和HTTP状态码 HTTP/1.1 200 OK #使用的服务器名称 Server: Apache-Coyote/1.1 #指明发送给接受者的实体正文的媒体类型 Content-Type: text/html;charset=ISO-8859-1 #指明正文的长度,用以字节的方式存储的十进制数字表示 Content-Length: 699 #时间戳 Date: Wed, 01 Jul 2015 07:54:24 GMT
格式化之后的响应头
Content-Length :699 Content-Type:text/html;charset=ISO-8859-1 Date:Wed, 01 Jul 2015 07:54:24 GMT Server:Apache-Coyote/1.1
3、常见的状态码
三、浏览器缓存
缓存的字段
1、使用ctrl+F5 后的请求头
当我们使用ctrl+F5 刷新一个页面时,在HTTP 的请求头加入一些请求头,告诉浏览器我们要获取的是最新的数据而不是缓存
ctrl+F5 后的HTTP 请求头
GET /TestHttp/ HTTP/1.1 Host: weixuan:8080 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Cookie: JSESSIONID=E4BB982F1928C825938CD50C0A82813B Connection: keep-alive #和Cache-Control类似 Pragma: no-cache #这个字段用于指定所有的缓存机制在整个请求/响应链中必须服从的指令 Cache-Control: no-cache
2、HTTP Head的可选值及说明
3、expires(有效期)
通常使用的格式是Expires:Wed, 01 Jul 2015 07:54:24 GMT。
过了这个时间值,缓存就失效了。浏览器在发出请求之前检查这个页面的字段,查看是否过期,如果过期了,重新向服务器发送请求
4、Last-Modified/Etag
Last Modified Wed Jul 01 2015 17:05:14 GMT+0800,告诉浏览器这个页面最后的修改时间。浏览器再次请求时会在请求头中加入if-modified-since:Wed Jul 01 2015 17:05:14 GMT+0800字段,询问当前缓存的页面是否是最新的,如果是最新的就会返回304状态码,服务器不会传输新的信息。
Etag这个字段让服务器为每一个页面分配唯一编号,通过这个编号来区分当前这个页面是否是最新的。