计算机网络基础:HTTP

先验知识

HTTP和其他协议的关系

通过下图,了解IP协议,TCP协议,DNS服务在使用HTTP协议通信过程中各自发挥的作用:

服务器处理流程

接受客户端连接 ------> 接受请求报文 ------> 处理请求 ------> 访问Web资源 ------> 构造应答 ------> 发送应答

URL和URI

URL

Uniform Resource Locator,统一资源定位符,访问web浏览器时需要输入的网页地址就是这个;

表示了资源的地址,根据URL是可以找到这个资源的;

例如:https://www.cnblogs.com/zhuchengchao/p/12899458.html

URI

Uniform Resource Identity,统一资源标识符,即用字符串标识了某一个资源;

例如:/zhuchengchao/p/12899458.html

联系与区别

URL为URI的子集,举个例子:URI为——花,URL为——百合花;

URI用字符串标识某一互联网资源,而URL表示了资源的地址;

URI是抽象的,在详细定位资源时要使用URL;

HTTP报文格式

请求报文格式

请求报文的方法

GET:获取指定的服务端资源

  • 请求参数直接跟在URL后面;
  • 请求的URL长度有限制;
  • 传输参数明文传输,不安全;
  • 一般作为用户获取资源,即查询数据;

POST:提交数据到服务器端

  • 请求参数在请求体中,即上图中的报文主体;
  • 请求的URL长度没有限制;
  • 相对安全;
  • 一般用于修改数据;

其他方法:

  • PUT:传输文件;
  • UPDATE:更新指定的服务端资源;
  • DELETE:删除指定的服务端资源;
  • HEAD:获取报文首部,和GET的区别为,不需要返回报文主体,只要首部即可;
  • OPTIONS:查询支持的方法,是否支持GET,PUT,DELETE... ...

响应报文格式

响应报文的状态码

2XX:请求成功状态码

状态码 原因短语 说明
200 OK 从客户端发出的请求在服务器端被正确处理了
204 No Content 请求已经被成功处理,返回的相应报文中不含主体数据
206 Partial Content 服务器对客户端的范围请求相应成功

3XX:重定向状态码

状态码 原因短语 说明
301 Moved Permanently 永久性重定向:为资源的请求分配了新的URI,以后都要使用这一个URI
302 Found 临时重定向:为资源的请求分配了新的URI,仅限于本次
303 See Other 与302相同,但明确表明需用GET方式获取资源
304 Not Modified 客户端发送附带的条件请求不满足,导致返回的响应内容不包含主体
307 Temporary Redirect 临时重定向:与302相同,但307遵守不将POST变为GET请求。

4XX:客户端错误状态码

状态码 原因短语 说明
400 Bad Request 请求报文存在语法错误,服务器无法理解
401 Unauthorized 发送的请求需要通过HTTP认证
403 Forbidden 对资源的访问请求被服务器拒绝了
404 Not Found 服务器上无法找到请求的资源

5XX:服务器错误状态码

状态码 原因短语 说明
500 Internal Server Error 服务器在执行请求时发生了错误,无法提供资源
503 Service Unavailable 服务器暂时处于超负荷或正在停机维护,无法处理请求

HTTP报文首部

HTTP协议的请求和响应报文中必定包含着HTTP的首部;

在上方HTTP的请求/响应报文的格式中可以看出,报文首部由如下部分组成:

  • 请求报文:请求行,请求首部字段,通用首部字段,实体首部字段;
  • 响应报文:状态行,响应首部字段,通用首部字段,实体首部字段。

格式:

  • 首部字段名:字段值

通用首部字段

请求报文和响应报文都会使用的字段。

首部字段名 说明 示例
Cache-Contorl 控制缓存行为 Cache-Contorl: private, max-age=0, no-chache
Connection 管理持久连接;控制不再转发给代理的首部字段 Connection: Keep-Alive
Connection: 不再转发的首部字段名
Data 创建报文的日期时间 Data: Thu, 26 Mar 2020 05:36:55 GMT
Pragma 报文指令 Pragma: no-cache
Trailer 报文末端的首部一览 Trailer: Expires
...(报文主体)...
Expires: Thu, 26 Mar 2020 05:36:55 GMT
Transfer-Encoding 指定报文主体的传输编码方式 Transfer-Encoding: chunked
Upgrade 升级为其他协议 Upgrade: TSL/1.0
Connection: Upgrade
Via 代理服务器的相关信息 Via: 1.0 gw.hacher.jp(Squid/3.1)
Via: 1.0 gw.hacher.jp(Squid/3.1), 1.1 al.example.com(Squid/2.7)
Waring 错误通知 Waring: 警告码 警告的主机:端口号 “警告内容” (日期时间)
Waring: 113 gw.hacker.jp:8080 "Heuristic expiration"

