网络之应用层与HTTP协议

2023-05-16

一、应用层

1.含义

应用层负责程序间沟通。我们的网络编程主要是针对应用层。

2.序列化与反序列化

序列化:发送数据时按照某个规则将数据转换为字符串。

反序列化:接收数据时按照相同的规则将字符串转换为数据。

二、HTTP协议

1.URL(Uniform Resource Location)

 统一资源定位符,俗称“网址”。

URL的结构:

协议方案://用户名:密码@服务器IP地址:端口/资源路径?查询字符串#片段标识符
http://username:password@server_ip:server_port/path?queryString#id

eg:

例1:
http://user:pass@www.example.jp:80/dir/index.htm?uid=1#ch1
解析:
http:            协议方案名(未加密)
user:pass        登录信息(认证)(一般会省略)
www.example.jp   服务器地址(域名)
80               服务器端口号(一般也省略),在请求发起时默认加上。
/dir/index.htm   带层次的文件路径(资源路径)
uid=1            查询字符串(多个参数间用“&”隔开)
ch1              片段标识符

例2
https://www.so.com/s?ie=utf-8&src=dlm&shb=1&hsid=bcb149e577d70e21&ls=n482bfbdf97&q=C%2B%2B
解析:
https://    协议方案名(加密)
www.so.com  服务器地址(域名)
/s          资源路径,这里的'/'是相对路径,系统会默认补全路径。(如/home/san/index.htm)
ie=utf-8&src=dlm&shb=1&hsid=bcb149e577d70e21&ls=n482bfbdf97&q=C%2B%2B 查询字符串,格式为key=val&key=val

有些字符,如“/”,“?”,“:”等字符已经被url当作特殊意义理解了,因此这些字符不能随意出现。如果要搜索有关这些字符的信息,就必须先对这些特殊字符进行转义。

转义的规则:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。

2.编码与解码

在URL中,特殊字符都有特殊含义。因此遇到特殊字符,要对它们进行转义(编码)。

编码:提交的数据中,如果存在特殊字符,就必须进行转义将特殊字符转为16进制的数字字符串如C++中的'+',c++转为16进制变为c2b2b。为了向服务器表明哪些数据是编码后的数据,在编码后的数据前面加上'%'来表示。那么“c++”经过编码就变为"c%2b%2b"。

解码:如果遇到'%',则认为紧跟其后面的两个字节数据需要进行解码。即根据ASCII码表,将%后面的两个字节进行转换(16进制变为10进制),然后对应ASCII码表找到对应的特殊字符。如"c%2b%2b",0x2b=2*16+11=43,43对应的ASCII码表得到'+',最后解码"c%2b%2b"得到"c++"。

3.HTTP协议

3.1 HTTP请求

POST:http://job.xjtu.edu.cn/companyLogin.do HTTP/1.1H
HOST:job.xjtu.edu.cn
Connection:keep-alive
Content-Length:36
Cache-Control:max-age=0
Origin:http://job.xjtu.edu.cn
Upgrade-Insecure-Requests:1
Content-Type:application/X-www-form-urlencoded
User-Agent:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Accept:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Referer:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Accept-Encoding:gzip,deflate
Accept-Language:zh-CN,zh;q=0.8
Cookie:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

username=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

http请求报文主要分为请求行、请求报头、空行和请求正文。按行读取,因此在上面的示例中,Accept属性实际只占一行。

因此,我们可以通过特殊记号空行把报头和报文(有效载荷)有效分离。

请求行主要包括请求方法、请求资源和版本号。

报头的属性

报头中有许多属性,它们都是以Key:Value的方式存放的。

HOST为主机地址,客户端告诉服务器,所请求的资源在哪个主机的哪个端口上。

Connection为连接属性,这里keep-alive指长链接。

Content-Length指正文大小(Body的长度)。

Content-Type指数据类型(如html/text等),这里指超文本传输类型。

User-Agent指用户的操作系统和浏览器版本信息。

Referer指当前页面是从哪个页面跳转过来的。

Location:搭配3XX状态码使用,告诉客户端接下来要到哪里去访问。

Cookie文件用于存放客户端少量信息(主要是用户名和密码(本地)),通常用于实现会话(Session)功能。

