网络编程总结-http协议
http协议
- 是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。
- hypertext transfer protocol(超文本传输协议)
- WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议。
- 通过tcp协议连接服务器,通过http协议进行通话
- 浏览器默认在域名后面加上:80
- C/S架构 Client/Server客户端服务器端
- B/S构架 Browse/Server浏览器端服务器端
- web资源:放在服务器端给用户访问的资源为web资源,分为静态和动态
- http1.0一次连接发送一个http请求发回一个响应获得一个web资源,就会断开连接
- http1.1一次连接能够一直发http请求回响应,可以获得多个web资源,连接超时或设置配置文件中Connection: close
超文本
在Internet上的Web服务器上存放的都是超文本信息。
超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。
“超文本”页面内可以包含图片、链接,甚至音乐、程序等非文字元素。
现时超文本普遍以电子文档方式存在,其中的文字包含有可以链结到其他位置或者文档的连结,允许从当前阅读位置直接切换到超文本连结所指向的位置。超文本的格式有很多,目前最常使用的是超文本标记语言(标准通用标记语言下的一个应用)及富文本格式。
超文本标记语言
超文本标记语言的结构包括“头”部分(Head)、和“主体”部分(Body),其中“头”部提供关于网页的信息,“主体”部分提供网页的具体内容。
网页的本质就是超级文本标记语言
超文本标记语言文件以.htm为扩展名或.html为扩展名。
富文本格式
富文本格式(Rich Text Format, 一般简称为RTF),大多数的文字处理软件都能读取和保存RTF文档。
它提供类似于 Microsoft Word 的编辑功能,容易被不会编写 HTML 的用户并需要设置各种文本格式的用户所喜爱。
http请求机制
(1)建立TCP连接
在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80
(2) Web浏览器向Web服务器发送请求命令
一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令
例如:GET/sample/hello.jsp HTTP/1.1
(3) Web浏览器发送请求头信息
浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
(4) Web服务器应答
客户机向服务器发出请求后,服务器会客户机回送应答,
HTTP/1.1 200 OK
应答的第一部分是协议的版本号和应答状态码
(5) Web服务器发送应答头信息
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
(6) Web服务器向浏览器发送数据
Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据
(7) Web服务器关闭TCP连接
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码
Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
http请求组成
Http请求即客户端发送给服务器的请求。一个完整的HTTP请求包括如下内容:一个请求行、若干消息头也叫请求头信息、空行、实体内容也叫请求正文或请求体

请求行:
用于描述客户端的请求方式
请求行分为三个部分:请求方法、请求地址URL和HTTP协议版本,它们之间用空格分割。例如,GET /index.html HTTP/1.1。
请求方式:
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP/1.1 定义的请求方法有8种:
GET(完整请求一个资源)、POST(提交表单)、PUT(上传文件)、DELETE(删除)、PATCH、HEAD(仅请求响应首部)、OPTIONS(返回请求的资源所支持的方法)、TRACE(追求一个资源请求中间所经过的代理)。最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT。
用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求
GET
GET方法要求服务器将URL定位的资源放在响应报文的数据部分,会送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号‘?’代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。通过GET方式传递的数据直接放在地址中,所以GET方式的请求一般不包含“请求内容”部分,请求数据以地址的形式表现在请求行。地址中‘?’之后的部分就是通过GET发送的请求数据,各个数据之间用‘&’符号隔开。如果数据是英文字母/数字,原样发送;如果是空格,转换为+;如果是中文/其他字符,则直接把字符串用BASE64加密,得出:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
特点:
- 不适合传送大量数据(不同的浏览器对地址的字符限制也有所不同,一般最多只能识别1024个字符)
- url长度限制:
- url长度根据浏览器及服务器的不同而有不同限制。
- IE浏览器对url长度限制是2083(2K+53),超过这个限制,则自动截断;chrome(谷歌)的url长度限制超过8182个字符返回414 Request-URI Too Large的错误
- Apache能接受url长度限制为8 192 字符
POST
POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。POST方式请求行中不包含数据字符串,这些数据保存在“请求内容”部分,各数据之间也是使用‘&’符号隔开。
URL
统一资源定位符,是一种资源位置的抽象唯一识别方法。
组成:<协议>://<主机>:<端口>/<路径>
端口和路径有时可以省略

