一个Java程序员眼中的Http协议

一个Java程序员眼中的Http协议

从业也有一年之久了,谢希仁老师的那本计算机网络估计已经承灰了,此文就Http协议做一个总结,如果有问题还望指出。


大致介绍一下HTTP协议

Http协议是在应用层的一个超文本传输协议,底层依赖于Tcp/IP进行实现,这也就意味着它是一个面向连接的过程。

Http有这么一个显著的特点,它是无状态的,什么是无状态呢?服务器端接收到一个Http请求它只管处理和响应,所以每一个Http请求都是上下不关联的,服务器端也不知道两次请求来自同一个浏览器的同一个页面。

Http通过cookie/session机制来解决无状态的问题,拿Tomcat为例,当客户端发出一次请求后,当服务器端响应客户端时,会在响应头中加入一个setCookie,设置一个JsessionID,而第二次客户端请求时,服务器端拿着cookie中的JsessionID就可以找到对应的Session,来实现多次请求一个会话的效果。

继续往下说说Http协议的一次请求具体流程,都已经时8102年了,再解释请求过程时,不能再说着,“我就是按了一下回车,然后咻咻咻~的他就给我一个网页了,好神奇!!”。

当我们按下回车后,DNS会解析域名,找到服务器的ip地址,然后和服务器建立三握手协议,然后再向服务器端发出请求,服务器端处理后,返回响应。

在TCP/IP协议中,有长连接和短连接这么两种连接,Http1.0中,采用的是短连接,这样也就意味着,每当我新建一次Http请求都得建立一次Tcp连接,如果在一个页面中不停的获取一些资源,将会频繁的有三握手,四挥手。而在Http1.1中,在服务器响应头中,会加入,Connection:keep-alive这么一个内容,也就意味着Http1.1中默认的就是长连接,在多次请求中,如果和服务器端的Tcp连接还未结束,就会使用同一条Tcp连接发起Http请求。

细致地讲解请求和响应

上段我们仅仅是在运输层和应用层地层面讲解了Http请求的内幕,但是还是没有讲解,请求是啥?响应又是啥?

请求的报文被分为三个部分:

1、请求行:请求行是用来标识请求的方法,请求的地址,以及请求的协议;

请求的方法也就是我们常说的get/post/delete/put等等,其中这四种对应了RestFul请求规范。

请求的地址就是地址。

请求的协议对应的就是Http协议的版本。

2、请求头:请求头的主要内容是用于描述请求主体,其中包含:

connection,也就是上段所说的,keep-alive属性。

编码方式,请求的应用程序,如火狐,andSoOn。

3、请求主体,get方法是没有请求主体,他的请求就直接放在Url中,post请求主体,用于放置请求的参数,可见下文:

POST  /index.php HTTP/1.1    请求行
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2  请求头
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
  空行
username=aa&password=1234  请求数据

再说响应,响应报文同样也是分为了三个部分,大同小异:

1、响应行:一样用于标注协议版本,以及状态码,所谓的状态码,就是用数字表示响应的结果,一般2**的表示资源请求成功,3**表示重定向,4**表示客户端错误,如404,5**表示服务器端错误,常见的有500,如下图:

常见响应码

2、响应头部:和请求体几乎没差,也就是对响应主体的描述,如,编码方式,响应文件类型,json还是text还是html,连接属性等等。

3、响应主体,一样我们列出以下样例:

HTTP/1.1 200 OK  状态行
Date: Sun, 17 Mar 2013 08:12:54 GMT  响应头部
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 4393
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
  空行

<html>  响应数据
<head>
<title>HTTP响应示例<title>
</head>
<body>
Hello HTTP!
</body>
</html>

猜你喜欢

转载自blog.csdn.net/that_is_cool/article/details/81143720