1 基本概念

HTTP协议:基于TCP协议之上实现的无状态、全文本的标准通信协议。

客户端:例如pc浏览器,移动应用端,第三方服务器等能发起http访问的设备。

服务器:能够接受HTTP协议请求,并且通常能够正常返回响应结果给客户端的设备。

HTTP协议其实说起来很简单,它有两个重要特性:纯文本,无状态。理解了这两个特性,基本就掌握了HTTP的核心思想了。其它知识,无非是应该各种场景下制定的协议细节。

纯文本:

TCP协议保证两个计算机直接的稳定通信,TCP报文传输的数据部分在HTTP协议里面就存放的是HTTP纯文本。

解决这个,最简单的就是安装一个抓包工具查看一下传输报文的格式,这里我们以Fiddler为例子,抓取访问知乎首页的请求。你可以很明显的看出来,请求和响应全部都是以纯文本方式交互。

无状态:

这个特性说的是:只依赖协议本身的定义,服务器无法区分连续的两次请求是否属于同一个客户端。有点抽象,这个等到最后说session与cookie时候一起说。

2 Get与Post请求的区别

这个问题老生常谈了,我面试时候也经常会问。

从协议的角度来的,区别如下:

区别就是请求开头第一行的标识符号,你是传GET还是POST,此外从传输角度来看没有任何区别!!!

网上千篇一律的什么URL传参,BODY传参,大小限制,安全限制之类的,基本都是各种框架、工具在具体工程实现上面的细节区分。

3 Json与Form表单,Content-Type请求头

现在RESTFUL API大行其道,但是早几年还是表单提交的天下,不过在做项目的过程中有时候还是会碰到要求表单提交的api,例入某讯家的接口。

所以还是有必要体会一下两者的不同,如下图:

同时对应的Content-Type请求头会有不同:

application/x-www-form-urlencoded

application/json

4 Cookie与Session

cookie:客户端保存的关于特定域名的服务器相关联数据。

session: 同一个客户端,一定时间段内的请求过程。

前文我们说过,无状态特性决定了,只依赖协议本身的定义,服务器无法区分连续的两次请求是否属于同一个客户端。我们先看图:

服务器无法区分两个请求分别属于谁的,虽然你看图列子,两个线是直接链接到不同的两个客户端的。但是,请注意关测HTTP请求的文本:

服务器收到像这样的纯文本,它如何从中推断出,是哪个客户端发出的请求呢?

答案是判断不了,条件不足。

聪明的你,可能已经想到了:在传输的文本中添加客户端相关的信息,不就可以识别特定客户端了吗?是的,工程界就是这么实现的,通常会借助于一个在客户端存储cookie来,近几年localstorage存储也大行其道,目的都是标识客户端归属。

5 Https请求

上文中有说到,http是纯文本,既然是纯文本,那我如果在通信过程中,例如在某一个路由中拦截请求,直接就可以看到所有明文,极为不安全。所以才有了SSL、TLS协议,给传输加个密。

这里有一个误区,SSL、TLS协议是直接在TCP传输层面做的加密,而不是在HTTP协议之上做封装。另外,建立传输开始过程中才会做不对称加密算法如RSA做证书验证,而在传输过程中,还是使用的对称加密算法如DES等。

6 1台服务器能同时处理多少客户端请求?

这个问题很有意思,先说答案:取决于网络带宽与服务器内存。

首先要明确一点是,物理规律无法打破。服务器与外界通信只靠一根网线。

所以网络带宽会限制链接客户端数量。

其次,每次建立一个连接,服务都会在内存中保持连接句柄,所以跟内存也会相关。

