HTTP访问一个网站的过程详解

访问一个网站的过程详解

例如访问:http://www.baidu.com

HTTP请求的准备

浏览器会将www.baidu.com这个域名发送给DNS服务器,让它解析成IP地址。由于HTTP是基于TCP协议的,先建立TCP连接,在HTTP 1.1的协议里面,默认开启了Keep-Alive,这样建立的TCP连接,就可以在多次请求中复用。

HTTP请求的发送

建立TCP连接以后,通过stream二进制流的方式传给对方,到了TCP层,会将二进制流变成一个报文段发送给服务器。

发送每个报文段的时候,都需要对方有一个回应ACK,来保证报文可靠地到达了对方。如果没有回应,那么TCP就会重新传输,直到可以到达。有时候同一个包可能被传输好多次,但这对于HTTP是透明的。

TCP层发送每一个报文的时候,都需要加上自己的地址(源地址)和它想要去的地方(目标地址),然后将源MAC和目标MAC放入MAC头,发送出去即可;若不在同一局域网内,就需要发送给网关,这时还需要发送ARP协议,来获取网关的MAC地址,然后将源MAC和网关MAC放入MAC头,发送出去。

网关收到包以后,发现MAC符合,取出目标IP,根据路由协议找到下一跳的路由器,获取下一跳路由器的MAC地址,将包发送给下一跳路由器。

这样路由器一跳一跳终于到达目标的局域网。这时候,最后一跳路由器能够发现,目标地址就在自己的某一个出口的局域网上。于是,在这个局域网上发送ARP,获得这个目标地址的MAC地址,将包发送出去。

目标机器发现MAC地址符合就将包收起来;发现IP地址符合,根据IP头中协议项,知道自己上一层是TCP协议,于是解析TCP头,里面有序列号,看一看这个序列包是不是我需要的,如果是就放入缓存中然后返回一个ACK,如果不是则丢弃。

TCP头里面还有端口号,HTTP的服务器正在监听这个端口号。于是,目标机器自然知道是 HTTP 服务器这个进程想要这个包,于是将包发给 HTTP 服务器。HTTP 服务器的进程看到,原来这个请求是要访问一个网页,于是就把这个网页发给客户端。

HTTP返回的发送

根据HTTP 响应报文的格式构造好返回的HTTP报文,接下来就是把这个报文发送出去。还是交给Socket去发送,还是交给TCP层,让TCP层将返回的HTML,也分成一个个小的段,并且保证每一段都可靠到达。

这些段加上 TCP 头后会交给 IP 层,然后把刚才的发送过程反向走一遍。虽然两次不一定走相同的路径,但是逻辑过程是一样的,一直到达客户端。

客户端发现 MAC 地址符合、IP 地址符合,于是就会交给 TCP 层。根据序列号看是不是自己要的报文段,如果是,则会根据 TCP 头中的端口号,发给相应的进程。这个进程就是浏览器,浏览器作为客户端也在监听某个端口。

当浏览器拿到了 HTTP 的报文。发现返回“200”,一切正常,于是就从正文中将 HTML 拿出来。HTML 是一个标准的网页格式。浏览器只要根据这个格式,展示出一个绚丽多彩的网页。

这就是一个正常的 HTTP 请求和返回的完整过程。

参考资料

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值