HTTP协议相关
HTTP
1. HTTP简介
-
HTTP协议(Hypertext transfer protocol)是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
-
HTTP协议作为TCP/IP模型中的应用层协议也不例外。HTTP协议通常承载与TCP协议之上,有时也承载与TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。
-
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
-
无状态:不会记录某个浏览器访问该网站的任何状态信息,服务器不知道客户端是什么状态
-
无状态不代表不能保持TCP链接,从HTTP/1.1开始,都默认开启了keep-alive保持连接特性,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问该服务器,会继续使用这条已经建立的连接
在 Tomcat 里是允许配置长连接的,配置 conf/server.xml 文件,配置 Connector 节点,该节点负责控制浏览器与 Tomcat 的连接,其中与长连接直接相关的有两个属性,它们分别是:keepAliveTimeout,它表示在 Connector 关闭连接前,Connector 为另外一个请求 Keep Alive 所等待的微妙数,默认值和 connectionTimeout 一样;另一个是 maxKeepAliveRequests,它表示 HTTP/1.0 Keep Alive 和 HTTP/1.1 Keep Alive / Pipeline 的最大请求数目,如果设置为 1,将会禁用掉 Keep Alive 和 Pipeline,如果设置为小于 0 的数,Keep Alive 的最大请求数将没有限制。也就是说在 Tomcat 里,默认长连接是打开的,当我们想关闭长连接时,只要将 maxKeepAliveRequests 设置为 1 就可以。
-
解决无状态的方法:
可以通过Cookie和Session来保存状态信息。
Cookie和Session有以下明显的不同点:
1)Cookie将状态保存在客户端,Session将状态保存在服务器端;
2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。Cookie最早在RFC2109中实现,后续RFC2965做了增强。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。Session并没有在HTTP的协议中定义;
3)Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器;
4)就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些。因为它不会任意读取客户存储的信息。
————————————————
版权声明:本文为CSDN博主「向小凯同学学习」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wd2014610/article/details/78116791
-
-
HTTP默认的端口号:80,HTTPS默认的端口号:443
-
浏览网页是HTTP的主要应用,但并不代表HTTP只能应用于网页的浏览。HTTP是一种协议,只要通信双方都遵守这个协议就可以进行通信
2. HTTP特点
- 简单快速:C2S只需发送请求方法(GET、POST...)和路径(http://localhost:8080/firstServlet),使HTTP服务器的程序规模更小,因而通信速度很快
- 灵活:HTTP可以传任意类型的数据对象。正在传输的类型由Content-Type加以标记
- (非)持续连接:
- HTTP0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户端的请求,并收到客户的应答后即断开连接
- HTTP1.1使用持续连接:不必为每一个web对象创建一个新的连接,一个链接可以传送多个对象,采用这种方式可以节省传输时间。允许HTTP设备在事务处理结束以后将TCP连接保持在打开状态,后面的HTTP Request/Response 依然可以通过这个TCP连接继续传送。(类似于SpringMVC中,只有一个Servlet的情况,客户端会一直访问这一个Servlet和端口)
- 如果客户端不想在连接上发送其他请求了,就应该在最后一条请求中发送Connection:close请求首部
- 管道化连接
- 允许在持久连接上可选的使用请求管道。是相对于keep-alive连接的又一性能优化。在响应到达之前,可以将多条请求放入队列,当第一条请求通过网络流向服务器时,第二条和第三条请求也可以开始发送了。在高时延网络条件下,这样做可以降低网络的环回时间,提高性能。
- 如果HTTP客户端不能确定连接持久,就不该使用管道
- 必须按照与请求相同的顺寻回送HTTP响应
- HTTP客户端必须做好连接会在任意时刻关闭的准备,还要准备好重发所有未完成管道化的请求
- 出错的时候,管道连接会阻碍客户端去了解服务器执行的是这些管道化中的哪些请求。由于无法安全的重试POST这样非幂等请求,所以要做好万一出错,某些方法就永远不会被执行的风险。
- 允许在持久连接上可选的使用请求管道。是相对于keep-alive连接的又一性能优化。在响应到达之前,可以将多条请求放入队列,当第一条请求通过网络流向服务器时,第二条和第三条请求也可以开始发送了。在高时延网络条件下,这样做可以降低网络的环回时间,提高性能。
- 支持B/S,C/S以及APP模式
3. HTTP版本
- HTTP/1.0
- 发送请求,创建一次连接,获得一个web资源,连接断开
- HTTP/1.1
- 发送请求,创建一次连接,获得多个web资源,连接断开
- http请求包括:请求行、请求头、请求体
- http响应包括:相应行、响应头、响应体
4. HTTP请求报文
4.1 请求头
-
referer:它的作用是指示一个请求是从哪里链接过来,那么当一个请求并不是由链接触发产生的,那么自然也就不需要指定这个请求的链接来源。
-
比如在网页中的a标签链接访问,会有referer这个属性,如果是浏览器直接输入的地址,这个值将为null,因为他并没有包含在某一个网站中
-
常用于防盗链:比如图片服务器可以通过这个判断来访问我图片的是不是规定的网站,如果不是将会跳转到特定的网站来访问或者拦截。
-
-
Accept:该请求所能支持的响应数据类型,MIME类型
-
Cookie:客户端的Cookie就是通过这个报文头属性传给服务端的
-
User-Agent:浏览器与用户操作系统信息
-
Connection:表示客户端与服务器连接类型:keep-alive持久连接,close已关闭
-
Host:请求的服务器主机名
-
Content-Length:请求体的长度
-
Content-Type:请求与尸体对应的MIME信息。如果是post请求,会有这个头,默认为application/x-www-form-urlencoded,表示请求体内容使用URL编码
-
Accept-Encoding:浏览器通知服务器,浏览器支持的数据压缩格式。如gzip
-
Accept-Language:浏览器通知服务器,浏览器支持的语言
-
Cache-Control:指定请求和响应遵循的缓存机制
更多参见:http://tools.jb51.net/table/http_header
4.2 Content-Type
Content-Type | 解释 |
---|---|
text/html | html格式 |
text/plain | 纯文本格式 |
text/css | CSS格式 |
text/javascript | js格式 |
image/gif | gif图片格式 |
image/jpeg | jpg图片格式 |
image/png | png图片格式 |
application/x-www-form- urlencoded |
POST专用:普通的表单提交默认是通过这种方式。form表单数据被编码为 key/value格式发送到服务器 |
application/json | POST专用:用来告诉服务端消息主体是序列化后的JSON字符串 |
text/xml | POST专用:发送xml数据 |
multipart/form-data | POST专用: |
5. HTTP响应报文
5.1 响应行:
报文协议及版本
- 例如:HTTP/1.1 200 OK
- 状态码:由3位数字组成,第一个数字定义了响应的类别
- 1xx:指示信息,表示请求已接收,继续处理
- 2xx:成功,表示请求已被成功接收,处理
- 200 OK:客户端请求成功
- 204 No Content:无内容。服务器成功处理,但未返回内容。一般用在只是客户端向服务器发送信息,而服务器不用向客户端返回什么信息的情况。不会刷新页面
- 206 Partial Content:服务器已完成了部分GET请求(客户端进行了范围请求)。响应报文中包含Content-Range指定范围的实体内容
- 3xx:重定向
- 301 Moved Permanently:永久重定向,表示请求的资源已经永久的搬到了其他位置
- 302 Found:临时重定向,表示请求的资源临时搬到了其他位置
- 303 See Other:临时重定向,应使用Get定向获取请求资源。303功能与302一样,区别只是303明确客户端应该使用Get访问
- 307 Temporary Redirect:临时重定向,与302功能一样,但POST不会变成GET
- 304 Not Modified:表示客户端发送附带条件的请求(GET方法请求报文中的IF..)时,条件不满足。返回304时,不包含任何响应主体。虽然304被划分在3xx,但是和重定向没关系。
- 4xx:客户端错误
- 400 Bad Request:客户端请求有语法错误,服务器无法理解。
- 401 Unauthorized:请求未经授权,这个状态码必须个WWW-Authenticate报头域一起使用
- 403 Forbidden:服务器收到请求,但是拒绝提供服务
- 404 Not Found:请求资源不存在,错误的路径、url
- 415 Unsupported Media Type:不支持的媒体类型
- 5xx:服务器端错误
- 500 Internal Server Error:服务器发生不可预期的错误
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
- 状态码:由3位数字组成,第一个数字定义了响应的类别
- 更多状态码:https://blog.csdn.net/origination_star/article/details/54341293
5.2 响应头
响应头也是用键值对key:value
服务器通过响应头来控制浏览器的行为,不同浏览器操作不同
常见响应头 | 描述 |
---|---|
Location | 指定响应的路径,需要与状态码302配合使用,完成跳转 |
Content-Type | 响应正文的类型(MIME类型) 取值:text/html;charset=UTF-8 |
Content-Disposition | 通过浏览器以下载方式解析正文 取值:attachment;filename=xx.zip |
Set-Cookie | 与会话相关技术。服务器向浏览器写入cookie |
Content-Encoding | 服务器使用的压缩格式 取值:gzip |
Content-length | 响应正文的长度 |
Refresh | 定时刷新。格式:秒数;url=路径。url可省略,默认值为当前页 取值:3;url=localhost:8000/multipart/menus |
Server | 指的是服务器名称,默认值:Apache-Coyote/1.1。可以通过conf/server.xml配置进行修改 <Connector port="8080" ...server="MyServer" /> |
Last-Modified | 服务器通知浏览器,文件的最后修改时间。与If-Modified-Since一起使用 |
Cache-Control | 响应输出到客户端后,服务端通过该报文头告诉客户端如何控制响应内容的缓存。 常见的取值有private、public、no-cache、max-age、no-store,默认为private:365天 |
2022-03-07 新增
自我检测
-
Http与Https的区别?
Http Https URL http:// https:// 安全性 安全 不安全 标准端口 80 443 加密 无法加密 加密 SSL证书 否 是 另外,在OSI模型中,HTTP工作于应用层,而HTTPS的安全传输机制工作在传输层,HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都是经过加密的。HTTPS可以有效防止运营商劫持,解决了防劫持的一个大问题。
-
HTTP的方法有哪些?
- 1.0:get,post,head
- 1.1追加:put,delete,connect,patch,options,trace
-
常见的HTTP响应状态码。
-
200, 201(成功请求并创建了新的资源)
- 200.OK
- 201.创建新的资源
-
202(已经接受请求,但未处理完成)
-
400(客户端请求的语法错误,服务器无法理解)
-
401(Unauthorized) 请求要求用户的身份认证
-
403(Forbidden) 服务器理解请求客户端的请求,但是拒绝执行此请求
-
404(服务器无法根据客户端的请求找到资源(网页))
通过此代码,网站设计人员可设置"您所请求的资源无法找"的个性页面
-
500(服务器内部错误,无法完成请求)
-
什么是Http
-
http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
-
早在HTTP建立之初,主要就是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。
-
Http发展史
- Http0.9 -> 1991,没有头,只能看连接
- Http1.0 -> 1996,加了一点头信息
- Http1.1 -> 1999
- 提供了更多选择的缓存头来控制缓存策略
- 带宽优化及网络连接的使用
- Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址
- 如果没收到Host头域,会返回BadRequest400
- 最重要的是长连接,有一个叫做Connection的信息,默认设置为keep-alive
- 错误通知的管理
- Http2 -> 2015
- 降低延迟,针对Http高延迟的问题,采用了多路复用,多个请求stream共享一个TCP连接的方式
- 请求优先级 ,针对多路复用可能关键请求被阻塞,允许给每个request设置优先级,重要请求优先响应
- Header压缩
- 基于https的加密协议传输
- 服务端推送
- 二进制传输
-
http缺点:
- 队头阻塞:现在浏览器默认关闭了管道话,只有收到服务器响应才会继续发送数据
- 流量控制,基于TCP
DNS
当DNS需要将名称解析为IP地址时,有几个地方需要来检查host文件。第一个位置就是检查本地计算机,DNS会在每台机器上查看。第二步,在读取主机文件后,再发送给DNS服务器之前,会查找DNS缓存。DNS确实非常努力的尝试在本地对IP地址进行DNS解析。因此查询的顺序就是本地文件,DNS缓存,最后才是DNS服务器。根据操作系统的不同,编辑主机文件有所不同。
DNS在本地找不到怎么办呢?
我们有大量的网站和IP的对应,这些不可能缓存在一个DNS服务器上。当我不得不访问一个DNS服务器答案时,如果它也没有,将继续访问另一个DNS服务器。最后将其缓存在DNS缓存中。
DNS Zone
当工作站和DNS服务器在同一个DNS Zone(DNS服务器是test.com DNS Server,那么这个服务器上会有所有和test.com相关的DNS对应的信息),如果想查询www.a1.test.com,可以直接通过DNS服务器来查到。
DNS最高级别就是Root,一共有13个,然后下面就是.com,.net,.cn...,这个叫做Top Level Domain(TLD)。专门负责TLD的叫做TLD服务器。然后根据不同的Top Level会有Second Level,比如.edu就是教育。
DNS Zone有两种
- Forward Lookup Zone:正向查找,Host Name to IP,我输入www.baidu.com,给我对应的ip
- Reverse Lookup Zone:反向查找,比如nestat
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)