从输入URL到页面显示发生了什么?

本文深入讲解了HTTP协议如何基于TCP协议实现可靠传输,包括三次握手建立连接和四次挥手断开连接的过程。此外还探讨了为何客户端需要在TIME_WAIT状态等待2MSL时间的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当你在浏览器输入一个URL 发生了什么?

详细过程:


  1. 浏览器通过DNS域名解析到服务IP
  2. 客户端(浏览器)通过TCP协议建立到服务器的TCP连接;(三次握手)
  3. 客户端(浏览器)向web服务器端(HTTP服务器)发送HTTP 协议包,请求服务器里的资源文档(telnet模拟)
  4. 服务器向客户端发送HTTP协议应答包
  5. 客户端和服务器断开(四次挥手),客户端开始解析HTML文档

http要请求成功,必须通过TCP的三次握手才能与服务器连接。
http连接成功要基于TCP,

三次握手:首先客户端发送一个SYM的数据包, (seq = client-isn)然后客户端就处于一个send的状态,然后客户端就等服务器给它一个确认 ,这是第一次握手;二次握手,服务器收到包之后,必须确认客户端SYM包,怎样确认的呢?先把SYM包转换成ACK包,ACK包会把刚才seq包+1,同时自己会发送sym包,然后客户端会收到,确实是之前自己发送的包,并且加了1返回。拿到SYM包之后它也把SYM包加1给返回出去了。这个时候三次握手建立完成。

1、先Client 发送连接、请求报文。
2、Server端接受连接后回复ACK报文,并为此次连接分配资源
3、Client端接受ACK报文之后也向服务器端发送ACK报文,并分配资源,这样TCP就建立了。
四次挥手:
1、Client 端发起中断连接请求,也就是发送FIn报文。Server端接到FIN报文之后,意思是说:“我Client端没有数据要发给你了”,但是如果你还有数据没发送完成,则不必急着关闭(Socket),可以继续发送数据。
2、Server发送ACK,告诉Clien端,“你的请求我收到了,但是我还没准备号,请继续等我的消息”。
wait:这个时候Client端就进入FIN_WAIT撞他,继续等待Server站的FIN报文。
3、当Server端确定数据已发送完成,则向Client端发送FIN报文,告诉Client端,”好了,我这边数据发送完了,准备好关闭连接了“。
4、客户端收到FIN报文后,就知道可以关闭连接了,但是它还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_Wait状态。如果Server端没有收到ACk则可以重传。Server端收到ACK后,就知道可以断开连接了。客户端等待2MSL后没有收到回复,则证明Server端已正常关闭。那么我(客户端)也可以关闭连接了。这样TCP连接就这样关闭。

fin 表示断开连接 ACK表示响应

报文:发送报文,响应也用报文

为什么客户端在TIME_WAIT状态必须等待2MSL时间呢?
1、第一,为了保证客户端发送的最后一个ACK报文段能够到达Server端。这个ACK报文段有可能丢失,因而使服务器端收不到已经发送的ACK报文段的确认。B超时重传这个FIN ,客户端就能在2MSL时间内收到这个重传的FIN,接着客户端还要重传一次确认,重新启动2MSL计时。如果客户端不在TIME_WAIT等待一段时间,而是在发送完ACK报文段后立即释放连接,就无法收到服务器端重传的FIN,因而也不会再发送一次确认报文段。这样B就不能正常关闭。
2、第二,防止“已失效的连接请求报文段”出现在本连接中。客户端发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网路消失。这样就可以使下一个新的连接中不会出现这种的连接请求报文段。

已经失效的连接请求报文段是这样产生的
考虑到一种正常情况:
客户端发出连接请求,但因连接请求报文丢失而未收到确认。于是客户端再重传一次连接请求。后来收到确认,重新连接连接。数据传输完毕后,就释放了连接。客户端共发送了两个连接请求报文段,但是第一个丢失,第二个到达了B。
异常情况的考虑:
即客户端发出的第一个连接请求报文段没有丢失,而是在某些网络结点长时间滞留了,以致延误到连接释放以后的某个时间才到达服务器。本来这是一个早已失效的报文段,但是服务器收到此失效的连接请求报文段之后,误认是客户端重新发送的新的请求。于是就向Client发出确认报文段,同意建立连接。因为客户端没有发出建立连接请求,只是服务端收到报废的报文段,所以客户端不会理服务端的确认,这样服务端就一直在等待之中,许多资源就这样白白浪费。
注意:采用三次握手就可以防止“已失效的连接请求报文段”现象的发生。

