Java网络编程-HTTP协议 (4)

Connection一般作为请求首部,表示是否需要持久连接。在HTTP1.1中,如果指定为Keep-Alive,可以提供持久连接,提高Socket的复用率从而降低多次连接的性能消耗。下面有一个小节专门介绍Keep-Alive。

Orgin

Origin一般作为请求首部,指明当前的请求是一个针对跨域资源共享的请求(该请求要求服务器在响应中加入一个Access-Control-Allow-Origin的消息头,表示访问控制所允许的来源)。

Origin: Access-Control-Allow-Origin

Access-Control-Allow-Origin一般作为响应首部,和Origin对应,表示服务器允许的该跨域资源共享的请求来源。

Access-Control-Allow-Origin: Server

Server一般作为响应首部,用于告知客户端服务器的相关信息。

HTTP请求体

如果采用GET请求方法,只需要向远处服务器提供URL,URL中的路径和查询字符串就可以匹配到需要查询的资源。但是URL中无法提供详细的客户端信息。另外,像POST和PUT这些请求方法所携带的数据体有可能比较大,无法放在URL的查询字符串。因此HTTP需要请求体。HTTP请求体包括下面四个部分:

1、一个起始请求行,包括HTTP方法、路径、查询字符串以及HTTP版本。

2、HTTP请求的首部。

3、一个空行(两个连续的回车或者换行对)。

4、请求数据体。

文字描述可能比较抽象,用图表示如下:

PS:space代表空格,\r\n代表换行。

举个例子:

GET /wp-admin/admin-ajax.php?postviews_id=23996&action=postviews&_=1538708851063 HTTP/1.1 Host: Connection: keep-alive Pragma: no-cache Cache-Control: no-cache Accept: */* X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36 Referer: Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 postviews_id=23996&action=postviews&_=1538708851063 HTTP响应体

响应体和请求体的格式类似,主要是返回服务器的响应数据到客户端,包括服务器的一些信息和响应数据体。HTTP响应体主要包括下面的四个部分:

1、一个起始响应行,包括HTTP版本、状态码、状态码描述。

2、HTTP响应的首部。

3、一个空行(两个连续的回车或者换行对)。

4、响应数据体。

文字描述可能比较抽象,用图表示如下:

PS:space代表空格,\r\n代表换行。

举个例子:

HTTP/1.1 200 OK Server: nginx Date: Fri, 05 Oct 2018 03:07:37 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive Keep-Alive: timeout=2 Vary: Accept-Encoding X-Powered-By: PHP/5.3.3 X-Robots-Tag: noindex X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN Content-Encoding: gzip 2995 Keep-Alive

在使用HTTP1.0的时候会为每个请求打开一个新的TCP连接,实际上,这导致了一个典型Web会话中打开和关闭所有连接所花费的事件远远大于实际传输数据所消耗的时间,特别是响应结果包含很多小文档的会话。对于使用SSL或者TLS加密的HTTPS连接,这个问题更加严重,因为建立一个安全的Socket的握手过程远比建立常规的Socket需要更多的工作。

在HTTP1.1和后面的版本中,服务器不必在返送响应之后就关闭连接。已经建立的连接可以保持打开,在同一个Socket上等待来自客户端的新请求。简单来说,就是可以在一个TCP连接上连续发送多个请求和连续进行多个请求的响应。

客户端可以在HTTP请求首部中添加一个Connection请求头,指定值为Keep-Alive,这样就能实现Socket的重用:

Connection: Keep-Alive

HTTP1.1或者之后的版本,Keep-Alive是默认开启的,不需要显式指定,如果需要关闭可以设置为close:

Connection: close

一旦开启了Keep-Alive,服务器在关闭一个Socket连接之前,如果有新的客户端再次连接到服务器,那么就是重用Socket。在JDK中可以通过系统属性来控制如果使用HTTP的Keep-Alive:

http.keepAlive:默认值为true,默认开启HTTP的Keep-Alive。

http.maxConnections:同时保持打开的Socket数量的最大值,默认值为5。

http.keepAlive.remainingData:默认值为false,如果设置为true,则JDK在丢弃连接之后会完成剩余数据的清理。

sun.net.http.errorstream.enableBuffering:默认值为false,如果设置为true,则尝试缓存400和500状态码的相对小的错误流,从而能释放连接以备后续使用。

sun.net.http.errorstream.bufferSize:为缓存错误流的缓冲区的字节大小,默认值为4096字节,只有上一项为true的时候才有意义。

sun.net.http.errorstream.timeout:默认值为300ms,读取错误流超时的毫秒数。

Cookie和Cookie管理

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyxzd.html