欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

goweb-http协议

程序员文章站 2022-08-21 18:03:40
"先链接到一个我的另一篇有关HTTP的博客" 第一次访问时会有些慢~~~ http协议 因为编写 Web 应用必须对 HTTP 有所了解,所以我们对 HTTP 进行介绍 HTTP 协议简介 HTTP 超文本传输协议 (HTTP Hypertext transfer protocol),是一个属于应用 ......

先链接到一个我的另一篇有关http的博客
第一次访问时会有些慢~~~

http协议

因为编写 web 应用必须对 http 有所了解,所以我们对 http 进行介绍

http 协议简介

http 超文本传输协议 (http-hypertext transfer protocol),是一个属于应用层的
面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于 1990
年提出,经过几年的使用与发展,得到不断地完善和扩展。它是一种详细规定了浏览器
和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
客户端与服务端通信时传输的内容我们称之为报文
http 就是一个通信规则,这个规则规定了客户端发送给服务器的报文格式,也规
定了服务器发送给客户端的报文格式。实际我们要学习的就是这两种报文。客户端发送
给服务器的称为”请求报文“,服务器发送给客户端的称为”响应报文“。

http 协议的发展历程

超文本传输协议的前身是世外桃源(xanadu)项目,超文本的概念是泰德˙纳尔森(ted
nelson)在 1960 年代提出的。进入哈佛大学后,纳尔森一直致力于超文本协议和该项目
的研究,但他从未公开发表过资料。1989 年,蒂姆˙伯纳斯˙李(tim berners lee)在 cern(欧
洲原子核研究委员会 = european organization for nuclear research)担任软件咨询师
的时候,开发了一套程序,奠定了万维网(www = world wide web)的基础。1990 年
12 月,超文本在 cern 首次上线。1991 年夏天,继 telnet 等协议之后,超文本转移协
议成为互联网诸多协议的一分子。
当时,telnet 协议解决了一台计算机和另外一台计算机之间一对一的控制型通信的
要求。邮件协议解决了一个发件人向少量人员发送信息的通信要求。文件传输协议解决
一台计算机从另外一台计算机批量获取文件的通信要求,但是它不具备一边获取文件一
边显示文件或对文件进行某种处理的功能。新闻传输协议解决了一对多新闻广播的通信
要求。而超文本要解决的通信要求是:在一台计算机上获取并显示存放在多台计算机里
的文本、数据、图片和其他类型的文件;它包含两大部分:超文本转移协议和超文本标
记语言(html)。http、html 以及浏览器的诞生给互联网的普及带来了飞跃。

http 协议的会话方式

浏览器与服务器之间的通信过程要经历四个步骤:建->发 ->回 ->关

浏览器与 web 服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一
个页面的访问,浏览器与 web 服务器都要建立一次单独的连接。

浏览器到 web 服务器之间的所有通讯都是完全独立分开的请求和响应对。

## http1.0 和 http1.1 的区别

在 http1.0 版本中,浏览器请求一个带有图片的网页,会由于下载图片而与服务器
之间开启一个新的连接;但在 http1.1 版本中,允许浏览器在拿到当前请求对应的全部
资源后再断开连接,提高了效率http 1.1 是目前使用最为广泛的一个版本,而最新的一个版本则是 http 2.0,又
称 http/2。在开放互联网上 http 2.0 将只用于 https://网址。https,即 ssl(secure
socket layer,安全套接字层)之上的 http,实际上就是在 ssl/tls 连接的上层进行 http
通信。
备注:ssl 最初由 netscape 公司开发,之后由 ietf(internet engineering task force,
互联网工程任务组)接手并将其改名为 tls(transport layer security,传输层安全协
议)

请求报文

  • 报文格式

    • 请求首行(请求行);
    • 请求头信息(请求头);
    • 空行;
    • 请求体;
  • get 请求