关于Cookie:“Cookie”是小量信息,由网络服务器发送出来以存储在网络浏览器上,从而下次这位独一无二的访客又回到该网络服务器时,可以从浏览器读回此信息。关于Cookie的详细内容请见百度百科https://mr.baidu.com/42ue6o0?f=cp

长连接与短连接

短连接是指通讯双方有数据交互时,就建立一个连接,数据发送完成后,则断开连接,即每次只完成一项业务的发送。

长连接指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。

短连接的操作步骤是:建立连接--发送数据--关闭连接。。。建立连接--数据传输--关闭连接

长连接的操作步骤是:建立连接--数据传输--。。。(保持连接)。。。--数据传输--关闭连接。

http的通信过程:(1)建立连接(2)发送请求(客户端)(3)相应请求并断开连接(服务器端)

3.2 HTTP响应

HTTP/1.1 200 OK
Server:YxlinkWAF
Content-Type:text/html;charset=UTF-8
Content-Language:zh-CN
Transfer-Encoding:chunked
Date:Fri,20 Sep 2018 09:56:52 GMT

<!DOCTYPE html>
<html>
<head>
<title>XXXXXXXXXXXXXXXXXXXXXXXXX</title>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

http响应主要分为状态行(首行)、响应报头、空行和有效载荷,也是”按行陈列"的。

状态行又包括HTTP服务器版本号、状态码和状态码解释。

响应报头和请求报头一样,一行一个属性,并且以Key:Value的方式存放。上面包括了服务器、内容类型、内容语言、传输编码和日期时间等详细信息。

空行后面的内容都是Body,Body允许为空字符串。如果Body存在,则在报头中会有一个Content-Length来标识Body的长度。在这里,服务器返回了一个html页面,那么html页面内容就是在Body中。

3.3 告知服务器意图的HTTP方法

方法说明支持的版本号
GET获取资源1.0、1.1
POST传输实体主体1.0、1.1
PUT传输文件1.0、1.1
HEAD获得报文首部(即报头)1.0、1.1
DELETE删除文件1.0、1.1
OPTIONS询问支持的方法1.1
TRACE追踪路径1.1
CONNECT要求用隧道协议连接代理1.1
LINK(UNLINK)建立和资源之间的联系(断开连接)1.0

GET用来请求访问已被URI识别的资源。指定的资源经服务器端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保持原样返回;如果是像CGI(Common Gateway Interface,通用网关接口)那样的程序,则返回经过执行后的输出结果。

POST用来传输实体的主体。虽然用GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是用POST方法。虽说POST的功能与GET很相似,但POST的主要目的并不是获取响应的主体内容。

PUT用来传输文件。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。但是,鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的Web网站不使用该方法。若配合Web应用程序的验证机制,或架构设计采用REST(REpresentational State Transfer,表征状态转移)标准的同类Web网站,就可能会开放使用PUT方法。

HEAD获得报文首部。HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性及资源更新的日期时间等。

DELETE删除文件。是与PUT方法相反的方法。DELETE方法按请求URI删除指定的资源。但是,HTTP/1.1的DELETE方法本身和PUT方法一样不带验证机制,所以一般的Web网站也不使用DELETE方法。当配合Web应用程序的验证机制,或遵守REST标准时还是有可能会开放使用的。

OPTIONS询问支持的方法。OPTIONS方法用来查询针对请求URI指定的资源支持的方法

TRACE追踪路径。TRACE方法是让Web服务器将之前的请求通信环回给客户端的方法。发送请求时,在Max-Forwards首部字段中填入数值,每经过一个服务器就将该数字减1,当数值刚好减到0时,就停止继续传输,最后接收到请求的服务器端则返回状态码200 OK的响应。客户端通过TRACE方法可以查询发送出去的请求是怎样被加工修改/篡改的。这是因为,请求想要连接到源目标服务器可能会通过代理中转,TRACE方法就是用来确认连接过程中发生的一系列操作。但是TRACE方法本来就不怎么常用,再加上它容易引发XST(Cross-Site Tracing,跨站追踪)攻击,通常就更不会用到了

