HTTP: 超文本传输协议, 基于 TCP /IP 通信协议来传输数据;
–Hyper Text Transfer Protocol
简单的知识点:https://www.cnblogs.com/youma/p/10540173.html
工作原理: 客户端-服务端架构 ,客户端通过URL 向http服务端发送请求;
服务端接收到请求后,向客户端发送相应信息 http默认端口号 80;
http 三个特点:
http是无连接的; 每次连接只处理一个请求, 服务器处理完客户端请求,并在客户端应答后,断开连接,节省时间;
http是媒体独立的; 客户端与服务器处理完数据 , 都是通过http来进行传输的;
http是无状态的, 对于处理过的 事物是没有记忆的, 因此cookie 就是用来解决此问题的;

报文从运用层传送到运输层,运输层通过TCP三次握手和服务器建立连接,四次挥手释放连接。
为什么需要三次握手呢?为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

例:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段,但是server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求,于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了,由于client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据,但server却以为新的运输连接已经建立,并一直等待client发来数据。所以没有采用“三次握手”,这种情况下server的很多资源就白白浪费掉了。
为什么需要四次挥手呢?
TCP是全双工模式,当client发出FIN报文段时,只是表示client已经没有数据要发送了,client告诉server,它的数据已经全部发送完毕了;但是,这个时候client还是可以接受来server的数据;当server返回ACK报文段时,表示它已经知道client没有数据发送了,但是server还是可以发送数据到client的;当server也发送了FIN报文段时,这个时候就表示server也没有数据要发送了,就会告诉client,我也没有数据要发送了,如果收到client确认报文段,之后彼此就会愉快的中断这次TCP连接


