网络基础应用层--HTTP协议

  • 一、应用层协议
    • (一)应用层协议概念
    • (二)自定义协议概念
    • (三)数据格式如何定义最优
    • (四)结构体的二进制序列化
  • 二、HTTP协议
    • (一)HTTP协议
      • 1.请求-响应协议概念
      • 2.HTTP协议概念
  • 三、HTTP协议格式
    • (一)HTTP请求格式
      • 1.请求首行
        • (1)请求方法
        • (2)URL
          • ①协议方案名称:
          • ②用户名:密码
          • ③@域名或IP地址
          • ④:端口
          • ⑤/资源路径
          • ⑥?查询字符串
          • ⑦#片段标识符
        • (3)HTTP协议版本简介
          • ①HTTP/0.9
          • ②HTTP/1.0
          • ③HTTP/1.1
          • ④HTTP/2.0
          • ⑤比较
      • 2.请求头部字段
      • 3.空行
      • 4.正文
    • (二)HTTP响应头部格式
      • 1.首行
        • (1)状态码
          • ①1xx
          • ②2xx
          • ③3xx
          • ④4xx
          • ⑤5xx

一、应用层协议

(一)应用层协议概念

负责应用程序之间的数据沟通。

(二)自定义协议概念

而应用程序是程序员自己写的,
应用程序之间如何沟通,用什么协议程序自己定义。

自己定制的数据格式约定。

(三)数据格式如何定义最优

传输性能+解析性能

  • 传输:按照指定格式组织好的二进制数据串要尽可能短小
  • 解析:将二进制数据串进行解析得到数据对象尽可能简单快速

(四)结构体的二进制序列化

因为结构体可能很容易完成多个数据对象在内存中的数据组织与解析

缺陷:

  • 位段的使用(平台不一致性),字节对齐(平台不一致)

序列化了解:

  • json序列化
  • protobuf序列化

二、HTTP协议

(一)HTTP协议

超文本传输协议(最早用来传输网页数据),
是一种简单的请求-响应协议(一次请求一次响应)。

1.请求-响应协议概念

客户端发送一个请求,服务器针对请求进行处理响应,完毕后通信结束。

2.HTTP协议概念

http协议是一个明文传输协议:以字符串组织数据格式(易懂)。

http协议是一种应用层的数据格式,在传输层用的是tcp协议。

也就是说:

http的服务器客户端其实就是tcp的服务器客户端,
只不过上层组织数据格式用的是http协议格式。

HTTP抓包工具:fiddler

网卡抓包工具:wireshark

三、HTTP协议格式

(一)HTTP请求格式

1.请求首行

请求中的第一行数据,包含三要素,以空格间隔,以\r\n结尾。

method url version\r\n

(1)请求方法

表示发送请求类型(请求资源/提交数据)

请求资源:

GET:获取一个实体资源,也可以提交部分数据给服务器,
但是提交的数据不在正文中,
而是在URL中,长度受到限制,并且因为数据在URL中因此不太安全。

提交数据:

POST:向服务器提交表单数据,数据在正文中,没有长度限制。

(2)URL

俗称的网址–学名:统一资源定位符–用于在网络中唯一定位一个资源。

如何定位网络中的资源—需要了解URL中所包含的元素

协议方案名称://用户名:密码@域名或IP地址:服务器端口/资源路径?查询字符串#片段标识符
http://username:password@ip:port/path?key=val&key=val#ch

如何定位资源—通过内部所包含的要素实现:

①协议方案名称:

描述通信所使用的协议。

②用户名:密码

身份认证信息—存在安全隐患,现在已经很少使用了。

③@域名或IP地址

服务器别名,例如baidu.com,一个便于记忆的字符串,
最终需要进行域名解析得到服务器IP地址。

④:端口

域名或者IP和端口就定位描述了网络上的一台主机上的某个进程。

⑤/资源路径

描述定位指定计算机上的指定路径下的某个实体资源,
/ 是一个相对根目录,对应服务器上的指定目录。

域名+端口+资源路径:三个定位了网络上指定服务器上的指定资源,由指定进程处理。

⑥?查询字符串

客户端提交个服务端的少量数据,格式:key=val&key=val…

  • urlencode
    -url编码,如果提交的数据中具有特殊字符,就有可能会与url中的间隔符造成歧义;
    因此如果提交的数据(资源路径,查询字符串)中有特殊字符,则需要进行转义–url编码
    遇到特殊字符,则将特殊字符的每个字节转换为16进制的数字字符,+ -> 2B。
    并且转换之后,为了表示这是编码后的数据,因此使用前缀%用以标识:c++ -> C%2B%2B
  • urldecode
    -url编码,对url编码后的数据进行解析得到原始数据
    遇到%则将紧随其后的两个字符转换为16进制的数字,%2B -> 2 B ;
    第一个数字乘以16(或者左移四位)加上第二个数字得到特殊字符ascii值。
