一次完整的http请求过程是怎样的?

HTTP请求是非常重要的,了解HTTP请求过程对于理解互联网开发非常重要。我可以给您一个关于 HTTP 请求的简单概述。

首先,我们需要明确的是,当我们在浏览器中输入URL地址时,我们就发起了一个HTTP请求。

接下来,我们可以通过以下步骤来了解HTTP请求的完整过程:

  1. 建立连接。当您在浏览器中输入URL并按下Enter键时,浏览器将向服务器发出请求并尝试建立连接。在此过程中,浏览器将寻找目标服务器并建立TCP连接。
  2. 发出请求。一旦连接建立完成,浏览器将发送一个HTTP请求,其中包含请求的URL、请求方法、HTTP版本号以及其他相关信息。
  3. 服务器处理请求。当目标服务器收到HTTP请求后,它将解析请求并执行相关操作。这可能包括搜索、读取或修改服务器上的文件。之后服务器会回复客户端请求。
  4. 服务器返回响应。当服务器处理完请求后,它将向浏览器发送HTTP响应,其中包含响应状态码、文档内容以及其他相关信息。
  5. 浏览器渲染响应。最后,浏览器会将响应解析并以用户能够理解的方式呈现出来。它可能包含HTML、CSS或Javascript等内容,这些内容将可视化在浏览器页面上。

这就是HTTP请求的整个过程,每个步骤都需要明确的理解和操作。希望这个简单的概述对您有所帮助。




谢邀~

我们打开浏览器,在地址栏输入www.wukong.com,几秒后浏览器打开悟空问答的页面,那么这几秒钟内发生了哪些事情,我就带大家一起看看完整的流程:

解析URL

浏览器首先会对输入的URL进行验证,如果不合法的时候,那么会把输入的文字传给默认的搜索引擎,比如你只在地址栏输入“悟空问答”几个字。

如果URL通过验证,那么可以解析得到协议(http或者https)、域名(wukong)、资源(首页)等信息。

DNS查询

  • 浏览器会先检查域名信息是否在缓存中。

  • 再检查域名是否在本地的Hosts文件中。

  • 如果还不在,那么浏览器会向DNS服务器发送一个查询请求,获得目标服务器的IP地址。

TCP封包及传输

这时候浏览器获得了目标服务器的IP(DNS返回)、端口(URL中包含,没有就使用默认),浏览器会调用库函数socket,生成一个TCP流套接字,也就是完成了TCP的封包。

TCP封包完成之后,就可以传输了,在完成“你瞅啥”,“瞅你咋地”,“来,过来唠唠”一系列操作之后,浏览器和服务器就完成了TCP的三次握手,建立了连接,后面就可以请求服务器资源了。

服务器接收请求并相应

  • HTTP有很多请求方法,比如:GET/POST/PUT/DELETE等等,我们浏览器输入URL这种,是GET方法。

  • 服务器接收到GET请求,服务器根据请求信息,获得相应的相应内容。例如我们输入的是:www.wukong.com,那么意味着访问首页文件。

浏览器解析并渲染

浏览器从服务器拿到了想要访问的资源,大多数时候,这个资源就是HTML页面,当然也可能是一个其他类型的文件。

  • 浏览器先对HTML文档进行解析,生成解析树(以DOM元素为节点的树)。

  • 加载页面的外部资源,比如JS、CSS、图片。

  • 遍历DOM树,并计算每个节点的样式,最终完成渲染,变成我们看到的页面。

这次请求响应之后,会断开连接,就这样,完成了一次HTTP的请求。

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。




“我是哟哟吼说科技,专注于数据网络的回答,欢迎大家与我交流数据网络的问题”

如题,一个完整的HTTP过程是怎样的?

一个完整的HTTP过程包括建立连接、数据传输、断开连接等七个步骤。

下面哟哟来详细介绍一下每一步:

1、TCP建立连接

HTTP协议是基于TCP协议来实现的,因此首先就是要通过TCP三次握手与服务器端建立连接,一般HTTP默认的端口号为80;

2、浏览器发送请求命令

在与服务器建立连接后,Web浏览器会想服务器发送请求命令

3、浏览器发送请求头消息

