【TCP/IP】HTTP 深藏阁楼爱情的钟 2022-05-16 05:46 128阅读 0赞 HTTP的知识很多很杂,网上有一份很详细的整理的链接:[Awesome HTTP][]。 参考文章:[计算机网络基础:这是一份详细 HTTP 学习指南][HTTP]。 ## HTTP ## **超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)**是互联网上应用最为广泛的一种网络协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。**通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。** HTTP 协议是基于请求与相应,具体如下图所示: ![70][] ### HTTP协议主要特点 ### * 简单快速:当客户端向服务器端发送请求时,只是简单的填写请求路径和请求方法即可,然后就可以通过浏览器或其他方式将该请求发送就行了; * 灵活:HTTP 协议允许客户端和服务器端传输任意类型任意格式的数据对象; * **无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间(当今多数服务器支持Keep-Alive功能,使用服务器支持长连接,解决无连接的问题);** * **无状态:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即客户端发送HTTP请求后,服务器根据请求,会给我们发送数据,发送完后,不会记录信息(使用 cookie 机制可以保持 session,解决无状态的问题)。** ## HTTP 请求报文 ## **HTTP 请求报文由请求行、请求头、空行和请求体(请求数据)4个部分组成,**如下图所示: ![70 1][] 请求报文示例: GET / HTTP/1.1 Host: www.baidu.com Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,id;q=0.4 Cookie: PSTM=1490844191; BIDUPSID=2145FF54639208435F60E1E165379255; BAIDUID=CFA344942EE2E0EE081D8B13B5C847F9:FG=1; ### 请求行 ### 请求行由请求方法、URL 和 HTTP 协议版本组成,它们之间用空格分开:GET / HTTP/1.1 ### 请求头 ### **请求头由 key-value 对组成,每行一对,key (键) 和 value (值)用英文冒号 : 分隔。请求头通知服务器有关于客户端请求的信息,**典型的请求头有: * **User-Agent:用户代理信息** \- Mozilla/5.0 (Macintosh; Intel Mac OS X 10\_12\_3) AppleWebKit/537.36 ... * Accept:客户端可识别的内容类型列表 - text/html,application/xhtml+xml,application/xml * Accept-Language:客户端可接受的自然语言 - zh-CN,zh;q=0.8,en;q=0.6,id;q=0.4 * Accept-Encoding:客户端可接受的编码压缩格式 - gzip, deflate, sdch, br * **Host:请求的主机名,允许多个域名同处一个IP地址,**即虚拟主机 - www.baidu.com * connection:连接方式 * close:告诉WEB服务器或代理服务器,在完成本次请求的响应后,断开连接 * **keep-alive:告诉WEB服务器或代理服务器。在完成本次请求的响应后,保持连接,以等待后续请求** * **Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie** \- PSTM=1490844191; BIDUPSID=2145FF54639208435F60E1E165379255; ### 空行 ### 最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。 ### 请求体 ### **请求数据不在 GET 方法中使用,而是在 POST 方法中使用。**与请求数据相关的最常使用的请求头是 Content-Type和 Content-Length。 ## HTTP 响应报文 ## **HTTP响应报文由状态行、响应头、空行和响应体4 个部分组成,**如下图所示: ![70 2][] 响应报文示例: HTTP/1.1 200 OK Server: bfe/1.0.8.18 Date: Thu, 30 Mar 2017 12:28:00 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Cache-Control: private Expires: Thu, 30 Mar 2017 12:27:43 GMT Set-Cookie: BDSVRTM=0; path=/ ### 状态行 ### 状态行格式: HTTP-Version Status-Code Reason-Phrase CRLF * HTTP-Version - HTTP 协议版本 * Status-Code - 状态码 * Reason-Phrase - 状态码描述 * CRLF - 回车/换行符 ### 响应头 ### **响应头由 key-value 对组成,每行一对,key (键) 和 value (值)用英文冒号 : 分隔。**响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和Request-URI进一步的信息,典型的响应头有: * **Server:包含处理请求的原始服务器的软件信息** * Date:服务器日期 * **Content-Type:返回的资源类型 (MIME)** * Connection:连接方式 * close:连接已经关闭 * **keep-alive:连接已保持,在等待本次连接的后续请求** * Cache-Control:缓存控制 * Expires:设置过期时间 * Set-Cookie:设置 Cookie 信息 ### 空行 ### 最后一个响应头之后是一个空行,发送回车符和换行符,通知浏览器以下不再有响应头。 ### 响应体 ### 服务器返回给浏览器的响应信息,下面是百度首页的响应体片段: <!DOCTYPE html> <!--STATUS OK--> <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <link rel="icon" sizes="any" mask href="//www.baidu.com/img/baidu.svg"> <title>百度一下,你就知道</title> </head> <body> ... </body> </html> ## HTTP Methods ## **HTTP 协议的请求方法有:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT、PATCH、HEAD。** HTTP 常用的请求方法: * **GET - 获取资源,使用 URL 方式传递参数,大小为 2KB** * **POST - 传输资源,HTTP Body, 大小默认8M** * **PUT - 资源更新** * **DELETE - 删除资源** http://www.example.com/users - 获取所有用户 http://www.example.com/users/a-unique-id - 新增用户 http://www.example.com/users/a-unique-id - 更新用户 http://www.example.com/users/a-unique-id - 删除用户 ### GET和POST区别 ### GET重点在从服务器上获取资源,POST重点在向服务器发送数据; * **GET传输数据是通过URL请求,以key = value的形式,置于URL后,并用"?"连接,多个请求数据间用"&"连接,这个过程用户是可见的。POST传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的;** * **Get传输的数据量小,因为受URL长度限制,但效率较高。POST可以传输大量数据,所以上传文件时只能用Post方式;** * **GET是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等。POST较GET安全性较高;** * GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)。POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。 ## HTTP Status Code ## 状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值: * **1xx:指示信息 – 表示请求已接收,继续处理** * **2xx:成功 – 表示请求已被成功接收** * **3xx:重定向 – 要完成请求必须进行更进一步的操作** * **4xx:客户端错误 – 请求有语法错误或请求无法实现** * **5xx:服务器错误 – 服务器未能实现合法的请求** 常见状态代码、状态描述的说明如下: * **200 OK:客户端请求成功** * 204 No Content:没有新文档,浏览器应该继续显示原来的文档 * 206 Partial Content:客户发送了一个带有Range头的GET请求,服务器完成了它 * **301 Moved Permanently:所请求的页面已经转移至新的url(永久重定向)** * **302 Found:所请求的页面已经临时转移至新的url(临时重定向)** * **304 Not Modified:客户端有缓冲的文档并发出了一个条件性的请求,服务器告诉客户,原来缓冲的文档还可以继续使用。** * **400 Bad Request:客户端请求有语法错误,不能被服务器所理解** * 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 * 403 Forbidden:对被请求页面的访问被禁止 * **404 Not Found:请求资源不存在** * **500 Internal Server Error:服务器发生不可预期的错误** * 503 Server Unavailable:请求未完成,服务器临时过载或宕机,一段时间后可能恢复正常(服务器正忙) ## HTTP1.1和2.0的特点 ## ### HTTP1.1的特点 ### * **默认持久连接节省通信量,只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求 ** * **管线化,客户端可以同时发出多个HTTP请求,而不用一个个等待响应 ** * **断点续传** ### HTTP2.0的特点 ### * **HTTP/2采用二进制格式而非文本格式 ** * **HTTP/2是完全多路复用的,而非有序并阻塞的——只需一个HTTP连接就可以实现多个请求响应 ** * **使用报头压缩,HTTP/2降低了开销 ** * **HTTP/2让服务器可以将响应主动“推送”到客户端缓存中** # HTTPS # **HTTPS就是在HTTP与传输层之间加上了一个SSL。** **HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议,TLS/SSL中使用了非对称加密,对称加密以及HASH算法。**握手过程的简单描述如下: * **浏览器将自己支持的一套加密规则发送给网站。** * **网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。** 获得网站证书之后浏览器要做以下工作: * 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示; * 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密; * 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。 网站接收浏览器发来的数据之后要做以下的操作: * 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致; * 使用密码加密一段握手消息,发送给浏览器; * 浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。 这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据。其中**非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性。由于浏览器生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄漏。** TLS握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。正是由于HTTPS非常的安全,攻击者无法从中找到下手的地方,于是更多的是采用了假证书的手法来欺骗客户端,从而获取明文的信息。默认HTTP的端口号为80,HTTPS的端口号为443。 ### 对称加密与非对称加密 ### * **对于对称加密来说,加密和解密用的是同一个密钥,加密方法有AES、DES、RC4、BlowFish等;** * **非对称加密在加密和解密时,用的是不同的密钥,分别称为公钥或私钥,非对称加密的加密方法有RSA、DSA、Diffie-Hellman等。** ## 从输入URL到页面加载发生了什么 ## 一般会经历以下几个过程: 首先,在浏览器地址栏中输入url; * **浏览器先查看浏览器缓存-系统缓存-路由器缓存,若有,直接请求IP,若没有,则跳到第三步操作;** * **在发送http请求前,需要域名解析(DNS解析),解析获取相应的IP地址;** * **浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手;** * **握手成功后,浏览器向服务器发送http请求,请求数据包;** * **服务器处理收到的请求,将数据返回至浏览器;** * **浏览器收到HTTP响应;** * **读取页面内容,浏览器渲染,解析html源码;** * **生成Dom树、解析css样式、js交互;** * **客户端和服务器交互;** * **ajax查询。** 其中,步骤2的具体过程是: * 浏览器缓存:浏览器会记录DNS一段时间,因此,只是第一个地方解析DNS请求; * 操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调用操作系统,获取操作系统的记录(保存最近的DNS查询缓存); * 路由器缓存:如果上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存; * ISP缓存:若上述均失败,继续向ISP(互联网服务提供商)搜索。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NDEwNzMw_size_16_color_FFFFFF_t_70][] [Awesome HTTP]: https://github.com/semlinker/awesome-http#http-%E5%9B%BE%E4%B9%A6 [HTTP]: https://blog.csdn.net/carson_ho/article/details/82106781 [70]: /images/20220516/18723387bd59471698b07e4cdef792a1.png [70 1]: /images/20220516/a859ca70137d42d980fe00966653def2.png [70 2]: /images/20220516/1313a6bcebb34713a005f3e05e7b3f6f.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NDEwNzMw_size_16_color_FFFFFF_t_70]: /images/20220516/1f0f96ea806c47cb98821347c0748ad3.png
还没有评论,来说两句吧...