HTTP 协议笔记

1. HTTP 传输机制

HTTP 是一个应用层协议,位于 TCP 的层次之上,并且是基于 TCP 协议进行通信的,也就是说 HTTP 在每一次通信之前都要先建立 TCP 连接来保证 HTTP 的可靠性。并且 HTTP 是用的 C/S 模型进行通信,即 Client/Server 的模型,Client 向 Server 发送 Request,Server 根据 Request 的内容对 Client 进行 Response。同时 HTTP 还是无状态协议,即 HTTP 协议本身并不会对已经建立起来的请求和响应对的状态进行持久化处理,这么做的目的是保持 HTTP 协议的简单性,从而提高工作效率。但是在许多时候我们需要记录用户的登录状态以便对用户的请求进行跟踪,提高 Server 的服务质量,如记录用户购物车中的商品,那么这时就需要引入一项技术来实现:Cookie。

对于上面那段话,总结如下:

  1. HTTP 基于 TCP 进行通信
  2. HTTP 是 C/S 通信模式
  3. HTTP 是无状态协议,HTTP 连接的建立状态不会持久
  4. 使用 Cookie 技术对用户进行标识从而追踪用户的请求提供更好的服务

2. HTTP 报文格式

HTTP 报文实际上分为 2 种,一种用于 Client 向 Server 请求服务,一种用于 Server 向 Client 响应请求。实际上这两种报文的格式都是一样的。

2.1 HTTP Request 报文

如上图所示,Request 报文的结构一共有 4 个部分组成:

  1. 第 1 部分是 Request-Line,一共包含 3 个字段(用空格分开):MethodURLHttp-Version。其中,Method 一共有 GET,POST,PUT,TRACE,OPTIONS,DELETE 这 6 种,最常见的是 GET 和 POST;URL 可以简单理解为浏览器地址栏中的网址;Http-Version 现在已经是 HTTP/1.1 版本了。

  2. 第 2 部分是 Request-Header,请求头部为请求报文添加了一些附加信息,是以 Key:Value 的形式保存在一个列表中,常见的请求头部如下表所示:

  3. 第 3 部分是 Blank-Line,这是一个空行,代表请求头部结束。用来分隔请求头和请求数据。

  4. 第 4 部分是 Request-Body,是请求数据的正文,是可选的,对于 GET 方法来说就没有请求正文。

2.2 HTTP Response 报文

如上图所示,Response 报文的结构也是由 4 部分组成:

  1. 第 1 部分是 Response-Line,一共包含 3 个字段(用空格分开):VersionStatus-CodePhrase。其中,Version 是协议版本,现在一般都是 HTTP/1.1;Status-Code 是状态返回码,共有 5 个系列,如一般情况下表所示;Phrase 是描述状态码的短语。



    上表只是笼统的列出了 4 个大类情况,更详细的状态码说明请参考 RFC 文档,在网上看到有一篇博客写得很好,可以参考:https://www.cnblogs.com/lxinxuan/archive/2009/10/22/1588053.html

  2. 第 2 部分是 Response-Header,和 Request-Header 类似,为响应报文添加的一些附加信息,也是以 Key:Value 的形式保存在一个列表中,常见的响应头部如下表所示:

  3. 第 3 部分也是 Blank-Line,用于分隔头部和正文。

  4. 第 4 部分是 Response-Body,是响应数据的正文,客户端请求的内容都放在这里。

3. URI URL URN 的区别

  1. URI(Uniform Resource Identifier),统一资源标识,用来唯一标识一个资源,是一个通用的概念。由 URL 和 URN 组成。
  2. URL(Uniform Resource Locator),统一资源定位,即资源所在位置,我们浏览器上的地址就是一条 URL。
  3. URN(Uniform Resource Name),统一资源命名,通过资源的名字来标识资源,与其所处的位置无关,这样即使资源的位置变了,其 URN 也不会改变。