在浏览器发送请求命令后,还会发送一些其它信息,最后以一行空白内容告知服务器已经完成头信息的发送;

4、服务器应答

在收到浏览器发送的请求后,服务器会对其进行回应,应答的第一部分是协议的版本号和应答状态码;

5、服务器回应头信息

与浏览器端同理,服务器端也会将自身的信息发送一份至浏览器;

6、服务器发送数据

在完成所有应答后,会以Content-Type应答头信息所描述的格式发送用户所需求的数据信息;

7、断开TCP连接

在完成此次数据通信后,服务器会通过TCP四次挥手主动断开连接。但若此次连接为长连接,那么浏览器或服务器的头信息会加入keep-alive的信息,会保持此连接状态,在有其它数据发送时,可以节省建立连接的时间;

欢迎大家多多关注我,在下方评论区说出自己的见解。




前言

今天我们来彻底聊聊,什么是TCP/IP、http、socket、长连接、短连接

TCP/IP

TCP/IP是协议组,分为三个层次:

  • 网络层
  • 传输层
  • 应用层。

在网络层有:

  • IP协议
  • ICMP协议
  • ARP协议
  • RARP协议
  • BOOTP协议

在传输层中有:

  • TCP协议
  • UDP协议

在应用层有:

TCP包括:

  • FTP协议
  • HTTP协议
  • TELNET协议
  • SMTP协议

UDP包括:

  • DNS协议
  • TFTP协议

短连接

流程:连接->传输数据->关闭连接

HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。

也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。

长连接

流程:连接 -> 传输数据 -> 保持连接 -> 传输数据 -> 。。。-> 关闭连接。

长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。

http的长连接

HTTP也可以建立长连接的,使用Connection:keep-alive,HTTP 1.1默认进行长连接。

HTTP1.1 和 HTTP1.0 相比较而言,最大的区别就是增加了长连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。

什么时候用长连接,短连接?

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。

每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多。

所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。

例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。


而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源。

而像WEB网站成千上万甚至上亿客户端的频繁连接,用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。

所以并发量大,但每个用户无需频繁操作情况下需用短连好。

总之,长连接和短连接的选择要视情况而定。

数据发送接收方式

异步

报文发送和接收是分开的,相互独立的,互不影响。这种方式又分两种情况:

  • 异步双工:接收和发送在同一个程序中,由两个不同的子进程分别负责发送和接收
  • 异步单工:接收和发送是用两个不同的程序来完成。

同步

报文发送和接收是同步进行,既报文发送后等待接收返回报文。

同步方式一般需要考虑超时问题,即报文发出去后不能无限等待,需要设定超时时间,超过该时间发送方不再等待读返回报文,直接通知超时返回。

在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。

Socket是什么

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口(TCP/IP是协议,Socket是他们的具体实现和对外api)。

在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面。

对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

Socket 通信示例

主机 A 的应用程序要能和主机 B 的应用程序通信,必须通过 Socket 建立连接,而建立 Socket 连接必须需要底层 TCP/IP 协议来建立 TCP 连接。

建立 TCP 连接需要底层 IP 协议来寻址网络中的主机。

我们知道网络层使用的 IP 协议可以帮助我们根据 IP 地址来找到目标主机,但是一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过 TCP 或 UPD 的地址也就是端口号来指定。

这样就可以通过一个 Socket 实例唯一代表一个主机上的一个应用程序的通信链路了。


建立通信链路(有点烧脑,可绕过)

当客户端要与服务端通信,客户端首先要创建一个 Socket 实例,操作系统将为这个 Socket 实例分配一个没有被使用的本地端口号,并创建一个包含本地和远程地址和端口号的套接字数据结构。


这个数据结构将一直保存在系统中直到这个连接关闭。在创建 Socket 实例的构造函数正确返回之前,将要进行 TCP 的三次握手协议,TCP 握手协议完成后,Socket 实例对象将创建完成,否则将抛出 IOException 错误。


与之对应的服务端将创建一个 ServerSocket 实例,ServerSocket 创建比较简单只要指定的端口号没有被占用,一般实例创建都会成功,同时操作系统也会为 ServerSocket 实例创建一个底层数据结构,这个数据结构中包含指定监听的端口号和包含监听地址的通配符,通常情况下都是“*”即监听所有地址。


