web本质

知识内容:html

1.网络协议复习web

2.模拟web浏览器

3.web本质总结缓存

 

参考:安全

http://www.cnblogs.com/wupeiqi/articles/5237672.html服务器

http://www.cnblogs.com/haiyan123/p/7695133.html网络

http://www.cnblogs.com/wyb666/p/9014857.html架构

 

 

 

1、网络协议复习app

1.HTTP协议框架

(1)HTTP特色

 1 HTTP协议属于应用层,并工做于客户端-服务端架构上
 2 
 3 HTTP协议是用于从服务器传输超文本到本地浏览器的传送协议
 4 
 5 HTTP是一个基于TCP/IP通讯协议来传递数据的协议
 6 
 7 浏览器做为HTTP客户端经过URL向HTTP服务端即WEB服务器发送全部请求。Web服务器根据接收到的请求后,向客户端发送响应
 8 
 9 简单快速:客户向服务器请求服务时,只需传送请求方法和路径;因为HTTP协议简单,使得HTTP服务器的程序规模小,于是通讯速度快
10    
11 灵活:HTTP容许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
12     
13 无链接:无链接的含义是限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接。采用这种方式能够节省传输时间
14     
15 无状态:无状态是指协议对于事务处理没有记忆能力。缺乏状态意味着若是后续处理须要前面的信息,则它必须重传,这样可能致使每次链接传送的数据量增大。另外一方面,在服务器不须要先前信息时它的应答就较快

HTTP协议流程以下图:

 

 

 

(2)HTTP请求格式

请求首行;        // 请求方式 请求路径 协议和版本,例如:GET /index.html HTTP/1.1
请求头信息;      // 请求头名称:请求头内容,即为key:value格式,例如:Host:localhost
空行;           // 用来与请求体分隔开
请求体。         // GET没有请求体,只有POST有请求体。

浏览器发送给服务器的内容就这个格式的,若是不是这个格式服务器将没法解读!在HTTP协议中,请求有不少请求方法,其中最为经常使用的就是GETPOST

 

HTTP默认的请求方法就是GET

注意:

  • 没有请求体
  • 数据量有限制!
  • GET请求数据会暴露在浏览器的地址栏中

GET请求经常使用的操做:
       1. 在浏览器的地址栏中直接给出URL,那么就必定是GET请求
       2. 点击页面上的超连接也必定是GET请求
       3. 提交表单时,表单默认使用GET请求,但能够设置为POST

 

(3)HTTP响应格式

通常状况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

  • 第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
  • 第二部分:消息报头,用来讲明客户端要使用的一些附加信息
  • 第三部分:空行,消息报头后面的空行是必须的
  • 第四部分:响应正文,服务器返回给客户端的文本信息。

关于响应状态码:

复制代码
复制代码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操做
4xx:客户端错误--请求有语法错误或请求没法实现
5xx:服务器端错误--服务器未能实现合法的请求

常见状态码:
200 OK                        //客户端请求成功
400 Bad Request               //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized              //请求未经受权,这个状态代码必须和WWW-Authenticate报头域一块儿使用 
403 Forbidden                 //服务器收到请求,可是拒绝提供服务
404 Not Found                 //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error     //服务器发生不可预期的错误
503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
复制代码

 

(4)GET和POST请求的区别

复制代码
GET请求

GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive

注意最后一行是空行
POST请求

POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley
复制代码

 

GET提交,请求的数据会附在URL以后(就是把数据放置在HTTP协议头中)

POST提交:把提交的数据放置在是HTTP包的包体中。上文示例中红色字体标明的就是实际的传输数据

所以,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

 

传输数据的大小:首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。

而在实际开发中存在的限制主要有:

  • GET:特定浏览器和服务器对URL长度有限制,例如 IE对URL长度的限制是2083字节(2K+35)。对于其余浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操做系 统的支持。所以对于GET提交时,传输数据就会受到URL长度的 限制
  • POST:因为不是经过URL传值,理论上数据不受 限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置

 

GET和POST的区别:

  • GET提交的数据会放在URL以后,以?分割URL和传输数据,参数之间以&相连,POST方法是把提交的数据放在HTTP包的Body中
  • GET提交的数据大小有限制(由于浏览器对URL的长度有限制),而POST方法提交的数据没有限制
  • GET方式须要使用Request.QueryString来取得变量的值,而POST方式经过Request.Form来获取变量的值
  • GET方式提交数据,会带来安全问题,好比登陆页面时经过GET方式提交数据时,用户名和密码将出如今URL上,若是页面能够被缓存或者其余人能够访问这台机器,就能够从历史记录得到该用户的帐号和密码

 

 