你必须要知道的HTTP协议原理的更多相关文章

  1. Web程序员应该知道的Javascript prototype原理

    有同事问了我几个和Javascript的类继承的小问题,我在也不太理解的情况下,胡诌了一通. 回来以后有些内疚, 反省一下, 整理整理Javascript的prototype的原理, 自己清楚点, 也 ...

  2. 你应该知道的RPC原理

    你应该知道的RPC原理 在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 而一旦踏入公司尤其是大型互 ...

  3. 我们必须要知道的RESTful服务最佳实践

    看过很多RESTful相关的文章总结,参齐不齐,结合工作中的使用,非常有必要归纳一下关于RESTful架构方式了,RESTful只是一种架构方式的约束,给出一种约定的标准,完全严格遵守RESTful标 ...

  4. 你应该知道的JAVA面试题

    你应该知道的JAVA面试题 经常面试一些候选人,整理了下我面试使用的题目,陆陆续续整理出来的题目很多,所以每次会抽一部分来问.答案会在后面的文章中逐渐发布出来. 基础题目 Java线程的状态 进程和线 ...

  5. Android 程序员必须知道的 53 个知识点

    1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式 ...

  6. [面试专题]前端需要知道的web安全知识

    前端需要知道的web安全知识 标签(空格分隔): 未分类 安全 [Doc] Crypto (加密) [Doc] TLS/SSL [Doc] HTTPS [Point] XSS [Point] CSRF ...

  7. 理工科应该的知道的C/C++数学计算库(转)

    理工科应该的知道的C/C++数学计算库(转) 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿真分析...这些或多或少与我们常用的软件息息相关,假如有一天你只需要这些大型软件 ...

  8. 每个极客都应该知道的Linux技巧

    每个极客都应该知道的Linux技巧 2014/03/07 | 分类: IT技术 | 0 条评论 | 标签: LINUX 分享到:18 本文由 伯乐在线 - 欣仔 翻译自 TuxRadar Linux. ...

  9. [转载]你需要知道的 16 个 Linux 服务器监控命令

    转载自: 你需要知道的 16 个 Linux 服务器监控命令 如果你想知道你的服务器正在做干什么,你就需要了解一些基本的命令,一旦你精通了这些命令,那你就是一个 专业的 Linux 系统管理员. 有些 ...

随机推荐

  1. seaborn库中柱状图绘制详解

    柱状图用于反映数值变量的集中趋势,用误差线估计变量的差值统计.理解误差线有助于我们准确的获取柱状图反映的信息,因此打算先介绍一下误差线方面的内容,然后介绍一下利用seaborn库绘制柱状图. 1.误差 ...

  2. SSY的队列 hash+记忆化

    题目描述 \(SSY\) 是班集体育委员,总喜欢把班级同学排成各种奇怪的队形,现在班级里有 \(N\) 个身高互不相同的同学,请你求出这 \(N\) 个人的所有排列中任意两个相邻同学的身高差均不为给定 ...

  3. struts2中数据的传输

    1.传统的写多个request接受参数方法. 2.struts2中的多个setter方法,getter方法 3.利用实体bean,让strut2 实例bean,少写setter方法,getter方法, ...

  4. Javaweb项目页面实时显示后台处理结果

    http://www.cnblogs.com/dong-xu/p/6701271.html 此博文甚好,项目参照博主代码可实现. 前端页面: <%@ page language="ja ...

  5. Android10_原理机制系列_AMS之AMS的启动

    概述 该篇基于AndroidQ,主要介绍系统启动中的 AMS(ActivityManagerService)的启动过程. AMS对四大组件(AndroidQ将activity移到了ActivityTa ...

  6. linux学习笔记全-如何学习linux?

    简介 今天整理文件整理出了好多年前学习linux的笔记 就整理下发布在博客上怕文件形式会误删. linux入门基础对于新手而言不推荐看书!!不推荐看书!!(大牛跳过)先看视频看linuxcast的视频 ...

  7. 面试官:小伙子,你能给我说一下HashMap的实现原理吗?

    1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现(他与Hashtable类似,但Hashtable是线程安全的,所以是同步的实现),此实现提供可选的映射操作,允许使用nu ...

  8. 在Guitar Pro中如何模拟电子管音响

    在这篇文章中,我们将使用Guitar Pro 7中的功能和工具,完成构建一个真实的电子管吉他音箱调音过程. 虽然Guitar Pro是用于创建吉他乐谱的工具,但在新版本中(主要是6和7)它也有一些模拟 ...

  9. H5系列之drag拖放

    H5中, 有个属性,draggable="true", 这个属性呢(默认false),需要加在标签上,加上去该标签就可以拖动了, 看下gif图吧 默认的标签,是不能拖动的,但是有两 ...

  10. symfony中,使用原声的sql语句

    1 /** 2 * 数组形式的原生sql 3 */ 4 public function arrayA(array $did) 5 { 6 $statement = $this->getEntit ...