### 回答1: 好的,我了解了。关于您的问题,整个过程可以分为以下几个步骤: 1. 输入URL:当您在浏览器地址栏中输入URL时,浏览器会将该URL发送到域名系统(DNS),通过域名系统将URL转化为IP地址。 2. 发送HTTP请求:浏览器根据URL发起HTTP请求,请求访问Web服务器的特定资源。 3. 服务器响应:当Web服务器接收到请求时,它将处理请求并返回所请求的资源。 4. 浏览器渲染:浏览器收到服务器响应后,它将解析HTML源代码,并根据CSS样式表和JavaScript代码来渲染页面。 5. 页面展示:最终,浏览器将HTML、CSS和JavaScript代码解析完毕后,它会在屏幕上展示出页面内容。 以上就是从输入URL页面展示的整个过程,希望能够帮到您。 ### 回答2: 当我们在浏览器的地址栏中输入URL时,整个过程可以分为以下几个步骤: 1. DNS解析:浏览器首先会根据URL中的域名(例如www.example.com)进行DNS解析,将域名解析为对应的IP地址。这一步骤是为了找到存放网页的服务器。 2. 建立TCP连接:浏览器通过IP地址与服务器建立TCP连接。TCP协议提供可靠的连接,确保数据的完整性。 3. 发起HTTP请求:一旦建立了TCP连接,浏览器会向服务器发起HTTP请求,请求包括请求方法、请求头、请求体等信息。请求方法可以是GET、POST等,服务器根据请求的不同做出相应的响应。 4. 服务器处理请求并响应:服务器接收到浏览器的请求后,会根据请求的内容进行相应的处理。处理包括读取数据库、执行后端代码等操作。之后,服务器会生成响应对象,包含响应状态码、响应头、响应体等信息。 5. 接收服务器响应:浏览器接收到服务器的响应后,根据响应头中的Content-Type确定响应的数据类型。如为HTML类型,则浏览器会将响应的HTML代码解析成DOM树。 6. 解析页面并渲染:浏览器根据DOM树构建渲染树,并依据CSS样式对各元素进行布局和样式计算,最终生成页面的渲染结果。同时,浏览器也会执行页面中的JavaScript代码。 7. 页面展示:最后,浏览器将渲染好的页面内容显示在用户的视窗中,用户可以看到页面的展示效果。 总结起来,从输入URL页面展示,经历了DNS解析、建立TCP连接、发起HTTP请求、服务器处理请求并响应、接收服务器响应、解析页面并渲染等多个步骤。最终,浏览器将渲染好的页面内容显示给用户。 ### 回答3: 从输入URL页面展示,大致经历如下步骤: 1. 域名解析:当我们在浏览器中输入URL后,首先会进行域名解析。浏览器会向DNS服务器发送域名请求,获取该域名对应的IP地址。 2. 建立连接:浏览器通过获取到的IP地址与Web服务器建立TCP连接。这个过程使用的是三次握手协议,确保连接的可靠性。 3. 发送请求:建立连接后,浏览器会发送HTTP请求给Web服务器,请求的内容包括请求的类型(GET/POST等)、地址、头部信息、可能还包括cookie等相关信息。 4. 服务器处理请求:Web服务器收到请求后,会根据请求内容进行处理。处理过程可能包括调取数据库、运行后台程序等动作。 5. 服务器响应:Web服务器根据请求的内容,返回一个HTTP响应给浏览器。响应的内容包括状态码、响应头部、实际的网页内容等。 6. 下载页面资源:浏览器接收到服务器返回的响应后,会开始下载网页的资源,如HTML、CSS、JavaScript、图片等。浏览器会根据响应头部中的Content-Type确定如何解析资源。 7. 页面渲染:当所有的资源下载完成后,浏览器会根据HTML结构、CSS样式,解析并渲染出网页。浏览器会从上到下解析HTML文档,解析过程包括构建DOM树、计算CSS样式、布局页面等。 8. JavaScript执行:在渲染过程中,浏览器会遇到JavaScript代码。浏览器会逐行解析执行JavaScript代码,并根据代码修改DOM树和样式,可能还会触发网络请求等。 9. 页面展示:当页面渲染和JavaScript执行完成后,页面便可以完整地展示给用户了。用户可以看到页面内容,与页面进行交互。 以上仅是一个大致的过程,实际上还有很多细节和额外的步骤,比如缓存机制、重定向、Cookie处理等等。不同的浏览器、服务器也可能会有些许差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值