CONNECT要求用隧道协议连接代理。CONNECT方法要求再与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输

 POST方法和GET方法的区别(常考)

(1)GET请求参数(提交的数据)直接拼接在url之后,而且参数长度有限制;而POST请求参数(提交的数据)在Body体(正文)中,参数长度没有限制。

实际上,get()本身并没有限制参数长度,真正限制参数长度的是浏览器和Web服务器本身。大部分浏览器限制在2K,而服务器限制在64K。它们都不是定值,各有不同。

(2)浏览器会自动缓存get请求,而post不会自动缓存,除非手动设置。

(3)get请求在浏览器中可回退,而post会再次请求。

(4)get请求时只能通过url编码,而post支持多种编码格式。

(5)get的请求参数可以被完整保存到历史记录中,而post不会被保留。

(6)get产生的url可以被bookmark,而post不可以。

3.4 HTTP的状态码

 类别原因短语示例
1XXInformation(信息状态码)接收的请求正在处理 
2XXSuccess(成功状态码)请求正常处理完毕200
3XXRedirection(重定向状态码)需要进行附加操作以完成请求301、302、303
4XXClient Error(客户端错误状态码)服务器无法处理请求404
5XXServer Error(服务器错误状态码)服务器处理请求出错500、503

HTTP状态码详解请见HTTP状态码

3.5 HTTP是不保存状态的协议

HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。

但是,随着Web的不断发展,因无状态而导致业务处理变得棘手的情况增多了。比如,用户登录到一家购物网站,即使他跳转到该站的其它页面,也需要能继续保持登录状态。针对这个实例,网站为了能够掌握是谁发送的请求。需要保持用户的状态。

HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络之应用层与HTTP协议 的相关文章

