TCP/IP协议簇系列目录

OSI七层模型及各层功能概述

TCP/IP协议簇概述

TCP/IP协议簇之物理层

TCP/IP协议簇之数据链路层

TCP/IP协议簇之网络层

TCP/IP协议簇之传输层

TCP/IP协议簇之应用层

TCP/IP协议簇之HTTP协议

---------------------------------------------------------------------------------------------------------------------------

1. HTTP协议概述及特点

1.1 HTTP协议概述       

       HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,用于从Web服务器传输超文本到本地浏览器的传送协议。浏览器作为HTTP客户端通过URL向WEB服务器发送请求,Web服务器根据接收到的请求后,向客户端发送响应信息。

       超文本:在互联网早期的时候只是简单的字符文字,也就是文本;超文本为超越了普通文本的文本,它是文字、图片、视频等的混合体,比如HTML本身只是纯文字文件,但内部用很多标签定义了图片、视频等的链接,在经过浏览器的解释,呈现给我们的就是一个文字、有画面的网页。

       通俗易懂的说,HTTP协议是一种在计算机里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范

1.2 HTTP协议特点

       1)简单快速:HTTP为轻量级通信协议,使得HTTP服务器的程序规模小,通信速度快。

  2)灵活:HTTP允许传输任意类型的数据对象(HTTP/1.0版本之后)。

  3)无状态:HTTP协议是无状态协议,对事务处理没有记忆能力。

       至于网上说的无连接(限制每次连接只处理一个请求),查阅资料后发现其实说的是基于tcp的短连接, 在0.9版本http协议的连接方式确实采用的是短连接,在http/1.0版本开始提出持久连接(长链接)概念,http/1.1版本长链接成为默认的连接方式,会在响应头加入Connection:keep-alive,所以称http为无连接需要制定版本号(1.1版本之前)。

参考资料:HTTP的发展

2. HTTP报文格式

       HTTP有两类报文:请求报文和响应报文。

2.1 HTTP请求报文

       一个HTTP请求报文由请求行、请求头部、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。

TCP/IP协议簇之HTTP协议_客户端

       请求行:由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔,用于描述要执行的请求,或者是对应的状态,成功或失败

TCP/IP协议簇之HTTP协议_数据_02

       请求头部:由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔,用于指明请求参数。

TCP/IP协议簇之HTTP协议_数据_03

       空行:指示所有关于请求的元数据已经发送完毕。

TCP/IP协议簇之HTTP协议_数据_04

       请求数据:在POST方法中使用,包含请求相关数据的正文。

TCP/IP协议簇之HTTP协议_服务器_05

2.2 HTTP响应报文

       一个HTTP请求报文由状态行、响应头部、空行和响应体4个部分组成,下图给出了响应报文的一般格式。

TCP/IP协议簇之HTTP协议_数据_06

       状态行:包含协议版本、状态码、状态文本(下文示例无状态文本)

TCP/IP协议簇之HTTP协议_数据_07

       响应头部:由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔,用于描述消息正文。

TCP/IP协议簇之HTTP协议_响应头_08

       空行:指示所有关于响应的元数据已经发送完毕。

TCP/IP协议簇之HTTP协议_数据_09

       响应体:不是所有的响应都有响应体:具有状态码 (如 201或204) 的响应,通常不会有响应体。 

TCP/IP协议簇之HTTP协议_客户端_10

3.HTTP请求/响应头参数

3.1 通用请求首部

       Content-Type:实体头部用于指示资源的MIME类型 media type 。语法:Content-Type: text/html; charset=utf-8;

       Content-Length:是一个实体消息首部,用来指明发送给接收方的消息主体的大小,即用十进制数字表示的八位元组的数目。语法:Content-Length: <length>

       Date:是一个通用首部,其中包含了报文创建的日期和时间。语法:Date: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT

       Keep-Alive:是一个通用消息头,允许消息发送者暗示连接的状态,还可以用来设置超时时长和最大请求数。语法:Keep-Alive: parameters

       Connection:定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。语法:Connection: keep-alive;Connection: close

3.2 常用请求头部参数

       Host:请求头指明了请求将要发送到的服务器主机名和端口号。语法:Host: <host>:<port>

       Accept:请求头用来告知(服务器)客户端可以处理的内容类型,借助内容协商机制, 服务器可以从诸多备选项中选择一项进行应用,并使用Content-Type应答头通知客户端它的选择。浏览器会基于请求的上下文来为这个请求头设置合适的值,比如获取一个CSS层叠样式表时值与获取图片、视频或脚本文件时的值是不同的。语法:Accept: <MIME_type>/<MIME_subtype>;Accept: <MIME_type>/*;Accept: */*

       User-Agent:首部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。语法:User-Agent: <product> / <product-version> <comment>

       Origin:指示了请求来自于哪个站点。该字段仅指示服务器名称,并不包含任何路径信息。该首部用于POST请求。语法:Origin: <scheme> "://" <host> [ ":" <port> ]

       Accept-Encoding:会将客户端能够理解的内容编码方式通知给服务端,通过内容协商的方式,服务端会选择一个客户端提议的方式,使用并在响应头Content-Encoding中通知客户端该选择。

       Accept-Language:请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言。借助内容协商机制,服务器可以从诸多备选项中选择一项进行应用, 并使用Content-Language响应头通知客户端它的选择。

3.3 常用响应头部参数

       Vary:是一个HTTP响应头部信息,它决定了对于未来的一个请求头,应该用一个缓存的回复(response)还是向源服务器请求一个新的回复。语法:Vary: <header-name>, <header-name>, ...

       Set-Cookie:被用来由服务器端向客户端发送 cookie。

TCP/IP协议簇之HTTP协议_客户端_11

       最后附一张图,图片借鉴自:javascript:void(0)

4.HTTP常用响应状态码

       1xx:1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到较少。

       2xx:2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。

              200:是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。

              204:也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。

              206:表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。

       3xx:3xx 类状态码表示客户端请求的资源发送了变动,需要客户端用新的 URL 重新发送请求获取资源。

              301:表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。

              302:表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。

              304:不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,用于缓存控制。

       4xx:4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。

              400:表示客户端请求的报文有错误,但只是个笼统的错误。

              403:表示服务器禁止访问资源,并不是客户端的请求出错。

              404:表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。

       5xx:5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。

              500:是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。

              501:表示客户端请求的功能还不支持。

              502:通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。

              503:表示服务器当前很忙,暂时无法响应服务器。

5.HTTP请求中GET和POST的区别

       1)地址栏变化

      GET提交,请求的数据会附在URL之后,以?分割URL和所传输的数据,多个参数之间用&连接;例如:http://localhost:8088/login?name=liuxiaobai&verify=%E4%BD%A0 %E5%A5%BD(如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,其中%XX中的XX为该符号以16进制表示的ASCII)。

       POST提交:把提交的数据放置在是HTTP包的包体<request-body>中。

       2)传输数据的大小:

      HTTP协议没有对传输的数据大小进行限制,也没有对URL长度进行限制,在实际开发中存在的限制主要有:

      GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制。因此GET提交时,传输数据就会受到URL长度的限制。

      POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制。

       3)安全性:

      POST的安全性要比GET的安全性高。因为通过GET提交数据,用户名和密码将明文出现在URL上。

       4)功能性:

       GET:一般用来从服务器上获取资源

       POST:一般用来更新服务器上的资源;

       5)REST幂等性:(这里指完全遵循HTTP设计规范,GET用于查询,POST用于更新)

       GET:幂等,即读取同一个资源,总是得到相同的数据,GET不会改变服务器上的资源

       ​​​​​​​POST:非幂等,每次请求对资源的改变并不是相同的,POST会对服务器资源进行改变;

6.一个完整的HTTP请求过程

       ​​​​​​​DNS域名解析--> 发起TCP的3次握手--> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源 --> 浏览器对页面进行渲染呈现给用户。

       ​​​​​​​1)浏览器查询DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的host文件和向本地DNS服务器进行查询等。

       ​​​​​​​2)浏览器得到域名对应的IP地址之后,向服务器请求建立TCP链接,发送三次握手;

       ​​​​​​​​​​​3)TCP链接建立后,浏览器向服务器发送http请求;

       ​​​​​​​4)服务器接收到请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果以及相应的视图返回给浏览器;

       ​​​​​​​5)浏览器解析视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述的步骤并向服务器请求这些资源;

       ​​​​​​​6)浏览器根据请求到的资源、数据进行渲染页面,最终向用户呈现一个完整的页面。