get /hello/index.jsp http/1.1
accept: */*
accept-language: zh-cn
user-agent: mozilla/4.0 (compatible; msie 8.0; windows nt 6.1; wow64;
trident/4.0; slcc2; .net clr 2.0.50727; .net clr 3.5.30729; .net clr 3.0.30729;
media center pc 6.0; .net4.0c; .net4.0e)
accept-encoding: gzip, deflate
host: localhost:8080
connection: keep-alive
cookie: jsessionid=c55836cda892d9124c03cf8fe8311b15

get 请求没有请求体,post 请求才有请求体

get /hello/index.jsp http/1.1 : get 请 求 , 请 求 服 务 器 路 径 为
hello/index.jsp,协议为 1.1;

  • host:localhost:请求的主机名为 localhost;

  • user-agent: mozilla/4.0 (compatible; msie 8.0…:与浏览器和 os 相关的

信息。有些网站会显示用户的系统版本和浏览器版本信息,这都是通过获取 user-
agent 头信息而来的;

  • accept: /:告诉服务器,当前客户端可以接收的文档类型, /,就表示
    什么都可以接收;

  • accept-language: zh-cn:当前客户端支持的语言,可以在浏览器的工具

选项中找到语言相关信息;

  • accept-encoding: gzip, deflate:支持的压缩格式。数据在网络上传递时,
    可能服务器会把数据压缩后再发送;

  • connection: keep-alive:客户端支持的链接方式,保持一段时间链接,默
    认为 3000ms;

  • cookie: jsessionid=369766fdf6220f7803433c0b2de36d98:因为不是
    第一次访问这个地址,所以会在请求中把上一次服务器响应中发送过来的 cookie
    在请求中一并发送过去。

  • post 请求
    post 请求要求将 form 标签的 method 的属性设置为 post

post /hello/target.html http/1.1
accept: application/x-ms-application, image/jpeg, application/xaml+xml,
image/gif, image/pjpeg, application/x-ms-xbap, */*
referer: http://localhost:8080/hello/
accept-language: zh-cn
user-agent: mozilla/4.0 (compatible; msie 8.0; windows nt 6.1; wow64;
trident/4.0; slcc2; .net clr 2.0.50727; .net clr 3.5.30729; .net clr 3.0.30729;
media center pc 6.0; .net4.0c; .net4.0e)
content-type: application/x-www-form-urlencoded
accept-encoding: gzip, deflate
host: localhost:8080
content-length: 14
connection: keep-alive
cache-control: no-cache
cookie: jsessionid=774da38c1b78ae288610d77621590345

referer:
度上点击链接到了这里,那么 referer:
址栏中直接输入的地址,那么就没有 referer 这个请求头了;

  • content-type: application/x-www-form-urlencoded:表单的数据类型,说明
    会使用 url 格式编码数据;url 编码的数据都是以“%”为前缀,后面跟随两位的 16 进
    制,例如“传智”这两个字使用 utf-8 的 url 编码用为“%e4%bc%a0%e6%99%ba”;

  • content-length:13:请求体的长度,这里表示 13 个字节。

  • keyword=hello:请求体内容!hello 是在表单中输入的数据,keyword 是表单
    字段的名字。

响应报文

  • 报文格式
    • 响应首行(响应行);
    • 响应头信息(响应头);
    • 空行;
    • 响应体;
http/1.1 200 ok
server: apache-coyote/1.1
content-type: text/html;charset=utf-8
content-length: 274
date: tue, 07 apr 2015 10:08:26 gmt
<!doctype html public "-//w3c//dtd html 4.01 transitional//en" >
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>insert title here</title>
</head>
<body>
<h1>hello</h1>
</body>
</html>
  • http/1.1 200 ok:响应协议为 http1.1,状态码为 200,表示请求成功;
  • server: apache-coyote/1.1:服务器的版本信息;

  • content-type: text/html;charset=utf-8:响应体使用的编码为 utf-8;

  • content-length: 274:响应体为 274 字节;

  • date: tue, 07 apr 2015 10:08:26 gmt:响应的时间,这可能会有 8 小时的时
    区差;

响应状态码

  • 状态码用来告诉 http 客户端,http 服务器是否产生了预期的 response。http/1.1
    协议中定义了 5 类状态码, 状态码由三位数字组成,第一个数字定义了响应的类

    • 1xx 提示信息 - 表示请求已被成功接收,继续处理

    • 2xx 成功 - 表示请求已被成功接收,理解,接受

    • 3xx 重定向 - 要完成请求必须进行更进一步的处理

    • 4xx 客户端错误 - 请求有语法错误或请求无法实现

    • 5xx 服务器端错误 - 服务器未能实现合法的请求

  • 响应码对浏览器来说很重要,它告诉浏览器响应的结果,常见的状态码有:
    • 200:请求成功,浏览器会把响应体内容(通常是 html)显示在浏览器中;

    • 404:请求的资源没有找到,说明客户端错误的请求了不存在的资源;

    • 500:请求资源找到了,但服务器内部出现了错误;

    • 302:重定向,当响应码为 302 时,表示服务器要求浏览器重新再发一个请求,
      服务器会发送一个响应头 location,它指定了新请求的 url 地址;