为什么http协议需要服务器,全面理解HTTP协议

L3Byb3h5L2h0dHAvaW1hZ2UuamlhZ291c2h1by5jb20vMjAxNi92YW1pYWkucG5n.jpg

引言:作为一名软件工程Web专业学生,对于HTTP的熟悉掌握是必不可少的,特此做记录,打造自己的HTTP栈。

URL与URI

我们经常接触到的就是URL了,它就是我们访问web的一个字符串地址,那么URI是什么呢?他们是什么关系呢?URL:uniform resource location 统一资源定位符URI:uniform resource identifier 统一资源标识符这也就是说,URI是一种资源的标识;而URL也是一种URI,也是一种资源的标识,但它也指明了如何定位Locate到这个资源。URI是一种抽象的资源标识,既可以是绝对的,也可以是相对的。但是URL是一种URI,它指明了定位的信息,必须是绝对的。

报文-通信的桥梁

客户端和服务器端通过相互发送报文进行通信,要深刻理解HTTP协议,就需要理解报文的格式和内容。

报文的组成

L3Byb3h5L2h0dHAvaW1hZ2UuamlhZ291c2h1by5jb20vMjAxNi9pYXFFcnEucG5n.jpg

无论是请求报文还是响应报文都需要有报文首部,当然报文主体并不是必需的。一般来说,请求报文的格式如下:

L3Byb3h5L2h0dHAvaW1hZ2UuamlhZ291c2h1by5jb20vMjAxNi9aWko3YmUucG5n.jpg

看一下百度网站的请求报文:

L3Byb3h5L2h0dHAvaW1hZ2UuamlhZ291c2h1by5jb20vMjAxNi9qSUZOVm4ucG5n.jpg

简单的报文形式:

GET / HTTP/1.1    //请求行,包含用于请求的方法,请求的URI,HTTP版本//以下为各种首部字段Host: www.baidu.com

Connection: keep-alive

Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0...

Accept-Encoding: gzip, deflate, sdch

Accept-Language: zh-CN,zh;q=0.8

响应报文的格式如下:

L3Byb3h5L2h0dHAvaW1hZ2UuamlhZ291c2h1by5jb20vMjAxNi9BdnltaWUucG5n.jpg

看一下百度网站的响应报文:

L3Byb3h5L2h0dHAvaW1hZ2UuamlhZ291c2h1by5jb20vMjAxNi9aUjdqdWUucG5n.jpg

HTTP/1.1 200 OK   //状态行,包含表明响应结果的状态码,原因短语和HTTP版本//以下为各种首部字段Server: bfe/1.0.8.5Date: Tue, 06 Oct 2015 14:48:28 GMT

Content-Type: text/html;charset=utf-8Transfer-Encoding: chunked

Connection: keep-alive

Cache-Control: private

告知服务器意图的HTTP方法

发送HTTP的方法有许多种,最常用的便是GET和POST,下面就这两种进行详细地说明。

GETGET方法用来请求访问URI所指定的资源,(我想访问你的某个资源)并不对服务器上的内容产生任何作用结果;每次GET的内容都是相同的。GET方式把请求所需要的参数放到URL中,直接就可以在URL中看见,有大小限制。

POSTPOST方法用来传输实体主体,目的并不是获取响应的主体内容,(我要把这条信息告诉你),POST方式则是把内容放在报文内容中,因此只要报文的内容没有限制,它的大小就没有限制。

总结GET用于获取某个内容,POST用于提交某种数据请求。按照使用场景来说,一般用户注册的内容属于私密的,这应该使用POST方式;而针对某一内容的查询,为了快速的响应,可以使用GET方式。

无状态协议与Cookie

HTTP是一种无状态协议,也就是每一次发送都是一次新的开始,服务器并不知道也没有必要知道当前连接的客户端是否之前有过交集,那么当需要进行保存用户登录状态时,则出现了麻烦,这个时候使用Cookie来保存状态。Cookie会根据服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段,通知客户端保存Cookie(保存在自己的电脑里),当下次客户端发送请求时,Cookie值会被添加到请求报文中发送出去。

持久连接

使用浏览器浏览一个包含多张图片的HTML页面时,浏览器会发起多次请求,如图所示:

L3Byb3h5L2h0dHAvaW1hZ2UuamlhZ291c2h1by5jb20vMjAxNi9lMkVOankucG5n.jpg

显而易见每次请求会造成无谓的TCP连接建立和断开,增加通信量的开销。

引入持久连接

持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。目前HTTP/1.1中默认为持久连接。

Connection:keep-alive

L3Byb3h5L2h0dHAvaW1hZ2UuamlhZ291c2h1by5jb20vMjAxNi83Qjd6YXkucG5n.jpg

管线化

管线化可以同时并行发送多个请求,不需要一个一个等待响应了。

常见的状态码

L3Byb3h5L2h0dHAvaW1hZ2UuamlhZ291c2h1by5jb20vMjAxNi9SZjZKMzIucG5n.jpg

确保安全的HTTPS

HTTP+加密+认证+完整性保护 = HTTPS一些登陆界面和购物结算界面使用HTTPS通信,也就是改用https://,HTTPS说简单点就是它的通信接口部分被SSL和TLS协议代替而已。

L3Byb3h5L2h0dHAvaW1hZ2UuamlhZ291c2h1by5jb20vMjAxNi9ycWVpRXIucG5n.jpg

身份认证

