深入理解Http协议

什么是B/S网络架构?

    B/S结构(Browser/Server,浏览器/服务器模式)和传统的C/S架构使用自定义的应用层协议不同,B/S架构使用的都是统一的Http协议,使用统一的http协议也为服务商简化

了开发模式。

什么是http协议?

    http协议即超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端

的浏览器。

当你在浏览器中输入www.baidu.com发生的操作

    首先他会请求DNS把这个域名解析成对应的ip地址,然后根据这个ip地址在互联网上找到相应的服务器,向这个服务器发送一个get请求,由服务器决定返回默认的数据资源给

访问的用户。在服务端实际上还有很复杂的业务逻辑:服务器可能有很多台,到底指定哪台服务器来处理请求,这需要一个负载均衡设备来平均分配所有用户的请求;还有请求

的数据是存储在分布式缓存里还是静态文件中,或是在数据库里,当数据返回浏览器时,浏览器解析数据发现还有一些静态资源(CSS、JS)时又会发起另外的http请求,而这

些请求很可能会在CDN上,那么CDN服务器又会处理这个用户的请求。

深入理解Http协议

HTTP协议解析

    http协议中分为请求和响应

    request分为三部分,request line,request header,body

    response也分为三部分,response line,response header,body

    其中以request header和response header 尤为重要,因为他们控制着互联网上用户的数据的传输,header中的头域就不分析了。

     http请求
          GET http://www.baidu.com HTTP/1.1    --请求行(包括请求方法、请求资源、http协议版本)
          Host: localhost:8080            --请求头
          User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
          Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
          Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
          Accept-Encoding: gzip, deflate
          Connection: keep-alive
                                                                     --空一行
          name=jake&password=123       --请求体(可选)

     http响应
           HTTP/1.1 200 OK                --响应行(包括http协议版本、状态码、)
           Server: Apache-Coyote/1.1         --响应头(key-vaule)
           Content-Length: 24
           Date: Fri, 30 Jan 2015 01:54:57 GMT
                                                      --一个空行
            this is hello servlet!!!                  --实体内容(为网页中显示的代码)

     常见的http状态码

           200    请求成功

           302    临时跳转,跳转的地址通过Location指定

           400    请求有语法错误,不能被服务器识别

           403    服务器收到请求,但是拒绝提供服务

           404    请求资源不存在

           500    发生不可预期的错误

     关于请求的方式

            请求方式基本的有四种GET、POST、PUT、DELETE而最常用的有两种为GET和POST
     我们看看GET和POST的区别

           1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. 使用GET请求的话body是空的, POST方法

是把提交的数据放在HTTP包的Body中.

           2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.

           3. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机

器,就可以从历史记录获得该用户的账号和密码.

           总结一下,Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求,在FORM(表单)中,Method默认为"GET",实质上,GET和POST只是发送

机制不同,并不是一个取一个发!

    DNS域名解析

           当我们通过URL来进行请求时,URL需要转换成服务器的IP地址才能建立连接,DNS就是将URL解析成IP的。

    DNS解析的10个步骤:

        1、浏览器会先检查缓存中有没有对应的解析过的IP地址,如果有,解析结束,如果没有进入第二步;

        2、浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果,Windows中的hosts文件就是用来设置这个的,如果还不能解析出,就会真正请求域名服务器来解析这个域名了;

        3、在我们的网络配置中都会有“DNS服务器地址”当前面两步并不能解析时,操作系统会把这个域名发送给这里设置的LDNS,也就是本地区的域名服务器,这个DNS不会离你太远,可以通过ipconfig来查询这个地址,大约80%的域名解析到这里就完成了;

        4、如果LDNS仍然没有解析,就直接到根域名服务器请求解析;

        5、根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD)地址。gTLD是国际*域名服务器,全球只有13台;

        6、本地域名服务器再向上返回的gTlD服务器发送请求;

        7、接受请求的gTLD服务器查找并返回此域名对应的Name Server 域名服务器的地址,这个Name Server通常就是你注册的域名服务器,例如你在阿里申请的域名,那么这个域名解析的任务就由阿里的服务器来完成;

        8、Name Server域名服务器会查询存储的域名和IP的映射关系表,正常情况下都根据域名得到目标IP记录,连同TTL值返回给DNS Server域名服务器。

        9、返回该域名对象的IP和TTL值,Local DNS Server会缓存这个域名和IP的对应关系,缓存的时间由TTL值控制;

        10、把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束。

        注:TTL(Time-To-Live)指一条域名解析记录在DNS服务器中的存留时间。

深入理解Http协议  

Windows中可以用nslookup命令来查询域名解析结果,不能查看过程,查看过程需要第三方工具。
    CDN工作机制
        CDN即内容分布网络,它是构筑在现有Internet上的一种先进的流量分配网络,用来提高用户范文网站的响应速度。目前CDN都以缓存网站中的静态数据为主,如CSS,JS,图片和静态页面等数据。用户从主服务站上请求到动态内容再从CDN上下载这些静态数据。
    所以,当你在浏览器中输入网址的时候,浏览器去获取该网址的html,服务器把response发送回给浏览器,浏览器分析html发现有静态文件,则会再去请求,最后下载完所有文件,网页才会被显示出来。所以打开一个网页浏览器发送了不止一次请求。

   --参考自《深入分析Java web技术内幕》