请求首部字段

客户端向服务器发送请求报文时使用的首部,补充了请求的附加内容,客户端信息,响应内容相关优先级等信息。

首部字段名 说明 示例
Accept 用户代理可处理的媒体类型 Accept:text/html,
application/xhtml+xml,
application/xml;q=0.9,
image/apng,/;q=0.8
Accept-Charset 优先的字符集 Accept-Charset:
iso-8859-5.unicode-1-1;q=0.8
Accept-Encoding 优先的内容编码 Accept-Encoding: gzip, deflate, br
Accept-Language 优先的语言(自然语言) Accept-Language:
zh-CN,zh;q=0.9,en;q=0.8
Authorization Web认证信息 Authorization: Basic avajoPdaD==
Expect 期待服务器的特定行为 Expect: 100-continue
From 用户的电子邮箱地址 From: xxx@xxx.xxx
Host 请求资源所在的服务器 Host: www.baidu.com
if-Match 比较实体标记(ETag) if-Match: "123456"
if-Modified-Since 比较资源的更新时间 if-Modified-Since: 时间
if-None-Match 与if-Match相反 if-None-Match: "123456"
if-Range 资源未更新时发送实体Byte的范围请求 if-Range: "123456"
Range: bytes=5001-10000
if-Unmodified-Since 与if-Modified-Since相反 if-Unmodified-Since: 时间
Max-Forwards 最大传输逐跳数,为0时,不再进行转发 Max-Forwards:10
Proxy-Authorization 代理服务器要求客户端的认证信息 Proxy-Authorization:
Basic avajoPdaD==
Range 实体的字节范围请求 Range: bytes=5001-10000
Referer 对请求中URI的原始获取方 Referer: https://www.baidu.com/
TE 传输编码的优先级 TE: gzip, deflate; q=0.5
User-Agent HTTP客户端程序的信息 User-Agent:
Mozilla/5.0 (Windows NT 10.0; WOW64)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/78.0.3904.108 Safari/537.36

响应首部字段

从服务器向客户端返回响应报文时使用的首部,补充了响应的附加内容,也会要求客户端附加额外的内容信息。

首部字段名 说明 示例
Accept-Ranges 是否接受字节范围请求 Accept-Ranges: bytes
Age 推算资源创建经过时间 Age: 53
ETag 资源的匹配信息 ETag: "5e8d4b59-c5c"
Location 令客户端重定向到指定URI Location:
http://.......
Proxy-Authenticate 代理服务器对客户端的认证信息 Proxy-Authenticate:
Basic realm="Usagidesign Auth"
Retry-After 对再次发起请求的时机要求 Retry-After: 120
Server HTTP服务器的安装信息 server: sffe
Vary 代理服务器缓存的管理信息 Vary : Accept-Encoding
WWW-Authenticate 服务器对客户端的认证信息 WWW-Authenticate: Basic
realm="Usagidesign Auth"

实体首部字段

针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间等于实体有关的信息。

首部字段名 说明 示例
Allow 资源可支持的HTTP方法 Allow: GET, HEAD
Content-Encoding 实体主体适用的编码方式 Content-Encoding: gizp
Content-Language 实体主体的自然语言 Content-Language: zh-CN
Content-Length 实体主体的大小(单位:Byte) Content-Length: 1500
Content-Location 替代对应资源的URI Content-Location:
http:// ../../..
Content-MD5 实体主体的报文摘要 Content-MD5:
JBK...ddkjfkl==
Content-Range 实体主体的位置范围 Content-Range:
bytes 5001-10000/10000
Content-Type 实体主体的媒体类型 Content-Type: image/jpeg
Expires 实体主体过去的日期时间 Expires:
Sat, 23 May 2020 01:41:38 GMT
Last-Modified 资源的最后修改日期时间 Last-Modified:
Sat, 16 May 2020 01:41:38 GMT

非HTTP1.1首部字段——Cookie

概述