HTTP协议(1)的更多相关文章

  1. HTTP协议系列(1)

    一.为什么学习Http协议       首先明白我们为什么学习HTTP协议,也就是说明白HTTP协议的作用.HTTP协议是用于客户端与服务器之间的通讯.明白了HTTP协议的作用也就知道了为什么要学习H ...

  2. 重温Http协议--请求报文和响应报文

    http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过h ...

  3. 协议森林17 我和你的悄悄话 (SSL/TLS协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. TLS名为传输层安全协议(Transport Layer Protocol),这个协议是一套加密的 ...

  4. 协议森林16 小美的桌号(DHCP协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. DHCP协议用于动态的配置电脑的网络相关参数,如主机的IP地址,路由器出口地址.DNS域名服务器地 ...

  5. 简约之美Jodd-http--深入源码理解http协议

    Jodd 是一个开源的 Java 工具集, 包含一些实用的工具类和小型框架.简单,却很强大! jodd-http是一个轻巧的HTTP客户端.现在我们以一个简单的示例从源码层看看是如何实现的? Http ...

  6. 【JavaScript】javascript中伪协议(javascript:)使用探讨

    javascript:这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行. 比如下面这个死链接: <a href="javasc ...

  7. SNMP简单网络管理协议

    声明:以下内容是学习谌玺老师视频整理出来(http://edu.51cto.com/course/course_id-861.html) SNMP(Simple Network Management ...

  8. 海鑫智圣:物联网漫谈之MQTT协议

    什么是MQTT协议 MQTT(消息队列遥测传输协议)是IBM在1999年专门针对物联网等应用场景来制订的轻量级双向消息传输协议,它主要是为了解决物联网上使用到的设备的互相通信的问题,以及这些设备与后端 ...

  9. linux-图形化远程管理协议

    远程管理控制方式: RDP(remote desktop protocol)协议: telnet: SSH(Secure Shell): RFB(Remote FrameBuffer)协议(图形化远程 ...

  10. RTP与RTCP协议介绍(转载)

    RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制,同步.RTP中没有连接的概念,本身并不能为按序传输数据包提供可靠的保证,也不提供流量控制和拥塞控制,这些都由RTCP来负责完 ...

随机推荐

  1. 难度并不NOIP的NOIP模拟赛

    今天老师请了前几届的学长来讲课,可是讲课为什么要考试呢... 学长说难度是NOIP,于是我就naive的跟着参加了,然而T3难度并不友好,感觉确实不是很适合我们现在做......不过课本来也不是给我们 ...

  2. 映众全新游戏内存条发布:单条16GB 最高4000MHz

    近日,显卡与内存厂商映众(INNO3D)推出了一款全新的游戏内存条产品——iCHILL Memory. iCHILL Memory是DDR4内存,单条容量有4GB-16GB可选,内存频率有2400MH ...

  3. anaconda查看删除增加镜像源

    # 查看显示原来的镜像源(base) [jiangshan@localhost ~]$ conda config --showadd_anaconda_token: Trueadd_pip_as_py ...

  4. 浅拷贝与深拷贝的实现方式、区别;deepcopy如果你来设计,如何实现(一)

    浅拷贝与深拷贝的实现方式.区别:deepcopy如果你来设计,如何实现: copy浅拷贝:没有拷贝子对象,所以原始数据改变,子对象改变 deepcopy深拷贝:包含对象里面的子对象的拷贝,所以原始对象 ...

  5. lvs 最常用算法 + tcpdump vrrp 抓包

    1.SH: source hash, 源地址散列. 将请求的目标IP地址换成请求的源IP地址:实现session保持的机制:将来自于同一个IP的请求始终调度至同一RS: 源地址散列调度算法正好与目标地 ...

  6. python在输出一段话中插入多个变量,每日作业补充

    %s用来插入用户输入的值name=input('请输入您的姓名:')age=input('请输入您的年龄:')sex=input('你的性别:')print('-------您好!%s------\n ...

  7. 数据预取 __builtin_prefetch()

    __builtin_prefetch() 是 gcc 的一个内置函数.它通过对数据手工预取的方法,减少了读取延迟,从而提高了性能,但该函数也需要 CPU 的支持. 该函数的原型为: void __bu ...

  8. java的myeclipse,java页面改动默认的javadoc方法

    在项目中右键点击新建class文件,在弹出的框中选择"here" 勾上enable project specific settings 选择comments中的types然后点击e ...

  9. [Usaco2009 Feb]Revamping Trails 道路升级 BZOJ1579

    分析: 比较裸的分层图最短路,我的实现方式是,每次求出1所有节点的最短路,之后用每一个节点更新与其相连的节点(取较小值),之后做K次,就求出了分层图的最短路了. 附上代码: #include < ...

  10. C/C++函数调用方式

    __cdecl __fastcall与__stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以 ...