java-web2-Http协议了解

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 java-web2-Http协议了解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

4.Http

4.1 http阐述

  • 超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式

超文本:

文本:html、字符串

超文本:图片、音频、视频、动画、定位、地图

    • TCP:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议
    • 传输控制协议(TCP,Transmission Control Protocol)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议
  • HTTP是应用层协议,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。

OSI的7层从上到下分别是 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 ;其中高层(即7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端,点到点的数据流:七层”是OSI参考模型

“四层”是 TCP/IP参考模型,即物理链路层、 网络层、传输层、应用层。

相同点:

1、两者都是以协议栈的概念为基础
2、协议栈中的协议彼此相互独立
3、下层对上层提供服务
不同点:
1、OSI是先有模型,TCP/IP是先有协议
2、TCP/IP用于Internet网络,OSI只用于参考,
3、层次数量不同
4、封装不同(逐层封装(OSI)与 越层封装(TCP/IP)

在这里插入图片描述

  • HTTP是一种协议规范,这种规范记录在文档上,为真正通过HTTP进行通信的HTTP的实现程序
  • HTTP是基于B/S架构进行通信的,而HTTP的服务器端实现程序有httpd、nginx等,其客户端的实现程序主要是Web浏览器。Web服务是基于TCP的,因此为了能够随时响应客户端的请求,Web服务器需要监听在80/TCP端口。这样客户端浏览器和Web服务器之间就可以通过HTTP进行通信了

4.2 工作原理

HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程:

  • 客户与服务器建立连接;
  • 客户向服务器提出请求;
  • 服务器接受请求,并根据请求返回相应的文件作为应答;
  • 客户与服务器关闭连接。
4.2.1 HTTP请求特点

两个时代

  • 在HTTP / 1.0之前:客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接:WWW服务器面向的是Internet中成千上万个用户且只能提供有限个连接,故服务器不会让一个连接处于等待状态,及时地释放连接可以大大提高服务器的执行效率
  • HTTP支持持久连接,在HTTP / 0.9和1.0中,连接在单个请求/响应对之后关闭。在HTTP / 1.1中,引入了保持活动机制,其中连接可以重用于多个请求持久性连接可以明显减少请求延迟,因为在发送第一个请求之后,客户端不需要重新协商TCP 3-Way-Handshake连接
  • HTTP2.0 头部压缩,采用二进制帧进行传输,解决了1.1的队头阻塞问题
  • HTTP是一种无状态协议,即服务器不保留与客户交易时的任何状态。减轻了服务器记忆负担,保持较快的响应速度
  • HTTP是一种面向对象的协议。允许传送任意类型的数据对象。
  • 客户在一个特定的TCP端口(端口号一般为80)上打开一个套接字。如果服务器一直在这个周知的端口上倾听连接,则该连接便会建立起来。然后客户通过该连接发送一个包含请求方法的请求块
  • HTTP规范定义了9种请求方法,每种请求方法规定了客户和服务器之间不同的信息交换方式,常用的请求方法是GET和POST。服务器将根据客户请求完成相应操作,并以应答块形式返回给客户,最后关闭连接
  • HTTP是基于请求/响应范式的。一个客户机与服务器建立连接后,发送一个请求给服务器,请求方式的格式为,统一资源标识符、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容
  • 服务器接到请求后,给予相应的响应信息,其格式为一个状态行包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容
  • 任何服务器除了包括HTML文件以外,还有一个HTTP驻留程序,用于响应用户请求

4.3 HTTP请求

  • client-request->server
  • 举例:百度

请求行

请求方式:get、post、head、delete、put、tract…

get:请求地址参数明文显示,不安全,携带参数少,大小有限,但高效

post:请求地址参数密文显示,安全,携带参数不限,大小不限,但不效

高效:提现在网络传输速率上

请求网址: https://www.baidu.com/sugrec?prod=pc_his&from=pc_web&json=1&sid=26350&hisdata=%5B%7B%22time%22%3A1649151819%2C%22kw%22%3A%22%E7%99%BE%E5%BA%A6%E6%8C%87%E6%95%B0%22%7D%5D&_t=1651892502780&req=2&bs=jfinal&csor=0
请求方法: GET
状态代码: 200 OK
远程地址: 110.242.68.4:443
引荐来源网址政策: unsafe-url
  • image/webp微信在线图片格式

消息头

Accept: application/json, text/javascript, */*;通知浏览器支持那种数据类型
Accept-Encoding: gzip, deflate, br 支持的编码格式ISO8859-1java默认
Accept-Language: zh-CN,zh;q=0.9  通知浏览器语言环境
Cache-Control: no-cache   
Connection: keep-alive			通知浏览器请求完成是否断开
Cookie: PSTM=1649119222;

4.4 HTTP响应

  • server-response->client

响应体

Accept: application/json, text/javascript, */*;通知浏览器支持那种数据类型
Accept-Encoding: gzip, deflate, br 支持的编码格式ISO8859-1java默认
Accept-Language: zh-CN,zh;q=0.9  通知浏览器语言环境
Cache-Control: no-cache   
Connection: keep-alive			通知浏览器请求完成是否断开
Cookie: PSTM=1649119222;
  • refresh:通知浏览器刷新设置
  • location:网页重定位window.location、window.href

响应状态码:
1xx:Informational
2xx:Success
3XX:请求重定向
4xx:Client Error
5xx:Server Error

在这里插入图片描述
在这里插入图片描述
问题:浏览器中输入网址后的执行全过程

1.浏览器获取域名

2.通过DNS协议获取域名对应服务器的ip地址

3.浏览器和对应的服务器通过三次握手建立TCP连接

4.浏览器通过HTTP协议向服务器发送数据请求

5.服务器将查询结果返回给浏览器

6.四次挥手释放TCP连接

7.浏览器渲染结果

涉及到的协议

应用层:HTTP和DNS

传输层:TCP UDP

网络层:IP ICMP ARP
  • tcp:建立链接的3此握手过程
  1. 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
  2. 服务器端收到SYN报文,回应一个SYN (SEQ=y)+ACK(ACK=x+1)报文,进入SYN_RECV状态
  3. 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
    在这里插入图片描述
  • tcp:关闭链接的4此握手过程:这是由TCP的半关闭(half-close)造成的
  1. 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕
  2. 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。

注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。

  1. 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
  2. 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123953.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!