http协议
-
简介:
- http协议是一种CS(client-server)协议,所以只能由客户端单向发起请求,服务端在响应请求。这里的客户端也叫用户代理(user-agent),在大多数场景下是一个浏览器
-
http请求
- http通信由请求和响应组成
- 请求行:包括请求方法,请求URL和协议版本号
- 请求方法:是指定的操作类型
方法 | 用途 |
GET | 向服务端获取URL指定的资源 |
POST | 向服务端提交数据 |
DELETE | 删除URL指定的服务器上的文件 |
PUT | 向指定的url存储文件 |
OPTIONS | 用于客户端向服务端询问是否支持特定的选项 |
TRACE | 让服务器回显请求中的内容 |
CONNECT | 用于在HTTP协议中建立代理隧道 |
HEAD | 和GET方法类似,但是服务器不返回实际内容 |
- 请求url:和请求头的host一起组成完整路径
- 版本号:http协议的版本号
- HTTP 1.0和HTTP 1.1是两个不同版本的HTTP协议,它们之间有以下区别:
- 1. 持久连接:HTTP 1.0默认使用短连接,即每个请求/响应后都会关闭连接,而HTTP 1.1默认使用持久连接,在同一个连接上可以发送多个请求和响应。
- 2. 请求管道化:HTTP 1.1支持请求管道化,即在一个持久连接上可以同时发送多个请求,而HTTP 1.0不支持请求管道化。
- 3. 缓存处理:HTTP 1.0的缓存处理较为简单,仅支持通过"Expires"和"Cache-Control"头字段进行缓存控制,而HTTP 1.1引入了更多的缓存控制机制,如"ETag"和"If-None-Match"等。
- 4. 错误处理:HTTP 1.0的错误处理较为简单,仅通过状态码表示错误,而HTTP 1.1引入了更多的错误处理机制 ,如通过"Transfer-Encoding"头字段传输错误信息。此外,在HTTP 1.1中新增了24个状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
- 5. Host头字段:HTTP 1.0中没有Host头字段,而HTTP 1.1中要求每个请求都包含Host头字段,以指示请求的目标主机。
- HTTP 1.0和HTTP 1.1是两个不同版本的HTTP协议,它们之间有以下区别:
- 请求头:
- - User-Agent:标识浏览器的详细信息,包括名称、版本、操作系统等。
- - Accept:指定客户端接受的数据类型,可以是文本、HTML、XML、JSON 等等。
- - Accept-Encoding:指定客户端可以接受的压缩编码类型,如 gzip、deflate 等。
- - Accept-Language:指定客户端接受的语言类型和优先级。
- - Cache-Control:指定客户端的缓存策略,如 no-cache、max-age 等。
- - Connection:指定客户端和服务器之间的连接类型,如 keep-alive、close 等。
- - Cookie:用于客户端和服务器之间传递会话信息,如用户登录状态等。
- - Host:指定要访问的服务器地址。
- - Referer:指定请求来源网页的 URL。
- - User-Agent:标识浏览器的详细信息,包括名称、版本、操作系统等。
- 请求体:存放post参数
http响应
- 每个响应格式都是相对应服务端返回
- 响应行包括版本号和状态码
- 状态码
状态码 | 说明 |
100-199 | 表示已收到请求,但未完成操作,用于通知客户端 |
200 | 表示服务器响应成功,也就是服务器找到了客户端请求的内容,并且将内容返回给客户端 |
301 | 永久重定向 |
302 | 临时重定向 |
304 | 强制缓存,使用本地缓存 |
403 | 请求权限不够 |
404 | 资源不存在 |
500 | 服务器端错误 |
- 响应头:
- Allow:服务器支持哪些请求方法(如GET、POST等)。
- Content-Encoding:文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE4、IE5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader(“Accept- Encoding”))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。
- Content-Length:表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。
- Content- Type:表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置 Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。
- Date:当前的GMT时间,例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
- Expires:告诉浏览器把回送的资源缓存多长时间,-1或0则是不缓存。
- Last-Modified:文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。
- Location:这个头配合302状态码使用,用于重定向接收者到一个新URI地址。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
- Refresh:告诉浏览器隔多久刷新一次,以秒计。
- Server:服务器通过这个头告诉浏览器服务器的类型。Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。Servlet一般不设置这个值,而是由Web服务器自己设置。
- Set-Cookie:设置和页面关联的Cookie。Servlet不应使用response.setHeader(“Set-Cookie”, …),而是应使用HttpServletResponse提供的专用方法addCookie。
- Transfer-Encoding:告诉浏览器数据的传送格式。
- WWW-Authenticate:客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader(“WWW-Authenticate”, “BASIC realm=\”executives\”“)。注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问。注:设置应答头最常用的方法是HttpServletResponse的setHeader,该方法有两个参数,分别表示应答头的名字和值。和设置状态代码相似,设置应答头应该在发送任何文档内容之前进行。
- setDateHeader方法和setIntHeadr方法专门用来设置包含日期和整数值的应答头,前者避免了把Java时间转换为GMT时间字符串的麻烦,后者则避免了把整数转换为字符串的麻烦。
- setContentType:设置Content-Type头。大多数Servlet都要用到这个方法。
- setContentLength:设置Content-Length头。对于支持持久HTTP连接的浏览器来说,这个函数是很有用的。
- addCookie:设置一个Cookie(Servlet API中没有setCookie方法,因为应答往往包含多个Set-Cookie头)。
- 响应体:返回来的内容
http2和http3
http2实现了多路复用,使用http2需要使用tls加密
http3使用了基于UDP的QUIC协议,免去三次握手,但是增加了被DDos的风险
WebSocket
- 可以进行全双工通信,但是消耗资源大。构建于http/https协议之上,所以支持http代理。
- WebSocket使用ws(web socket)和wss(使用了TLS的web socket)两种资源标识符,分别默认使用80和443端口
- 长连接
Web服务器
- 资源
- 静态资源:服务器上已经存在的文件,可以直接返回到客户端,可以缓存
- 动态资源:服务端需要经过计算才能生成的内容,不能缓存
- Web页面
- 文档对象模型(DOM)
- 浏览器从服务端收到的是网页的html源码,然后解析成dom树,再去渲染
- javascrupt
- 前端主要语言,主要用于动态处理页面内容,其他的还包括
- html,通用标记语言,主要是那些标签
- css,样式表,主要处理样式
- 前端主要语言,主要用于动态处理页面内容,其他的还包括
- 文档对象模型(DOM)