之后当调用 accept() 方法时,将进入阻塞状态,等待客户端的请求。当一个新的请求到来时,将为这个连接创建一个新的套接字数据结构,该套接字数据的信息包含的地址和端口信息正是请求源地址和端口。


这个新创建的数据结构将会关联到 ServerSocket 实例的一个未完成的连接数据结构列表中,注意这时服务端与之对应的 Socket 实例并没有完成创建,而要等到与客户端的三次握手完成后,这个服务端的 Socket 实例才会返回,并将这个 Socket 实例对应的数据结构从未完成列表中移到已完成列表中。所以 ServerSocket 所关联的列表中每个数据结构,都代表与一个客户端的建立的 TCP 连接。




Http请求的一次详解:

  1. 客户端输入URL

  2. 客户端检测缓存:

有缓存且较新,客户端直接读取本地缓存进行资源展示;

有缓存但是不新,准备http请求包,发送至服务端进行缓存校验;

备注:http1.0中Expire、http1.1中是Cache-Control根据发起http请求:

请求报文包含:
a) 请求行
用来说明请求类型(getpostdelete等)、要访问的资源(URI)以及使用的HTTP版本(1.0还是1.1)
b) 首部(header)
HOST将指出请求的目的地;
User-Agent由浏览器来定义,自动发送;
Connection:通常设置为keep-Alive, 长连接;
其他首部包括等。
c) 空行
d) 请求实体

3. 提取请求首部HOST通过DNS域名解析获取服务IP(DNS缓存递归等)

4. 通过IP与默认端口创建TCP连接,进行http请求报文数据发送,其中重点就三次握手进行描述:

客户端向服务端发送syn=1,seq=client请求的ID;
服务端向客户端发送syn=1,seq=服务端请求的ID,ack=客户端请求的ID+1;
客户端向服务端发送syn=0,seq=客户端请求的ID+1,ack=服务端请求的ID+1,datadata…

5. 服务端程序接受请求,定向到请求路径处理请求:

服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理

元数据:请求报文首部
<method> <URL> <VERSION>
HEADERS格式name:value
<request body>
示例:
Host: www.chuyuni.cn 请求的主机名称
Server: Apache/2.4.7

HTTP常用请求方式:MethodGET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS

6.访问资源:

服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源

资源放置于本地文件系统特定的路径:DocRoot
DocRoot → /var/www/html
/var/www/html/images/logo.jpg
http://www.magedu.com/images/logo.jpg
web服务器资源路径映射方式:
(a) docroot (b) alias
(c) 虚拟主机docroot(d) 用户家目录docroot

7. 返回处理结果,准备http响应:

响应报文包含:
a) 状态行:http版本(1.1或者1.0),状态码
200:请求正常处理
304:返回上次请求资源未作改动,验证浏览器的缓存机制
400:请求参数错误
401:客户端无权访问,要去输入用户名密码之类的授权信息
403:禁止访问(读写权限等影响)
404:请求的资源不存在
500:服务内部错误
502:网关错误
503:临时过载或者维护,导致服务端无法正常处理请求
b) 首部
报文支持的语言编码格式等,注意If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答,用于服务端缓存校验
c) 空行
d) 响应报文实体

8. 通过建立的tcp连接来返回相关的http响应报文及http状态信息,然后根据实际情况看是否关闭连接(Connection的keep-alive)

9. TCP连接关闭经历4次握手

客户端主动关闭连接放发送FIN进入FIN_WAIT1状态

服务端发最后的data和ack客户端接收进入CLOSEWAIT状态,客户端进入接受ACK进入FINWAIT2状态

服务端主动发FIN,客户端接受FIN并发送ack进入TIMEWAIT状态

服务器端正式关闭连接进入close状态

10. 客户端拿到http响应的报文信息,经过一系列前端处理过程最终将请求的资源进行展示。

作者:夕阳雨晴,欢迎关注我的头条号:偶尔美文,主流Java,为你讲述不一样的码农生活。

展开阅读全文

页面更新:2024-03-30

标签:封包   报文   数据结构   缓存   服务端   客户端   实例   浏览器   状态   协议   完整   过程   操作   服务器   数据   财经   资源   信息

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top