随机推荐

  • 年度回忆录-我的2013

    How time flies I hardlyhave time to exclaim xff01 回首这一年 xff0c 我最大的感觉是匆忙 xff01 从寒假开学前的合作 xff0c B S系列学习 xff0c 到软考 xff0c 开始
  • git 子模块

    有种情况我们经常会遇到 xff1a 某个工作中的项目需要包含并使用另一个项目 也许是第三方库 xff0c 或者你独立开发的 xff0c 用于多个父项目的库 现在问题来了 xff1a 你想要把它们当做两个独立的项目 xff0c 同时又想在一个
  • 【pcl入门教程滤波系列】之GroundSegmentation滤波(三)

    简介 前两篇对点云从算法层面上进行一定程度解析 通过使用pcl回归拟合地面算法 pcl学习系列之GroundSegmentation滤波 一 线段拟合分割算法 pcl学习系列之GroundSegmentation滤波 二 但是并不是一个算法
  • 基于误差状态卡尔曼滤波惯性导航理论(初步,持续更新)

    文章目录 常用方法 一 惯性导航备注1 xff09 坐标系之间换算2 xff09 几种表示姿态的方法1 四元数表示角度更新四元数运算 2 李代数表示角度3 链式求导方法 二 惯性导航算法理论1 xff09 科式加速度科式加速度的表示什么时候
  • Ubuntu系统安装时grub修复操作

    一 操作指令 1 先输入例如 34 ls hd1 gpt6 34 的命令查看所有硬盘分区目录下的信息 xff0c 其中数字1 6是可变的 xff0c 需要不断更改直到目录下信息出现 proc home等信息时 xff0c 记录下此时的数字
  • 香港大学R3live:手把手教你如何编译和运行

    R3live是香港大学MARS实验做的有关Livox雷达的相关成果 xff0c 于2021年12月31日开源 xff0c 其主要目标是以Livox雷达为核心做多传感器融合方案 以下是个人的Ubuntu系统下环境配置和简单运行记录 R3liv
  • Cartographer学习记录:Ubuntu16.04安装运行及可能出现的问题

    Cartographer是Google开源的激光SLAM项目 xff0c 目前是激光SLAM方案中较为稳定的 xff0c 已应用于工业机器人激光建图定位 xff0c 我之前是研究视觉SLAM的 xff0c 后面转到激光SLAM方案 xff0
  • Cartographer学习记录:Cartographer地图3D可视化配置(自录数据集版)

    在上一篇对Cartographer官方数据集进行可视化配置后 xff0c 这篇博客将跟各位小伙伴们分享如果利用自己录制的数据包进行地图的3D可视化 因为之前还没有做博客的习惯 xff0c 没有将我搭建平台和录制数据集的过程记录下来 xff0
  • Cartographer学习记录:手把手教你如何获取3D SLAM后端的位姿

    在我们利用cartographer建图完成后用来定位时 xff0c 就需要获取位姿信息 xff0c 那么该如何获取后端的位姿和时间并将其作为topic信息发布出来呢 xff1f 本篇文章将手把手教你如何实现 一 明确需要的数据 xff08
  • 二分搜索算法(以力扣周赛“每个小孩最多分到多少糖果”为例)

    上午刚刚打完力扣周赛 xff0c 感觉心有余而力不足 xff0c 好多次都有这么一种差一点就AC的感觉 xff0c 所以归根结底还是自己基础不牢的缘故 xff0c 借着有感记录下二分搜索算法的解法 xff0c 也祭奠下自己第287场周赛的再
  • 优先队列(priority_queue)的妙用(以力扣周赛“K 次增加后的最大乘积”为例)

    1 priority queue的用法 优先队列在实际的动态更新过程中帮我们找到最大或者最小的元素 xff0c priority queue的使用需要先包含头文件 lt queue gt xff0c 即 include lt queue g
  • linux文件流与文件描述符之间的转换

    linux文件流与文件描述符之间的转换 1 已知文件流指针 xff0c 获取对应的文件描述符 int fileno FILE stream 主要应用 xff1a 如果程序先前用fopen打开了一个文件 xff0c 但是又想对其进行锁定操作
  • D435i的IMU话题ROS包录制和查看

    1 bag数据录制 a 启动相机 xff0c 发布话题 roslaunch realsense2 camera rs imu calibration span class token punctuation span launch b 数据
  • 百问网物联网实战-FREERTOS

    一 移植步骤 先添加源码到MDK工程中还是先创建FreeRTOSConfig h xff0c 在FreeRTOSConfig h里面 xff0c 每一项的配置代表的什么 xff0c 值的范围是多少 xff0c 可以查看官网说明 config
  • 组合导航原理剖析(二):惯性导航方法与应用综述

    资料下载 PSINS 枯荣有常 知乎 半闲居士 知乎 书灌木 知乎 任乾 知乎 武汉大学多源智能导航实验室 传统导航采用单点导航的方式 xff0c 定位精度为几米 xff0c 显然不符合自动驾驶的需求 现有在自动驾驶中常用的三种导航方案 x
  • 英伟达 Jetson TX2介绍

    Jetson TX2介绍 Jetson nbsp TX2是NIVDIA瞄准人工智能在Jetson TK1和TX1推出后的升级 TX2的GPU和CPU都进行了升级 内存增加到了8GB 存储增加到了32GB 支持Wifi和蓝牙 编解码支持H 2
  • 基于SPWM的逆变器程序应用及自制电路

    自制逆变器的电路及程序应用 设计并制作 一个简易逆变器 xff0c 其结构如图所示 逆变器进行负载试验时 xff0c 需在其输出端接负载 通常情况下 xff0c 输出电能消耗在该负载上 2 基本要求 逆变器输出端仅连接电阻性负载 xff0c
  • configure,make,make install的作用以及configure参数解释说明

    文章源自 xff1a http feinibuke blog 51cto com 1724260 367376 http www chinaz com server 2007 0620 10489 shtml 一 configure mak
  • 关于大疆御2行业进阶版(M2EA)热红外照片温度信息提取问题

    xff08 1 xff09 大疆dji thermal sdk只支持导出RAW格式的数据信息而非TIFF xff0c RAW格式无法直接导入Pix4d Mapper等软件用于拼接 xff0c 需要自己转换转换成TIFF xff08 2 xf
  • 网络之应用层与HTTP协议

    一 应用层 1 含义 应用层负责程序间沟通 我们的网络编程主要是针对应用层 2 序列化与反序列化 序列化 xff1a 发送数据时按照某个规则将数据转换为字符串 反序列化 xff1a 接收数据时按照相同的规则将字符串转换为数据 二 HTTP协