Linux网络基础 -- 详解应用层(HTTP与URL)

一,应用层

应用层也称为应用实体(AE),它由若干个特定应用服务元素(SASE)和一个或多个公用应用服务元素(CASE)组成。每个SASE提供特定的应用服务,例如文件运输访问和管理(FTAM)、电子文电处理(MHS)、虚拟终端协议(VAP)等。CASE提供一组公用的应用服务,例如联系控制服务元素(ACSE)、可靠运输服务元素(RTSE)和远程操作服务元素(ROSE)等。
应用层是直面程序员的一层,因为应用程序是程序员自己写的,因此应用层的协议也都是程序员自己制定的。

自定制协议与知名协议(HTTP)

自定制协议

  • 程序员自己根据自己的应用特点,定制的协议(数据格式/数据的描述信息)
    下面以一个简单版的网络计算机为例。客户端向服务端发送需要计算的数据,服务端进行计算。

上面我们用结构体进行数据的存储与发送,实际上是对我们的数据对象进行了序列化。

序列化与反序列化

  • 序列化 是将对象的状态信息转换为可以存储或传输的形式的过程。
  • 反序列化 从一系列字节提取数据结构的反向操作,是反序列化,也称为解编组。

下面列举几个比较常见的序列化方式。
json

Json
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 
易于人阅读和编写。同时也易于机器解析和生成。 
它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯
(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 
这些特性使JSON成为理想的数据交换语言。

protobuf

Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,
它是 是一种轻便高效的结构化数据存储格式,
可以用于结构化数据串行化,或者说序列化。
它很适合做数据存储或 RPC 数据交换格式。
可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183.proto 文件。
他们用于 RPC 系统和持续数据存储系统。

XML

可扩展标记语言(英语:Extensible Markup Language,简称:XML),
是一种标记语言。标记指计算机所能理解的信息符号,
通过此种标记,计算机之间可以处理包含各种信息的文章等。
如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,
也可以使用像XML这样由相关人士自由决定的标记语言,
这就是语言的可扩展性。XML是从标准通用标记语言(SGML)中简化修改出来的。
它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。

一个序列化的优劣有多种评定标准:解析性能/传输性能/鲁棒性/可调试性/可读性/兼容性
等等多个方面。

知名协议HTTP

http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。
之所以将HTTP协议称为知名协议,是因为使用它实在是太广泛了。
HTTP协议是一个超文本传输协议,早期用于传输超文本数据html。但是发展至今,已经不局限于传输超文本数据,我们可以接触到的大多数据都可以进行传输。

二,URL

定义
统一资源定位符(URL,英语duUniform Resource Locator的缩写),它的英文简称叫做URL。也被称为网页地址,是因特网上标准的资源的地址。

格式
URL以字符串的抽象形式来描述一个资源在万维网上的地址。一个URL唯一标识一个Web资源,通过与之对应的URL即可获得该资源。UR格式一般如下:
协议方案://认证用户名:认证密码@服务器IP地址:服务器处理进程端口/请求的资源路径?查询字符串#片段标识符

  • 端口:一般默认80端口
  • IP地址: 我们一般看到的是IP地址的别名,比如www.baidu.com 这个别名叫做域名,通过域名可以解析得到服务器的IP地址。
  • /请求的资源路径:资源在服务器的路径 这里的 / 并不是服务器的根目录 只是一个相对的根目录。
  • 查询字符串:客户端提交给服务端的一些数据,通常有 key:value 键值对组成。查询字符串中一半不能出现特殊的符号,因为特殊符号在URL中都有特殊的含义, 遇到特殊字符需要进行字符转义。 通常使用urlencode与urldecode进行转义。
  • urlencode:url编码,将特殊字符每一个字节转换为16进制的数字字符,并使用%作为前缀。
  • urldecode:url解码,在url中遇到%,则认为后面两个字符需要转义,反向转换即可。
  • 片段标识符:html中的一个标签,直接跳转到页面的某个位置。

三,HTTP协议

1. HTTP协议发展历史

http是一个应用于web的传输数据的协议, 我们将其叫做超文本传输协议。
HTTP协议共经历了 0.9 ,1.0 ,1.1 ,2.0, 四个版本的迭代。

  • 0.9:仅用于传输html数据, 只有GET请求,协议格式不完整。
  • 1.0:正式规定http协议, 增加多种请求方法,支持多种文件格式的数据流
  • 1.1:增加更多请求方法和描述信息,支持长连接,管线化传输
  • 2.0:采用二进制流传输, 多路复用,允许服务端主动推送服务

在这里插入图片描述

TIP

  • 长连接和短连接:
    http基于tcp进行数据传输。
    短连接:发送请求,得到响应, 关闭连接。
    长连接:一次连接,发送多个请求。
  • 管线化传输:保证响应顺序和请求顺序一致的前提下,可以一次发送多个请求。
  • 多路复用:相应顺序可以不和请求顺序保持一致,在数据头部标识相应的请求信息

2. HTTP是一个无状态协议

首先,标准的HTTP请求是无状态,无连接的。
无状态无连接详解: lhttps://www.cnblogs.com/bellkosmos/p/5237146.html.

  • 协议对于事务处理没有记忆能力【事物处理】【记忆能力】
  • 对同一个url请求没有上下文关系【上下文关系】
  • 每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况【无直接联系】【受直接影响】
  • 服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器【状态】

无状态无连接的缺点呢?

  1. 当我们登录服务端的时候会需要繁琐的步骤(每次)
  2. 与数据库底层进行交互的时候,及其的浪费效率

因此首先引入了cookie存储客户端的信心,每次通信的时候,进行交互,但是由于安全以及效率问题,又引入了session在服务器保存客户端的信息。cookie传递session中的信息。

cookie和session

  • set-cookie 服务端通过set-cookie向客户端传递信息,会被保存在客户端浏览器的cookie文件中。
  • cookie 客户端每次通信从cookie文件中读取数据通过cookie向服务段发送数据。
  • session 服务端为每个登录的客户端创建会话,在服务端描述一些会话信息,保存在服务端,通过cookie将sessionID返回给客户端,客户端每次通信都会通过cookie带有自己的session id。

3. 请求和响应抓包分析

工具

  • fiddler: 浏览器代理工具,通过代理实现数据抓包。
  • wireshark:网卡抓包工具,抓取流经网卡的所有数据流量。

请求

首行

请求方法+URL+版本号

GET http://123.207.58.25/ HTTP/1.1

以空格进行间隔 以\r\n进行结尾

  • 请求方法:GET /POST /HEAD
  • URL :如 http://123.207.58.25/
  • 协议版本:HTTP/1.1

常见请求方法:
在这里插入图片描述

1.GET:获取资源
GET方法用来请求URL指定的资源。指定的资源经服务器端解析后返回响应内容。例子:

请求	
GET /index.html HTTP/1.1
响应
返回index.html的页面资源

2.POST:传输实体主体
POST方法用来传输实体的主体。

请求
POST /submit.cgi HTTP/1.1
响应
Content-Length:1560	返回submit.cgi接收数据的处理结果

3.PUT:传输文件
PUT方法用来传输文件。就像FTP协议的文件上传一样,要求在请求报文主体中包含文件的内容,然后保存到请求URL指定的位置。不太常用。

请求	
POST /index.cgi HTTP/1.1
响应
Content-Length:text/hml
Content-Length:1560
响应返回状态码204 No Content(比如:该html已存在从该服务器上)

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

请求
HEAD /index.html HTTP/1.1
响应
返回index.html有关的响应首部

5.DELETE:删除文件
DELETE方法用来删除文件,是PUT的相反方法。DELETE方法按请求URL删除指定的资源。也不常用。

请求	
DELETE /example.html HTTP/1.1
响应
响应返回状态码204 No Content(比如:该html已从该服务器上删除)

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

请求
OPTIONS * HTTP/1.1
响应
HTTP/1.1 200 OK 
Allow:GET,POST,HEAD,OPTIONS

7.TRACE:追踪路径
TRACE方法是让Web服务器端将之前的请求通信环回给客户端方法。客户端可以用TRACE方法查询发送出去的请求时怎样被加工修改的。不常用,还容易引发XST攻击

请求	
TRACE / HTTP/1.1
响应
Max-Forwards:2	HTTP:/1.1 200 OK
Content-Type:message/http
Content-Length:1024

TRACE / HTTP/1.1
Host:hackr.cn
Max-Forwards:2

8.CONNECT:要求用隧道协议链接代理
CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和TSL协议把通信内容加密后经网络隧道传输。

请求
CONNECT proxy.hackr.cn:8080 HTTP/1.1
响应
HTTP/1.1 200 OK(之后进入网络隧道)

头部
描述本次请求的关键字段信息。由key:value键值对组成默认\r\n结尾。
示例:

Host: 123.207.58.25 //服务端ip地址
Connection: keep-alive //长短连接
Cache-Control: max-age=0 //缓存控制 每次信息是否重新获取
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36//客户端属性信息
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,;q=0.8,application/signed-exchange;v=b3;q=0.9//自己所能接受的数据属性
Referer: http://123.207.58.25/admin
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=3t2cjtk8l7cqpvrn2bs8t2ihf6; loginStatus=yes//cookie

空行
间隔头部与正文,接收到\r\n\r\n时, 认为头部结束。

正文
需要提交给服务端的数据。

响应

首行

HTTP/1.1 200 OK

包含三个要素,空格间隔 \r\n结尾

  • 版本协议:HTTP/1.1
  • 响应状态码:表示本次请求后, 服务端所作出的响应结果。
  • 状态码描述:对状态码的描述信息。可以使用官方描述也可以自定义。

响应状态码:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–信息不完整需要进一步补充
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求

在这里插入图片描述

    	请求收到,继续处理:
                100      客户端必须继续发出请求
                101      客户端要求服务器根据请求转换HTTP协议版本
     
         操作成功收到,分析,接受:
                200      交易成功
                201      提示知道新文件的URL
                202      接受和处理、但处理未完成
                203      返回信息不确定或不完整
                204      请求收到,但返回信息为空
                205      服务器完成了请求,用户代理必须复位当前已经浏览过的文件
                206      服务器已经完成了部分用户的GET请求
     
         重定向:
                300      请求的资源可在多处得到
                301      永久重定向,在Location响应首部的值仍为当前URL(隐式重定向)
                302      临时重定向,在Location响应首部的值仍为新的URL(显示重定向)
                303      建议客户端访问其他URL或访问方式
                304      Not Modified 请求的资源没有改变 可以继续使用缓存
                305      请求的资源必须从服务器指定的地址得到
                306      前一版本HTTP中使用的代码,现行版本中不再使用
                307      声明请求的资源临时性删除
     
         客户端错误:
                400      错误请求,如语法错误
                401      未授权
                   HTTP 401.1    未授权,登录失败
                   HTTP 401.2    未授权,服务器配置问题导致登录失败
                   HTTP 401.3    ACL  禁止访问资源
                   HTTP 401.4    未授权  授权被筛选器拒绝
                   HTTP 401.5    未授权  ISAPI或CGI授权失败
                402      保留有效ChargeTo头响应
                403      禁止访问
                   HTTP 403.1    禁止访问  禁止可执行访问
                   HTTP 403.2    禁止访问  禁止读访问
                   HTTP 403.3    禁止访问  禁止写访问
                   HTTP 403.4    禁止访问  要求SSL
                   HTTP 403.5    禁止访问  要求SSL 128
                   HTTP 403.6    禁止访问  IP地址被拒绝
                   HTTP 403.7    禁止访问  要求客户端证书
                   HTTP 403.8    禁止访问  禁止站点访问
                   HTTP 403.9    禁止访问  连接的用户过多
                   HTTP 403.10   禁止访问  配置无效
                   HTTP 403.11   禁止访问  密码更改
                   HTTP 403.12   禁止访问  映射器拒绝访问
                   HTTP 403.13   禁止访问  客户端证书已被吊销
                   HTTP 403.15   禁止访问  客户端访问许可过多
                   HTTP 403.16   禁止访问  客户端证书不可信或者无效
                   HTTP 403.17   禁止访问  客户端证书已经到期或者尚未生效
                404       没有发现文件、查询或URL
                405       用户在Request-Line字段定义的方法不允许
                406       根据用户发送的Accept拖,请求资源不可访问
                407       类似401,用户必须首先在代理服务器上得到授权
                408       客户端没有在用户指定的饿时间内完成请求
                409       对当前资源状态,请求不能完成
                410       服务器上不再有此资源且无进一步的参考地址
                411       服务器拒绝用户定义的Content-Length属性请求   
                412       一个或多个请求头字段在当前请求中错误
                413       请求的资源大于服务器允许的大小
                414       请求的资源URL长于服务器允许的长度
                415       请求资源不支持请求项目格式
                416       请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,       请求也不包含If-Range请求头字段
                417       服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长
         服务器端错误: 
                500 - 内部服务器错误
                   HTTP 500.100 - 内部服务器错误 
                   HTTP 500-11 服务器关闭
                   HTTP 500-12 应用程序重新启动
                   HTTP 500-13 - 服务器太忙
                   HTTP 500-14 - 应用程序无效
                   HTTP 500-15 - 不允许请求 
                501 - 未实现
                502 - 网关错误
                503 - 服务不可用
                504 - 网关超时

头部
本次响应的关键字的描述。
抓包分析

HTTP/1.1 200 OK//首行
Server: nginx/1.12.2
Date: Sun, 31 May 2020 01:35:20 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked//实体正文的传输方式
Connection: keep-alive
X-Powered-By: PHP/5.4.16
Expires: Thu, 19 Nov 1981 08:52:00 GMT//缓存过期时间
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

空行
区分正文与头部
正文
响应数据。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值