⑦#片段标识符

html网页汇中的一个标签ID,可以查看网页直接滑动到指定位置。

(3)HTTP协议版本简介

①HTTP/0.9

不成熟版本,只有GET进行超文本数据传输,协议格式不完善….

②HTTP/1.0

规范了协议格式,新增支持GET/HEAD/POST方法,支持了多媒体数据流的传输。

③HTTP/1.1

支持更多请求方法以及头部字段,有了长连接管理,以及缓冲管理。

④HTTP/2.0

基于http协议的臃肿,重新进行一些设计,解决了一些典型问题以及性能问题。

缓存控制:

一些资源在没有改变的情况下不需要重新传输.

长连接的改进:

  • 短连接:
    -http实际上是基于tcp的,短连接是建立连接,发送请求,得到响应,断开连接
    (规范清晰,但性能低);
  • 长连接:
    -在一次连接中可以多次请求,并且1.1版本的长连接具有管线化管理思想。

长连接相较于短连接,节省了大量的连接建立时间 。

管线化相较于传统长连接,请求连续发送同时处理,节省处理时间,按序响应;

缺陷:
响应必须与请求顺序一致,存在队头阻塞问题。

队头阻塞:如果第一个资源处理时间长,就算后面的资源准备好了也不能响应。

解决:
2.0版本的长连接多路复用,解决了队头阻塞问题,每个响应中包含对应的请求描述,
因此哪个资源准备好了就能直接响应。

⑤比较

1.0版本相较于0.9版本:

主要规范了协议格式,支持更多的功能以及数据传输方式。

1.1版本相较于1.0版本:

主要在于性能上的改进,以及其他一些特殊功能的添加。

2.0版本相较于1.1版本做的改动更大:
加粗样式

  1. 从明文字符串传输改为二进制传输;
  2. 支持服务端主动推送依赖数据(以前是一次请求一次响应),一次请求,可以响应多个数据;
  3. 多路复用在响应头部中添加请求信息,不用按序响应,解决队头阻塞问题;
  4. 保存以前传输中没有出现的头部字段,相同的头部字段不用每次都重新传输了。

2.请求头部字段

以key:val形式的键值对组成,每个键值对以\r\n结尾,关于请求或者正文…的关键描述信息。

  • Host:服务器域名地址信息

  • Connection长短连接的管理,keep-alive表示长连接,close表示短连接。

  • User-Agent:客户端浏览器以及系统版本信息。

  • Accept:客户端告诉服务器自己能够接收到什么样的响应数据。

  • Referer:里面包含一个连接,表示的是当前请求的来源页面连接。

  • Content-Length正文描述,描述正文有多长。
    请求或者响应必须完整才能处理,不完整就会出问题;
    多个请求或响应连续发送,就会存在粘包问题:
    (多个数据连接到一起无法区别每个数据的起始和结尾);
    这个字段就是用于解决HTTP粘包问题:
    根据格式先取出头部,根据头部中的content-length字段确定正文长度,
    然后取出指定长度正文,解决粘包。

  • Content-Type正文类型描述,决定了对端如何处理正文数据。

3.空行

\r\n,用于间隔头部与正文。

  • 头部最后一个字段会以\r\n结尾,加上空行\r\n会组成一个连续的\r\n\r\n,
    这就是头部结束的标识;
  • 或者当头部字段逐个取出,而其中某个字段只有单纯\r\n没有其他信息,
    则表示这就是空间就是头部结束标识。

4.正文

提交给服务器的数据。

(注意:GET请求没有正文,POST提交的数据放在正文中)

(二)HTTP响应头部格式

HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。

1.首行

明确针对请求的处理结果,包含三个要素,以空格间隔,以\r\n结尾。

协议版本:0.9、 1.0 、 1.1 、 2.0…

(1)状态码

处理结果的简单明确表示,以数字表示不同等待处理结果。

①1xx

一些描述和协商信息;

101协议切换的响应状态码。

②2xx

响应成功处理;

200-成功处理;
206-断点续传。

③3xx

表示资源已重定向,一个资源从原先的位置移动到另一个位置,但是保证原先的链接依然可用。

http://huazai.com/a.png->http://huazai.com/image/a.png
通常与Location响应字段配合使用:
Location:http://huazai.com/image/a.png