由于HTTP是无状态协议,即无法记住之前与其通讯的客户端;

Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态;

首部字段 说明 首部类型
Set-Cookie 开始状态管理所使用的Cookie信息 响应首部字段
Cookie 服务器接收到的Cookie信息 请求首部字段

Set-Cookie

Set-Cookie: status=enable; expire= 时间; path=/; domain=.***.com

字段说明:

属性 说明
NAME=VALUE 赋予Cookie的名称和其值(必须)
expire=DATE Cookie的有效期
(若无,则默认为浏览器关闭为止)
path=PATH 将服务器上的文件目录作为Cookie的使用对象
(若无,则默认为文档所在的文件目录)
domain=域名 作为Cookie使用对象的域名
(若无,则默认为创建Cookie的服务器域名)
Secure 仅在HTTPS安全通信时才会发送Cookie
HttpOnly 加以限制,使Cookie不能被JavaScript脚本访问

Cookie:

Cookie: BAIDUID=***; BDORZ=***; COOKIE_SESSION=***; BD_HOME=1; H_PS_PSSID=***; sug=3; sugstore=0; ORIGIN=2; bdime=0Cookie: status=enable

告知服务器,当客户端想要获得HTTP状态管理支持时,就会在请求中包含从服务器接收到的Cookie

Session

服务器端会话技术,访问者从访问某个网站开始到离开为止;

在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中;

由于HTTP是无协议的,因此会使用Cookie来管理Session,因此Session的实现是依赖于Cookie的;

Session与Cookie的区别:

  • session存储数据在服务器端,Cookie在客户端;
  • session没有数据大小限制,Cookie有;
  • session数据安全,Cookie相对于不安全。

HTTPS

概述

HTTPS(Secure)是安全的HTTP协议,不作为新协议,只是在HTTP通信接口部分加上了SSL(Secure Socket Layer,安全套接层)和TSL(Transport Layer Security,安全层传输协议),HTTPS是身披SSL外壳的HTTP;

HTTPS=HTTP+加密+完整性保护

格式:https://<主机>:<端口>/<路径>

端口由原先的80端口,变为443端口

HTTP存在的问题

问题一:HTTP是明文传输的,内容会被窃听;

问题二:不验证通信方的身份,可能遭遇伪装

问题三:无法证明报文的完整性,可能已遭篡改

HTTPS解决问题

采用加密方式

通信加密:

通过SSL或TSL的组合使用,加密HTTP的通信内容;

用SSL建立安全通信线路后,就可以在这条线路上进行HTTP通信;

内容加密:

HTTP采用混合加密机制:综合使用了非对称和对称加密的方式,流程概括如下:

根据了随机数1,2,3和相同的加密算法生成了共享秘钥;

双方使用对称秘钥进行加密通信。

  • 内容加密是指,将传输的报文主体进行加密,但是对于报文首部信息是不会加密的;
  • 共享加密=对称加密:加密和解密都是通过同一个秘钥;
  • 公钥加密=非对称加密:
    • 公钥:可以随意发布在网上,可以解开有私钥加密的数据;
    • 私钥:需要保密,不能被人知道,可以解开由公钥加密的数据。

数字证书

通过数字证书来确定通信方,数字证书是可信任组织颁发给特定对象的认证;

通过证书,可以证明通信方就是意料之中的服务器。

数字证书组成:证书格式、版本号;证书序列号;签名算法;有效期;对象名称;对象公开秘钥;...

HTTPS通信步骤

参考

《图解TCP/IP》 [日]竹下隆史等

《图解HTTP》[日]上野宣

