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