HTTP结构与基础

这篇文章中,我们主要针对HTTP\1.1版本进行介绍

请求报文和响应报文

请求报文

请求报文由客户端发出,其格式为:

请求方法 请求URI 协议版本 可选的请求首部字段和内容实体,例如:

Post  /index.html HTTP/1.1
* Host是请求首部字段,代表服务器主机
Host: www.hukaihe.cn
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length:16 nickName=AgentKyle&age=21

也可以写成下面这种形式:

GET http://www.hukaihe.cn/index.html HTTP/1.1
*不使用Host首部字段
... ...

如果不是访问特定资源而是对服务器本身发起访问,可以用“*”来代替URI

响应报文

响应报文由:HTTP版本号 状态码 原因语句 可选的响应首部字段 实体主体

例如:

HTTP/1.1 200 ok
Date: Tue, 10 Jul 2017 03 18 14:45:15 GMT
Content-Length: 686
Content-Type:text/html * 资源主体的实体(entity body)
<html>
... ...

HTTP的特点

客户端和服务器端

HTTP协议规定,请求由客户端发出,最后服务器端响应该请求并返回。即肯定是先从服务器端开始建立通信的。

有时候,按实际情况,两台计算机作为客户端和服务器端的角色有可能会互换,但就进一条通信路线而言,服务器端和客户端的角色是确定的。而用HTTP协议能够明确地区分哪端是客户端,哪端是服务器端。

状态

HTTP是无状态(stateless)的协议。这样设计可以更快地处理大量事务,确保协议的可伸缩性,减少服务器的CPU以及内存资源的消耗。

可以使用cookie技术管理HTTP的状态。cookie通过在请求和响应报文中写入cookie信息来控制客户端的状态。cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie信息。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。服务器端发现客户端发送过来的cookie后,会检查究竟是哪一个客户端发送过来的连接请求,然后对比服务器上的记录,最后得到用户的状态信息。

持久连接与管线化

当我们访问一个带有很多插图的HTML页面时,会发生很多访问这些图片的HTTP请求。如果每次请求都需要重复建立和断开TCP连接会造成很多额外的性能开销。

于是,在HTTP1.1中,所有连接默认采取持久连接(keep-alive)的策略,即在任意一端没有明确提出断开连接,则保持TCP连接状态。这样减少了因为TCP连接带来的额外开销和服务端的负载,使得HTTP请求和响应能够尽早结束,加快web页面的显示速度。

而管线化技术在持久连接的基础上,使得多个请求能够并行发送,不发生阻塞现象。(不必等到一个请求返回响应后才发送另一个请求),这明显的提高了请求的速度。

作者: 圣经的旋律 
链接:https://www.imooc.com/article/17058
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作!

