Http 协议详解

简介

TCP/IP协议栈

Http 超文本协议

  1. HTTP 超文本传输协议,是一个无状态、TCP/IP的应用层协议,用于定义web浏览器与web服务器之间交换数据的过程。
  2. 版本:HTTP/1.0、HTTP/1.1。区别是1.1版本,客户端与服务器连接后,在一个连接上可以获取多个web资源。
  3. 在TCP/IP协议栈中的位置:Http(SSL) -> TCP -> IP -> 数据链路层(从上往下)

Http 请求

组成

  1. 客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送一个HTTP请求。
  2. 一个完整的HTTP请求包括如下内容:一个请求行,若干消息头(请求头)、实体内容。

请求行(General)

  1. 客户端的请求方式:Get/Post
  2. 请求的地址
  3. HTTP版本号:HTTP/1.1
# 火狐查看得出: 
请求网址:https://www.baidu.com/
请求方法:GET
远程地址:180.97.33.108:443
状态码:200 OK
版本:HTTP/1.1

# Chrome 查看得出
Request URL: https://www.baidu.com/
Request Method: GET
Status Code: 200 OK
Remote Address: 180.97.33.107:443
Referrer Policy: no-referrer-when-downgrade

请求头(Request Header):客户请求主机 和 客户端环境信息

  1. Accept: 指定客户端接受哪些类型的信息。/:支持任何类型
  2. Accept-Charset:指定客户端接受的字符集。如,Accept-Charset:iso-8859-1,gb2312
  3. Accept-Encoding:指定客户端可接受的数据压缩格式
  4. Accept-Language:客户端的语言环境
  5. Host:指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的
  6. If-Modified-Since:客户端告诉服务器资源的缓存时间
  7. Referer:客户端从哪个资源访问的服务端(防盗链)
  8. User-Agent:客户端的软件环境(什么操作系统,什么浏览器)
  9. Cookie:Cookie数据
  10. Connection:这个请求完了是保持链接还是断开链接(长短链接)。close/keep-alive
# 火狐查看得出:
Accept: text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Cache-Control: max-age=0
Connection: keep-alive
Cookie: BAIDUID=750D9FB78B62071D74F66B…1458_21098_26432;
Host: www.baidu.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/60.0


# Chrome 查看得出
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,ja;q=0.7
Cache-Control: max-age=0
Connection: keep-alive
Cookie: BIDUPSID=0C0589E7DDB5029A8E71E88AFB719857; 
Host: www.baidu.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36

实体内容 (Query String Parameters)

  1. 一般是请求的内容,如访问 https://www.baidu.com/?query=entity
# 火狐查看得出:参数栏
query: entity

# Chrome 查看得出: Query String Parameters
query: entity

Http 响应

组成

  1. 一个HTPP响应代表服务器向客户端回送的数据。
  2. Http 响应包括:一个状态行,若干响应头(消息头),以及实体内容

状态行

  1. 服务器处理的结果,主要是状态码数据
  2. 格式:HTTP版本号/状态码 原因叙述<CRLF>,如 HTTP/1.1 200 OK
  3. 状态码
状态码 含义
100 ~ 199 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
200 ~ 299 表示成功接收请求,已经完成整个过程。如200
300 ~ 399 为完成请求,客户端需要进一步细化请求。例如,请求的资源已经移动到一个新的地址。常用 302、307、304
400 ~ 499 客户端的请求有错误。常用404
500 ~ 599 服务器端出现错误。常用500
  1. 常用状态码
301、302:资源已经不存在了,需要重定向到新地址(控制重定向)
304、307:指定客户端去拿缓存
401、403:没有权限访问,如用户名密码错误
404、407:请求的资源没有,如URL地址错误
405:访问方式错误。如Get、Post方式错误
500:服务器端出现问题

响应头 (Response Headers)

  1. Location:配合301、302状态码使用,实现重定向。
response.setStates("301");//设置状态码为301  
response.setHeader("Location","http://www.baidu.com")// 新网址 
  1. server:服务器类型
  2. Content-Encoding:压缩类型;实现压缩返回
//实现压缩  
String tDate = "准备被压缩的数据";  
System.out.println("压缩前的数据大小:  "+tDate.getBytes().length);  
  
ByteArrayOutputStream bout = new ByteArrayOutputStream();  
GZIPOutputStream gout = new GZIPOutputStream(bout);  
gout.write(tDate.getBytes());  
gout.flush();  
gout.close();//写到字节数组流中  
  
byte[] gzip = bout.toByteArray();//得到压缩后的数据  
System.out.println("压缩后的数据大小:  "+gzip.length);  
  
// 通知浏览器数据采用压缩格式  
response.setHeader("Content-Encoding", "gzip");//压缩格式  
response.setHeader("Content-Length",gzip.length+"" );//压缩数据的长度  
response.getOutputStream().write(gzip); 
  1. Content-Length:返回内容的长度
  2. Content-Language:返回内容的语言
  3. Content-type:返回数据的类型
