HTTP协议 简介
HTTP协议
1.四大特性
HTTP协议
1.四大特性
1.基于TCP/IP作用于应用层之上的协议
2.基于请求响应
3.无状态
cookie
session
token
4.无连接
keep-alive
2.请求响应数据格式
请求首行(请求方式 协议版本)
请求头(一堆k:v键值对) 就类似于开路先锋 携带了一些服务端可以提前知道的信息
(/r/n)(如果请求头里没有内容 那就是 /r/n/r/n)
请求体(发送post请求 携带的数据都会放在请求体中)
3.响应状态码
下面是常见的HTTP状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
HTTP状态码分类
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
HTTP协议对收发消息的格式要求
每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。 HTTP响应的Header中有一个 Content-Type
表明响应的内容格式。如 text/html
表示HTML网页。
HTTP GET请求的格式:
HTTP响应的格式:
HTTP数据格式
这说明我们发送给浏览器的响应式无效的, Web应用程序想要在网络中完整的传输, 就一定需要遵从一定的通信协议,而在Web端这个应用层协议就是HTTP协议.
HTTP协议是有属于它自己的传输数据的格式的, HTTP的数据格式包含以下部分:
- 请求首行 协议版本, 请求方式
- 请求头 包含多个键值对形式的请求信息
- \r\n
- 请求体
服务端的响应格式也与之相对应:
- 响应首行 协议版本, 状态码
- 响应头 包含多个键值对形式的响应信息
- \r\n
- 响应体
返回正确响应
了解了HTTP的基本数据格式之后, 只要我们发送合法的响应信息, 就能和浏览器做一个基本的通信了, 然后继续修改上述的代码.
...
# 返回响应头
response = 'HTTP/1.1 200 OK\r\n\r\n'
# 返回响应体
response += '<h1>Hello World!!!</h1>'
...
HTTP协议
四大特性
1.基于TCP/IP作用于应用层之上的协议
2.基于请求响应
3.无状态
4.无连接
长连接websocket
数据格式
请求首行(HTTP/1.1 GET/POST)
请求头(一大堆的k,v键值对)
请求体(post请求携带的数据)
响应状态码
1XX:服务端已经接受到你的数据 正在处理 你可以继续提交相应数据
2XX:请求成功(200 OK)
3XX:重定向
4XX:请求错误(404请求资源不存在 403请求错误携带的数据不够 不符合相应规定)
5XX:服务器内部错误(500)
请求方式
1.get 获取资源
2.post 提交数据
5. 应用层
HTTP协议
FTP协议
TCP协议
流式协议,可靠协议
基于TCP协议通道
TCP协议传输数据之所以可靠,不是在于双通道,而是在于反馈机制,发送消息后必须等到对方回应,才会将内存中的数据清除。
UDP协议
数据报协议
无需建立双向通道 数据传输是不安全
将内存中的数据直接发送出去 不会做保留
早期的qq
三次握手四次挥手
三次握手建立连接
四次挥手断开连接
###如何解决TCP的粘包问题
基于TCP实现大文件的上传
客户端:
1.先生成一个字典
2.制作字典的报头
3.发送字典的报头
4.发送字典数据
5.发送真实数据
服务端
1.接收固定长度的报头
2.解析获取字典的长度
3.接收字典数据
4.解析获取真实数据信息
5.接收真实数据
socketserver
能够实现并发的效果
并发:看上去像同时运行的
并行:真正意义上的同时执行
ps:单核的计算机绝对不可能实现并行 但是可以实现并发
大文件上传
服务端
1.socket创建TCP服务
2.连接循环
3.通信循环
接受固定长度的字典的报头
解析获取字典数据的真实长度
接受字典数据 解码 反序列化成字典
从字典中获取文件大小 以及文件名等其他信息
4.循环接受文件数据
文件操作(wb) 接受一行往文件中写入一行
客户端
1.socket客户端代码
2.利用os.listdir获取文件夹中所有的文件名
3.循环打印 供用户选择想要上传的文件
用户选择是否符合要求
4.根据用户寻找及os.path.join方法拼接用户想要上传的文件绝对路径
5.根据文件路径获取文件大小os.path.getsize()
6.定义一个发送给服务端的字典
{
"file_name":用户选择的文件名,
"file_size":文件大小,
...额外键值对消息
}
7.制作字典的报头
序列化 编码
8.发送字典的报头
9.发送字典数据
10.发文件
文件操作 一行行读取并发送