有一些网址或者服务需要用户的身份信息,因此需要随时知道这些消息,但是肯定不能每次都让用户输入用户密码,因此关于认证就有下面几种方式:

L3Byb3h5L2h0dHAvaW1hZ2UuamlhZ291c2h1by5jb20vMjAxNi95cUV2WWIucG5n.jpg

在这里主要说一下FormBase认证,也就是表单认证。

使用Cookie来管理Session

客户端把用户IE和密码等登录信息放入报文的实体部分,以POST方式发送给服务器。

服务器进行身份认证,产生SessionID,加入到Set-Cookie内,返回给客户端。

客户端接收到SessionID后,将其加入Cookie,下次请求时,浏览器会自动发送Cookie。

在传输过程中,一种安全地保存密码方式是,先利用给密码加盐的方式增加额外信息,再使用散列hash函数计算出散列值后保存。

相关内容

HTTPS与SSL(上篇)

HTTPS与SSL(下篇)

全面理解HTTP协议

转载和积累系列 - 深入理解HTTP协议

深入理解HTTP协议 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web C ...

爬虫入门系列(一):快速理解HTTP协议

4月份给自己挖一个爬虫系列的坑,主要涉及HTTP 协议.正则表达式.爬虫框架 Scrapy.消息队列.数据库等内容. 爬虫的基本原理是模拟浏览器进行 HTTP 请求,理解 HTTP 协议是写爬虫的必备 ...

深入理解AMQP协议

深入理解AMQP协议 2018年10月22日 12:32:16 一剑何风情 阅读数:1941   文章目录 一.AMQP 是什么 二.AMQP模型 工作过程 深入理解 三.Exchange交换机 默认 ...

网络编程懒人入门(六):深入浅出,全面理解HTTP协议

本文引用了自简书作者“涤生_Woo”的文章,内容有删减,感谢原作者的分享. 1.前言 HTTP(全称超文本传输协议,英文全称HyperText Transfer Protocol)是互联网上应用最为广 ...

[搜狐科技]由浅入深理解Raft协议

由浅入深理解Raft协议 2017-10-16 12:12操作系统/设计 0 - Raft协议和Paxos的因缘 读过Raft论文

(转存 作者未知)深入理解HTML协议

深入理解HTML协议 http协议学 习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(Worl ...

3. 与服务器对话:理解 HTTP 协议

0.服务器与本地交换机制 2.详解HTtp服务 (1)与服务器对话的流程 (2)Reque 请求 (3)Response 响应 200 成功 404 没有网页 (4)Get/Post区别 get查询数 ...

深入理解 web 协议(一)- http 包体传输

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/WlT8070LlrnSODFRDwZsUQ作者:吴越 开坑这个系列的原因,主要是在大前端学习的 ...

转战物联网·基础篇05-通俗理解MQTT协议的实现原理和异步方式

网络上搜索MQTT协议,会出现太多的解释,这里就不做官方标准释义的复制了.这一节我们从实战理解角度,通俗的将MQTT协议的作用及实现原理说一下,旨在可以快速理解MQTT协议.所以可能会出现很多看似 ...

随机推荐

cve-2015-5122漏洞分析

HackTem爆出的第二枚0day,分析了下,做个记录. Poc中一开始会分配一个Array类型的_ar结构. 第一次赋值 此时在a[0 ] –a[1e-1] 处已被赋值为Vector.

EasyUI filebox组件在IE下不兼容

EasyUI 1.4.1 jQuery v1.11.1 EasyUI1.4.1版本的filebox在IE9+环境下,提交表单上传文件时出错,不能使用.

Crash日志符号化

1.符号化crash日志需要3样东西: 1).crash日志本身(如:example.crash),从Xcode的organizer导出或者来自Itunes Connect. 2).crash日志所对 ...

来讲讲C#中的类

1.什么是类? 面向对象的语言,最基本的就是类.在C#中,类是这样来定义的:类代表一组具有公共属性和行为的对象. 举个例子,现实生活中,人就是一个“类”,但这只是一个统称,指所有的人.我们要找个人一起 ...

7.4.1 Dumping Data in SQL Format with mysqldump

7.4 Using mysqldump for Backups 使用mysqldump 用于备份: 7.4.1 Dumping Data in SQL Format with mysqldump 7. ...

python_Opencv_绘图

opencv中也可以用一些函数来绘图 直接上源码,例子: # -*- coding: utf-8 -*- import numpy as np import cv2 # 黑色的图片 img=np.ze ...

(转)top关键字与top表达式(SQLServer)

SQLServer 中,top也很有用,例如查询部分数据,还可以用表达式.其语法如下: SELECT TOP number|percent column_name(s) FROM table_name ...

Android性能优化-内存泄漏的8个Case

1为什么要做性能优化? 手机性能越来越好,不用纠结这些细微的性能? Android每一个应用都是运行的独立的Dalivk虚拟机,根据不同的手机分配的可用内存可能只有(32M.64M等),所谓的4GB. ...

PROC IMPORT 选项

GETNAMES=YES;导入源文件字段名作为SAS数据集的字段名MIXED=NO;若某一列中包含数值型和字符型变量,将数值型按照缺省值处理.若选的是YES则是将数值型转换成字符型存储,默认为NOSC ...

Redis数据"丢失"讨论及规避和解决的几点总结

Redis大部分应用场景是纯缓存服务,请求后端有Primary Storage的组件,如MySQL,HBase;请求Redis的键未命中,会从primary Storage中获取数据返回,同时更新Re ...

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值