http请求格式示例:
GET / HTTP/1.1
Host: localhost:10000
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh;Chrome/64.0.3282.186 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;;q=0.9
1.GET / HTTP/1.1 叫做请求行. 里面包含3个信息, 以空格隔开, 第一个叫做请求方法, 除了 GET 方法之外, 还有 POST 方法, 除此之外还有其他方法, 这两种最常用. GET 主要用于从服务器获得数据, POST 主要用于从浏览器提交数据到服务器.
-
第二个表示请求的资源路径. 当请求的URL是 https://www.baidu.com/, 那么我们会发现 路径会显示 ‘/’, 那么如果请求的URL是 https://www.baidu.com/index.html, 我们会发现路径显示是 ‘/index.html’.
-
第三个表示 HTTP 协议的版本, 那么既然有 1.1版本, 前置版本肯定是1.0了,那么两个版本有什么区别呢? 1.1版本比1.0的版本主要多个一些请求方法等扩充协议的内容.请求头. 除了第一行之外, 剩下的所有数据的格式都是类似的.
-
Host 表示浏览器要请求的主机地址. 这服务器ip地址,如果端口号不显示,默认使用:80
-
Connection 表示浏览器和服务器之间的连接方式, 浏览器和服务器连接是长连接( keep-alive)还是短连接 Cache-Control: 缓存方式 max-age=0表示不缓存
-
User-Agent 用户代理, 客户端应用程序的类型, 指定User-Agent可以做到初步反爬 。我们使用谷歌浏览器和火狐浏览器分别请求百度, 那么会发现 User-Agent 的值是不一样的, 它主要是用于浏览器告诉服务器自己的身份, 比如浏览器端使用的操作系统是什么版本, 浏览器是什么版本等等.
-
Accept 表示浏览器告诉服务器, 自己能够接收并识别的文件类型.
-
Accept-Encoding 表示浏览器能够处理的压缩方式. 为什么需要压缩呢? 当网页数据量大的时候, 压缩之后可以提高传输速率, 提高用户体验. Accept-Language 浏览器可以接收的文本语言, 如果非中文编码可能会出现乱码. Cookie: 客户端用户身份的一个表示
HTTP 响应报文协议 例:
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 14 Mar 2019 09:52:48 GMTServer: BWS/1.1
1.第一行 HTTP/1.1 200 OK 叫做响应行,共分成3部分, 第一部分 HTTP/1.1 表示 HTTP协议的版本, 第二部分是一个数字, 这个数字表示响应状态码, 用户向服务器发出了请求, 如果服务器正常返回响应报文, 那么状态码一般都是200, 第三部分的 “OK” 表示原因短语, 表示对前面状态码的简单描述.
2.响应头Server: nginx/1.10.2 服务器的名称Date: Thu, 06 Sep 2019 04:11:11 GMT 服务器的时间: 格林威治时间, 相当于0时区Content-Type: text/html;charset=UTF-8 服务器告诉客户端浏览器响应内容的文本格式及编码格式Transfer-Encoding: chunked 表示服务器发送给客户端的数据大小不确定,如果发送数据完成会有一个特殊的标识数据\0\r\n ,
Content-Length: 100 明确告诉客户端发送数据的长度,
两者会有其一Connection: keep-alive 表示连接状态, keep-alive表示长连接X-Application-Context:application:production:6202 服务器程序程序员自己设置的响应头信息Content-Language:zh-CN 服务器告诉客户端支持的语言类型
3.空行(\r\n) 响应体(查看响应体数据选择response选项卡)
小结:
HTTP协议响应报文分为4部分,每部分之间使用\r\n进行分割 响应行 响应头 空行(\r\n) 响应体
.长连接和短连接目标 知道长连接和短连接的特点在HTTP/1.0中, 默认使用的是短连接.
也就是说, 浏览器和服务器每进行一次HTTP操作, 就建立一次连接, 但任务结束就中断连接.如果客户端浏览器访问的某个HTML或其他类型的 Web 页中包含有其他的Web资源,如js文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。
但从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:长连接 Connection:keep-alive短连接 Connection:close在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,
连接的建立通过三次握手,释放则需要四次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的。
TCP短连接模拟一种TCP短连接的情况: client 向 server 发起连接请求 server 接到请求,双方建立连接 client 向 server 发送消息 server 回应 client 一次读写完成,此时双方任何一个都可以发起 close 操作一般都是 client 先发起 close 操作。
当然也不排除有特殊的情况。从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作!
TCP长连接通信过程 client 向 server 发起连接 server 接到请求,双方建立连接 client 向 server 发送消息 server 回应 client 一次读写完成,连接不关闭 后续读写操作… 长时间不操作之后client发起关闭请求
TCP长/短连接的优点和缺点 长连接可以省去较多的TCP建立和关闭的操作,节约时间。但是如果用户量太大容易造成服务器负载过高最终导致服务不可用
短连接对于服务器来说实现起来较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但是如果用户访问量很大, 往往可能在很短时间内需要创建大量的连接,造成服务器响应速度过慢小结
长连接: 连接建立成功后,可以发送多次请求和响应,等双方不进行通信的时候,服务端做好断开连接的操作 短连接: 连接建立成功后,一次请求和响应完成以后连接就会断开,每次发送请求需要先建立好连接 长连接减少了用户的等待时间,提升了访问速度,但是增加了服务端的资源开销 短连接不会占用服务端过多的资源,但是增加了用户的等待时间,减慢了访问速速
http状态码:
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
200 OK //客户端请求成功 400 Bad Request
//客户端请求有语法错误,不能被服务器所理解 403 Forbidden //服务器收到请求,但是拒绝提供服务 404 Not Found
//请求资源不存在,eg:输入了错误的URL 500 Internal Server Error //服务器发生不可预期的错误 503
Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常


本文深入解析HTTP协议的工作原理,包括客户端和服务端的交互流程,重点介绍了HTTP的无连接、媒体独立和无状态特性,以及TCP三次握手和四次挥手的细节。同时,详细展示了HTTP请求和响应报文的格式,长连接和短连接的区别,最后总结了HTTP状态码的含义。
3093

被折叠的 条评论
为什么被折叠?



