web本质

知识内容:

1.网络协议复习

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.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在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快

 

 

 

二、模拟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()

 

 

 

三、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                 字符串             

 

posted @ 2018-05-13 23:43  woz333333  阅读(370)  评论(0编辑  收藏  举报