HTTP协议基础知识

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这个字段让服务器为每一个页面分配唯一编号,通过这个编号来区分当前这个页面是否是最新的。
发布了266 篇原创文章 · 获赞 9 · 访问量 23万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览