HTTP协议

1.前情回顾

1.match 和 search 返回对象

2.findall 返回列表

3.sub返回的是替换之后的结果

4.split切割

5.贪婪和懒惰是相对的,而且是有前提的,需要满足全局的情况

6.\b在ASCII码中表示退格,有特殊的含义

在正则中也有特殊含义,匹配的是数字到非数字的边界("123!"匹配的是3和!之间),不是数据

\b 在ASCII是一个转义字符   表示退格 ASCII码8
    在正则中也有特殊的含义  用以匹配 数字-非数字字符边界 而不匹配数据
    单词边界符能够匹配中文符号、英文符号、空格、制表符、回车符号,以及各种边界
    
含义不一样 使用不一样   
    比如匹配字符串中\b字符 需要正则有\b且不加r
    如果 需要匹配 数字-非数字字符边界 则应该使用r'\b'
    re.match(r"h\f\b", "h\f\b").group()   # 以下代码合法吗
    re.match( "h\f\b", "h\f\b").group()   # 以下代码合法吗
    
那到底什么时候不能用r,什么时候应该用r呢
    如果匹配数据是ASCII码中转义字符的含义 那么不应该使用r字符
    除此之外一般情况下都可以加上r字符

7.\r是将正则中的\变成\\

8.浏览器-服务器工作流程

浏览器 发起资源请求;显示资源

DNS服务器 将域名转换为IP地址

web服务器 提供网页资源 图片视频音频

1. 用户在浏览器地址栏输入资源网址 URL(协议 主机名 资源路径)
2. 浏览器把网址中主机名发送DNS服务器 进行域名解析 获取到IP地址
3. 通过IP地址 和 (协议)端口 连接服务器 connect
4. 向服务器发起资源请求(包括资源路径)
5. 服务器会读取资源请求 解析 发送对应的资源数据给浏览器
6. 浏览器解析数据并且进行显示
7. 如果网页显示还需要其他资源 重复执行56步  直到获取到所有的资源

2.HTTP协议(重点是格式)

2.1简单介绍

协议:规定了数据的格式,就是一种约定,让双方可以通信。

HTTP协议作用:

就是浏览器和服务器之间传输网页资源的数据采用的一种协议格式

超文本传输协议(HTTP协议)

应用层次的协议

基于请求响应模式

基于TCP

91年0.9版本

97年1.1版本(现在使用的版本)

超文本就是超文本标记语言写的HTML

HTTP协议是基于TCP实现的应用层协议

TCP/IP模型每一层的作用:

按照图片右侧的例子理解一下即可,了解,不需要死记硬背。

HTTP协议的工作模式:一次请求request和一次响应response的模式

浏览器主动发起请求,服务器才响应。

响应的数据是两部分:一部分是请求结果,一部分是数据

2.2HTTP请求报文格式

2.2.1谷歌浏览器

开发者模式(WindowsF12打开):

  • Elements:查找网页源代码HTML中的任一元素,手动修改任一元素的属性和样式且能实时在浏览器里面得到反馈。
  • Console:记录开发者开发过程中的日志信息,且可以作为与JS进行交互的命令行Shell。
  • Sources:断点调试JS。
  • Network:从发起网页页面请求Request后分析HTTP请求后得到的各个请求资源信息(包括状态、资源类型、大小、所用时间等),可以根据这个进行网络性能优化。
# 请求报文第一行,请求行,分为三部分
GET / HTTP/1.1
   # 请求方法 GET 获取资源  浏览器向服务器请求资源
   #        POST 浏览器向服务器提交数据
   #        HEAD 验证前后台工作是否正常
   # 资源请求路径(域名后面的就是请求路径)
   #      如果浏览器的路径是/或者没有   那么请求路径是就是/
   #      / 在web服务器中表示首页
   # HTTP协议版本
# 请求头  名称:值
Host: www.baidu.com
   #请求的主机名称
Connection: keep-alive
   # 连接方式  保持存活<长连接>   close直接关闭<短连接>
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
   # 用户代理(浏览器身份) 适配网页(手机网页或者电脑网页):反爬Python3.5
   # 爬虫的时候可以将自己伪装成其他用户   爬虫的时候不要将别人的网站弄奔溃
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
   # 浏览器接受文件的类型 数据类型
Accept-Encoding: gzip, deflate, br
   # 可以接受的压缩算法   数据太大,网络传输过程中提高效率
   #      可以节约带宽资源,提高网页传输效率
Accept-Language: en-US,en;q=0.9
   # 接受的语言  语言的优先级

课堂思考问题

请求行分为几部分、每一部分分别表示什么、请求头有什么特点、分别表示什么含义

2.2.2HTTP请求报文格式总结

请求行[方法 资源路径 版本 \r\n] \r\n代表换行符

请求头[名称:值\r\n]

空行[\r\n]

请求体[存储的是 浏览器提交给服务器的数据]