协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1
消息头:
使用消息头,可以实现HTTP客户机与服务器之间的条件请求和应答,消息头相当于服务器和浏览器之间的一些暗号指令。
每个消息头包含一个头字段名称,然后依次是冒号、空格、值、回车和换行符。
消息头字段名是不区分大小写的,但习惯上将每个单词的第一个字母大写。
整个消息头部分中的各行消息头可按任何顺序排列。
消息头又可以分为通用信息头、请求头、响应头、实体头等四类。
许多请求头字段都允许客户端在值部分指定多个可接受的选项,多个项之间以逗号分隔。
有些头字段可以出现多次,例如,响应消息中可以包含有多个“Warning”头字段。
(2)接着分析请求头信息,由以上请求头信息可知,请求头信息的格式如下所示:
- 请求头名称
- 冒号
- 请求头值
现在我们来一一分析这些请求头,理解它们的作用:
用于描述客户端请求那台主机及客户端的一些环境信息等
HTTP请求中的常用消息头

Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链
Host:浏览器请求的主机名和端口号,在这里它请求的主机是localhost,虽然后面没有显示端口号,但是你要知道这个端口号是80,它是http协议默认的端口号。
User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。表示当前浏览器的类型和OS的类型,其中MSIE 8.0表示是ie浏览器,版本是8.0等。
accept:浏览器通过这个头告诉服务器,它所支持的MIME类型
Accept-Charset:浏览器可接受的字符集。
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。enà表示英文,USà表示美国,zhà表示中文,CNà表示中国。
Content-Length:表示请求消息正文的长度。
If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间
Content-Type:
request的body部分的数据编码格式由header部分的Content-Type指定。(所以get请求不需要设置Content-Type)
Content-Type用来表示请求中的媒体类型信息
Content-Type的格式 type/subtype(;parameter)?type
type:主类型,可以是任意字符串;比如text;*代表所有类型
subtype:子类型 ,可以是任意字符串;比如html,*代表所有类型
parameter:参数,是可选的;可以在Content-Type中加如一些特殊的参数,比如Accept请求头的参数,常见的有用于设置字符编码的charset参数
比如:Content-Type: text/html;charset:utf-8;
Content-Type常见的媒体类型
text开头的媒体格式类型
text/html: HTML格式
text/plain:纯文本格式
text/xml: XML格式
image开头的媒体格式类型
image/gif:gif图片格式
image/jpeg:jpg图片格式
image/png:png图片格式
application开头的媒体格式类型
application/xhtml+xml:XHTML格式
application/xml: XML数据格式
application/atom+xml:Atom XML聚合格式
application/json: JSON数据格式(常用)
application/pdf:pdf格式
application/msword: Word文档格式
application/octet-stream: 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded: <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
上传文件时的媒体格式类型:
multipart/form-data : 需要在表单中进行文件上传时,必须要指定enctype属性值为multipart/form-data,意思是以二进制流的形式传输文件。
常用的有以下几种方式(上文标红的)
application/x-www-form-urlencoded(默认)
multipart/form-data (form表单里面有文件上传时,必须要指定enctype属性值为multipart/form-data,意思是以二进制流的形式传输文件)
application/json、application/xml等格式的数据
Post请求与get请求区别
将例1-2 post方式请求信息与例1-3 get方式请求信息进行比较,有以下两点区别:
- 请求首行区别:请求参数的位置不同
以上两种请求方式都是带参数的请求,POST请求首行是:POST /Example04/index.jsp HTTP/1.1,GET请求首行为: GET /Example04?username=zhangsan&password=123 HTTP/1.1,其中GET请求首行中,”?”后面的是请求参数,多个请求参数之间用”&”连接。可以看出,POST请求的请求参数并不在请求首行中。
- GET请求没有请求体,POST请求有请求体(请求正文)
从例1-3中可以看出,GET请求没有请求体。从例1-2可以看出,POST请求有请求体,而且请求体的内容是从form.html页面提交过来的参数。这些参数的格式:参数名=参数值&参数名=参数值&…,get请求没有请求体,它的请求参数附加在请求首行的url后面。
总结:
1.post请求可以提交大数据 get请求只能提交1kb,由于有无请求体。
2.post请求它的数据不会在浏览器上显示(安全)
get请求请求的参数会在浏览器上显示。
3.post请求,请求参数是在请求正文中.
get请求,它是资源路径上。
HTTP响应
HTTP响应报文由状态行(status line)、相应头部(headers)、空行(blank line)和响应数据(response body)4个部分组成。

