3.1小节完稿

This commit is contained in:
astaxie
2012-09-05 11:32:49 +08:00
parent 84719da93b
commit a21b41f848
4 changed files with 46 additions and 1 deletions

47
3.1.md
View File

@@ -2,7 +2,7 @@
我们平时浏览网页的时候,打开浏览器,输入网址,按下回车键,然后就出来了内容。在这个看似简单的行为背后,到底隐藏了些什么呢?
上面这个普通的浏览过程底层其实是这样做的浏览器是一个客户端当你输入URL的时候首先浏览器会去请求DNS服务器通过DNS获取相应的域名对应的IP然后通过IP和服务器建立socket连接发送http请求信息服务器接收到请求信息之后定位请求的资源(如果是动态语言例如php、python、ruby之类的)那么服务器执行相应的逻辑之后返回http信息客户端接收到http信息开始渲染断开和服务器的socket链接。
上面这个普通的浏览过程底层其实是这样做的浏览器是一个客户端当你输入URL的时候首先浏览器会去请求DNS服务器通过DNS获取相应的域名对应的IP然后通过IP和服务器建立socket连接发送http请求信息服务器接收到请求信息之后处理相应的请求返回http response信息客户端接收到http信息之后开始渲染这些http response里面的content信息断开和服务器的socket链接。
![](images/3.1.web2.png?raw=true)
@@ -61,6 +61,9 @@ HTTP协议是无状态的同一个客户端的这次请求和上次请求是
>HTTP协议是建立在TCP协议之上的因此TCP攻击一样会影响HTTP的通讯例如比较常见的一些攻击SYN Flood是当前最流行的DoS拒绝服务攻击与DdoS分布式拒绝服务攻击的方式之一这是一种利用TCP协议缺陷发送大量伪造的TCP连接请求从而使得被攻击方资源耗尽CPU满负荷或内存不足的攻击方式。
###HTTP请求信息(浏览器信息)
我们先来看看Request消息的结构, Request 消息分为3部分第一部分叫Request line, 第二部分叫Request header,第三部分是body。header和body之间有个空行详细的如下所示
- 请求行GET/POST(流的组织(请求)方式) URL(地址+目录) 版本号
- 请求头:
@@ -72,7 +75,24 @@ HTTP协议是无状态的同一个客户端的这次请求和上次请求是
- 空行:分割请求头和消息体
- 消息体:请求的参数
我们通过fiddler抓包可以看到如下请求信息
![](images/3.1.http.png?raw=true)
![](images/3.1.httpPOST.png?raw=true)
我们可以看到GET请求消息体为空POST请求带有消息体。
Http协议定义了很多与服务器交互的方法最基本的有4种分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查删4个操作。 我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息而POST一般用于更新资源信息.
我们看看GET和POST的区别
1. GET提交的数据会放在URL之后以?分割URL和传输数据参数之间以&相连如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
2. GET提交的数据大小有限制因为浏览器对URL的长度有限制而POST方法提交的数据没有限制.
3. GET方式需要使用Request.QueryString来取得变量的值而POST方式通过Request.Form来获取变量的值。
4. GET方式提交数据会带来安全问题比如一个登录页面通过GET方式提交数据时用户名和密码将出现在URL上如果页面可以被缓存或者其他人可以访问这台机器就可以从历史记录获得该用户的账号和密码。
###HTTP响应信息(服务器信息)
我们再来看看HTTP的response信息他的结构如下
- 状态行HTTP版本 服务器状态(比如404找不到...) 描述信息
- 响应头
@@ -81,6 +101,31 @@ HTTP协议是无状态的同一个客户端的这次请求和上次请求是
Server服务器类型
- 消息体:服务器发送给客户端的页面内容
Response 消息中的第一行叫做状态行由HTTP协议版本号 状态码, 状态消息 三部分组成。
状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response.
HTTP/1.1中定义了5类状态码 状态码由三位数字组成,第一个数字定义了响应的类别
- 1XX 提示信息 - 表示请求已被成功接收,继续处理
- 2XX 成功 - 表示请求已被成功接收,理解,接受
- 3XX 重定向 - 要完成请求必须进行更进一步的处理
- 4XX 客户端错误 - 请求有语法错误或请求无法实现
- 5XX 服务器端错误 - 服务器未能实现合法的请求
我们看下面这个图展示了详细的返回信息左边可以看到有很多的资源返回码200是常用的表示正常信息302表示跳转。response header里面展示了详细的信息。
![](images/3.1.response.png?raw=true)
###HTTP协议是无状态的和Connection: keep-alive的区别
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
HTTP是一个无状态的面向连接的协议无状态不代表HTTP不能保持TCP连接更不能代表HTTP使用的是UDP协议无连接
从HTTP/1.1起默认都开启了Keep-Alive保持连接特性简单地说当一个网页打开完成后客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭如果客户端再次访问这个服务器上的网页会继续使用这一条已经建立的连接。
Keep-Alive不会永久保持连接它有一个保持时间可以在不同的服务器软件如Apache中设定这个时间
##请求实例

BIN
images/3.1.http.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

BIN
images/3.1.httpPOST.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
images/3.1.response.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB