HTTP协议基础知识

来源:互联网 发布:淘宝钻石店铺好做吗 编辑:程序博客网 时间:2024/06/07 00:35

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#cookieCookie: JSESSIONID=E4BB982F1928C825938CD50C0A82813B#当前连接是否保持Connection: keep-alive

格式化之后的请求头
Accept :text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Encoding :gzip, deflateAccept-Language :zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Connection :keep-aliveCookie : JSESSIONID=E4BB982F1928C825938CD50C0A82813BHost : weixuan:8080User-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 :699Content-Type:text/html;charset=ISO-8859-1Date:Wed, 01 Jul 2015 07:54:24 GMTServer:Apache-Coyote/1.1

3、常见的状态码



三、浏览器缓存

缓存的字段


1、使用ctrl+F5 后的请求头

当我们使用ctrl+F5 刷新一个页面时,在HTTP 的请求头加入一些请求头,告诉浏览器我们要获取的是最新的数据而不是缓存

ctrl+F5 后的HTTP 请求头
GET /TestHttp/ HTTP/1.1Host: weixuan:8080User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateCookie: JSESSIONID=E4BB982F1928C825938CD50C0A82813BConnection: 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这个字段让服务器为每一个页面分配唯一编号,通过这个编号来区分当前这个页面是否是最新的。
0 0
原创粉丝点击