# 请求报文
GET /index.html HTTP/1.1\r\n
Host: 127.0.0.1\r\n
Connection: keep-alive\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate, sdch\r\n
Accept-Language: zh-CN,zh;q=0.8\r\n
\r\n

GET方法用以资源获取 一般都没有请求体,POST用以资源提交 一般都带请求体

GET方法用以资源获取 一般都没有请求体

请求行[GET 资源路径 版本 \r\n] \r\n代表换行符

请求头[名称:值\r\n]

空行[\r\n]

POST用以资源提交 一般都带请求体

请求行[POST 资源路径 版本 \r\n] \r\n代表换行符

请求头[名称:值\r\n]

空行[\r\n]

请求体[存储的是 浏览器提交给服务器的数据]

课堂思考问题:

1请求报文整个分为几部分,哪几部分

2post方法和get方法的请求报文有什么区别

3 常用的头部的意义

2.3响应报文

HTTP/1.1 200 OK
   start-line 起始行  状态行  响应行
   版本
   状态码  
       200成功 2xx表示成功  
       3xx表示重定向   302Found/307
           Location: https://www.baidu.com/
       4xx 客户端错误  404 Not Found
           表示用户端请求错误
       5xx 服务器错误  503服务不可用
   状态说明

# 响应头部说明
Connection: Keep-Alive    连接方式  HTTP/1.1默认 长连接
Content-Encoding: gzip    数据采用的压缩方式 解压缩
Content-Language:zh-CN   数据采用的语言
content-Length:1002      数据的长度,单位是字节
Content-Type: text/html(Content-Type: 
application/javascript;charset=UTF-8)
   数据类型   charset=UTF-8表示数据采用的字符集是utf-8
   有可能是网页有可能是图片
Date: Sun, 25 Nov 2018 04:10:00 GMT  日期时间
   格林威治时间 0时区
   北京时间    东八区   +8
Expires: Sun, 25 Nov 2018 04:09:33 GMT
   代表过期时间
Server: BWS/1.1
   服务器后台程序的名称  名称可以随便改

# Content-X头部一般都是标识后面的数据的属性

2.3.1HTTP响应报文格式总结

响应行[版本 状态码 说明\r\n]

响应头[名称 : 值\r\n]

空行[\r\n] 用来分割上下内容,表示响应头结束

响应体[存储的是 服务器发送给浏览器的数据 图片等网页资源]

2.4 验证HTTP响应报文格式

为了强化对响应报文的认识,这套格式,不是为了记住代码

import socket
# 1 创建出 TCP套接字  IPv4    基于字节流
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2 输入URL-->域名---DNS解析--->获取到服务器ip地址
#  IP 和 端口 连接服务器
tcp_socket.connect(('tlias-stu.boxuegu.com',80))
# 3 组装请求报文,发送给服务器 请求行 +
request_data = "GET / HTTP/1.1\r\n" +"Host:www.tlias-stu.boxuegu.com\r\n" + "\r\n"
tcp_socket.send(request_data.encode())
# 4 接收响应报文  验证
response_data = tcp_socket.recv(4096)
print(response_data)
# 5 关闭和服务器的连接 - 短连接方式
tcp_socket.close()
------------------------------------------------------
HTTP/1.1 200 OK\r\n
Server: nginx/1.10.2\r\n
Date: Sun, 25 Nov 2018 08:06:02 GMT\r\n
Content-Type: text/html;charset=ISO-8859-1\r\n
Content-Length: 2729\r\n
Connection: keep-alive\r\n
X-Application-Context: application:production:6303\r\n
Last-Modified: Mon, 20 Aug 2018 06:01:44 GMT\r\n
Accept-Ranges: bytes\r\n
Content-Language: en-US\r\n
Vary: Accept-Encoding\r\n
\r\n
<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/favicon.ico><title>TLIAS\xe7\xa0\x94\xe8\xae\xa8\xe6\xb1\x87</title><link href=/css/chunk-07a5.d674c38c.css rel=prefetch><link href=/css/chunk-095e.15abea5b.css rel=prefetch><link href=/css/chunk-0f9f.415bfa1c.css rel=prefetch><link href=/css/chunk-1247.03e81ebe.css rel=prefetch><link href=/css/chunk-1bfa.d674c38c.css rel=prefetch><link href=/css/chunk-2a87.acf8c5c1.css rel=prefetch><link href=/css/chunk-3d0b.d674c38c.css rel=prefetch><link href=/css/chunk-40ec.d674c38c.css rel=prefetch><link href=/css/chunk-4762.d674c38c.css rel=prefetch><link href=/css/chunk-4b2e.c5eb09a1.css rel=prefetch><link href=/css/chunk-591c.fae7b595.css rel=prefetch><link href=/css/chunk-6be2.69dfb6f2.css rel=prefetch><link href=/css/chunk-6c19.d6ab9cf4.css rel=prefetch><link href=/css/chunk-6dcb.557aa669.css rel=prefetch><link href=/css/chunk-6f19.d674c38c.css rel=prefetch><link href=/css/chunk-7704.d674c38c.css rel=prefetch><link href=/css/chunk-8417.d674c38c.css rel=prefetch><link href=/css/chunk-882d.d674c38c.css rel=prefetch><link href=/css/chunk-8f38.abf43e65.css rel=prefetch><link href=/js/chunk-07a5.a94bf613.js rel=prefetch><link href=/js/chunk-095e.a3a72cc2.js rel=prefetch><link href=/js/chunk-0b75.f3f85fd8.js rel=prefetch><link href=/js/chunk-0f9f.05daa514.js rel=prefetch><link href=/js/chunk-1247.e84febb0.js rel=prefetch><link href=/js/chunk-1bfa.1da67777.js rel=prefetch><link href=/js/chunk-2a87.5d2fd4c1.js rel=prefetch><link href=/js/chunk-3d0b.d4a0e6b9.js rel=prefetch><link href=/js/chunk-40ec.be23cbb7.js rel=prefetch><link href=/js/chunk-4762.0c96e4a5.js rel=prefetch><link href=/js/chunk-4b2e.dfb6d161.js rel=prefetch><link href=/js/chunk-591c.77c06357.js rel=prefetch><link href=/js/chunk-6be2.06b40164.js rel=prefetch><link href=/js/chunk-6c19.3edf1e2d.js rel=prefetch><link href=/js/chunk-6dcb.d6226677.js rel=prefetch><link href=/js/chunk-6f19.e05576f1.js rel=prefetch><link href=/js/chunk-7704.9281e4d1.js rel=prefetch><link href=/js/chunk-8417.1d4c7b26.js rel=prefetch><link href=/js/chunk-882d.6b54c3c9.js rel=prefetch><link href=/js/chunk-8f38.8de796a5.js rel=prefetch><link href=/css/app.231297aa.css rel=preload as=style><link href=/css/chunk-vendors.849b725d.css rel=preload as=style><link href=/js/app.0b402d7b.js rel=preload as=script><link href=/js/chunk-vendors.849d86b7.js rel=preload as=script><link href=/css/app.231297aa.css rel=stylesheet><link href=/css/chunk-vendors.849b725d.css rel=stylesheet></head><body><div id=app></div><script src=/js/app.0b402d7b.js></script><script src=/js/chunk-vendors.849d86b7.js></script></body></html>

