Web简读
最近准备看《GO web编程》,想把所思所想写出来,以供参阅。
HTTP请求
关于HTTP的讲解太多,我只说些自己的理解。
HTTP是一个请求、响应协议。客户端发起一个请求,服务端响应一个请求。
在HTTP中,总是客户端建立一个连接,发起一个请求。服务端不能主动去与客户端联系,也不能给客户端发送一个回调连接。
HTTP请求包(客户端信息)
Request请求包分为3部分。Request line(请求行)、Request header(请求头)、body(主体)。header和body之间有个空行。
GET /domains/example/ HTTP/1.1 //请求行: 请求方法 请求URI HTTP协议/协议版本
Host:www.iana.org //服务端的主机名
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 //浏览器信息
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 //客户端能接收的mine
Accept-Encoding:gzip,deflate,sdch //是否支持流压缩
Accept-Charset:UTF-8,*;q=0.5 //客户端字符编码集
//空行,用于分割请求头和消息体
//消息体,请求资源参数,例如POST传递的参数
请求行包括概况信息:请求的方式(GET、POST...),请求URL(/domains/example/),请求协议(HTTP、HTTPS、FTP)等
请求头包括body的内容描述、请求用户信息等(一般每一条header都代表了一条描述请求内容的信息):
Content-Type: charset=utf-8 请求内容字符集采用utf-8
Content-Type: text/css 请求内容是css
Content-Type: image/jpeg 请求内容是.jpeg的图片
HTTP/1.1 200 OK 一般在服务端返回的header里,代表请求成功
...
主体就是本次请求的内容。
HTTP响应包(服务端信息)
HTTP response包结构如下
HTTP/1.1 200 OK //状态行
Server: nginx/1.0.8 //服务器使用的WEB软件名及版本
Date:Date: Tue, 30 Oct 2012 04:14:25 GMT //发送时间
Content-Type: text/html //服务器发送信息的类型
Transfer-Encoding: chunked //表示发送HTTP包是分段发的
Connection: keep-alive //保持连接状态
Content-Length: 90 //主体内容长度
//空行 用来分割消息头和主体
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"... //消息体
Response包中第一行叫做状态行,由HTTP协议版本号、状态码、状态消息三部分组成
状态码用于告诉客户端本次HTTP请求是否正确响应。
1XX 提示信息 - 表示请求已被成功接收,继续处理
2XX 成功 - 表示请求已被成功接收,理解,接受
3XX 重定向 - 要完成请求必须进行更进一步的处理
4XX 客户端错误 - 请求有语法错误或请求无法实现
5XX 服务器端错误 - 服务器未能实现合法的请求
一般见的比较多的状态码:403(禁止访问,可能是身份权限问题)、404(访问文件未找到),这并不是服务端的错误,而是请求有问题,所以在4XX里面。500(服务端错误)。
HTTP协议是无状态的和Connection:keep-alive的区别
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
HTTP是一个无状态协议,但不代表HTTP不能保持TCP连接。
HTTP默认开启了Keep-Alive保持连接特性。当打开一个网页之后,客户端与服务端的TCP连接不会立刻关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的TCP连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同服务器上设置这个时间。
这是一个很有用的特性。一般打开一个网页之后不会立刻关闭,会不断地点击页面上的按钮,这个时候如果每一次交互都需要建立一次TCP连接,会影响浏览速度的同时加重服务器负担。同时还有一个更加合适的场合应用这一特性,就是在编辑文本的同时自动保存。这中间会有很多次向服务端的请求,需要在一条TCP连接上完成。
小发现
打开百度的时候会发现有很多请求,但只有第一个请求是我主动发起的。之后的请求我并不知道。
这是因为,在首次打开网页的时候,我发起了一个请求,服务端响应了我这个请求并且将html页面返回给浏览器,浏览器在渲染html页面的时候里面的css、javascript、img等静态资源,浏览器会自动向服务器请求。所以会有很多请求。不过这些请求都是在同一条TCP连接上的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。