2016/07/30

浏览器http访问(二)


继上年写的第一遍 浏览器http访问(一)。继续学习研究web http 的内容。


URI URL URN

我们经常接触到的就是URL了,它就是我们访问web的一个字符串地址,那么URI是什么呢?他们是什么关系呢?

URI: uniform resource identifier 统一资源标识符

URL: uniform resource location 统一资源定位符

URN: uniform resource name 统一资源命名

URI是用来唯一的标识一个资源。一种概念标准
URL是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
而URN是通过名字来标识资源,比如 mailto:java-net@java.sun.com
也就是说,URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。
URI属于父类,而URL,URN属于URI的子类。URL,URN是URI的一个子集。


在 浏览器http访问(一) 中写过一个简单的socket服务器来分析http请求的内容。但是没有详细说明内容格式。其实 客户端和服务器端通过相互发送报文进行通信,要深刻理解HTTP协议,就需要理解报文的格式和内容。


报文的组成

http2_01.png

无论是请求报文还是响应报文都需要有报文首部,当然报文主体并不是必需的。

http2_02.png

//报文类型 URI 协议版本
GET /demo.php?user=ddd HTTP/1.1
//请求首部
Host: 192.168.91.128:9001
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
//请求内容

可以看到,GET请求方式不含请求内容,但请求头部和请求内容之间的空行还是存在的。这是为了更好的划分两者的关系。我们 可以通过16进制查看请求内容,你会发现请求头部和请求内容之间使用了两次 \r\n

http2_03.png


GET

GET方法用来请求访问URI所指定的资源,(我想访问你的某个资源)并不对服务器上的内容产生任何作用结果;每次GET的内容都是相同 的。GET方式把请求所需要的参数放到URL中,直接就可以在URL中看见,有大小限制。

在http协议中,其实并没有对url长度作出限制,往往url的最大长度和用户浏览器和Web服务器有关,不一样的浏览器,能接受的最大长 度往往是不一样的,当然,不一样的Web服务器能够处理的最大长度的URL的能力也是不一样的。基本上2k以下不会有所限制,所以我们 定制自己的URL时注意不要超过2K即可(其实有1K长度URL已经很恐怖了)

POST

POST方法用来传输实体主体,目的并不是获取响应的主体内容,(我要把这条信息告诉你),POST方式则是把内容放在报文内容中,因此 只要报文的内容没有限制,它的大小就没有限制。

总结

GET用于获取某个内容,POST用于提交某种数据请求。 按照使用场景来说,一般用户注册的内容属于私密的,这应该使用POST方式;而针对某一内容的查询,为了快速的响应, 可以使用GET方式。


无状态协议与Cookie

HTTP是一种无状态协议,也就是说每一次发送数据都是一次新的开始,服务器根本不知道之前是否与客户端有过交集,那么当需要保存 用户登录状态时就会出现麻烦。这时就需要使用 Cookie 来保存状态。Cookie会根据服务器发送的响应报文内一个叫 Set-Cookie 的 首部字段,通知客户端保存 Cookie ,当下次客户端发送请求时,Cookie值会被添加到请求报文中发送出去

不同浏览器对 cookie 的大小和数量限制各不一样,网上找到一个关于各浏览器之间对cookie的不同限制:

描述 IE6.0 IE7.0/8.0/9.0+ Opera FF Safari Chrome
cookie个数 每个域为20个 每个域为50个 每个域为30个 每个域为50个 没有个数限制 每个域为53个
cookie大小 4095个字节 4095个字节 4096个字节 4097个字节 4097个字节 4097个字节

总之,在进行页面cookie操作的时候,应该尽量保证cookie个数小于20个,总大小 小于4KB


持久连接

使用浏览器浏览一个包含多张图片的HTML页面时,浏览器会发起多次请求,如图所示:

http2_04.png

显而易见每次请求会造成无谓的TCP连接建立和断开,增加通信量的开销。

Connection:keep-alive

引入持久连接: 持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。目前HTTP/1.1中默认为持久连接

http2_05.png