继上年写的第一遍 浏览器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协议,就需要理解报文的格式和内容。
报文的组成
无论是请求报文还是响应报文都需要有报文首部,当然报文主体并不是必需的。
//报文类型 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
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页面时,浏览器会发起多次请求,如图所示:
显而易见每次请求会造成无谓的TCP连接建立和断开,增加通信量的开销。
Connection:keep-alive
引入持久连接: 持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。目前HTTP/1.1中默认为持久连接
。