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