2.TCP协议和UDP协议

(1)TCP

TCP是一种面向链接的、可靠的、基于字节流的传输层通讯协议

TCP的特性:  有序性、真确性、可靠性、可控性,TCP使用面向链接的方式收发数据,在收发数据以前需创建链接,在数据传输以后释放链接,创建链接时采用3次握手的方式来保证发送的可靠性、可控性

在双方成功握手以后将在两个应用程序之间创建一个全双工的通讯,这个全双工通讯将占用两个计算机之间的通讯线路,直到它被一方关闭或双方关闭为止

全双工:双方能够收发消息,接受消息

应用:web浏览器、电子邮件、文件传输

 

(2)UDP

UDP是一种无链接的传输层协议,提供面向对象的简单的不可靠信息传送服务,虽然UDP不可靠,可是因为UDP的开销小通常UDP适用于吞吐量大(轻量级控制)、能够承受信息丢失(传输不可靠)的应用场景。并且在网络情况良好的状况下,UDP的丢包率在实际状况下也很是少,因此有不少经典的协议采用UDP进行传输,好比SNMP、NFS、DNS等

应用:域名系统(DNS)、视频流

 

(3)TCP与UDP

TCP---传输控制协议,提供的是面向链接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间创建一个TCP链接,以后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另外一端。

UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,可是并不能保证它们能到达目的地。因为UDP在传输数据报前不用在客户和服务器之间创建一个链接,且没有超时重发等机制,故而传输速度很快

 

 

 

2、模拟web

1.WEB应用(网站)
        Http协议:
            发送:
                POST /index HTTP/1.1
                Host: 127.0.0.1:8080
                Connection: keep-alive
                Cache-Control: max-age=0
                Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
                User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
                HTTPS: 1
                Accept-Encoding: gzip, deflate, sdch
                Accept-Language: zh-CN,zh;q=0.8
                Cookie: csrftoken=hNmu2JOtntGMN0hSRSPmMQk2newEb3o8zb6pXW5Cc3m54IaA5VlTkUvqWsFezpni


                p=123
            
            响应:
                200 OK
                Cache-Control:public, max-age=15
                Connection:keep-alive
                Content-Encoding:gzip
                Content-Type:text/html; charset=utf-8
                Date:Wed, 14 Jun 2017 01:21:17 GMT
                Expires:Wed, 14 Jun 2017 01:21:33 GMT
                Last-Modified:Wed, 14 Jun 2017 01:21:03 GMT
                Transfer-Encoding:chunked
                Vary:Accept-Encoding
                X-Frame-Options:SAMEORIGIN
                X-UA-Compatible:IE=10
                        

                浏览器解析响应而后用户在页面看到内容(字符串)
          

    

2.以博客园为例
        浏览器(socket客户端)
            2. www.cnblogs.com(42.121.252.58,80)
                sk.socket()
                sk.connect((42.121.252.58,80))
                
                sk.send('我想要xx')
            5. 接收
            6. 链接断开
            
            
            
        博客园(socket服务端)
            1. 监听ip和端口(42.121.252.58,80)
                while True:
                    用户 = 等待用户链接
                    3. 收到'我想要xx'
                    4. 响应:“好”
                     用户已断开


3.模拟web

模拟访问网页:运行下列代码,在浏览器中输入http://localhost:8000/并回车将看到Hello, Seven

 1 import socket
 2 
 3 
 4 # 处理请求:
 5 def handle_request(client):
 6     buf = client.recv(1024)
 7     client.send(b"HTTP/1.1 200 OK\r\n\r\n")
 8     client.send(b"Hello, Seven")
 9 
10 
11 def main():
12     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
13     # 监听网络
14     sock.bind(('localhost', 8000))
15     sock.listen(5)
16 
17     while True:
18         # 等待链接
19         connection, address = sock.accept()
20         handle_request(connection)
21         connection.close()
22 
23 
24 if __name__ == '__main__':
25     main()

 

 

 

3、web本质总结

web框架的本质说简单点就是socket服务端与浏览器之间的通讯

 1         1. Http,无状态,短链接
 2         
 3         2. 客户端与服务端
 4             浏览器至关于socket客户端
 5             网站至关于socket服务端
 6             
 7         3. 写网站,主要是写3部分:
 8             a. socket服务端
 9             b. 根据URL不一样返回不一样的内容
10                 路由系统:URL -> 函数
11             c. 字符串返回给用户
12                 模板引擎渲染:
13                     HTML充当模板(特殊字符)
14                     本身创造任意数据
15                 字符串             
相关文章
相关标签/搜索