//输出图片,可以去tomcat的web.xml中查找  
        response.setContentType("image/bmp; charset=utf-8");  
response.setHeader("Content-Type", "image/bmp");  
InputStream in = this.getServletContext().getResourceAsStream("/");  
int len = 0;  
byte[] buffer = new byte[1024];  
OutputStream out = response.getOutputStream();  
while((len=in.read(buffer))>0){  
    out.write(buffer, 0, len);  
}  
  1. Refresh:浏览器多长时间重新刷新一次。也可以实现重定向。
response.setHeader("Refresh","1000");//刷新  
response.setHeader("Refresh","1000; url=http://www.baidu.com");//刷新  
response.setHeader("Refresh","0; url=http://www.baidu.com");//重定向 
  1. Transfer-Encoding:数据的传送格式。chunked-为以块状形式传送。
Transfer-Encoding   chunked 
  1. Last-Modified:告诉浏览器当前资源的缓存时间。
  2. ETag:缓存相关的头,可以实现实时更新,比其他缓存头(以秒为单位)更及时精确。
  3. Expires:告诉浏览器把回送的资源缓存多长时间。-1或0,则不缓存。
//设置缓存 一定要是当前时间 + 控制的缓存时间  
response.setDateHeader("Expires", System.currentTimeMillis() + 1000*3600); 
  1. progma:"no-cache" | Cache-Control:"no-cache" :控制浏览器不要缓存。
//不需要缓存       
response.setHeader("Pragma", "no-cache");  
response.setHeader("Cache-Control", "no-cache");  
response.setHeader("Cache-Control", "no-store");  
response.setDateHeader("Expires", 0);//时间头  
  1. content-disposition:服务器返回内容为需要下载访问
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode("文件名称", "UTF-8"));
# 火狐查看得出:
Bdpagetype  1
Bdqid   0xf60525b4000463c7
Cache-Control   private
Connection  Keep-Alive
Content-Encoding    gzip
Content-Type    text/html
Cxy_all baidu+a3c955f7fdab4bd322ed0b4a7b8ca3f4
Date    Thu, 21 Jun 2018 11:51:06 GMT
Expires Thu, 21 Jun 2018 11:51:06 GMT
Server  BWS/1.1
Set-Cookie  BDSVRTM=18; path=/
Set-Cookie  BD_HOME=0; path=/
Set-Cookie  H_PS_PSSID=1458_21098_26432; path=/; domain=.baidu.com
Strict-Transport-Security   max-age=172800
Transfer-Encoding   chunked
Vary    Accept-Encoding
X-Ua-Compatible IE=Edge,chrome=1

# Chrome 查看得出: 
Bdpagetype: 2
Bdqid: 0xf24f13cb0003dde3
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Thu, 21 Jun 2018 11:51:58 GMT
Expires: Thu, 21 Jun 2018 11:51:58 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=132; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=26524_1459_21117_18560_26350_20927; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Transfer-Encoding: chunked
X-Ua-Compatible: IE=Edge,chrome=1

实体内容(Response Body)

  1. 服务端返回的内容: 访问 https://www.baidu.com/?query=entity

# 火狐查看得出:响应栏 
HTML 的网页信息

# Chrome 查看得出: 
HTML 的网页信息

Range,实现断点下载

请求头

  1. 告诉服务器只传输一部分web资源,这个头可以用来实现断点续传功能。
  2. Range:可以通过三种格式设置要传输的字节范围:
  • Range:bytes = 1000-2000 :传输范围从1000 到 2000 字节。
  • Range:bytes = 1000- :传输web资源中第1000个字节以后的所有内容。
  • Range:bytes = 1000 :传输最后1000 个字节。
  1. 代码:请求中,实现断电下载
# 请求中,实现断电下载  
URL url = new URL("http://localhost:8080/javaweb/");//请求的地址  
HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
conn.setRequestProperty("Range", "byte=5-");//请求5字节以后的数据,断点下载  
  
InputStream  in = conn.getInputStream();  
int len = 0;  
byte[] buffer = new byte[1024];  
FileOutputStream out = new FileOutputStream("c:\\a.text",true);//存放的地方  
  
while((len=in.read(buffer))>0){  
    out.write(buffer, 0, len);  
}  
  
in.close();  
out.close();  

响应头字段

  1. Accept-Range:这个字段说明web服务器是否支持Range
  • Accept-Range:bytes:支持
  • Accept-Range:none:如果不支持
  1. Content-Range:指定了返回web 资源的字节范围。这个字段值的格式是:
Content-Range: 1000-3000/5000 # 整个资源是5000,返回的是1000-3000  
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容