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请求和响应都遵循相同的格式,一个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.发文件 文件操作 一行行读取并发送
posted @   Bitten  阅读(276)  评论(0编辑  收藏  举报
编辑推荐:
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
阅读排行:
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 接口重试的7种常用方案!
点击右上角即可分享
微信分享提示
CONTENTS