从零开始学HTTP (二) HTTP结构与基础的更多相关文章

  1. 从零开始学MySQL(二)

    鉴于上节篇幅以安装为主,因此对于调用mysql所需要使用的“命令”只是略微提及.随之而来就会带给读者诸多不解了,因为你会思考,这串长长的字符到底有什么特殊的含义呢?聪明的你可能早就抱着好奇心去“摆渡” ...

  2. 从零开始学Python第一周:Python基础(上)

    Python语法基础(上) 一,Python的变量 (1)创建变量 变量的含义:存储信息的地方 创建变量并赋值 x = 1 print x x = 123 #再次赋值 print x (2)使用变量 ...

  3. 从零开始学Linux[二]:常用操作:用户组、进程、网络、ssh

    摘要:Linux基础学习:创建用户组和用户.软件包管理.磁盘管理.进程管理.前后台进程的切换.网络配置.浏览网页.远程登录ssh 第一节,主要介绍一些简单命令,这节介绍一些日常操作. 1.创建用户组和 ...

  4. 从零开始学HTTP (一)网络基础

    网络基础 web发展史 下面列出了web发展中几个重要的历史结点 1990年 HTTP/0.9问世(HTTP/0.9含有HTTP1.0之前版本的意思,这时HTTP并未作为标准被公布) CERN(欧洲核 ...

  5. Java从零开始学十二(构造方法)

    一.构造方法 构造方法的主要目的是为类中的属性初始化 二.构造方法的定义格式 class 类名称{ 访问权限 类名称(类型1 参数1,类型2 参数2,…){ 程序语句 ; …    // 构造方法没有 ...

  6. 从零开始学JavaScript二(基本概念)

    基本概念 一.区分大小写 在ECMAScript中的一切(变量.函数名.操作符)都是区分大小写的. 如变量名test和Test分别表示两个不同的变量, 二.标识符 所谓标识符,就是指变量.函数.属性的 ...

  7. 从零开始学算法---二叉平衡树(AVL树)

    先来了解一些基本概念: 1)什么是二叉平衡树? 之前我们了解过二叉查找树,我们说通常来讲, 对于一棵有n个节点的二叉查找树,查询一个节点的时间复杂度为log以2为底的N的对数. 通常来讲是这样的, 但 ...

  8. 从零开始学Python 二

    上一章我们已经安装好了Python环境,并且写出了第一个Python程序.下面我们接着继续学习.首先,来分析下上一章我们写的代码. 我们最初的目的是为了可以输出一串有意义的文字,最终选择了英文语句“h ...

  9. 从零开始学安全(二十七)●利用Nmap对防火墙,IDS,IPS 进行欺骗

    先介绍什么是防火墙 ids 并联  ips 串联 来看我们nmap 命令

  10. 从零开始学安全(二十六)●利用Nmap目标的本版进行探测

    通过对对方电脑的服务探测 对本版较低的服务 或者无补丁的服务 可以直入侵 版本探测 version  后边就是版本

随机推荐

  1. HDU 6336 Matrix from Arrays (杭电多校4E)

    遇事不决先打表. 然后会发现(个屁)大的矩形是由一个2L*2L的矩形重复出现组成的然后我们就可以这个矩形分成四个点到(0, 0)点的矩形,这样问题就变成了求四个到顶点(0, 0)的矩形的面积,然后就先 ...

  2. ComM(通信管理)和CanNm(network)

    1      网络管理组成部分 网络管理部分由通信管理器(简称ComM),通用网络管理器接口(简称NmIf),总线相关的网络管理器(简称NM,包括CanNM,LinNM,FrNM),总线相关的状态管理 ...

  3. Arch Linux中安装Anaconda

    安装步骤 通过AUR安装yaourt -S anaconda 激活Anaconda环境source /opt/anaconda/bin/activate root 关闭Anaconda环境source ...

  4. [luogu2286][宠物收养所]

    题目链接 思路 比较裸的一道平衡树的题.用一个变量S来表示当前树的情况,当S为负数时树内为宠物,当S为正数时树内为人.然后每次分情况讨论一下.如果树为空或者是与来的东西(人或宠物)与树内存的相同.那么 ...

  5. 笔记:用标准c写 com dll

    在 [XXX.idl] 中 1. 如果想在脚本语言中传递一个值,并且在dll(c代码)中修改这个值并返回的话, 这个参数必须写为:[in, out] VARIANT* 如果写成 [in, out] i ...

  6. 真的无语, 今天遇到一个奇葩的事情: http 会话劫持

    今天一个用户反应说软件一运行就提示错误,然后关闭. 然后用户截屏发给我看了一下,我一看,无语了. 在软件中显示的正常一段文字说明尾部出现 <script src="http://ad. ...

  7. Java programming problems

    1.使用循环把26个字母按字典顺序存入数组,在不使用另外数组的情况下将其逆序存放,在根据处理后的字符数组创建一个字符串并输出 public static void main(String[] args ...

  8. PHP快速排序算法

    说明: 通过设置一个初始中间值,来将需要排序的数组分成3部分,小于中间值的左边,中间值,大于中间值的右边,继续递归用相同的方式来排序左边和右边,最后合并数组 示例: <?php $a = arr ...

  9. 第二篇-Django建立数据库各表之间的联系(中)

    上篇中已经建立了两个table,Book和Publish.这篇介绍如何用python增删改查数据库中的数据. 在views.py中创建一个index函数 from django.shortcuts i ...

  10. RabbitMQ入门-发布订阅模式

    兔子的Publish/Subscribe是这样的: 有个生产者P,X代表交换机,交换机绑定队列,消费者从队列中取得消息.每次有消息,先发到交换机中,然后由交换机负责发送到它已知的队列中. 生产者代码: ...