C/S模式和B/S模式
客户端和服务器
B/S模式:客户端与服务器一问一答(通讯)遵循:HTTP协议
-
HTTP概念:
HTTP,(超文本传输协议),它是TCP/IP协议中的一个应用层协议。 -
HTTP版本:
- HTTP/1.0
- HTTP/1.1
- HTTP-NG 实验室阶段,未投入使用
-
HTTP1.0的会话方式
2. 建立消息
2. 发送请求消息
2. 回送响应信息
2. 关闭连接
(TCP面向连接;UDP不需要连接的) -
浏览器与web服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对于每一个页面的访问,浏览器与web服务器都要建立一次单独的连接
-
浏览器到web服务器之间的所有通讯都是完全独立分开的请求和响应对
-
支持代理
-
HTTP请求消息
- 请求消息的结构
一个请求行,若干消息头,以及实体内容其中一些消息头是可选的,消息头和实体内容之间要用空行隔开
例如:
GET/index.html HTTP/1.1 -请求行 Accept:*/* -| Accept-Lauguage:zh-cn | Connection:Keep-Alive | Host:localhost |--多个消息头 Referer:http://localhost/index.php | User-Agent:Mozilla4.0 | Accept-Encoding:gzip,deflate -| --一个空行
- 请求消息的结构
-
响应消息
- 响应消息的结构
一个状态行,若干消息头,以及实体内容
其中一些消息头和实体内容是可选的,消息头和实体内容之间要用空行隔开
例如HTTP/1.1 200 OK -状态行 Server.Microsoft-IIS/6.0 -| Date: Wed Oct 26 11:20:45 CST 2011 | Content-Length:3389 |-多个消息头 Content-Type:text/html | Cache-control:private -| -一个空行 <html> -| <body> |-实体内容 …… -|
- JAVA访问实例
public class TestHttp {
public static void main(String[] args) {
Socket socket = null;
PrintWriter pw = null;
BufferedReader br = null;
try {
socket = new Socket("www.baidu.com",80);
System.out.println(socket);
pw = new PrintWriter(socket.getOutputStream());
pw.println("GET / HTTP/1.1");
pw.println("Host:www.baidu.com");
pw.println();
pw.flush();
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str = br.readLine();
while(str != null){
System.out.println(str);
str = br.readLine();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(pw != null){
pw.close();
}
if(br != null){
br.close();
}
if(socket != null){
socket.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
- HTTP消息的其他细节
- 响应消息的实体内容就是网页文件的内容,也就是我们在浏览器中使用查看源文件的方式看到的内容(HTML代码)
- 一个GET方式的请求消息中不能包含实体内容,且没有采用chunked传输编码方式,那么消息头部分必须包含内容长度的字段,否则,客户端和服务器就无法知道实体内容何时结束
- 在HTTP协议中,还可以使用简单的请求消息和响应消息,他们都没有消息头部分
- 简单的请求消息只能用于GET方式,且请求行中不用指定HTTP版本号
- 对于简单的请求消息,服务器返回简单的响应消息,简单的响应消息中只包含实体内容
- HTTP消息头
- 使用HTTP消息头,可以实现HTTP客户端和服务器之间的条件请求应答,消息头相当于客户端和服务器之间的一些暗号指令
利用消息头可以实现访问统计,例如站长统计,百度统计等 - 每个消息头包含一个投资端名称,然后每一次是冒号,空格,值,回车和换行符
例如:Accept-Lauguage:zh-cn - 消息头字段名是不区分大小写的,但习惯上将每个单词的第一个字母大写
- 整个小吸头部分中的隔行消息头可按任何顺序排列
- 消息头又可以分为通用消息头,请求头,响应头,实体头四类
- 许多请求头字段都允许客户端在值部分指定多个可接受选项,多个值之间以逗号分隔
例如:Accept-Encoding:gzip,compress - 有些字段你可以出现多次,例如,响应消息中可以包含有多个“Warning”头字段
- HTTP请求行与状态行
- 请求行
- 格式:请求方式 资源路径 HTTP版本号<CRLF>
例如:GET /index.html HTTP/1.1
请求方式:GET,POST,HEAD,OPTIONS,DELETE,TRACE,PUT
- 格式:请求方式 资源路径 HTTP版本号<CRLF>
- 状态行
- 格式 HTTP版本号 状态码 描述文本<CRLF>
例如:HTTP/1.1 20 OK
- 使用GET和POST方式传递参数
-
在URL地址后面可以附加一些参数
- URI格式
协议名://用户名:密码@主机名:端口号/资源路径
mailto:vwell@vzhang.net - URN
用户名@主机名 - GET方式
例如:GET /reg.php?username=v.zhang&password=123456 HTTP/1.1
特点:传送的数据量有限制,一般限制在1kb以内 - POST方式
例如:
POST /res.php HTTP/1.1
Host:localhost
Content-Type: application/x-www-form-urlencoded
Content-Length:10
username=v.zhang&password=123456 --实体内容
特点:传送数据要比GET方式传送大的多
- URI格式
- 响应状态码
- 表示服务器对请求的各种不同处理结果和状态,三位十进制数
- 响应状态码的典型情况
- 200(正常)
- 302/307(临时重定向)
- 301(永久重定向)
- 304(未修改)
- 401(未经授权访问)
- 404(找不到)
- 500(服务器内部错误)
HTTPS:HTTP加上加密处理和认证机制。
Client向Server请求建立连接。
Server返回证书(包含公钥)。
Client验证证书有效,生成对称加密的密钥,并用公钥加密发给Server。
Server用私钥解密出密钥,通过密钥跟Client传输数据。
https = http + SSL(后升级为TSL)
https解决三个问题:
加密:对密钥非对称加密。
完整性校验:摘要算法
身份认证:私钥签名+CA证书认证
RSA(非对称加密算法):双方必须协商一对密钥,一个私钥一个公钥。用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据, 只有对应的私钥才能解密。