计算机网络:HTTP的更多相关文章

  1. [计算机网络]简易http server程序

    好久没输出了,知识还是要写下总结才能让思路更加清晰.最近在学习计算机网络相关的知识,来聊聊如何编写一个建议的HTTP服务器. 这个http server的实现源代码我放在了我的github上,有兴趣的 ...

  2. [Network] 计算机网络基础知识总结

    计算机网络学习的核心内容就是网络协议的学习.网络协议是为计算机网络中进行数据交换而建立的规则.标准或者说是约定的集合.因为不同用户的数据终端可能采取的字符集是不同的,两者需要进行通信,必须要在一定的标 ...

  3. 计算机网络中的帧封装(C实现)

    这段时间开始复习计算机网络,看到帧封装这一节,结合以前的课程设计,就用C写了个帧封装的程序,说实话C学的确实不怎么样,实现的时候对于文件操作那部分查了好多资料,下面说说帧封装是啥情况. 学过计算机网络 ...

  4. 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结 转载

    基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...

  5. 计算机网络(7)-----TCP协议概述

    传输控制协议(Transmission Control Protocol) 概念 一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络OSI模型中,它 ...

  6. 【转】牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

    基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...

  7. 计算机网络: IP地址,子网掩码,默认网关,DNS服务器详解

    楔子: 以Windows系统中IP地址设置界面为参考(如图1), IP地址, 子网掩码, 默认网关 和 DNS服务器, 这些都是什么意思呢? 学习IP地址的相关知识时还会遇到网络地址,广播地址,子网等 ...

  8. 2016.7.7 计算机网络复习要点第四章之网际协议IP

    1.与IP协议配套使用的还有三个协议: **地址解析协议ARP: **网际控制报文协议ICMP: **网际组管理协议IGMP: 2.虚拟互连网络: **没有一种单一的网络能够适应所有用户的需求: ** ...

  9. 计算机网络及TCP/IP知识点(全面,慢慢看)

    TCP/IP网络知识点总结 一.总述 1.定义:计算机网络是一些互相连接的.自治的计算机的集合.因特网是网络的网络. 2.分类: 根据作用范围分类: 广域网 WAN (Wide Area Networ ...

  10. 开始认真学计算机网络----computer network学习笔记(一)

    什么是计算机网络,就是连一堆计算机,计算机不单单指pc,还包括打印机啦,手机啦巴拉巴拉一堆 为什么要连,share data共享数据 数据? 文档,图片,视频,巴拉巴拉 网络有什么类型? LAN--- ...

随机推荐

  1. redis跨实例迁移 & redis上云

    1)redis跨实例迁移--源实例db11迁移至目标实例db30 root@fe2e836e4470:/data# redis-cli -a pwd1 -n 11 keys \* |while rea ...

  2. weblogic漏洞分析之CVE-2017-3248 & CVE-2018-2628

    CVE-2017-3248 & CVE-2018-2628 后面的漏洞就是2017-3248的绕过而已,所以poc都一样,只是使用的payload不同 本机开启JRMP服务端 ->利用T ...

  3. Oracle体系结构一

    总体结构分为三个部分:SGA,PGA,FILE文件 按功能分: 存储结构  存储结构对应关系  主要文件: 数据文件: 每个数据文件只与一个数据库相关联 一个表空间可以包含一个或者多个数据文件 一个数 ...

  4. PHP的CLI命令行运行模式浅析

    在做开发的时候,我们不仅仅只是做各种网站或者接口,也经常需要写一些命令行脚本用来处理一些后端的事务.比如对数据进行处理统计等.当然也是为了效率着想,当一个事务有可能会有较长的耗时时,往往会交由服务器的 ...

  5. Java面向对象系列(10)- 什么是多态

    多态 即同一方法可以根据发送对象的不同而采取不同的行为方式 一个对象的实际类型是确定的,但可以指向对象的引用类型有很多 多态存在的条件 有继承关系 子类重写父类方法 父类引用指向子类对象 注意:多态是 ...

  6. yolov5实战之二维码检测

    目录 1.前沿 2.二维码数据 3.训练配置 3.1数据集设置 3.2训练参数的配置 3.3网络结构设置 3.4训练 3.5结果示例 附录:数据集下载 1.前沿 之前总结过yolov5来做皮卡丘的检测 ...

  7. spring-data-redis 上百万的 QPS 压力太大连接失败,我 TM 人傻了

    大家好,我们最近业务量暴涨,导致我最近一直 TM 人傻了.前几天晚上,发现由于业务压力激增,某个核心微服务新扩容起来的几个实例,在不同程度上,出现了 Redis 连接失败的异常: org.spring ...

  8. 突破GD渲染的图片马

    <?php /* The algorithm of injecting the payload into the JPG image, which will keep unchanged aft ...

  9. 地心地固坐标系(ECEF)与站心坐标系(ENU)的转换

    目录 1. 概述 2. 原理 2.1. 平移 2.2. 旋转 2.3. 总结 3. 实现 4. 参考 1. 概述 我在<大地经纬度坐标与地心地固坐标的的转换>这篇文章中已经论述了地心坐标系 ...

  10. 《面试八股文》之 JVM 20卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...