HTTP协议基础知识总结

一、HTTP协议

1、基本概念

HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。

2、HTTP协议的基本特点

(1)基于请求和响应
客户端向http服务器发起一次请求,服务器对请求做出响应,一来一回。
(2)无连接
无连接是指在应用层无连接,限制每次连接只处理一次请求,也就是说客户发起请求,服务器做出响应。连接即终止。这么做的原因是http是基于互联网的。服务器可能同时面对数十万,百万的请求。由于请求具有瞬时性,突发性。网页浏览具有联想性等等。造成相邻两次请求之间的关系可能不大。如果采用长时间连接的方式,大部分的网络资源就会被空闲下来,造成浪费。所以讲http协议设计成,请求时建立连接,响应时释放连接,以尽快将资源释放出来去服务其他客户端。
(3)无状态
无状态是指http协议没有记忆能力,当一次请求完毕后,它并不会将这次的数据保存下来。
缺点:下次请求的数据与上次相关联的话,就得进行数据重传,可能会造成每次传输的数据量都很大。
优点:在不需要上次的数据时,应答比较快。
(4)简单快速
协议简单,一来一回就结束(一次请求,一次应答,也是所谓的短连接),使得http服务器的程序规模小,不需要去处理太复杂的逻辑,因而通信速度很快。
(5)灵活
http协议允许传输任意类型的数据,类型由报文头部的Content-Type指出。
总之,http协议的种种特点,都简化http服务器的设计,使其可以接受大量高并发的请求。
我们需要知道的是:HTTP协议永远是客户端发送请求,服务器端回送响应

二、HTTP请求报文和响应报文

http协议既然是基于请求和响应的,那么就必须有请求和响应两种报文。
这里写图片描述
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。

1、HTTP请求报文

请求报文分为四部分:请求行、请求报头信息、空行和请求数据4个部分组成,.

1、请求行

http请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。

例如:POST http://job.xjtu.edu.cn/companyLogin.do HTTP/1.1

(1)http请求方法
其中,HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。
(1)GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。
(2)POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将
数据发送给目的服务器,并且没有数据长度限制
(2)URL字段详解:
URL(Uniform Resource Locator) 地址用于描述一个网络上的资源, 基本格式如下:
这里写图片描述
像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现. ⽐比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进⾏行转义. 转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做⼀一位,前面加上%,编码 成%XY格式:
这里写图片描述
从上面的URL可以看出,一个完整的URL包括以下几个部分:
(1)协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在”HTTP”后面的“//”为分隔符
(2)身份验证:其实这一块信息我们看到的比较少,这是一个可选部分,一般的协议(http\https之类)都会使用默认的匿名形式进行数据获取,该部分使用的是@作为该部分的结束符号。
(3)域名部分:可以使用IP地址或域名,这是一个很关键的部分,这关系到你需要从哪个服务器上去获取资源。
(4)端口:服务器设定的端口。像URL地址里一般无端口,那是因为服务器使协议的默认端口了,用户使用url访问服务器时,可以省略的。
(5)路径:访问的资源在服务器下的相对路径,不是在服务器的绝对路径,是服务器上的一个目录或者文件地址。
(6)参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“uid=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。
(7)片段部分: 该部分与上面的?后面的表单信息本质的区别就是这部分内容不会被传递到服务器端。一般用于页面的锚。就是我们常见的网站右下脚一般有一个回到顶部的按钮,一般就是使用其实现的。

2、请求报头信息

请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔,常见请求头如下:
这里写图片描述
请求头部的最后会有一个空行,表示请求头部结束,接下来为请求正文,这一行非常重要,必不可少。

3、空行

用于区分请求头部信息和请求正文

4、请求正文

可选部分,比如GET请求就没有请求正文,若方法字段是POST,则通常来说此处放置的就是要提交的数据;比如要使用POST方法提交一个表单,其中有user字段中数据为“admin”, password字段为123456,那么这里的请求数据就是 user=admin&password=123456,使用&来连接各个字段。

2、响应报文

同样的,HTTP响应报文也由三部分组成:响应行、响应头、响应体
响应报头示例:
这里写图片描述
下面分别介绍这三部分:

1、响应行

响应行一般由协议版本、状态码及其描述组成 比如 HTTP/1.1 200 OK;
其中协议版本HTTP/1.1或者HTTP/1.0,200就是它的状态码,OK则为它的描述。
一般的常见状态码有以下:
100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。
200~299:表示成功接收请求并已完成整个处理过程。常用200
300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(意味着你请求我,我让你去找别人),307和304(我不给你这个资源,自己拿缓存)
400~499:客户端的请求有错误,常用404(意味着你请求的资源在web服务器中没有)403(服务器拒绝访问,权限不够)
500~599:服务器端出现错误,常用500
更详细的状态码信息

2、响应头

响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。
常见的响应头部信息如下:
Allow:服务器支持哪些请求方法(如GET、POST等)。
Content-Encoding:文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE4、IE5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader(“Accept- Encoding”))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。
Content-Length:表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。
Content- Type:表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置 Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。
Date:当前的GMT时间,例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
Expires:告诉浏览器把回送的资源缓存多长时间,-1或0则是不缓存。
Last-Modified:文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。
Location:这个头配合302状态码使用,用于重定向接收者到一个新URI地址。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
Refresh:告诉浏览器隔多久刷新一次,以秒计。
Server:服务器通过这个头告诉浏览器服务器的类型。Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。Servlet一般不设置这个值,而是由Web服务器自己设置。
Set-Cookie:设置和页面关联的Cookie。Servlet不应使用response.setHeader(“Set-Cookie”, …),而是应使用HttpServletResponse提供的专用方法addCookie。
Transfer-Encoding:告诉浏览器数据的传送格式。
WWW-Authenticate:客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader(“WWW-Authenticate”, “BASIC realm=\”executives\”“)。注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问。

3、响应体

响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码。

三、HTTP协议的工作流程

一次HTTP操作称为一个事务,其工作过程可分为四步:
(1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。
(2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
(3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
(4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值