1. 应用层概述
应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。
应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。我们把应用层交互的数据单元称为报文
应用层必知必会
协议 | |
---|---|
HTTP | 超文本传输协议 |
HTTPS | |
DNS | 域名系统 |
DHCP | 动态主机配置协议 |
FTP | 文本传输协议 |
SMTP | 简单邮件传输协议 |
SSH | 安全外壳协议 |
TELNET | 远程登陆协议 |
2. 用户上网设置
2.1 静态IP地址
当为一台新电脑插上网线,开机后它并不能直接上网;网络通信的本质是交换数据包,电脑A向电脑B发送一个数据包,后者收到了,回复一个数据包,从而实现两台电脑之间的通信;
通过之前对网络层的讲述我们知道, 为了接受数据包,我们需要在网络上将自己标志出来,这个标志就是IP地址(实际上还有MAC地址,这里先不说),我们把整个因特网看成为一个单一的、抽象的网络,IP 地址就是给每个连接在因特网上的主机(或路由器)的每一个接口分配一个在全世界范围是唯一的 32 位的标识符(IPV4)
为了标识我们的计算机,我们需要做一些设置,有时,管理员(或者ISP)会告诉你下面四个参数,你把它们填入操作系统,计算机就能连上网了
本机的IP地址
子网掩码
网关的IP地址
DNS的IP地址
这样我们给定计算机一个指定的IP,由于它们是给定的,计算机每次开机,都会分到同样的IP地址,所以这种情况被称作"静态IP地址上网",自然,这样的配置麻烦且不够灵活,如果一台电脑的IP地址保持不变,其他电脑就不能使用这个地址,处于这个原因,大多数用户使用"动态IP地址上网"
2.2 动态IP地址(DHCP协议)
所谓"动态IP地址",指计算机开机后,会自动分配到一个IP地址,不用人为设定。它使用的协议叫做DHCP协议;
动态主机配置协议 DHCP 提供了即插即用连网(plug-and-play networking)的机制,这种机制允许一台计算机加入新的网络和获取IP地址而不用手工参与;
DHCP用于获取动态IP地址是应用层的协议
2.2.1 DHCP是使用客户服务器方式
需要 IP 地址的主机在启动时就向 DHCP 服务器广播发送发现报文(DHCPDISCOVER),这时该主机就成为 DHCP 客户。
本地网络上所有主机都能收到此广播报文,但只有 DHCP 服务器才回答此广播报文。
DHCP 服务器先在其数据库中查找该计算机的配置信息。若找到,则返回找到的信息。若找不到,则从服务器的 IP 地址池(address pool)中取一个地址分配给该计算机。DHCP 服务器的回答报文叫做提供报文(DHCPOFFER)
DHCP服务器必须是静态地址
2.2.2 租用期
DHCP 服务器分配给 DHCP 客户的 IP 地址的临时的,因此 DHCP 客户只能在一段有限的时间内使用这个分配到的 IP 地址。DHCP 协议称这段时间为租用期。
租用期的数值应由 DHCP 服务器自己决定。
DHCP 客户也可在自己发送的报文中(例如,发现报文)提出对租用期的要求
2.2.3 DHCP协议的工作过程
① DHCP 服务器被动打开 UDP 端口 67,等待客户端发来的报文。
② DHCP 客户从 UDP 端口 68发送 DHCP 发现报文(发送广播,目的地址全1,源地址全0 )
因为DHCP客户这个时候并不知道DHCP服务器的地址,所以这个时候是以广播的方式发送报文
③ 凡收到 DHCP 发现报文的 DHCP 服务器都发出 DHCP 提供报文,因此 DHCP 客户可能收到多个 DHCP 提供报文
④ DHCP 客户从几个 DHCP 服务器中选择其中的一个,并向所选择的 DHCP 服务器发送 DHCP 请求报文
⑤ 被选择的 DHCP 服务器发送确认报文DHCPACK,进入已绑定状态,并可开始使用得到的临时 IP 地址了
DHCP 客户现在要根据服务器提供的租用期 T 设置两个计时器 T1 和 T2,它们的超时时间分别是 0.5T 和 0.875T。当超时时间到就要请求更新租用期
⑥ 租用期过了一半(T1 时间到),DHCP 发送请求报文 DHCPREQUEST 要求更新租用期
⑦ DHCP 服务器若同意,则发回确认报文DHCPACK。DHCP 客户得到了新的租用期,重新设置计时器
⑧ DHCP 服务器若不同意,则发回否认报文DHCPNACK。这时 DHCP 客户必须立即停止使用原来的 IP 地址,而必须重新申请 IP 地址(回到步骤2
若DHCP服务器不响应步骤6的请求报文DHCPREQUEST,则在租用期过了 87.5% 时,DHCP 客户必须重新发送请求报文 DHCPREQUEST(重复步骤6),然后又继续后面的步骤
⑨ DHCP 客户可随时提前终止服务器所提供的租用期,这时只需向 DHCP 服务器发送释放报文 DHCPRELEASE 即可
上面的是在一个网段放一个DHCP服务器,这样会造成浪费,可以使用DHCP中继代理跨网段进行分配
2.3.4 DHCP中继代理
并不是每个网络上都有 DHCP 服务器,这样会使 DHCP 服务器的数量太多。现在是每一个网络至少有一个 DHCP 中继代理,它配置了 DHCP 服务器的 IP 地址信息。
当 DHCP 中继代理收到主机发送的发现报文后,就以单播方式向 DHCP 服务器转发此报文,并等待其回答。收到 DHCP 服务器回答的提供报文后,DHCP 中继代理再将此提供报文发回给主机
3. 域名系统DNS
上面说到,发送数据包,必须要知道对方的IP地址,但是在我们实际上网的时候(以浏览器为例)我们并没有输入对方的IP地址,而是只需要知道对应的网址(域名)就行了
DNS协议可以帮助我们,将这个网址(域名)转换成IP地址
名字到 IP 地址的解析是由若干个域名服务器程序完成的。域名服务器程序在专设的结点上运行,运行该程序的机器称为域名服务器
从理论上将,整个互联网可以只是要一个域名服务器,是他装入互联网上的所有主机名,并回答所有对IP地址的查询,但是由于互联网的规模过大
① 这样的域名服务器肯定会因为超过负载而无法工作
② 一旦域名服务器出现故障,整个互联网就会瘫痪
因特网采用层次结构的命名树作为主机的名字,并使用分布式的域名系统 DNS
3.1 互联网的域名结构
- 因特网采用了层次树状结构的命名方法
- 任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,即域名
- 域名的结构由标号序列组成,各标号之间用点隔开:
3.2 主机host文件
起初域名和ip地址之间的解析都是完全存放在一个名为hosts的文件当中,在这个文件当中我们建立了ip和域名的一一对应的关系,在互联网初期,这样做完全是没有问题的,但是随着网络的发展,网络内的主机越来越多,这个文件会变得越来越大,而且为了保证每台主机都能有这样的解析功能,我们不得不让每台主机都有同样的文件,那么每次我们更新文件的时候,互联网每台主机都需要更新自己的hosts文件,这是一件工作量极其大的事情,所以后来就有了DNS系统
3.3 域名服务器
从理论上讲可以让每一级的域名都有一个相对应的域名服务器,但是这样做会使域名服务器数量太多,所以DNS采用划分区的方法来解决问题
- 一个服务器所负责管辖的(或有权限的)范围叫做区(zone)。
- 各单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够连通的。
- 每一个区设置相应的权限域名服务器,用来保存该区中的所有主机的域名到IP地址的映射。
- DNS 服务器的管辖范围不是以“域”为单位,而是以“区”为单位
上图b的DNS域名服务器的树状结构图如下
互联网上的DNS域名服务器是按照层次安排的,每一个域名服务器都只对域名体系内的一部分进行管辖
① 根域名服务器:
根域名服务器是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和 IP 地址。
不管是哪一个本地域名服务器,若要对因特网上任何一个域名进行解析,只要自己无法解析,就首先求助于根域名服务器。
在因特网上共有13 个不同 IP 地址的根域名服务器,它们的名字是用一个英文字母命名,从a 一直到 m(前13 个字母)
很多情况下根域名服务器并不是用来直接把待查询的域名转成IP地址,而是告诉本地域名服务器下一步应该找哪一个顶级域名服务器进行查询
② 顶级域名服务器
这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。
当收到 DNS 查询请求时,就给出相应的回答(可能是最后的结果,也可能是下一步应当找的域名服务器的 IP 地址)
③ 权限域名服务器
这就是前面已经讲过的负责一个区的域名服务器
当一个权限域名服务器还不能给出最后的查询回答时,就会告诉发出查询请求的 DNS 客户,下一步应当找哪一个权限域名服务器
④ 本地域名服务器
本地域名服务器对域名系统非常重要,本地域名服务器并不属于上图的域名服务器的层次结构
当一个主机发出 DNS 查询请求时,这个查询请求报文就发送给本地域名服务器
每一个因特网服务提供者 ISP,或一个大学,甚至一个大学里的系,都可以拥有一个本地域名服务器,
这种域名服务器有时也称为默认域名服务器
本地域名服务器离用户比较近,一般不超过几个路由器的距离,当所要查询的主机也属于同一个本地ISP时,该本地服务器立即就能将所查询的主机名转换成IP地址而不去询问其他的域名服务器
提高域名服务器的可靠性
DNS 域名服务器都把数据复制到几个域名服务器来保存,其中的一个是主域名服务器,其他的是辅助域名服务器
当主域名服务器出故障时,辅助域名服务器可以保证 DNS 的查询工作不会中断
主域名服务器定期把数据复制到辅助域名服务器中,而更改数据只能在主域名服务器中进行。这样就保证了数据的一致性
3.4 域名解析的过程
主机向本地域名服务器的查询一般都是采用递归查询。如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文
本地域名服务器向根域名服务器的查询通常是采用迭代查询。当根域名服务器收到本地域名服务器的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地域名服务器进行后续的查询
3.5 域名缓存
为了提高 DNS 查询效率,并减轻服务器的负荷和减少因特网上的 DNS 查询报文数量,在域名服务器中广泛使用了高速缓存,用来存放最近查询过的域名以及从何处获得域名映射信息的记录。
由于名字到地址的绑定并不经常改变,为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时器并处理超过合理时间的项(例如:每个项目两天)。当域名服务器已从缓存中删去某项信息后又被请求查询该项信息,就必须重新到授权管理该项的域名服务器绑定信息。当权限服务器回答一个查询请求时,在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销,而减少此时间值可提高域名解析的正确性。
不仅在本地域名服务器中需要高速缓存,在主机中也需要。许多主机在启动时从本地服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到名字时才使用域名服务器。维护本地域名服务器数据库的主机应当定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删除无效的项。由于域名改动并不频繁,大多数网点不需花精力就能维护数据库的一致性
4. 万维网
4.1 万维网概述
万维网 WWW (World Wide Web)并非某种特殊的计算机网络
万维网是一个大规模的、联机式的信息储藏所
万维网用链接的方法能非常方便地从因特网上的一个站点访问另一个站点,从而主动地按需获取丰富的信息
这种访问方式称为“链接”
起初是用hao123.com这样的导航页
现在是用baidu这样的搜索引擎来进行关键字搜索找到自己感兴趣的链接
万维网提供分布式服务
4.2 超媒体与超文本
万维网是分布式的超媒体系统,他是超文本系统的扩充
超文本是指包含指向其他文档的链接(超链接)的文本,也就是说,一个超文本由多个信息源构成,而这些信息源可以分布在世界各地,利用一个链接可以使用户找到远在异地的另一个文档(页面)
超媒体与超文本的区别是文档内容不同。超文本文档仅包含文本信息,而超媒体文档还包含其他表示方式的信息,如图形、图像、声音、动画,甚至活动视频图像
4.3 万维网的工作方式
万维网以客户服务器方式工作
浏览器就是在用户计算机上的万维网客户程序。万维网文档所驻留的计算机则运行服务器程序,因此这个计算机也称为万维网服务器
客户程序向服务器程序发出请求,服务器程序向客户程序送回客户所要的万维网文档
在一个客户程序主窗口上显示出的万维网文档称为页面(page)
3.4 万维网需要解决的问题
① 怎么标志分布在整个互联网上的万维网文档 (URL)
使用统一资源定位符 URL (Uniform Resource Locator)来标志万维网上的各种文档。
使每一个文档在整个因特网的范围内具有唯一的标识符 URL
② 用什么样的协议来实现万维网上的各种链接 (HTTP)
在万维网客户程序与万维网服务器程序之间进行交互所使用的协议,是超文本传送协议 HTTP (HyperText Transfer Protocol)。
HTTP 是一个应用层协议,它使用 TCP 连接进行可靠的传送
③ 怎样使各种万维网文档都能在因特网上的各种计算机上显示出来,同时使用户清楚地知道在什么地方存在着超链 (HTML)
超文本标记语言 HTML (HyperText Markup Language)使得万维网页面的设计者可以很方便地用一个超链从本页面的某处链接到因特网上的任何一个万维网页面,并且能够在自己的计算机屏幕上将这些页面显示出来
④ 怎样使用户能够很方便地找到所需的信息 (搜索引擎)
为了在万维网上方便地查找信息,用户可使用各种的搜索工具(即搜索引擎)
5. URL
- 统一资源定位符 URL 是对可以从因特网上得到的资源的位置和访问方法的一种简洁的表示。
- URL 给资源的位置提供一种抽象的识别方法,并用这种方法给资源定位。
- 只要能够对资源定位,系统就可以对资源进行各种操作,如存取、更新、替换和查找其属性。
- URL 相当于一个文件名在网络范围的扩展。因此 URL 是与因特网相连的机器上的任何可访问对象的一个指针
使用HTTP的URL | http://<主机>:<端口>/<路径> |
① http这表示使用 HTTP 协议
② 冒号和两个斜线是规定的格式
③ 主机的域名
④ HTTP 的默认端口号是 80,通常可省略
⑤ 若再省略文件的<路径>项,则 URL 就指到因特网上的某个主页(home page)
6. 超文本传输协议HTTP
6.1 HTTP的操作过程
HTTP协议定义了浏览器(即万维网客户进程)怎么向万维网服务器请求万维网文档以及服务器怎么把文档传送给浏览器
从层次的角度看,HTTP 是面向事务的(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础
(1) 浏览器分析超链指向页面的 URL。
(2) 浏览器向 DNS 请求解析 www.tsinghua.edu.cn
的 IP 地址。
(3) 域名系统 DNS 解析出清华大学服务器的 IP 地址。
(4) 浏览器与服务器建立 TCP 连接
(5) 浏览器发出取文件命令:GET /chn/yxsz/index.html
(6) 服务器给出响应,把文件 index.htm 发给浏览器。
(7) TCP 连接释放。
(8) 浏览器显示“清华大学院系设置”文件 index.htm 中的所有文本
6.2 HTTP的主要特性
1. HTTP 是面向事务的客户服务器协议
所谓事务就是说一些列的信息交换,而这一系列的信息交换是不可分割的整体,也就是说要么所有的信息交换都完成,要么一次交换都不进行
2. HTTP 1.0 协议是无状态的(stateless)
同一个客户第二次访问同一服务器上的页面时,服务器的响应与第一次访问时的相同,他并不知道这个客户以前来过
之所以这样设计是为了简化服务器的设计,使服务器更容易支持大量并发的HTTP请求
无状态其实既是优点又是缺点。因为服务器没有记忆能力,所以就不需要额外的资源来记录状态信息,不仅实现上会简单一些,而且还能减轻服务器的负担,能够把更多的 CPU 和内存用来对外提供服务
但是服务器没有记忆能力,它就无法支持需要连续多个步骤的事务
操作。每次都得问一遍身份信息,不仅麻烦,而且还增加了不必要的数据传输量。由此出现了 Cookie
技术
3. HTTP 协议本身也是无连接的,虽然它使用了面向连接的 TCP 向上提供的服务
虽然HTTP使用面向连接的TCP作为运输层协议,保证了数据的可靠传输,但是HTTP协议本身是无连接的,不用建立HTTP连接
4. 明文
HTTP 协议里还有一把优缺点一体的双刃剑,就是明文传输。明文意思就是协议里的报文(准确地说是 header 部分)不使用二进制数据,而是用简单可阅读的文本形式。
对比 TCP、UDP 这样的二进制协议,它的优点显而易见,不需要借助任何外部工具,用浏览器、Wireshark 或者 tcpdump 抓包后,直接用肉眼就可以很容易地查看或者修改,为我们的开发调试工作带来极大的便利。
当然缺点也是显而易见的,就是不安全,可以被监听和被窥探。因为无法判断通信双方的身份,不能判断报文是否被更改过
5. 应用广泛、环境成熟
因为 HTTP 协议本身不属于一种语言,它并不限定某种编程语言或者操作系统,所以天然具有跨语言、跨平台的优越性。而且,因为本身的简单特性很容易实现,所以几乎所有的编程语言都有 HTTP 调用库和外围的开发测试工具
随着移动互联网的发展, HTTP 的触角已经延伸到了世界的每一个角落,从简单的 Web 页面到复杂的 JSON、XML 数据,从台式机上的浏览器到手机上的各种 APP、新闻、论坛、购物、手机游戏,你很难找到一个没有使用 HTTP 的地方
6. 简单灵活易扩展
HTTP 最重要也是最突出的优点是 简单、灵活、易于扩展
6.3 持续连接vs非持续连接
HTTP协议的基础是下面的运输层建立了TCP连接
HTTP/1.0使用非持续连接
可以看到请求到一次万维网文档所需要的时间是该文档的传输时间+建立TCP连接的时间,在HTTP/10中会为每次请求都建立一个TCP连接,这种非持续连接不仅使请求时间变慢而且让服务器的负担很重
HTTP/1.1使用持续连接
万维网服务器在发送响应后仍然在一段时间内保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的 HTTP 请求报文和响应报文
这并不局限于传送同一个页面上链接的文档,而是只要这些文档都在同一个服务器上就行
目前一些流行的浏览器(例如,IE 6.0)的默认设置就是使用 HTTP/1.1
① 非流水线方式:客户在收到前一个响应后才能发出下一个请求。这比非持续连接的两倍 RTT 的开销节省了建立 TCP 连接所需的一个 RTT 时间。但服务器在发送完一个对象后,其 TCP 连接就处于空闲状态,浪费了服务器资源
② 流水线方式:客户在收到 HTTP 的响应报文之前就能够接着发送新的请求报文。一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文。使用流水线方式时,客户访问所有的对象只需花费一个 RTT时间,使 TCP 连接中的空闲时间减少,提高了下载文档效率
6.4 HTTP 1.0 vs 1.1 vs 1.2
HTTP1.1 的主要变化:
- HTTP1.0 经过多年发展,在 1.1 提出了改进。首先是提出了长连接,HTTP 可以在一次 TCP 连接中不断发送请求。
- 然后 HTTP1.1 支持只发送 header 而不发送 body。原因是先用 header 判断能否成功,再发数据,节约带宽,事实上,post 请求默认就是这样做的。
- HTTP1.1 的 host 字段。由于虚拟主机可以支持多个域名,所以一般将域名解析后得到 host。
HTTP2.0 的主要变化:
- HTTP2.0 支持多路复用,同一个连接可以并发处理多个请求,方法是把 HTTP数据包拆为多个帧,并发有序的发送,根据序号在另一端进行重组,而不需要一个个 HTTP请求顺序到达;
- HTTP2.0 支持服务端推送,就是服务端在 HTTP 请求到达后,除了返回数据之外,还推送了额外的内容给客户端;
- HTTP2.0 压缩了请求头,同时基本单位是二进制帧流,这样的数据占用空间更少;
- HTTP2.0 适用于 HTTPS 场景,因为其在 HTTP和 TCP 中间加了一层 SSL 层。
6.5 代理服务器
代理服务器(proxy server)又称为万维网高速缓存(Web cache),它代表浏览器发出 HTTP 请求。
万维网高速缓存把最近的一些请求和响应暂存在本地磁盘中。
当与暂时存放的请求相同的新请求到达时,万维网高速缓存就把暂存的响应发送出去,而不需要按 URL 的地址再去因特网访问该资源
6.6 HTTP报文结构
HTTP
HTTP 有两类报文:
由于 HTTP 是面向正文的(text-oriented),因此在报文中的每一个字段都是一些 ASCII 码串,因而每个字段的长度都是不确定的
6.6 .1 请求报文
请求报文——从客户向服务器发送请求报文。
请求行
① “方法”是面向对象技术中使用的专门名词。所谓“方法”就是对所请求的对象进行的操作,因此这些方法实际上也就是一些命令。因此,请求报文的类型是由它所采用的方法决定的
GET | 获取资源,当前网络中绝大部分使用的都是 GET |
HEAD | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头,用于确认 URI 的有效性及资源更新的日期时间等 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改 |
PUT | 上传文件,由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法 |
PATCH | 对资源进行部分修改。PUT 也可以用于修改资源,但是只能完全替代原始资源,PATCH 允许部分修改 |
OPTIONS | 查询指定的 URL 支持的方法 |
CONNECT | 要求在与代理服务器通信时建立隧道。使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输 |
TRACE | 追踪路径。服务器会将通信路径返回给客户端。发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个服务器就会减 1,当数值为 0 时就停止传输。通常不会使用 TRACE,并且它容易受到 XST 攻击(Cross-Site Tracing,跨站追踪) |
post和get的区别:
-
都包含请求头请求行 post多了请求body
-
get多用来查询,请求参数放在url中,不会对服务器上的内容产生作用
-
post用来提交,如把账号密码放入body中
-
GET是直接添加到URL后面的,直接就可以在URL中看到内容,而POST是放在报文内部的,用户无法直接看到
-
GET提交的数据长度是有限制的,因为URL长度有限制,具体的长度限制视浏览器而定。而POST没有
② “URL”是所请求的资源的 URL
③ “版本”是 HTTP 的版本。
消息头
accept | 浏览器通过这个头告诉服务器,它所支持的数据类型 |
Accept-Charset | 浏览器通过这个头告诉服务器,它支持哪种字符集 |
Accept-Encoding | 浏览器通过这个头告诉服务器,支持的压缩格式 |
Accept-Language | 浏览器通过这个头告诉服务器,它的语言环境 |
Host | 浏览器通过这个头告诉服务器,想访问哪台主机 |
If-Modified-Since | 浏览器通过这个头告诉服务器,缓存数据的时间 |
Referer | 浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链 |
Connection | 浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接 |
Cache-Control | 控制缓存行为 |
6.6.2 响应报文
响应报文——从服务器到客户的回答。
状态行
以 2xx
为开头的都表示请求成功响应
状态码 | 含义 |
---|---|
200 | 成功响应 |
204 | 请求处理成功,但是没有资源可以返回 |
206 | 对资源某一部分进行响应,由Content-Range 指定范围的实体内容 |
以 3xx
为开头的都表示需要进行附加操作以完成请求
状态码 | 含义 |
---|---|
301 | 永久性重定向,该状态码表示请求的资源已经重新分配 URI,以后应该使用资源现有的 URI |
302 | 临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问 |
303 | 该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源 |
304 | 该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况 |
307 | 临时重定向。该状态码与 302 Found 有着相同的含义 |
以 4xx
的响应结果表明客户端是发生错误的原因所在
状态码 | 含义 |
---|---|
400 | 该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求 |
401 | 该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息 |
403 | 该状态码表明对请求资源的访问被服务器拒绝了 |
404 | 该状态码表明服务器上无法找到请求的资源 |
以 5xx
为开头的响应标头都表示服务器本身发生错误
状态码 | 含义 |
---|---|
500 | 该状态码表明服务器端在执行请求时发生了错误 |
503 | 该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求 |
响应头
HTTP响应中的常用响应头(消息头)
Location | 服务器通过这个头,来告诉浏览器跳到哪里 |
Server | 服务器通过这个头,告诉浏览器服务器的型号 |
Content-Encoding | 服务器通过这个头,告诉浏览器,数据的压缩格式 |
Content-Length | 服务器通过这个头,告诉浏览器回送数据的长度 |
Content-Language | 服务器通过这个头,告诉浏览器语言环境 |
Content-Type | 服务器通过这个头,告诉浏览器回送数据的类型 |
Refresh | 服务器通过这个头,告诉浏览器定时刷新 |
Content-Disposition | 服务器通过这个头,告诉浏览器以下载方式打数据 |
Transfer-Encoding | 服务器通过这个头,告诉浏览器数据是以分块方式回送的 |
Expires | 控制浏览器不要缓存 |
Cache-Control | no-cache |
Pragma | no-cache |
设置Location响应头,实现请求重定向
package gacl.http.study;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author gacl
*
*/
public class ServletDemo01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setStatus(302);//设置服务器的响应状态码
/**
*设置响应头,服务器通过 Location这个头,来告诉浏览器跳到哪里,这就是所谓的请求重定向
*/
response.setHeader("Location", "/JavaWeb_HttpProtocol_Study_20140528/1.jsp");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
当在浏览器中使用URL地址"http://localhost:8080/JavaWeb_HttpProtocol_Study_20140528/servlet/ServletDemo01"访问ServletDemo01时,就可以看到服务器作出响应后发送到浏览器的状态码和响应头信息,如下图所示
服务器返回一个302状态码告诉浏览器,你要的资源我没有,但是我通过Location响应头告诉你哪里有,而浏览器解析响应头Location后知道要跳转到/JavaWeb_HttpProtocol_Study_20140528/1.jsp页面,所以就会自动跳转到1.jsp
设置content-disposition响应头,让浏览器下载文件
package gacl.http.study;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo05 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 设置content-disposition响应头,让浏览器下载文件
*/
response.setHeader("content-disposition", "attachment;filename=xxx.jpg");
InputStream in = this.getServletContext().getResourceAsStream("/img/1.jpg");
byte buffer[] = new byte[1024];
int len = 0;
OutputStream out = response.getOutputStream();
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
6.7 在服务器上存放用户的信息
HTTP是无状态的,这样虽然简化了服务器的设计,但是时间工作中,一些万维网站点还是希望能识别用户
Session和Cookie