状态行:
描述服务器对请求的处理结果
状态行格式: HTTP版本号 状态码 原因叙述<CRLF>; 举例:HTTP/1.1 200 OK
其中协议版本与请求报文一致
响应头:
描述服务器的基本信息及数据的描述信息,描述信息可以通知客户端如何处理回送的数据。

HTTP响应中的常用响应头(消息头)
Location: 服务器通过这个头,来告诉浏览器跳到哪里
Server:服务器通过这个头,告诉浏览器服务器的型号
Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式
Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度
Content-Language: 服务器通过这个头,告诉浏览器语言环境
Content-Type:服务器通过这个头,告诉浏览器回送数据的类型
Refresh:服务器通过这个头,告诉浏览器定时刷新
Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打数据
Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的
Expires: -1 控制浏览器不要缓存
Cache-Control: no-cache
Pragma: no-cache
实体内容(响应正文):
服务器向客户端回送的数据。
响应正文是在浏览器上真正显示的内容。
响应消息的实体内容就是网页文件的内容,也就是在浏览器中使用查看源文件的方式所看到的内容。
该响应消息的响应体是一个html文档。浏览器可以直接识别这个html文件。而我们访问的是一个jsp文件,响应回去的是一个html文件。说明服务器将该jsp翻译成了一个html,然后再响应给浏览器。
消息头解读
在HTTP请求消息中,请求行之后,便是若干请求头信息。请求消息头主要用于向服务器端传递附加消息,例如,客户端可以接受的数据类型、压缩方法、语言及发送请求的超链接所属页面的URL地址等信息。今天我们主要学习的就是包含发送请求的超链接所属页面的URL的请求头:Referer。
1.请求头Referer
Referer请求头的值是发送请求的超链接所属页面的URL。
使用Referer请求头要注意以下两点:
- 如果是在浏览器地址栏上直接访问,那么请求信息中就没有Referer请求头。
- 如果在页面中点击超链接或者提交表单,请求信息中存在Referer请求头。
Referer请求头有以下两个用途:
- 统计工作
- 防盗链
2.Content-Type请求头
请求头中也有一个请求头名字为Content-Type,但是它们是不一样的。
Content-Type请求头是浏览器告诉服务器,请求体的类型。对于Get请求来说,它是没有请求体的,所以Gontent-Type请求头在GET方式的请求信息中是不存在的。它的默认值是application/x-www-form/urlencoded,表示请求体内容会经过URL编码。
3.Content-Length请求头
Content-Length请求头的值是请求体的字节数。对于请求方式是GET请求的请求信息中是不存在这个请求头的。
常用HTTP状态码
常用状态码介绍
在http响应协议中,我们通过HttpWatch抓包抓取到响应信息。其中响应首行中就包含一个状态码。状态码由三位数字组成,表示请求是否被理解或者被满足。HTTP响应状态码的第一个数字定义了响应的类别,后面两位没有具体分类,第一个数字有五种可能的取值,具体介绍如下所示:
- 1xx :表示请求已接收,需要继续处理。
- 2xx :表示请求已经成功被服务器接收、理解、并接受
- 3xx :为完成请求,客户端需要进一步细化请求
- 4xx :客户端的请求有错误
- 5xx :服务器端出现错误
通过上面的介绍,现在我们来学习几个具体、常用的状态码,如下所示:
|
状态码 |
说明 |
|
200 |
请求成功,浏览器会把响应回来的信息显示在浏览器端。 |
|
404 |
表示客户端出错,比如说在浏览器端请求一个不存在的资源,这时浏览器端会出现404状态码。 |
|
405 |
客户端错误的一种,表示当前的请求方式不支持。比如说服务器端只对GET请求做了处理,而客户端的请求是post方式的,这个时候会出现405状态码。 |
|
500 |
服务器端错误,比如说服务器端代码出现空指针等异常,浏览器就会收到服务器发送的500状态码。 |
|
302 |
表示重定向。比如说浏览器访问一个资源,服务器响应给浏览器一个302的状态码,并且通过响应头Location发送了一个新的url,告诉浏览器去请求这个url。这就是重定向。 |
|
304 |
第一访问一个资源后,浏览器会将该资源缓存到本地,第二次再访问该资源时,如果该资源没有发生改变,那么服务器响应给浏览器304状态码,告诉浏览器使用本地缓存的资源。 |
304状态码详解
通过常用状态码的介绍,我们对304状态码有了一定的了解,现在通过一张图来详细了解该状态码,如图1-1所示:

现在,对图1-1进行分析:
(1)浏览器第一次请求资源,index.jsp。
(2)服务器端响应成功,发送状态码200,响应信息中包含一个Last-Modified响应头,该响应头的值是index.jsp文件的最后修改时间,如2014/11/10 6:51。
(3)浏览器接收到服务器发送过来的响应信息,将结果显示出来,并将响应内容及时间缓存在本地。
(4)浏览器第二次访问这个index.jsp页面,在请求信息中包含If-Modified-Since请求头,该请求头的值是浏览器缓存在本地的时间,也是第一次请求时服务器响应回来的时间:2014/11/10 6:51。
(5)服务器收到浏览器的请求,获得请求头If-Modified-Since的值,将这个值与服务器端index.jsp文件的最后修改时间进行比较,如果一致,表示服务器端没有对index.jsp进行修改,浏览器缓存的是最新的,这时服务器会响应304状态码给浏览器。如果不一致,则正常响应,将最新的资源响应给浏览器。
在上面的304详解时,提到了两个头:
- Last-Modified:这个是响应头,是浏览器第一次请求一个资源时,服务器发送给浏览器的,值为请求内容最后的修改时间。
- If-Modified-Since:这个是请求头,浏览器第二次请求一个资源时,浏览器发送给服务器的,把第一次服务器发送给它的时间归还给服务器。
禁用缓存及定时刷新
1. 禁止浏览器缓存的响应头
在一些jsp页面中存在一些信息,当jsp页面被服务器解析后,发送给浏览器,页面中某些信息就会充当响应头,响应给浏览器。下面我们使用Myeclipse新建一个web工程,观察该工程的index.jsp页面,如例1-1所示:
例1-1 index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
this is my index page
</body>
</html>
(1)在index.jsp页面中有以下三句话:
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
当jsp页面被Tomcat服务器翻译之后,这三句话其实分别对应着三个响应及其值,如下所示:
- Expires: 0;
- Cache-Control: no-cache;
- Pragma: no-cache
这三个响应头一起作用可以实现禁止浏览器缓存。
2.定时刷新—Refresh
Refresh响应头是告诉浏览器多长时间之后跳转到哪里。如:
Refresh: 3;url=http://www.itcast.cn,即为3秒之后跳转到http://www.itcast.cn这个网址。我们可以通过jsp中的meta元素来实现定时刷新,详情请参考定时刷新之代码详解。
(1)创建一个web应用Example07,在该应用的WebRoot目录下新建一个refresh.jsp页面,主要代码如例1-2所示:
例1-2 refresh.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Refresh" content="5;url=http://www.baidu.com">
<title>Insert title here</title>
</head>
<body>
<p>5秒后,跳转到百度首页</p>
</body>
</html>
(2)将Example07应用发布到Tomcat服务器中,启动Tomcat服务器。在浏览器地址栏上输入http://localhost:8080/Example07/refresh.jsp.效果如图1-1所示:

5秒后自动跳转到百度主页
url统一资源定位符,由四部分组成:协议名,ip地址,端口号,资源名

浙公网安备 33010602011771号