2.5 长连接和短连接

HTTP中基于TCP<面向连接>实现

短连接:

优点:管理多个连接 简单 容易实现

缺点:如果用户频繁操作,消耗大量的资源进行套接字的创建和销毁

由于在用户发起请求的时候才创建连接 容易造成用户体验差

Connection: close

长连接:

需要同时保持和大量客户端连接的存活 实现复杂 对应硬件的需求高

用户频繁操作 节约了大量的资源(不需要进行 大量资源的创建和销毁)

用户体验更好

现行web服务器常用的做法

Connection: Keep-Alive

本文分享自微信公众号 - 全栈技术精选(Pythonnote),作者:小闫同学啊

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 扶我起来,前端还没倒下,我不能睡

    长路漫漫,唯夜作伴。虽然一天的工作头昏脑胀,但是仍然放不下我心心念念的前端啊,扶我起来,我还可以学~

    小闫同学啊
  • 浅谈密码加密

    我们的项目如果是使用flask框架开发的话,那么可以使用flask中提供的安全模块,将密码进行加密。这样做的好处是保障用户信息安全,要不然公司内任何一个程序员都...

    小闫同学啊
  • python技术面试题(二)

    3.组织数据发送给默认网关(IP还是DNS服务器的IP,但是mac地址是默认网关的mac地址),默认网关拥有转发数据的能力,把数据转发给路由器。

    小闫同学啊
  • 前端工程化-构建

    构建的核心是资源管理。简单说,构建就是把前端工程师开发的源代码进行编译、压缩、打包等一系列操作,最终产出可以直接上线或者可供后端工程师的资源。 构建可以划分为纯...

    寒月十八
  • 21.Elasticsearch分析与分析器

    首先,将一块文本分成适合于倒排索引的独立的 词条 , 之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall 分析器执行上面的工作...

    IT云清
  • CTF实战32 综合实战和讲解二(讲解部分)

    该培训中提及的技术只适用于合法CTF比赛和有合法授权的渗透测试,请勿用于其他非法用途,如用作其他非法用途与本文作者无关

    用户1631416
  • Confluence 6 恢复一个站点问题解决

    https://www.cwiki.us/display/CONFLUENCEWIKI/Restoring+a+Site

    HoneyMoose
  • QQfamily火红壁纸送不停 - 腾讯ISUX

    腾讯ISUX
  • BlockingQueue

    前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队...

    java达人
  • Swift 小心字典Value等于nil(容易出错)

    版权声明:转载请标明出处 https://blog.csdn.net/ZY_FlyWay/article/details/89186333

    ZY_FlyWay

扫码关注云+社区

领取腾讯云代金券