B/S架构两方面好处:客户端使用统一的浏览器Browser;服务端基于统一的HTTP协议。
HTTP协议采用无状态的短连接的通信方式,通常情况下一次请求就完成了一次数据交互,通常也对应一个业务逻辑,然后这次通信连接就断开了。
如何发起一个请求
当一个用户在浏览器里输入www.pingan.com这个URL时:
1.请求DNS把这个域名解析成对应的IP地址。
2.根据IP地址在互联网上找到对应的服务器,向这个服务器发起一个get请求。
3.由这个服务器决定返回默认的数据资源给访问的用户。
在服务器端实际上还有很复杂的业务逻辑:
服务器可能有很多台,到底指定哪台服务器来处理请求,需要一个负载均衡设备来平均分配所有用户的请求。
请求的数据是存储在分布式缓存中还是一个静态文件中,或是在数据库里。
当数据返回浏览器时,浏览器解析数据发现还有一些静态资源(如CSS、JS或者图片)时又会发起另外的HTTP请求,而这些请求很可能会在CDN上,那么CDN服务器上又会处理这个用户的请求。
不管网络架构如何变化,始终有一些固定不变的原则:
互联网上所有资源都要用一个URL来表示。
必须基于HTTP协议与服务端交互。
数据展示必须在浏览器中进行。
如何发起一个HTTP请求和如何建立一个Socket连接区别不大,只不过outputStream.write写的二进制字节数据格式要符合HTTP协议。
浏览器在建立Socket连接之前,必须根据地址栏里输入的URL的域名DNS解析出IP地址,再根据这个IP地址和默认80端口与远程服务器建立socket连接,然后浏览器根据这个URL组装成一个get类型的HTTP请求头,通过outputStream.write发送到目标服务器,服务器等待inputStream.read返回数据,最后断开这个连接。
不同浏览器在如何使用这个已经建立好的连接,以及根据什么规则来管理连接,有各种不同的实现方法。
一句话:发起一个HTTP请求的过程就是建立一个socket通信的过程。
HTTP协议解析
要理解HTTP协议,最重要的就是要熟悉HTTP协议中的HTTP Header, HTTP Header控制着互联网上成千上万的用户的数据的传输。
最关键的是,它控制着用户浏览器的渲染行为和服务器的执行逻辑。
常见的HTTP请求头:
Accept-Charset: 用于指定客户端接受的字符集
Accept-Encoding 指定可接受的内容编码,如Accept-Encoding:gzip.defate
Accept-Language 指定一种自然语言,如Accept-Language;zh-cn
Host 用于指定被请求资源的Internet主机和端口号,如Host:www.pingan.com
User-Agent 客户端将它的操作系统、浏览器和其他属性告诉服务器
Connection 当前连接是否保持,如Connection:Keep-Alive
常见的HTTP响应头:
Server 使用的服务器名称,如Server.Apache/1.3.6(UNIX)
Content-Type 用来指明发送给接收者的实体正文的媒体类型,如Content-Type:text/html;charset=GBK
Content-Encoding 与请求报头Accept-Encoding对应,告诉浏览器服务端采用的是什么压缩编码
Content-Language 描述了资源所用的自然语言,与Accept-Language对应
Content-Length 指明实体正文的长度,用以字节方式存储的十进制数字来表示
Keep-Alive 保持连接的时间,如Keep-Alive:timeout
常见的HTTP状态码
200 客户端请求成功
302 临时跳转,跳转的地址通过Location指定
400 客户端请求有语法错误,不能被服务器识别
403 服务器收到请求,但是拒绝提供服务
404 请求的资源不在
500 服务器发生不可预期的错误
浏览器缓存机制
在我们浏览一个页面时发现有异常的情况下,通常考虑是不是浏览器做了缓存,一般的做法是按Ctrl+F5重新请求一次,重新请求的页面肯定是最新的页面。
原因: 在浏览器端,如果是按Ctrl+F5组合键刷新页面,浏览器会直接向目标URL发送请求,而不是使用浏览器缓存的数据。
文章转载于:http://blog.csdn.net/sunkobe2494/article/details/43762041?ref=myread