301—永久重定向-下次请求直接请求新链接。
302—临时重定向-每次请求先请求原链接。

④4xx

表示客户端请求错误;

400, 404—没有这个资源。

⑤5xx

表示服务器错误;

500—内部错误,
502—代理请求错误;
504—代理请求超时。

状态码描述:

对于状态码的文字描述—无实质效果。

网络基础应用层--HTTP协议相关推荐

  1. 网络基础 -- 应用层HTTP协议

    目录 应用层(TCP/IP协议中的应用层/HTTP协议) HTTP协议 URL -- 统一资源定位符 UrlEncode / UrlDecode HTTP协议格式 概述 HTTP 请求消息Reques ...

  2. 前端网络基础-应用层DNS协议

    目录 初识域名 正向解析和反向解析 DNS解析 主机本地hosts文件实现DNS解析 浏览器缓存实现DNS解析 本地DNS服务器实现DNS解析 域名的组成 DNS迭代解析 DNS递归解析 DNS协议 ...

  3. 前端网络基础-应用层HTTP协议

    目录 什么是HTTP协议 URL与URI HTTP协议的报文结构 HTTP请求方法 GET请求方法 POST请求方法 HTTP响应状态码 HTTP报文头 HTTP无状态性 什么是HTTP协议 HTTP ...

  4. 网络基础 之SSL协议

    网络基础 之SSL协议 一.SSL 协议简介 SSL 的功能 SSL 的特性 SSL 在协议栈的位置 SSL 体系结构 二.SSL 协议工作原理 SSL协议可分为两层 SSL 的两个重要概念 SSL握 ...

  5. 网络基础网络层--IP协议

    网络基础网络层--IP协议 一.IP协议解析 (一)4位版本 (二)4位报头长度 (三)8位服务类型 (四)16位数据报长度 (五)16位分片标识 (六)3位分片标志 (七)13位分片偏移 (八)8位 ...

  6. 网络基础 TCP/IP协议面试常问知识点

    网络基础 TCP/IP协议面试常问知识点 ****************** 如有侵权请提示删除 ********************* 1.网络包的组成: 报头/起始帧分界符--MAC头部-- ...

  7. 【Linux】网络基础--应用层详解

    网络基础--应用层 ⏰应用层

  8. HTTP协议【网络基础/应用层】

    文章目录 1. 网络基础 TCP/IP 2. 与HTTP密切相关的协议 2.1 负责传输的 IP 协议 路由选择 2.2 确保可靠性的 TCP 协议 三次握手 2.3 负责域名解析的 DNS 服务 2 ...

  9. 【网络】应用层-HTTP协议

    网络-应用层-HTTP协议 文章目录 网络-应用层-HTTP协议 HTTP协议 什么是HTTP协议 URL urlencode和urldecode HTTP基本特征 HTTP协议版本 HTTP报文结构 ...

最新文章

  1. [C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器...
  2. DirectShow Filter 基础与简单的示例程序
  3. MTK 驱动开发(24)---camera模块的制作
  4. webservices系列(三)——调用线上webservice(天气预报和号码查询)
  5. Mask-RCNN校验结果计算mAP值
  6. 适用于Win7系统下Intel 7代核心显卡驱动程序
  7. 盘点python socket 中recv函数的坑
  8. 摘-连载-《青青子衿》(念才)-采葛-96
  9. python弹幕分析_《用python 玩转数据》项目——B站弹幕数据分析
  10. selenium+python设置爬虫代理IP
  11. Liunx服务器安装SVN
  12. https://api.douban.com 不在以下 request 合法域名列表中,请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/net
  13. 解决Could not find method xxx for arguments问题
  14. Nodejs学习路线图
  15. java 固定电话_Java正则表达式验证固定电话号码符合性
  16. POST 后台404错误
  17. 胡桃日记获取服务器版本信息,胡桃日记各渠道时装兑换领取方法
  18. mysql dlink,mysqld使用rosa双机软件共享数据目录
  19. linux上vi好用的插件,Vim好用的插件: vundle
  20. 安卓应用签名机制分析

热门文章

  1. 关于Keil开发C51单片机的头文件问题
  2. 德勤2022技术趋势:IT自我颠覆、技术跨界融合创新
  3. 活动回顾| Apache Doris 的过去、现在与未来
  4. Charles下载与破解
  5. 什么是数据结构,都有哪些数据结构
  6. 计算机网络思科平台第四章测验答案
  7. Linux内核学习系列(7)——execve与需求加载
  8. 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图
  9. 网络吞吐量对网络的影响
  10. Python浪漫520表白代码