您的位置:首页 > 理论基础 > 计算机网络

Http协议笔记

2016-12-16 17:58 316 查看

一、定义

协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。HTTP协议的主要特点可概括如下:

支持客户/服务器模式。
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
无状态:无状态是指协议对于事务处理没有记忆能力,同一个客户端的这次请求和上次请求是没有对应关系。

二、消息结构

1.Request请求

Request请求消息分为三部分:请求行、请求头、请求体

(1)请求行:指定了请求方法,请求资源的路径,http的版本

例如:GET http://www.cnblogs.com/ HTTP/1.1

(2)请求头:客户端向服务器端传递请求的附加信息以及客户端自身的信息

Accept: 浏览器端可以接受的媒体类型,如*/*  代表浏览器可以处理所有类型
Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码);
Accept-Language:浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如gb2312,gbk等等.
User-Agent:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本
Accept-Charset:浏览器申明自己接收的字符集,如gb2312,utf-8
Cookie:将cookie的值发送给HTTP 服务器
Content-Length:发送给HTTP服务器数据的长度。
Content-Type:表单的数据类型,如application/x-www-form-urlencoded
Referer:提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,它可以用来做统计工作,也可以用来做防盗链
Connection:客户端与服务器之间TCP连接方式.
keep-alive
   当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接;close  代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。
Host:指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的
If-Modified-Since:把浏览器端缓存页面的最后修改时间发送到服务器去
If-None-Match:缓存文件的Etag值

Cache-Control:这个用来指定Response-Request遵循的缓存机制。max-age 在指定时间再次访问不会重新请求服务,单位秒;no-cache 不用缓存
(3)请求体:请求数据


2.Response响应

response响应消息分为三部分:响应行、响应头、响应体

(1)响应行: 描述响应状态

例如:HTTP/1.1 200 OK

(2)响应头:

Set-Cookie:发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie
Server:包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的
Location:用于重定向一个新的位置, 包含新的URL地址,Location响应报头域常用在更换域名的时候
Cache-Control: public响应被缓存,并且在多用户间共享;private响应只能作为私有缓存,不能在用户之间共享;no-cache提醒浏览器要从服务器提取文档进行验证;no-store绝对禁止缓存(用于机密,敏感文件);max-age
指定秒数缓存后过期
Last-Modified:服务器端文件的最后修改时间
ETag:服务器端文件的Etag值
(3)响应体:返回的数据

三、http请求方法

客户端与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE。GET是从服务端获得数据,POST和PUT是创建或更新数据,DELETE是删除数据。

GET与POST区别:

get是从服务器是获得数据,post是向服务器传输数据
get提交的数据会放在URL之后,暴露了数据
get提交的数据大小有限制(因为浏览器对URL的长度有限制),而post方法提交的数据没有限制.
POST与PUT区别:主要在于put是幂等的,也就是对同一URL的多个请求应该返回同样的结果;而post多次发出同样的POST请求后,其结果是创建出了若干的资源

四、http状态码

HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别

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

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

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

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

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

常见的状态码:

200 OK 服务器成功处理了请求
301/302 Moved Permanently(重定向)请求的URL已移走。Response中应该包含一个Location URL, 说明资源现在所处的位置,浏览器客户端会自动再发送一个Request
304 Not Modified(未修改)客户的缓存资源是最新的, 要客户端使用缓存
400 Bad Request  客户端请求有语法错误,不能被服务器所理解

404 Not Found 未找到资源
500 Internal Server Error 服务器遇到一个错误,使其无法为请求提供服务

503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

五、关于java中httpclient请求返回302或301

在用HttpClient,用get 的时,如果返回状态301/302有重定向,会自动再去访问重定向的内容 。 
但用post访问url就不会自动 重定向的内容 。有两种方法让程序继续访问, 
1、利用heard 取Location值重新再访问,代码如下

if(response.getStatusLine().getStatusCode()==302){  
    //获得响应header里面Location值
   String locationUrl=response.getLastHeader("Location").getValue();
   //重新发请求
  return sendPost(locationUrl, params);
 }


2、HttpClient实例中增加重定向策略,代码如下

client.setRedirectHandler(new DefaultRedirectHandler() {
@Override
public boolean isRedirectRequested(HttpResponse response, HttpContext context) {
boolean isRedirect = super.isRedirectRequested(response, context);
if (!isRedirect) {
int responseCode = response.getStatusLine().getStatusCode();
if (responseCode == 301 || responseCode == 302) {
return true;
}
}
return isRedirect;
}
});


六、https

1.握手认证过程

(1)客户端发起请求,包含TSL版本信息,Cipher加密套件候选列表,压缩算法候选列表,随机数random_C,扩展字段等信息,其中随机数用于后续的密钥协商
(2)服务端接收请求返回协商的信息结果,包括选择使用的协议版本 version,选择的加密套件 cipher suite,选择的压缩算法 compression method、随机数 random_S ,同时服务器还将向客户端传送自己的证书,其中随机数用于后续的密钥协商

(3)客户端接收响应后主要操作:

 验证证书的合法性;
计算产生随机数字 Pre-master,并用证书公钥加密;
客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数 random_C 和 random_S 与自己计算产生的随机数字 Pre-master,计算得到协商密钥
结合之前所有通信参数的值和hash算法生成一段握手消息(握手消息+握手消息的HASH值 ),采用协商密钥 与算法进行加密,发送给服务器握手验证
(4)服务端再次接收请求后的操作:

用私钥解密得到 Pre-master 数据,基于之前交换的两个明文随机数 random_C 和 random_S,同样计算得到协商密钥
用协商密钥解密握手消息与HASH值,验证客户端传过来的握手消息
服务器也结合所有当前的通信参数信息生成一段握手消息并采用协商密钥 与算法加密并发送到客户端;
(5)客户端计算所有接收信息的 hash 值,并采用协商密钥解密,验证服务器发送的数据,验证通过则握手完成;

(6)后续通信开始使用协商密钥与算法进行加密。

2.httpclient代码请求,并且需要客户端证书认证

private final static String KEYSTORE_FILE ="D:/test_cert.p12";
private final static String KEYSTORE_PASSWORD ="123456";
//读取超时时间
private static int socketTimeout = 10000;
//连接超时时间
private static int connectTimeout = 30000;

public static String send(String url, String content) throws Exception {
InputStream instream = HttpsRequest.class
.getResourceAsStream(KEYSTORE_FILE);// 证书目录
KeyStore keyStore = KeyStore.getInstance("PKCS12");
try {
keyStore.load(instream, KEYSTORE_PASSWORD.toCharArray());// 设置证书密码
} catch (Exception e) {
e.printStackTrace();
} finally {
instream.close();
}
SSLContext sslcontext = SSLContexts.custom()
.loadKeyMaterial(keyStore, KEYSTORE_PASSWORD.toCharArray())
.build();
// Allow TLSv1 protocol only
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext, new String[] { "TLSv1" }, null,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);

CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(sslsf).build();

// 根据默认超时限制初始化requestConfig
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(socketTimeout)
.setConnectTimeout(connectTimeout).build();
HttpPost httpPost = new HttpPost(url);
StringEntity postEntity = new StringEntity(content, "UTF-8");
httpPost.addHeader("Content-Type", "text/xml");
httpPost.setEntity(postEntity);

// 设置请求器的配置
httpPost.setConfig(requestConfig);
String result = "";
try {
HttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
result = EntityUtils.toString(entity, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
httpPost.abort();
}
return result;

}




其他:

参考博文:
http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html(http协议) http://kb.cnblogs.com/page/168720/(http状态码)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: