| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> 网络协议 -> 应用层: HTTP 与 HTTPS协议 -> 正文阅读 |
|
|
[网络协议]应用层: HTTP 与 HTTPS协议 |
|
http是应用层的协议, 应用程序之间数据格式的约定统一格式, 由程序员们自己约定 协议可以用自定制协议也可以是已有的、优秀的知名的协议. http协议就是大佬们弄好的针对典型应用的知名的nb的协议.(应用层的知名的协议还有: http 超文本传输协议,https 解密的http, ftp 文件传输协议, smtp 邮件传输协议, dns 域名解析协议) 自定制协议: 我们可以自己随便定义使用的数据格式,? 但是要高效就得考虑: 序列化,反序列化的传输性能和解析性能问题. 序列化后的二进制数据越短传输性能越好, 序列化和反序列化的过程越简单解析性能越好. 通常使用结构体的二进制序列化解析性能非常高 (通过的是结构体的特性,对成员变量的赋值就能实现数据在内存中的序列化.) 但是结构体方式的序列化存在缺陷: 不同平台 位段的使用、字节对齐 不同. http协议是应用层协议,在传输层用的tcp协议.也就是说http服务器也就是tcp服务器.?http协议是个简单的请求-响应协议,一次请求一个响应. http是明文字符串传输协议(2.0版本前), 即协议组织的请求响应数据是人能看得懂的. http请求格式:包括首行, 头部字段, 空行, 正文四个部分
首行:首行就是请求报文中的第一行, 包含三个要素: method url version\r\n, 三个要素之间用空格间隔. 一个完整的首行就例如:? GET http://www.baidu.com:9090/path?key=val&key=val#ch HTTP/1.1\r\n (\r\n是换到下一行行首, 不是一个字符串的意思) method: 请求方法.请求方法描述了这个请求的目的, 比如是获取数据还是提交数据或者是修改数据, 删除数据. 典型的有: GET: 获取数据, 没有正文, 也可以提交少量数据, 提交的数据在url中,有安全隐患长度也有限制. POST: 提交数据, 提交的数据在正文中, 长度无限制. HEAD: 与GET类似,但响应不要正文数据,只要头部描述. URL: 统一资源定位符, 俗称网址.??较为完整的URL格式: 协议方案名称://用户名:密码@域名或IP地址:端口/资源路径?查询字符串#片段标识符 协议方案名称: 描述通信所用协议. 用户名:密码 :现在已经很少用了,因为之间把用户名和密码放在网址上是不安全的. 域名或ip地址: 服务器的别名, 方便人记忆的(比如baidu.com), 通过域名解析得到服务器ip地址. 端口: 域名(或ip地址)和端口定位描述了网络中的某一台主机上的某个进程, http默认80端口,https-443端口 /资源路径: 描述指定路径下的某个实体资源(功能), / 是服务器里的相对根目录. 域名(或ip地址)+端口+/资源路径,就决定了客户端这个请求的是网络中指定主机上的指定资源, 且这个请求由哪个进程处理. 比如: http://cn.bing.com/search, 必应服务器的查询功能.http://cn.bing.com/login, 必应服务器的登录 查询字符串:?客户端提交给服务端的少量数据, 格式为(键值对): key=val&key=val ... 为了防止提交的数据中有特殊字符(字母外的字符)比如? 会造成特殊字符与url中的间隔符产生歧义, 所以特殊字符需要进行转义, 即url编码,urlencode. urlencode: 遇到特殊字符将其每个字节转换为16进制的数字字符, 比如我们搜索c++在请求报文中的url中的查询字符串中的 ' + ' 就转成ascii表十六进制的2B. 并且转换后为了表示这是特殊字符,加前缀标识%,比如c++转为c%2B%2B urlencode: url解码,对url编码后的数据解码, 遇到%,则将%后的两个字符的16进制ascii值转换为特殊符号. 片段标识符:?html网页中的标签id,加了片段标识符可以让网页直接滑动到指定位置. version: http协议版本号协议版本后的 \r\n 就是转到行首,换行,就像回车换行到下一行行首. 0.9版本: 不成成熟的版本, 只有GET的方法,协议格式不完善. 1.0版本: 规范了协议格式, 有了HEAD,POST,GET方法, 支持了多媒体数据流传输. 1.1版本: 支持更多请求方法和头部字段, 有了长连接管理和缓存管理. 2.0版本: 由于http协议臃肿,重新进行了设计,有点推翻重建内维尔, 解决了一些典型,性能的问题. 1.0相较0.9: 主要规范了协议格式, 支持了更多更能和数据传输方式.. 1.1相较1.0: 主要在性能上改进.缓存控制: 一些资源在没有改变则不需要重新再次传输.? 长连接的改进: 短链接: 一次连接只处理一次请求, 即建立连接,发送请求,得到响应,断开连接. 而下次(每次)请求得再次新建一个链接.? 长连接: 一次链接中可以进行多次请求. 长连接相较于短链接节省了大量的来连接建立时间 1.1版本的长连接是管线化思想, 2.0版本的长连接是多路复用思想. 管线化:相较于传统长连接,请求连续发送同时处理,节省处理时间,按序响应 2.0版本中的长连接多路复用: 解决了队头阻塞问题,每个响应中包含对应的请求描述,因此哪个资源准备好了就可以直接响应 1.从明文字符串传输改为二进制传输 3.多路复用在响应头部中添加请求信息,不用按序响应,解决队头阻塞问题 头部:头部字段以 key: val 组成的多个键值对字段组成(val前有空格), 每个键值对以\r\n结尾, 是关于请求或正文的关键描述信息. key是字段类型名, key: val键值对就像 学校: 某某某大学 这样,val描述key, 常见的字段有: Host: 服务器域名或地址信息. Connection: 长短连接的管理.(Connection: keep-alive表示长连接,Connection: close表示短链接) User-Agent: 告诉服务端 客户端的浏览器版本以及系统版本信息(根据版本服务端会相应不同的渲染页面等..) Accept: 告诉服务端客户端自己能够接收什么样的响应数据 Referer:?val中包含一个连接,表示的是当前请求的来源页面连接(比如百度给某网站打广告, 该网站可以通过referer统计从百度点链接进来的人数,看看广告打得值不值等..) Content-Length:?正文描述,描述正文有多长 Content-Type: 正文类型描述,决定了对端如何处理正文数据 空行:空行就是\r\n独占一行, 用于间隔头部与正文. 当头部自动逐个取出,而某个字段只有\r\n时,则表示头部结束. 也可以理解为头部最后一个字段结尾为\r\n\r\n. 正文:提交给服务端的数据, GET没有这部分.POST提交的数据就放在正文中.(GET放url中) 一个简单的http请求:
http响应格式:
首行:也包含三个要素: 协议版本 响应状态码 状态码描述? ? 也是以空格为间隔.最后有对\r\n 协议版本: 就是上边说的0.9/ 1.0/?1.1/ 2.0 响应状态码: 一个三位数的数字, 每个数字代表不同的请求结果 1xx: 1开头的响应状态码, 描述信息或是协议切换协商, 比如101是协议切换响应, 服务器同意客户端的切换协议请求就会响应101 2xx: 描述请求成功处理, 比如200对应的状态码描述就是OK 3xx: 重定向,?当一个资源链接发生改变,但是保持原链接依然可用则将原链接重定向到新的链接,与Location头部字段搭配, 客户端看到3xx的响应,会请求跳到Location字段中的网址. 301-永久-下次请求时直接请求新链接;? ? ? 302-临时-下次请求时依然请求原链接 4xx: 描述客户端错误, 400-请求格式错误,? 404-请求的资源不存在. 5xx: 描述服务端错误, 500-服务器内部错误;? 502-代理服务器错误; 504-代理请求超时 状态码描述: 对状态码的简单描述, 是一些英文单词,比如 200 OK,OK就是对200这个响应状态码的简单描述. 即请求得到的响应结果,请求成功了就是OK.? 404 NOT FOUND.? 状态码描述是无意义的,我们自己写响应时,后面的状态码描述和状态码对不上也不会报错. 头部:也是由多个 key: val 键值对组成, 每个键值对以\r\n结尾, 也是用于描述正文或响应信息. 也有Connection-Length: 正文长度,Connection-Type: 正文类型. 之类的头部字段. Location: 与3xx的响应码搭配使用, val是一个重定向的新链接. Set-Cookie: 与请求的Cookie头部字段搭配使用, 用于实现http的cookie机制. cookie机制:http是一个无状态的协议, 早期版本中短连接,一次通信连接就会断开,但是随着协议的发展, 客户端的标识状态越来越重要,比如购物︰登录会告诉对方客户端的身份信息,但是当你本次通信完毕链接就断开了,下次买东西的时候依然需要重新建立连接发送客户端认证信息. cookie就是用于在http协议中持续维护客户端通信状态的机制 |
|
|
| 网络协议 最新文章 |
| 使用Easyswoole 搭建简单的Websoket服务 |
| 常见的数据通信方式有哪些? |
| Openssl 1024bit RSA算法---公私钥获取和处 |
| HTTPS协议的密钥交换流程 |
| 《小白WEB安全入门》03. 漏洞篇 |
| HttpRunner4.x 安装与使用 |
| 2021-07-04 |
| 手写RPC学习笔记 |
| K8S高可用版本部署 |
| mySQL计算IP地址范围 |
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年11日历 | -2025/11/29 22:19:44- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |