diff --git a/3.1.md b/3.1.md index 404f6304..bebec593 100644 --- a/3.1.md +++ b/3.1.md @@ -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)中设定这个时间 ##请求实例 diff --git a/images/3.1.http.png b/images/3.1.http.png new file mode 100644 index 00000000..25108bf3 Binary files /dev/null and b/images/3.1.http.png differ diff --git a/images/3.1.httpPOST.png b/images/3.1.httpPOST.png new file mode 100644 index 00000000..31d02020 Binary files /dev/null and b/images/3.1.httpPOST.png differ diff --git a/images/3.1.response.png b/images/3.1.response.png new file mode 100644 index 00000000..978de790 Binary files /dev/null and b/images/3.1.response.png differ